源码下载地址:http://www.oldlinux.org/Linux.old/

Part 1:进入内核前的苦力活

01|开机后最开始的两行代码是什么?

1
2
wget http://www.oldlinux.org/Linux.old/kernel/0.1x/linux-0.11.tar.gz
tar -zxvf linux-0.11.tar.gz

CPU 中有个 PC 寄存器 寄存器在CPU中吗?
内存(RAM)?
ROM(BIOS)

Intel 手册规定,开机后 PC 寄存器要初始化为 0xFFFF0,也就是从这个内存地址开始,执行 CPU 的第一条指令。

ds 是默认加上的,表示在 ds 这个段基址处,往后再偏移 0x0001 单位,将这个位置的内存数据复制到 ax 寄存器中。

ds 这个数据段寄存器的作用就是这样,方便了描述一个内存地址时,可以省略一个基址
第一步,BIOS 将操作系统代码加载到内存 0x7c00;第二步,通过 mov 指令将默认的数据段寄存器 ds 的值改为 0x07c0,方便以后的基址寻址方式。

访问指令时 cs 就是基址,访问栈时 ss 是基址。

内存地址为何是0x7c00,可以参考这篇文章 http://www.ruanyifeng.com/blog/2015/09/0x7c00.html
0x7C00这个地址来自Intel的第一代个人电脑芯片8088,以后的CPU为了保持兼容,一直使用这个地址。 当时,搭配的操作系统是86-DOS。这个操作系统需要的内存最少是32KB。我们知道,内存地址从0x0000开始编号,32KB的内存就是0x0000~0x7FFF 由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了: 0x7FFF - 512 - 512 + 1 = 0x7C00 至于为什么把引导程序放在最后的位置?因为操作系统启动后,主引导记录就没有用处了,此后它所在的内存地址可以被操作系统重新利用,所以放在最后了。


http://example.com/2023/02/16/linux内核调试/Linux0.11 源码趣读/
作者
ningan123
发布于
2023年2月16日
许可协议