我要映射一个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);
具体的导致这种现象的真正的原因,目前尚未清楚。
我现在遇到的问题是这样的,
如果下面这样的话,就可以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);
xtang1
5
- 可以在 mmap_device_memory() 后面加判断,检查出的是什么错。
if (mem_mem == (void *)-1) {
printf("mmap: %d\n", errno);
}
-
ThreadCtl() 只为当前线程取得特权,你的第一部份和第二部份是在同一线程里吗?
-
下面这段代码明显有问题。
if (rc ==-1)
{
return EXIT_FAILURE;
printf("ThreadCtl Error.\n");
}
恩,貌似晓得原因了,估计是不在一个线程里面,谢谢xtang.对于3)是不是if里面的语句写反了呢,嘿嘿。是copy