大家好,这里是第五位面壁者。今天继续我们的学习之旅,同样视频会放在B站,PPT和视频录音的文字版本会在下面这些平台同步更新,欢迎各位大佬参观指导。
今天的这期内容,我给大家介绍一款我自己编写的可以在Linux下访问物理内存信息的图形化界面工具---RWLinux。
RWLinux只是一个偶然的产物,由于工作的原因,我需要经常在各种环境下访问和查看计算机的各种硬件信息,包括但不限于物理内存/IO端口/PCI配置空间/CPUMSR等。在UEFI Shell下有RU.efi供我们使用,在Windows下有ReadWriteEverying,但是在Linux下我发现似乎没有类似的集成工具,而是一个个分散的小工具,它们大多需要走一遍安装流程才能使用,而且各自都存在一些限制,最主要的还是,它们没有集成在一起。
在大多数情况下,其实这些缺憾其实无伤大雅,但是在某些场合,比如在远程某个客户发邮件说某款等待量产机型的USB口在Linux不识别优盘,我需要他帮我看一下发生fail时候USB的Port Status,这需要先找到USB Controller的PCIConfig Space拿到MMIO的Bar,然后再去Bar Register显示的MemoryAddress去读取USB MMIO Register。在Linux下,这可能需要用到lspci+devmem/hexedit,待测环境可能不允许我们去安装软件,客户那边对接的人可能也没办法进行上述这堆涉及多个tool而且还基于命令行的操作。
我本身并不是Linux工程师,最一开始,只是本着学习Linux的目的进行了一下关于Linux下访问硬件信息的探索,RWLinux只是进行这些探索后的一个副产品。所以今天这期内容主要分为三个部分,先是介绍一下我所学习到的在Linux下访问硬件信息的原理和方法,随后介绍一些业界存在的主流工具以及限制,最后再介绍RWLinux界面以及下载方法。
想要在Linux下访问物理内存空间,就离不开/dev/mem,从系统的角度来看,/dev/mem是linux下的一个字符设备,这个设备文件是专门用来访问物理地址空间用的,里面的内容是物理地址空间的全镜像。什么是物理地址空间?在英特尔手册的第一卷3.3小节就给出过定义,所谓的物理地址空间就是处理器可以通过自己的地址总结访问到的内存空间。那么我现在提两个问题:第一个,USB的MMIO在不在物理地址空间里面?第二个,一个64bit的PC,装了根8G的内存条,那我写程序去读物理地址为0xFFFFFFF0的内容,所访问的数据在这根8G内存条里的什么位置?如果有同学在听完这两个问题后第一时间没有答案,先右上角叉掉这跟视频,然后下去把IO/MMIO/物理地址空间/