《以C语言解析电脑》书评
最近一直在写一个DOS下检查笔记本的CPU、memory、hard disk和CD-ROM的tool。2010的9月底10月初本身就是一个很纠结的时间段,因而这个工具也让我很纠结,断断续续的,从中秋前两天开始这个任务,然后度过了3天的佳节,回来后连续写了6天又迎来了史上最长的国庆,今天是国庆的第一天,开始总结并反思自己写这个tool的经历。这个tool的基本功能都已经实现了,剩下的就是狗尾续貂了,当然您要是理解成锦上添花,我会很开心。
台湾前辈蔡英川有本书是《以C语言解析电脑》,在开发这个工具之前,我就在淘宝上花费RMB170多购得了它,因而站在巨人的肩膀上,使得我的开发顺利了不少,该tool的IDE部分就是借鉴了前辈的实现方法。当然由于PC架构更新很快,蔡前辈的这本书就有许多需要改进的地方,不知道蔡前辈有没有兴趣出第二版。
首先看硬盘这部分。
现在的SATA硬盘都采用了AHCI模式,当然AHCI和IDE的是同一个PCI bus和device,只是function number有所不同。所以在DOS下访问二者的方式几乎一致,都是先要通过它的PCI地址来获取系统为它分配的port,然后再往该port下命令的方式来获取硬盘参数。可惜蔡前辈的code有些许的瑕疵,使得只能访问IDE而不能访问AHCI。另外还有一个bug,使得只能访问IDE 的legacy port(0x170~0x177和0x1f0~0x1f7),而一旦bios修改了IDE的port,就不能读出硬盘参数。
瑕疵:AHCI和IDE具有不同的class ID, IDE class ID的子类别码是01H,而AHCI的子类别码为06H。蔡前辈在枚举PCI device的时候,只是考虑到了01H而没有考虑到06H,所以只能获取IDE的硬盘参数而不能获取AHCI的硬盘参数。改进方法很简单,只需要把06H加进来即可。
bug:也可能是蔡前辈的笔误,code里面有一个逻辑性错误,就是在获取IDE 的IO port时虽然能够获取到,可是并没有将它赋给相应的变量,使得始终以legacy port来访问硬盘参数,一旦bios修改了IDE的port,就读不到硬盘参数了。 当然改进方法也很简单,只要认真思考一下就可以了。当然蔡前辈的这个bug害我吃了不少的苦头,好在我不厌其烦的一步步调试,最终不可思议的发现原来是蔡前辈错了。蔡前辈的网站上应该会有这本书的勘误,可惜他的网站在大陆访问不了,准备待大力国庆蜜月归来向他讨个翻墙工具。
(去一表哥家里玩了两天,今天10月4号,接着写)
再来看CPU这部分。
识别CPU是通过CPUID这个指令。使用CPUID这个命令,首先要将参数放在EAX寄存器,然后是CPUID指令,根据参数的不同会有不同的结果返回到EAX~EDX这四个寄存器。汇编指令如下:
mov EAX, XXXXH
CPUID
mov iEAXValue, EAX
mov iEBXValue, EBX
mov iECXValue, ECX
mov iEDXValue, EDX
最终的返回值就存储在了变量iEAXValue~iEDXValue这四个变量中。
可以通过DEBUG32在win下演示该指令,可惜现在不能上传图片,就不演示了。
蔡英川前辈提出令EAX分别为0、1、2然后通过返回值来识别CPU。不过现在同种类型和规格的CPU都有一个唯一的CPU String来标识。因而只要获取到CPU String就能够知道你的CPU是哪种CPU。对于intel的CPU,可以令EAX分别为80000002H~80000004H来获取该string。
long CPUString[13]; _asm{ mov eax, 80000002H CPUID mov CPUString[0], eax mov CPUString[1], ebx mov CPUString[2], ecx mov CPUString[3], edx mov eax, 80000003H CPUID mov CPUString[4], eax mov CPUString[5], ebx mov CPUString[6], ecx mov CPUString[7], edx mov eax, 80000004H CPUID mov CPUString[8], eax mov CPUString[9], ebx mov CPUString[10], ecx mov CPUString[11], edx mov CPUString[12], 0 }
CPUString[13]这个数组里面存放的就是CPU String的ASCII值,可以通过printf语句来输出查看:
printf("CPUString: %s/n", CPUString);
而蔡前辈提出的方法则太过于繁琐,而且code的可兼容性也不是太好。
目前主要是研究了蔡前辈的这两个部分,因而只写了这两部分的书评。总体而言,蔡前辈的书写的既浅又深,可谓深入浅出,对
PC架构一窍不通的人可以用来入门,在BIOS界浸淫多年的人则可以将它作为一个案头必备工具书,对BIOS新手来说则可以用它来了解
PC架构的发展,当然如果你既想了解底层又想了解上层开发,那它就是你的完美伴侣。
台湾人写书总是有自己独特的视角,当然也有自己的秘技,不像大陆人那般粗制滥造。虽然这本书总共不到500页,表格、图片、代码就
占了近九成,却花了我近RMB200, 可我还是觉得物超所值,因为知识是无价的。只要你能从中获取到对你真正有用的东西,它就是无价的。
向台湾IT同行致敬。
《以C语言解析电脑》书评相关推荐
- 《设计模式之禅》书评
前一段时间终于领到了我期待已久的<设计模式之禅>一书,但是由于工作的原因,一直没有时间静下心来细细品味作者那些来自自己工作实践中的禅语.我把这本书放在我的床前,每当我临睡前,我都会翻翻此书 ...
- 读秦小波《设计模式之禅》 -- 工厂模式
设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都 ...
- 设计模式之禅--思维导图
原图ProcessOn里搜索:设计模式之禅
- 23种设计模式彩图-设计模式之禅
<The Zen of Design Patterns> -<设计模式之禅> 书中的23种设计模式彩图:
- 设计模式之禅【六大设计原则】
大旗不挥,谁敢冲锋--6大设计原则 单一职责原则 "你设计的类符合SRP原则吗?"--保准对方立马"萎缩"掉,而且还一脸崇拜的看着你,心想"老大确实英 ...
- 《设计模式之禅》前言
终于可以写前言了,这说明<设计模式之禅>已经基本完成,可以长嘘一口气了. 为什么写<设计模式之禅> 今年5月份,我在JavaEye上发了一个帖子,其中提到自己已经工作 ...
- 设计模式之禅【原型模式】
真刀实枪之原型模式 先发个个性化电子账单来引出今天的主角 个性化服务 一般银行都会要求个性化服务,添加一些个人信息在提示信息之前. 递送的成功率 邮件的递送成功率有一定的要求,由于大批的发送邮件,会被 ...
- 设计模式之禅之单一职责原则
声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 单一职责原则(Single Responsibility Principle) 1.定义: 在接口 ...
- 设计模式之禅【状态模式】
真刀实枪之状态模式 从电梯说起 随着城市的发展,有两样东西的发明在城市的发展中起到非常重要的作用 汽车:横向发展 电梯:纵向发展 既然说电梯,那就看看电梯有哪些动作 开门 关门 运行 停止 好了,动作 ...
- 设计模式之禅【组合模式】
真刀实枪之组合模式 从公司的人事架构谈起吧 公司的组织架构 从上图中可以分析出: 有分支的节点(树枝节点) 无分支的节点(叶子节点) 根节点(无父节点) 有了树状结构图,再看看类图长啥样吧! 这个类图 ...
最新文章
- Photoshop图层混合模式计算公式大全
- 【网络安全】反序列化漏洞底层扩展与制作WebShell
- SAP 电商云 Spartacus Checkout 端到端测试
- Java Web Token - JWT
- go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的
- matlab打开矩阵表,如何将Excel数据导入MATLAB中?:EXCLE中通过矩阵表输出选项
- Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法System.String ToString()问题解决)...
- Hive复杂数据类型之array
- VISIO——word中插入visio图片 图片边缘空白裁剪
- hadoop三大组件
- Tibco Designer -- 循环遍历
- 微信JSAPI支付 跟 所遇到的那些坑
- Matlab里关于T2F/F2T/lpf.m函数调用应注意的问题及函数修改
- 华中科技大学计算机学院有调剂名额吗,华中科技大学计算机学院2017考研调剂信息...
- oracle不足位数补零
- 【基于MATLAB的数字图像处理】第三章·基本图像变换
- 如何在代码中进行注释?
- TC SRM599 div2 p950
- 配置了yml文件但是提示cannot resolve property XXX
- JDK8中Collectors.toMap方法报Duplicate key xxx错误信息