1、思考 OS 开机背后发生的事情
2、图灵机 -> 通用图灵机(把菜谱载入到控制器里,计算机就能做指定的菜)。进一步,把程序载入到内存,执行这个程序出现响应的结果。
- 冯洛伊曼:计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器
- 把程序载入内存(存储器)(取),用一个IP指针指向当前处理的指令(指),运算器、控制器解释执行这条指令(执行),计算机就能执行响应的工作
- 计算机是怎么工作的:“取指执行”
ps:为了帮助大家理解与回忆李治军老师课程内容,本系列图片将保留李老师课堂上的笔记
3、计算机 x86结构(Intel)开机时:
(1) x86 PC刚开机时CPU处于实模式
(2) 开机时,CS = 0xffff; IP=0x0000 (实模式的寻址 CS:IP - CS左移4位+IP)
(3) 寻址0XFFFF0 (ROM BIOS映射区)
(4) 检查RAM,键盘,显示器,软硬磁盘
(5) 将磁盘0磁道0扇区(OS引导扇区)读入内存0x7c00处
(6) 设置 cs=0x07c0,ip=0x0000
- 计算机刚上电内存是固化的寻址0xFFFF0(ROM BIOS-basic input ouput system)
- 一个扇区为 512 bytes
4、引导扇区代码: bootsect.s(s是汇编代码),将被汇编为机器指令,然后放在引导扇区上
- 先将端寄存器分别赋值:ds=7c0, es=900, 再赋值偏移地址: si=0, di=0,于是得到两个地址ds:si,es:di。
movw
移动字,一共移动cx=256个字,即512 bites。将读入的bootsect.s从ds:si移动到es:di,即从7c00移动到90000(为了腾出空间,后续便于把OS整体从90000移动到从00000开始的地方,OS的长度会覆盖到 7c000,所以需要把 OS 先移动90000再去取指执行)- jmpi-间接跳转,go(标号)->ip, INITSEG->cs,即顺序执行跳到go标号处继续
- 关键是
int 0x13
,这是BIOS读磁盘扇区的中断(BIOS中断之一) - cl开始读,读al个扇区,读到 es:bx 内存地址(0x90200,与0x90000差512个字节,因为第一个扇区从90000开始占用了512个字节了)
- bp存放开机显示界面存放的偏移,把#msg1中存放字符串打印到屏幕上
- 再用
int 0x13
中断读 system模块 -> 黑色屏幕干了:打印logo,读入system模块,执行setup.s - 修改OS登录界面的LOGO:
- 修改 msg1 对应的字符串
- 修改
mov cx, #24
, 24是指输出24个字符
- 先通过中断0x13把 system 模块读入,此时 bootsec.s 已经执行完退出,再把控制权交给 setup(SETUPSEG = 0x9020)
bootsect.s 任务总结:
- CS=0xffff, IP=0x0000,ROM BIOS映射区 -> 检查RAM,键盘,显示器,软硬磁盘
- CS=0x07c0, IP=0x0000,磁盘0磁道0扇区的引导扇区bootsect.s -> 先把本身bootsect.s 移动到 CS=0x0900, IP=0x0000 腾出空间
- CS=0x0900, IP=0x0000,还是执行 bootsect.s -> 将磁盘区中4个steup扇区读入boot扇区256个字节之后,执行 bootsect.s
- CS=0x0920, IP=0x0000,还是执行 bootsect.s -> 打印logo,读入system模块,跳到(90200)准备执行 setup.s