请问xtang以及论坛的各位大大,关于mmap_device_memory()映射的地址的疑问。

我要映射一个PCIe设备的memory,用法如下

mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED|MAP_PHYS,addr_mem);

在单个文件调试的时候,映射完全正常,映射后得的地址为:0x = 0x40100800;映射地址的读写完全没有问题。

可在应用时,调用上述的PCIe源文件的时候,发现映射的地址就不对了,映射出来的地址却为:0xFFFFFFFF,映射地址的无从操作了,报Memory fault (core dumped) 的错误,可pcie的源程序没有任何的改动,一摸一样的。

请问xtang以及各位大大以前遇到过这样的问题么,我被这个问题折磨好久了,就是找不到原因,太不可思议了。
ps. 上述的mmap_device_memory()中的各个参数都是按照定义来设置的。

初步确定原因,是由于mmap_device_memory()与ThreadCtl( _NTO_TCTL_IO, 0 )之间有一段找到设备以及读取PCIe的地址代码,这段代码不知为何能影响mmap_device_memory()的工作。
目前初步的解决方式在mmap_device_memory()的上一行加上ThreadCtl( _NTO_TCTL_IO, 0 );即可

rc = ThreadCtl( _NTO_TCTL_IO, 0 );
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);

具体的导致这种现象的真正的原因,目前尚未清楚。

没完全看懂你的问题。

  1. mmap_device_memory() 返回 -1 意味着出错,你应该 可以查errno来看看具体出了什么 错。

  2. mmap_device_memory() 需要IO特权,也已经说,在执行这函数前,必须先执行 ThreadCtl()。如果你写的是个程序,通常在 main() 里做ThreadCtl(),如果你写的是库,一般是在库里先设一个初始化用的init()函数,在那里做个ThreadCtl()。

我现在遇到的问题是这样的,
如果下面这样的话,就可以mmap返回正确的地址。

rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
......
(其他一些初始化的代码)
......
rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*第二次获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);

如果是下面这样的话,就mmap返回0xffffffff。

rc = ThreadCtl( _NTO_TCTL_IO, 0 );/*获取特权*/
if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}
......
(其他一些初始化的代码)
......
mem_mem = mmap_device_memory(NULL,0x800,(PROT_READ|PROT_WRITE),MAP_SHARED,addr_mem);
  1. 可以在 mmap_device_memory() 后面加判断,检查出的是什么错。
 if (mem_mem == (void *)-1) {
        printf("mmap: %d\n", errno);
 }
  1. ThreadCtl() 只为当前线程取得特权,你的第一部份和第二部份是在同一线程里吗?

  2. 下面这段代码明显有问题。:slight_smile:

if (rc ==-1)
{
    return EXIT_FAILURE;
    printf("ThreadCtl Error.\n");
}

恩,貌似晓得原因了,估计是不在一个线程里面,谢谢xtang.对于3)是不是if里面的语句写反了呢,嘿嘿。是copy :laughing: