生活中和工作中有许许许多多的事情,有的事情我们比较熟悉,自然而然就可以把他做到位,而有些东西就是实现就可以了,甚至差不多就那样吧。
其实正是这种思维会影响自己对技术的提升,不求甚解,一知半解,先干起再说!其实,很早就有这方面的感觉,但是始终没有当回事,直到最近看些文章时,让自己又有了体会。
且听我道来~~
0x01:奇怪的 0x7c00 地址
前几天看一个系列的文章,文章的内容还算不错,技术比较基础,但是感觉文章的讲解相当到位,这个系列文章主要是介绍 Linux 0.11 源码的。
Linux 0.11 是入门 Linux 内核源码的不错的一个版本,代码量不到一万五千行,虽然代码不多,但是也几乎包含了完整的 Linux 内核的设计精髓。(题外话:看,人家的内核从 0.01 开始,经历了 0.01、0.1x、0.95……直到多个版本后才到 1.0,据说 0.95 算是比较完整的内核,但是由于代码量就过多了,不适合入门。对了,为什么我们的软件很多都是从 1.0 开始呢?)
当我们开机按下电源那一刻,在正式进入操作系统内核之前,或者说在正式进入保护模式之前,主引导扇区会对内存进行一个简单的规划和布局(甚至还会用之后要用的代码覆盖已经不用的代码),那么主引导扇区是如何进入内存的呢?是通过 BIOS 加载进来的!BIOS 会把主引导扇区(硬盘或软盘的 0 盘面 0 磁道 1 扇区)的内容,也就是那 512 个字节搬到内存的 0x7c00 地址处。看到这个地址就比较奇怪。
为什么不把它搬到 0 地址处呢,好多书都没有给出答案,只是说早期就这么规定的,或者是就这么设计的,甚至有的书上直接写他也不知道(作者真的很坦诚,毕竟不影响知识的完整,也没有硬解释)。真的,我看过的资料都没有给出过解释(我看的都是中文资料),我也从来没有深究过这个问题。包括我看的这个系列文章也一样没有给出答案。
0x02:原来真的有答案,真是事有始末
但是!注意,“但是”来了!在这个系列文章的评论中,有一个网友给出了一个链接,链接对应的文章中说明了 0x7c00 的来历。文章的开头,作者也表示对 0x7c00 这个地址表示疑惑,他觉得为什么要把 MBR 加载到内存将近 32K 的地址处呢,他也在书中没有看到过什么合理的解释。后来他看了国外的一篇文章,文章中解释了为什么是 0x7c00。
因为当时个人电脑使用 8088 时,最少需要 32K 的内存,为了让操作系统有一个连续的内存空间,因此,尽量把 MBR 的位置放到内存的尾部。那么按照内存最少 32K 来设计,32K = 0x7fff,MBR 的大小是 512 字节,MBR 也会产生数据,因此除了 MBR 的 512 字节外,又给 MBR 预留了 512 字节的空间,因此 0x7fff - 512- 512 + 1 = 0x7c00。而后续的操作系统为了兼容它,那么后来开机启动时 MBR 会被 BIOS 加载到内存的 0x7c00 的地址处。
是不是很有意思,原来真的有一个合理的历史原因。想起一些群友话来,“技术是演进而来的”、“新技术的产生是解决旧技术的问题的,旧技术的劣势就是新技术的优势”,那么任何一个问题都是有历史可挖的,而不是拍脑门就那么出现的。
0x03:最后
看到这里,是不是感觉到了,自己不深挖的、认为没有用的、用不上的问题,总有人去深挖它,上面我提到的文章作者貌似也不是搞操作系统的,但是他对这个问题找到答案了,而那些研究操作系统的,解读源码的却没有找到答案。这可能就是差距吧,别说没有天赋了,可能多搜索几次,或者在搜索引擎多翻几页都嫌麻烦吧!
写到这里,我突然又想到一个问题,MBR 结尾的两个字节 55 AA 是什么来历呢?有知道的么?反正我是不知道!
五一了,有什么打算呢?分享一些视频假期刷刷吧,最近我在刷的几个,挺好看,几个韩剧吧,幽灵虽然比较老吧,但是看过好几次了吧,弱小的英雄第二季是比较新的吧,也挺好看!希望能喜欢!