B站视频链接 - 【205.读取磁盘代码】
加载内核
把内核代码加载到内存中的哪个位置?
x86实模式内存布局
| 起始 | 结束 | 大小 | 用途 |
|---|
| FFFF0 | FFFFF | 16B | BIOS系统入口地址 |
| F0000 | FFFEF | 64KB-16B | BIOS系统源代码 |
| C8000 | EFFFF | 160KB | 映射硬件适配器的ROM或内存映射I/O |
| C0000 | C7FFF | 32KB | 显示适配器BIOS |
| B8000 | BFFFF | 32KB | 文本模式显示适配器 |
| B0000 | B7FFF | 32KB | 黑白显示适配器 |
| A0000 | AFFFF | 64KB | 彩色显示适配器 |
| 9FC00 | 9FFFF | 1KB | EBDA扩展BIOS数据区 |
| 7E00 | 9FBFF | 622080B约608KB | 用做存储内核代码 |
| 7C00 | 7DFF | 512B | MBR |
| 500 | 7BFF | 30464B约30KB | |
| 400 | 4FF | 256B | BIOS数据区 |
| 000 | 3FF | 1KB | 中断向量表 |
内存规划
| 起始 | 结束 | 大小(扇区) | 用途 |
|---|
| 7C00 | 7DFF | 1 | BOOT |
| 7E00 | 8FFF | 9 | BOOT LOADER |
| 9000 | 9FBFF | * | KERNEL |
内核加载过程
graph LR;
A("Boot")
B("Boot Loader(Kernelx16)")
C("Kernelx32")
A-->B-->C
Boot职责
- 从硬盘中读取
kernelx16代码到内存中
- 跳转到
kernelx16的_start位置开始执行
BootLoader(Kernelx16)职责
Kernelx32职责