目录
- 第二章
- 第四章
- 什么是物理地址、线性地址、虚拟地址?
- 为什么要使用保护模式?个人理解:
- 中断表无法处理:
第二章
- 即使内存条大小没有超过地址总线的范围,也不会全都能被访问到,毕竟要预留一些地址用来访问其他外设,所以最终还得看地址总线把地址指向哪块内存了。这就是安装了4GB内存,电脑中只显示3.8GB的原因。
- x86中CS:IP寄存器寻址方式:如CS = FFFFH, IP = 0000H,在取出CS:IP中的地址前先对这两个寄存器中所存储的地址进行相加操作,操作如下:1.CS中的数据左移四位, 所以最终CS = FFFF0H(为什么会得到这个结果?因为这个数据是16进制的,“H”代表了“HEX”) 2.CS+IP = FFFF0H+0000H = FFFF0H。3.最后地址加法器将“FFFFF0H”这个地址输出,并且开始寻找该地址所在的内存单元,由此可以CS:IP两个寄存器相加所得到的地址才是实际的代码段的内存单元的地址。
第四章
什么是物理地址、线性地址、虚拟地址?
- 在实模式下,“段基址+段内偏移地址”经过段部件的处理,直接输出的就是物理地址
- 而在保护模式下,“段基址(段选择子)+段内偏移地址”称为线性地址
- 若开启了分页功能,此线性地址又多了一个名字,就是虚拟地址(虚拟地址、线性地址在分页
机制下都是一回事)。
为什么要使用保护模式?个人理解:
- 段全局描述符表是存放在内存中的
- 是为了扩展寻址的大小。使用保护模式后,有32位段基址可供选择,基本上可以寻到0-4G任意空间
- 主要还是为了安全功能。使用保护模式,有专门的bit来判断你是否可读可写可执行这一段内存,你访问的内存有没有超出段界限等等
中断表无法处理:
很明显,中断表有问题,选择子正常,但基址不对。
赋值有问题,赋值不对
压栈有问题,压入的中断向量表表项基址为0
但是确实能找到中断向量表,有问题。怀疑链接有问题,用nasm编译的kernel.S和gcc编译的main.c无法正常链接