1.上次说要实现键盘中断还没实现的
2.接着又有问题了就是对于异常的处理,例如一个也异常的处理
一直在512字节里面写很憋屈,这下把书上的代码用上暂且内存分布如下
慢慢修改了,在更新修改
#直接用给的程序加载从第二个扇区开始
#加载的是保护模式的程序
#但是加载到什么地方哪?按照书上的位置
#显示的时候直接写显存位置怎么处理?怎么回车换行
#用一个全局变量标示写入的位置80*25的标准
#全局段描述表
0 空
1 数据段 初始地址是0x0 界限是4G 4G 全局修改
2 主程序加载的段 初始地址是0x7C00 界限是1FF 512字节 跳转保护
3 堆栈段 初始地址是0x7C00 界限是0xFFFFE000<<FFFFFFFF 大小4KB ESP的初始值?
4 显示描述 初始地址是0xB8000 界限是7FFFF 也就是
5 系统公用例子代码段
6 内核数据段
7 内核代码段
#全局段描述表结束
#中断描述符
中断段 初始地址是0X0000A000 界限是2^11-1=0X7FF
#中断段描述符结束
#内存分布图
00000000
00006C00-------------------------------------
|
4KB大小内核栈 地址换算 基地址限长 3
|
00007C00-------------------------------------
|
512字节的引导位置 2
|
00007DFF-------------------------------------
00007E00-------------------------------------
|
描述符位置(每个描述符占位8个字节) 1ff=512/8=64
|
00007FFF---------------------------------------
|
描述符防止不够空缺出来的 512额外字节
|
000081FF----------------------------------------
00008200----------------------------------------
|
LDT描述符位置 1ff=512/8=63
|
000083FF----------------------------------------
|
防止描述符不够额外添加的 512额外字节
|
000085FF----------------------------------------
00008600----------------------------------------
|
tss描述符 1ff
|
00009FFF----------------------------------------
0000A000----------------------------------------
|
中断安装的位置 256*8=2^11
|
0000A800-----------------------------------------
00010000---------------------------------------
00011000--------------------------------------
00020000-------------------------------------
|
1024页目录 4KB
|
00021000-------------------------------------
|
1024页表 4KB->4M
|
00022000-------------------------------------
00040000-------------------------------------
|
系统核心的程序和数据加载位置(大小不固定)
|
0009ffff-------------------------------------
000A0000
000B8000-------------------------------------
|
显示区域 4
|
000BFFFF-------------------------------------
000fffff
00100000-------------------------------------
|
用户程序和数据
|
FFFFFFFF-------------------------------------
------------------------------------------
更新:内存地址加载初始位置不变
运行地址改为了0x50400处(由链接的过程静态确定了)