第四回 | 把自己在硬盘里的其他部分也放到内存来
新读者看这里,老读者直接跳过。
本系列会以一个读小说的心态,从开机启动后的代码执行顺序,带着大家阅读和赏析 Linux 0.11 全部核心代码,了解操作系统的技术细节和设计思想。
你会跟着我一起,看着一个操作系统从啥都没有开始,一步一步最终实现它复杂又精巧的设计,读完这个系列后希望你能发出感叹,原来操作系统源码就是这破玩意。以下是已发布文章的列表,详细了解本系列可以先从开篇词看起。
本系列的 GitHub 地址如下(文末阅读原文可直接跳转)
https://github.com/sunym1993/flash-linux0.11-talk
------- 正文开始 -------
load_setup:
mov dx,#0x0000 ; drive 0, head 0
mov cx,#0x0002 ; sector 2, track 0
mov bx,#0x0200 ; address = 512, in 0x9000
mov ax,#0x0200+4 ; service 2, nr of sectors
int 0x13 ; read it
jnc ok_load_setup ; ok - continue
mov dx,#0x0000
mov ax,#0x0000 ; reset the diskette
int 0x13
jmp load_setup
ok_load_setup:
...
ok_load_setup:
...
mov ax,#0x1000
mov es,ax ; segment of 0x10000
call read_it
...
jmpi 0,0x9020
start:
mov ax,#0x9000 ; this is done in bootsect already, but...
mov ds,ax
mov ah,#0x03 ; read cursor pos
xor bh,bh
int 0x10 ; save it in known place, con_init fetches
mov [0],dx ; it from 0x90000.
...
后面的世界越来越精彩,欲知后事如何,且听下回分解。
------- 多说两句 -------
先给大家留个课后作业,文中不是提到了 BIOS 提供了很多中断函数方便操作系统刚启动的时候调用么?这些中断都是什么?大家负责去找一份一手资料(注意是一手资料,不要网上整理的二手博客),并上传到我的 GitHub 上(文末阅读原文就是)。
不知不觉已经第四回了,刚刚才把 bootsect.s 这个汇编文件讲完,它所做的事情无非就是把硬盘中的数据复制到内存,然后挪来挪去的,并且根据放置在内存中的位置,设置了各种段基址寄存器的值。
在解答读者疑问时,我发现有两种特别极端的人。
一种是把这几讲的内容想得极其复杂,什么代码段和数据段一样会不会相互影响,这些地址是虚拟地址还是物理地址,为什么要不断从内存一个地方挪动到另一个地方,BIOS 是怎么映射到内存的,硬盘中 512 字节是数据还是代码,等等。
这样的人,我建议把你所知道的一切先忘掉,就把这几讲所说的东西理解清楚,因为它就是很简单,不涉及那么多乱七八糟的知识。你所产生的那些疑问,在这个阶段根本就不存在这些问题,现在内存就在这,你想怎么玩就怎么玩,无非就是访问数据,执行代码,自己能安排明白即可。
还有一种人,就是把这几讲的内容想得特别简单,这几讲确实就是复制硬盘数据和内存数据为主,但这就是操作系统呀!它就是不断通过这样简简单单的动作,把自己一点一点搞复杂的呢。
首先它靠 BIOS 做了第一步加载动作,然后就可以用加载的这 512 字节,去加载更多在硬盘中的代码和数据,那整个过程就自己把自己加载完整了,你不觉得这个过程也很伟大和奇妙么?会不会有解答了你之前一直困惑的什么东西呢?
多想想,多看看每回的扩展部分和延伸部分。
------- 关于本系列 -------
本系列的开篇词看这
本系列的扩展资料看这(也可点击阅读原文),这里有很多有趣的资料、答疑、互动参与项目,持续更新中,希望有你的参与。
https://github.com/sunym1993/flash-linux0.11-talk
本系列全局视角
最后,祝大家都能追更到系列结束,只要你敢持续追更,并且把每一回的内容搞懂,我就敢让你在系列结束后说一句,我对 Linux 0.11 很熟悉。
另外,本系列完全免费,希望大家能多多传播给同样喜欢的人,同时给我的 GitHub 项目点个 star,就在阅读原文处,这些就足够让我坚持写下去了!我们下回见。