1. 上电
CPU进入实模式 -> 从0xFFFF0开始执行BIOS代码 -> 系统检测 -> 启动存储第一个扇区并读入到内存0x7C00并调整到此位置
2. bootsect.S
将自己移动到0x90200 -> 将setup.S读取到0x90200处 -> 利用BIOS中断0x13读取磁盘参数 -> 显示“Loading system...” -> 将setup模块后的system模块加载到内存0x10000位置
3. setup.S
利用BIOS终端读取机器参数 -> 将system模块从0x10000~0x8ffff整体下移到0x00000 -> 进入保护模式:加载中断描述符表寄存器(idtr)、全局描述符表寄存器(gdtr)、开启A20地址线、重设两个中断控制芯片8259A(0x20~0x2f)、设置控制寄存器CR0 -> 跳转到system最前的head.s
4. head.s
加载各个数据段寄存器 -> 重设中断描述符表idt,时256个中断项皆指向一个只报错的哑中断子程序ignore_int -> 重设全局描述符表gdt(将段长8MB改为16MB)-> 检测A20地址线是否开启 -> 设置分页内存 -> 利用返回指令跳转到main函数执行(跳转到main是最激动人心的时刻,终于可以使用C语言了!)
5. main
根据setup.S获取的机器参数对变量进行初始化 -> 对硬件进行初始化:陷阱门、块设备、字符设备、tty -> 手段设置第一个任务(task 0)进程0 -> 设置运行中断 -> 切换到任务0 -> 利用fork()创建运行init()的进程1
此后:
- 进程0,空闲时运行,执行pause()系统调用,并调用调度程序
- 进程1,安装根文件系统、显示系统信息、运行系统初始化资源配置文件rc中的命令、运行用户在shell中命令或程序
6. 放飞意志
接下来就是Linux功能源码了
- 中断处理
- 设备管理
- 进程管理
- 内存管理
- 文件服务
- 库
以前一直都觉得操作系统很复杂,当然确实复杂,你不去看她的源码,她永远都是一个黑匣子;读了她的源码后,其实和普通应用程序实质区别并不是很大,只是多了一些硬件处理,多受了一些限制而已。所以,隔行如隔山,只是因为你没有探过头,瞧瞧瞄一眼即可看清大概轮廓。