linux下如何取得主板的序列号?或是BIOS信息?
linux下如何取得主板的序列号?或是BIOS信息?LINUX下有没有看BIOS信息的命令呢?
请高手指教。谢谢。 自己找到了。
ALAN COX他老人家竟然编了个dmidecode的程序,再参考SMBIOS的规范即可。
希望有相同问题的人受到启发。 也不说清楚点,还要别人再忙活一遍啊 :shock: 主板序列号等信息是通过读取BIOS取得的。 LINUX下,BIOS是被屏弃的,对具体硬件设备的访问是通过具体的端口(寄存器)实现的,所以不能象在WINDOWS下那样很方便的根据具体的函数API读取了。
在PC中,最初的1MB内存空间的使用是特殊的。开头的640K(即0x0—0x9FFFF)为RAM。从0xA0000开始的空间用于各种CGA、EGA、VGA等卡的ROM。而BIOS的ROM地址就是在0xF0000—0xFFFFF这64K上。
LINUX的内存管理机制是基于保护模式的,对内存的访问是通过MMU转换的。但BIOS的内容实际上却可以通过文件”/dev/mem”读取(LINUX的内核管理者Alan cox 也觉得似乎是个内核漏洞,但他却利用这个漏洞读取BIOS内容)。
通过研究在Alan的dmidecodede 程序代码,得到读取BIOS的方法:
⑴ 打开”dev/mem”文件
⑵ 通过mmap(),将文件的内容映射到进程的空间,并通过memcpy()将BIOS内容考到相应缓冲区。之所以不用文件的read(),而用mmap()的原因是后者能解决在IA-64机时read()所遇到的问题。
⑶ 通过SMBIOS的规范,读出内容。 640K-1M的RAM地址空间用于影子内存。 :-D
我先前读frame buffer驱动得时候,看别人得程序是吧visual memory用mmap映射到用户空间进行操作,而不用read操作,是不是也是因为IA-64的原因呢?
一直没有机会试验一下,所以不明白 "Chad Smith noticed that, for some obscure reason, accessing the
/dev/mem file using mmap() instead of read() would work. "
MMAP
Note that mmap() is now used by default wherever possible, since this seems
to solve a number of problems. This default behavior can be changed in
config.h. Just to make sure this is clear, mmap() is not used for performance
reasons but to increase the number of systems on which dmidecode can be
successfully run. See the IA-64 subsection above for details.
我对内核了解不多,大概MMAP是靠缺页异常而运转,而READ()则是直接去读取文件。
大概缺页异常的函数比read()更灵活全面吧。
具体原因还请高手指点 什么是缺页异常啊?
我查了下书,说framebuffer设备通常要进行大量数据传递,用mmap可以很大的提高效率(linux device drivers),可惜我的lcd还没做上去,否则可以验证下看看
页:
[1]