不懂就问,为什么mmap返回0xffffffff

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
chengshuyi
帖子: 20
注册时间: 2018-10-18 10:18
系统: ubuntu16

不懂就问,为什么mmap返回0xffffffff

#1

帖子 chengshuyi » 2018-11-16 14:05

我想通过mmap读取/sys/bus/pci/devices/0000:03:00.0/resource0文件内容,但是返回0xffffffffffffffff地址。下面是我的代码:

代码: 全选

int fd = open("/sys/bus/pci/devices/0000:03:00.0/resource2",O_RDONLY);
void *map_addr =  mmap(NULL, 0xfff, PROT_READ, MAP_SHARED, fd, 0);
下面是我在linux文档里面找的pci文件系统的解释,可以看见resource0..N PCI resource N, if present (binary, mmap, rw[1]) 。是可以mmap和读写的,但是[1] rw for RESOURCE_IO (I/O port) regions only 这一句没有看懂。

代码: 全选

       file		   function
       ----		   --------
       class		   PCI class (ascii, ro)
       config		   PCI config space (binary, rw)
       device		   PCI device (ascii, ro)
       enable	           Whether the device is enabled (ascii, rw)
       irq		   IRQ number (ascii, ro)
       local_cpus	   nearby CPU mask (cpumask, ro)
       remove		   remove device from kernel's list (ascii, wo)
       resource		   PCI resource host addresses (ascii, ro)
       resource0..N	   PCI resource N, if present (binary, mmap, rw[1])
       resource0_wc..N_wc  PCI WC map resource N, if prefetchable (binary, mmap)
       revision		   PCI revision (ascii, ro)
       rom		   PCI ROM resource, if present (binary, ro)
       subsystem_device	   PCI subsystem device (ascii, ro)
       subsystem_vendor	   PCI subsystem vendor (ascii, ro)
       vendor		   PCI vendor (ascii, ro)

  ro - read only file
  rw - file is readable and writable
  wo - write only file
  mmap - file is mmapable
  ascii - file contains ascii text
  binary - file contains binary data
  cpumask - file contains a cpumask type

[1] rw for RESOURCE_IO (I/O port) regions only
所以我应该怎么做才能读取resource0文件内容,或者修改。
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 不懂就问,为什么mmap返回0xffffffff

#2

帖子 astolia » 2018-11-16 19:09

用mmap不去看看手册?

代码: 全选

sudo apt install manpages-dev
man mmap
自己去看RETURN VALUE那一段
还有如果那两行代码就是你的实际代码的话,那不检查fd也体现出你糟糕的编程习惯
chengshuyi
帖子: 20
注册时间: 2018-10-18 10:18
系统: ubuntu16

Re: 不懂就问,为什么mmap返回0xffffffff

#3

帖子 chengshuyi » 2018-11-18 16:44

astolia 写了: 2018-11-16 19:09 用mmap不去看看手册?

代码: 全选

sudo apt install manpages-dev
man mmap
自己去看RETURN VALUE那一段
还有如果那两行代码就是你的实际代码的话,那不检查fd也体现出你糟糕的编程习惯
检查fd了(不等于-1),只不过为了防止避重就轻就手动删除了。

代码: 全选

RETURN VALUE         top

       On success, mmap() returns a pointer to the mapped area.  On error,
       the value MAP_FAILED (that is, (void *) -1) is returned, and errno is
       set to indicate the cause of the error.

       On success, munmap() returns 0.  On failure, it returns -1, and errno
       is set to indicate the cause of the error (probably to EINVAL).
出错是返回-1的,但是我这个返回0xffffffffffff(最大的虚拟地址) :Noting
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 不懂就问,为什么mmap返回0xffffffff

#4

帖子 astolia » 2018-11-18 20:12

任何一个计算机专业的大一学生,在入学后最初一两周的课程上,都会知道0xffffffffffff就是-1。如果你搞不清楚又立志要搞软件开发,建议你找计算机专业的教科书来补习一下。
如果你觉得不去系统学习也没关系,遇到问题再跑来问知识点就行了,那这些就是知识点
https://www.cnblogs.com/zhangziqiu/arch ... rCode.html
https://www.cnblogs.com/tgycoder/p/4218696.html
chengshuyi
帖子: 20
注册时间: 2018-10-18 10:18
系统: ubuntu16

Re: 不懂就问,为什么mmap返回0xffffffff

#5

帖子 chengshuyi » 2018-11-18 21:04

astolia 写了: 2018-11-18 20:12 任何一个计算机专业的大一学生,在入学后最初一两周的课程上,都会知道0xffffffffffff就是-1。如果你搞不清楚又立志要搞软件开发,建议你找计算机专业的教科书来补习一下。
如果你觉得不去系统学习也没关系,遇到问题再跑来问知识点就行了,那这些就是知识点
https://www.cnblogs.com/zhangziqiu/arch ... rCode.html
https://www.cnblogs.com/tgycoder/p/4218696.html
哦,懂了。这个我都学过,可能智商不够 :Cry
回复