共享内存,如何固定逻辑地址(映射地址)问题

philo_ly 2009-12-30 04:31:29
我想使用固定逻辑地址(映射地址),以使用指针访问,
在linux和Solaris上没有问题,但是移植到AIX上,不能固定逻辑地址,导致非法访问。
请问,如何在AIX上固定逻辑地址(映射地址)
代码中获取共享内存首地址语句如下:
shmat(shm_id, (void*)0x4000000000, SHM_RND);
SHM_RND这个选项怎么使用?
网上都是说了这个SHM_RND的效果,但是没有例子。

请帮忙。
...全文
242 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
philo_ly 2010-01-04
  • 打赏
  • 举报
回复
这个问题比较复杂,即使这个程序没有问题,但是其他程序在访问的时候,如果使用这个地址,有可能在其他进程内部不能访问。

[Quote=引用 4 楼 mymtom 的回复:]
写了个简单程序测试了一下,没有问题呀。
系统
AIX P550 3 5 0000DF83D600
编译命令 cc -q64
C/C++ code
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#include<assert.h>
#include<stdio.h>int
main(int argc,char*argv[])
{
key_t shmkey;int shmid;char*addr;
size_t size;int rc;

size=1024*1024;
shmkey= ftok(argv[0],1);
shmid= shmget(shmkey, size, IPC_CREAT|0666);
printf("shmid=%d\n", shmid);
addr= shmat(shmid, (void*)0x0700000000000000, SHM_RND);
printf("addr=%p\n", addr);
assert(0!= addr);
memset(addr,0, size);

rc= shmdt(addr);
printf("rc=%d\n", rc);
rc= shmctl(shmid, IPC_RMID,0);
assert(0== rc);return0;
}
[/Quote]
mymtom 2010-01-03
  • 打赏
  • 举报
回复
写了个简单程序测试了一下,没有问题呀。
系统
AIX P550 3 5 0000DF83D600
编译命令 cc -q64

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#include <assert.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
key_t shmkey;
int shmid;
char *addr;
size_t size;
int rc;

size = 1024 * 1024;
shmkey = ftok(argv[0], 1);
shmid = shmget(shmkey, size, IPC_CREAT | 0666);
printf("shmid=%d\n", shmid);
addr = shmat(shmid, (void *)0x0700000000000000, SHM_RND);
printf("addr=%p\n", addr);
assert(0 != addr);
memset(addr, 0, size);

rc = shmdt(addr);
printf("rc=%d\n", rc);
rc = shmctl(shmid, IPC_RMID, 0);
assert(0 == rc);
return 0;
}
philo_ly 2009-12-31
  • 打赏
  • 举报
回复
是64位程序,
0x0700000000000000
mymtom 2009-12-30
  • 打赏
  • 举报
回复
我看错了吗?

0x4000000000
吗?
64位程序?
mymtom 2009-12-30
  • 打赏
  • 举报
回复
32位程序?

xlc编译的时候加选项
-bmaxdata:0x40000000

18,773

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧