Linux下用memory方式访问PCIE空间

4 篇文章 2 订阅

测试环境:Ubuntu 14.04LTS

在Windows下,我们 用RW everything很容易可以看到PCIE所有的config space,但是我们最近想在Linux下dump PCIE config space,首先我们尝试用IO read的方式,

也就是通常我们会用CF8和CFC的方式,但是很遗憾这种方式只能读出来256个字节,那么后面的0x100~0x1FF怎么去读,就是下面我们要解决的问题。

1,首先我们需要获取PCIE在memory中的映射地址,我们看ACPI的手册,会发现有一个MCFG的东西,官方解释如下:

“MCFG” PCI Express memory mapped configuration space base address Description Table
PCI Firmware Specification, Revision 3.0
See the ACPI Link Document under the heading "PCI Sig".

也就是说MCFG里面有保存PCIE的基地址,这个的获取方式,可以利用acpidump这个工具,如果没有的话,需要先安装

sudo apt-get install acpidump

成功之后,我们键入acpidump,会dump出来很多register的值,慢慢下拉我们会找到如下的


从PCI Firmware Specification Revision 3.0上面可以看到,MCFG的定义:


看到失眠的Configuration space base address allocation structure,偏移地址是44,也就是0x2c,然后再参考Table4-3:


再回到acpidump读出来的MCFG,PCIE的基地址就是F0000000,这个值不是固定的,在其他的机子上会有不同。

2,为了验证上面的基地址就是PCIE的,我们需要写一个简单的程序,试试看。

justin@ubuntu:/mnt/hgfs/LinuxTools/PCITools/pci_dump$ sudo ./pci_dump -m
The offset address value is 0xf0000000
The value at 0xf0000000 is 0x71908086

好的,我们读出来memory address f0000000的低2个字节是8086,所以基地址肯定没有问题,之后就可以根据PCIE spec上的协议,组合PCIE 的Bus,Device,Function和Register的值来获取对应地址的值了。

如果不放心上面的验证,也可以通过lspci这个tool去读下bus 0, device 0,funtion 0,register 0的值,进一步验证下。






  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
回答: 当Linux系统出现"out of memory"错误时,有几种解决方法可以尝试。首先,最简单的方法是增加内存或者优化应用程序,使其占用更少的内存。另外,可以通过调整内核参数来临时解决该问题。可以使用命令"free -lm"来查看内存使用情况,然后根据需要释放内存。可以通过修改配置文件"/proc/sys/vm/drop_caches"来释放缓存,其中的值可以为0~3,代表不同的含义,例如释放页缓存、释放dentries和inodes,或者释放所有缓存。此外,还可以通过关闭OOM killer来临时关闭内存溢出杀手,可以通过修改"/proc/sys/vm/oom_dump_tasks"文件来实现。如果需要永久生效,可以修改"/etc/sysctl.conf"文件并增加"vm.oom-kill = 0"的配置,然后重启系统或执行"sysctl -p"命令使其生效。[1] 另外,如果系统配置为2G且没有交换分区,可能会导致每天出现"out of memory"错误。在这种情况下,可以增加物理内存并创建交换分区来改善情况。然而,如果系统在运行2-3天后仍然出现"out of memory"错误,可能是由于low memory不足导致的。可以通过使用命令"sync"和"echo 3 >> /proc/sys/vm/drop_caches"来释放内存,并查看"/proc/buddyinfo"文件来确认内存是否已被释放。[3] 另外,如果以上方法无效,还可以考虑安装hugemem kernel RPM包并重启系统来解决问题。这种内核可以以不同的方式分割low memory和high memory,并提供足够多的low memory到high memory的映射。[2]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术在路上

帮助需要的人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值