linux按照学习思路,可以姑且分为五大部分:
启动引导,系统调用,进程调度,内存管理,文件系统
那我们从 linux0.11 的启动开始探索。
我们可以在boot/目录下看到有三个汇编文件,构成我们linux启动的过程。分别为setup.s, bootsect.s, head.s
其中setup.s也给编译器指明了整个linux启动的入口:
entry start
start:
故事就从这里开始吧。
引导程序由BIOS加载并运行。它活动时,操作系统还不存在,整台计算机的所有资源都由它掌控,而能利用的功能只有BIOS中断调用。
首先,bootsect.s工作内容
bootsect.s完成两个工作:
1. 读入setup
2. 读入system
结束后,打印logo,以下为代码分析:
#define BOOTSEG 0x07c0
#define INITSEG 0x9000
#define SETUPSEG 0x9020
//程序在 BOOTSEG 开始
entry start
start:
//ds(data segment), es(extra segment) 皆为段寄存器
mov ax, #BOOTSEG
mov ds, ax
mov ax, #INITSEG
mov es, ax
//后面rep repeat的次数
mov cx, #256
//si,di 位偏移,处理方式 ds<<4+si, es<<4+di
sub si, si
sub di, di
//移动256个字,即512字节(一个扇区) BOOTSEG=>INITSEG
rep movw
//间接跳转(段间跳转 jump inter-segment) 由此处跳转到 INITSEG<<4+go
//cs = INITSEG, ip/pc = go
jmpi go, INITSEG
//后面程序运行在 INITSEG
go:
mov ax, cs
mov ds, ax
mov es, ax
//stack segment
mov ss, ax
//stack pointer 栈顶指针