操作系统 --- 如何启动 Boot
打开电源
- 内存中寻址0xFFFF0, 运行这里的代码检查RAM, 键盘,显示器等硬件
默认 CS = 0xFFFF, IP = 0x0000, CS左移四位加IP等于 0xFFFF0- 将硬盘中的0磁道0扇区加载到内存中的0x7c00处
0磁道0扇区储存着操作系统的引导扇区 (boot扇区),从这里开始启动操作系统- 设置 cs=0x07c0, ip = 0x0000:寻找0x7c00
boot扇区: bootsect.s
1.bootsects.s 将操作系统分段读入: 首先读入setup.s, 然后读入system.s
setup扇区: setup.s
- 在setup模块获取计算机基本信息,如光标位置,扩展内存大小,显卡参数等
- 此时计算机使用的是16位模式(计算机此时解释cs, ip结果为16位),大小远远不够
- setup.s在最后通过mov ax, #0x0001 mov cr0,ax将计算机切换为32位模式(保护模式)
- 然后通过jmpi 0, 8 跳转至system模块
- 切换之后通过GDT表解释cs, ip. 结果为32位模式
- CS的作用变为查表+ip位移
system扇区: system.s
- system扇区初始化系统
- system.s 通过makefile执行head.s
- 当执行到move_to_user_mode时系统启动成功, 开机完毕
- main函数是死循环函数,计算运行时永远不会结束
- 这里是内存初始化,将内存分为每页为4k的map