00 写在前面
本系列内容主要是对李治军老师的《操作系统》课程的笔记整理。
b站地址:https://www.bilibili.com/video/BV1d4411v7u7?spm_id_from=333.337.search-card.all.click
01 计算机是如何工作? 取指执行
02 打开电源之后,我们关注的就是指针IP及其指向的内容
1、X86 PC刚开机时CPU处于实模式(注意实模式和保护模式的区别,这里从寻址方式来说,实模式的寻址为CS:IP即CS左移4位+IP);
2、开机时的地址: CS = 0xFFFF; IP = 0x0000;
3、寻址0xFFFF0(ROM BIOS映射区);
4、检查RAM,键盘,显示器,软硬磁盘;
5、将磁盘0磁道0扇区读入0x7c00处;
注释:一个扇区512字节、0磁道0扇区 —— 操作系统的引导扇区
6、设置cs = 0x07c0,ip = 0x0000。
03 引导扇区就是启动设备的第一个扇区
引导扇区就是启动设备的第一个扇区,是开机后执行的第一段我们可以控制的程序。
04 引导扇区代码
注释:
一、为啥要用汇编写?
原因:如何用C语言写,假如定义了一个i,那么i存放在内存的哪个地方,我们是不知道的。而汇编的话,直接对应的就是机器码,是完全可控的。而我们编写此程序,正需要完全可控的。
二、PPT汇编代码,理解所需知识点?
1、与Ds联用,用来确定数据段中某一存储单元的偏移地址。在串处理指令中sI和Dl作为隐含的源变址和目的变址寄存器,此时sI和Ds联用,Dl和Es 联用,分别达到在数据段和附加段中寻址的目的
2、rep术语叫做“重复前缀指令”,因为既然是传递字符串,则不可能一个字(节)一个字(节)地传送,所以需要有一个寄存器来控制串长度。这个寄存器就是CX,指令每次执行前都会判断CX的值是否为0(为0结束重复,不为0,CX的值减1),以此来设定重复执行的次数
3、Jump是直接跳转,jumpi是简介跳转,程序中,即把go赋值给ip
4、90200化成10进制就是512
三、BIOS并不是放在内存中的,而是放在ROM(只读存储器)。
而BIOS由硬件来加载,被加载到 0xF0000~0xFFFFF处;BIOS是存储在ROM里面的,不用调入内存就可直接被CPU运行;
BIOS 运行初期,CPU 其实是不能访问内存的;BIOS 所在的 FLASH 是那种可以被 CPU 直接寻址的 FLASH 芯片。
05 setup模块代码解读
1、读什么?al=扇区数量,cl=开始扇区
可以看到cl即cx低两位是0x02即从第二个扇区读起,al即ax低两位是SETUPLEN=4即读四个扇区
2、读到哪里?es:bx内存地址
可以看到es=0x9000,bx=0x0200,所以是0x90200,就是在引导扇区之后开始装载setup模块
90200化成10进制就是512
参考博文:https://blog.csdn.net/weixin_41761478/article/details/99587236
06 关于ok_load_setup
……
读光标位置
mov cx,#24//24个字符
……
mov bp,#msg1 //msg1就是要显示的内容
……
int 0x10//中断,显示字符
……
call read_it//继续读后面的扇区
如果要更改显示内容,除了修改msg1还要修改mov cx #字符数
参考博文:https://blog.csdn.net/weixin_41761478/article/details/99587236
注释:
1、Call read_it 就是开机时window窗口显示出来之后,停在那里时候,就是在读代码。
2、刚开始操作系统在磁盘上,所以第一步就是将操作系统从磁盘上载入到内存中(内存,才能进行取指执行、取指执行) 这个过程就是BootSect.s来完成的。
也就是第一讲的内容,首先是出现logo,之后将setup读进来,再将system读进来。
07 setup模块,有名字可以联想到此模块是用来完成OS启动前的设置
这张ppt 的重点就是int 0x15中断
注释:
1、扩展内存:1M\1G 之后的内存;
2、为什么要读内存的大小?因为将来需要管理内存。
08 进入保护模式
注释:
1、PE=1,CPU就要走另外一条解释执行的电路,原本的解释执行是CS<<4 + IP(16位)
保护模式下的地址翻译、中断处理(查表法)
09 初始化表
注释:
1、lgdt gdt_48 就是初始化表的意思
2、0表象,8个字节,所以0与1表象之间相差8个字节;
3、 CS:9 IP:0
注释:
1、为啥是跳到0x0000,就是根据GDT表项中的红色部分那一块。
2、跳到0地址执行,因为system模块已经移动到0地址
10 跳到system模块执行
注释:
1、怎么编写操作系统的控制代码 ——Makefile
2、将操作系统最后编译出来的样子称为Image——操作系统镜像
3、我们有一堆源码,通过makefile产生了操作系统镜像,将这个镜像放在零磁零扇区
11 关于汇编
12
head.s执行完之后,就跳出来执行main.c
head.s是汇编,main.c是C函数,这个跳转是如何做到的?
利用堆栈来实现,从堆栈中取出地址
13
注释:
1、4K就1页
2、红色就是使用了,绿色是未使用的。红色使用的部分就是OS
3、将OS读入内存,再初始化