【操作系统】-- 李治军老师《操作系统》笔记整理1

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读入内存,再初始化

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值