busybox 访问amd_iommu的BAR的0地址,可以获取device table的地址,device table的地址是内存中预留的,这个地址devmem是没有权限访问的
查看CONFIG_STRICT_DEVMEM为,限制用户态通过dev/mem访问所有内存
可以看到demem访问时被限制的,需要重新编译内核打开限制
make menuconfig,然后输入/ 搜索STRICT_DEVMEM,可以看到在kernel hacking有对应配置
进入 kernel hacking把
[ ] Filter access to /dev/mem
[ ] Filter I/O access to /dev/mem (NEW)
前面的*点掉(上下键选中,然后敲空格)
vim .config查看CONFIG_STRICT_DEVMEM是没有set的,剩下的就是编译内核了
编译内核的方式
起来后访问内存还是不行,但是提示从没有权限变成了invalid argument
对应这个问题linux/lib/Kconfig.debug有说明
我们需要在配置kernel时,关闭CONFIG_X86_PAT=n,同时开启CONFIG_EXPERT
或者直接在cmdline加上nopat的配置 [X86] Disable PAT (page attribute table extension of pagetables) support.
重启系统后,可以正常访问内存的地址了
我们可以看到devmem读取的和直接hexdump /dev/mem是一样的,只是大小端显示不同。
参考
https://lwn.net/Articles/267427/
http://blog.sina.com.cn/s/blog_6f5b220601012xbc.html
https://blog.csdn.net/anzhuangguai/article/details/54316206