前言
一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油!
本文总结自B站【哈工大】操作系统 李治军(全32讲)
老师课程讲的非常好,感谢
【哈工大】操作系统 李治军(全32讲)
操作系统启动
最开始应将磁盘上的操作系统读到内存里并且放在其上,操作系统引导扇区完成工
启动两件事:读入系统,setup初始化
操作系统是移动过来的,从0地址处开始,继续位置是应用程序
setup退出
jmpi0,8。按照cs左移四位加上ip应该跳到80位置,但实际上来到00位置(setup改变了寻址方式,因为左移四位最多能达到20位地址也就是一兆,想访问4G就得由16位模式换成32位模式,也就是保护模式)
说到底就是CPU解释程序不一样。
cr0寄存器:最后一位如果是0就是16位模式,是1就是保护模式。
CPU要走另一条解释执行指令的电路:gdt(硬件,快)
CS不再是左移四位产生新地址,而是成为选择子。以前CS里面放的是地址,现在放的是查表的索引,真正的基址放在表中。
GDT:全局描述符表
GDT表中的内容是setup初始化得来的,每个表四个word16位,一共64位。但寻址时候以字节为单位,也就是8.所以刚才的8就是找这个。有了这个表再配合这句指令就启动了32位模式。
表中内容是硬件来解释的
三个段基址(也即是图中红色部分),拼在一起段基址就是0。
setup工作:
1.读了些硬件参数,为之后建立操作系统打下基础。
2.把system移动至00地址处,操作系统核心代码一直在这里。
3.启动保护模式。
4.使用高级32位指令,跳到0地址处开始执行。
这一堆源码通过makefile产生了一个操作系统镜像,将这个镜像放到04-0扇区,再用这个image进行开机引导,操作系统顺理成章就被读进来,待会初始化产生shell。操作系统启动完成
image是一个树状结构,就是设备树。
head.s作用:第一个文件,又一次的初始化了idt、gdt表。setup只是为了跳到08临时创建了一段gdt表,现在系统要真正工作了,开启20号地址线访问4G内存。
变为了32位汇编代码,还有一种叫内嵌汇编:在一些.c文件中有些指令必须严格按照我们的方式去执行。
head.s完成之后要去执行main.c。由汇编跳到c函数
main是一个死循环,因为操作系统开机就不会停止
mem_init:初始化内存。初始化一个mem_map数组,数组为0就是没有使用。每次右移12位也就是4K,4K为一页。
这个表大小由end_men参数传入,也就是多大内存,从90002处来,也就是setup设置时读入。