- 本系列博客为观看哈工大李治军老师的操作系统视频而做的整理总结。
- 本文为第一篇,主要是概念认知及阅读启动代码,了解操作系统的启动过程
一、操作系统是什么?
如图所示,操作系统就是界于应用和硬件之间,方便 我们使用硬件(如显存)的一层软件。
它管理哪些硬件?
我们重点关注它的 CPU管理、内存管理、终端管理、磁盘管理、文件管理
学习操作系统的三个层次:
- 应用软件调用操作系统接口
- 应用软件进入操作系统,了解和修改操作系统
- 从底层硬件出发设计并实现操作系统
四个样例实验大体指明操作系统的学习方向和需要具备的能力
二、计算机结构及计算机启动过程
1.冯`诺依曼存储程序思想: 将程序和数据放到计算机内部的存储器中,计算机在程度的控制下一步一步进行处理。
2.计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器
3.计算机开机过程
操作系统刚开始在磁盘上
但是取址执行需要代码放入内存中
所以第一部分工作是将操作系统从磁盘上读入内存中。
计算机刚开机进入的是BIOS, 引导系统启动。
硬盘的第一个扇区上存放着开机后执行的第一段我们可以控制的程序。操作系统从这里开始。
计算机开机执行的第一段启动代码:
MOVW:将DS:SI的内容送至ES:DI,复制过去
此处是将DS ES 左移4位后加上SI DI 值
rep movw
rep 是重复执行直到CX =0 ,movw 是移动1个字
jumpi go ,INITSEG 间接跳转, 段基址加段内偏移(go)
ah al 为ax的高字节,低字节
ch cl 为cx的高字节,低字节
dh dl 为dx的高字节,低字节
如图示,内存地址跨过boot的512字节后如今在90200处,即setup 扇区的起始地址。
该段代码从第2个扇区开始,读4个扇区。 地址从90200开始。 即读入setup
载入setup模块后, msg1为定义的启动阶段显示的字符。
这里的字符串可以自已修改, 对应的要修改mov cx,#24 中的字符个数。
bootsect 完成后要执行 setup 模块
15号中断,获取内存大小
mov [2],ax 是间接寻址 9000<<4 +2 90002
形成管理的数据结构
setup 要移动操作系统到0地址处,此后操作系统一直在这里。
(这就是为什么要将引导扇区从 0x7c00处复制到 90000处开始执行,防覆盖)
实模式是16位 。 保护模式是32位
16位左移4位加IP,最多20位,能寻址的空间是1M . 满足不了内存访问。
32位可以访问4G的内存
这里的jmpi 0,8 是保护模式下的寻址方式,要查gdt表
gdt ( global discription table) 全局描述符表
cs 从该表中选择表项,根据表项+ip产生地址
这个表中必需有内容,所以setup要执行操作,初始化该表
中断表是后面调用接口时会用到
4个字就是8个字节
所以 8 对应的是第二个表项
这样取出的段基址是 0 ,ip也是0 。所以跳到内存0x0000处(32位)
这里放的是system 模块, 开始执行system 模块
要执行system 模块的第一部分代码 head.s
操作系统必须按这样的结构编写。如何保证呢?通过makefile
操作系统写完后是一个镜像 image ,将这个镜像放到0磁道0扇区。
再用这个镜像引导,操作系统就起来了
在head .s 中,要再一次建立idt ,gdt 表。 刚才建立是为了执行jmpi 0,8 .
现在是为了系统运行。
此处是32位汇编代码
head .s 出来要进入main .c
此处的栈是向下生长 ,main函数永不返回
这是初始化内存,以4K为一页,逐页清零