Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92374
  • 博文数量: 12
  • 博客积分: 1499
  • 博客等级: 上尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-20 10:01
文章分类
文章存档

2010年(1)

2008年(11)

我的朋友

分类:

2008-10-16 09:06:53

i386的内存管理模式包括两种,即实模式与保护模式。

选择子(Selector)
段寄存器CS,SS,DS,ES,FS与GS的值均叫做选择子(selector)。CS的值为代码段的地址,而EIP为下一条指令对于CS的值的偏移位置。段间转换控制如calls, jumps, returns, 中断与异常等通过修改CS的值来实现。SS为栈指针,而DS,ES,FS和GS可指向四个不同的数据段。

在实模式下,段寄存器的值为20-bit的高16-bit值。而在保护模式下,它的值为一个各描述符为64-bit的描述符表(descriptor)的索引。通过selector找到该表对应项的值,该项包括一个32-bit的地址,以及其它一些如权限之类的信息。这个地址即为基地址,所有的虚拟地址加上这个值将得到线性地址。此时如果分页机制没有打开,则该线性地址也就是物理地址,否则需要通过分页转换去得到最终的物理地址。

描述符(Descriptors)
所有的描述符均为8字节,位于其相应描述符表内。段描述符描述了相应段的属性,如段的起始位置,大小,类型以及访问权限等。

描述符表
共有三种:GDT,LDT,IDT。GDT包含8191项(GDT0保留),可被所有的task访问;LDT包含8192项,仅能被某个对应的task访问。IDT包括256项gates。每个中断对应的中断号即为IDT的索引,通过查找IDT可得到对于的中断处理函数的地址。


Selectors
选择子为段寄存器的内容,包括3部分:Index, TI, RPL. Index指定了描述符项,13bit的大小正好对应8192个描述符项;TI指定是LDT(TI=1)还是GDT。RPL用于保护模式。

一般保护性错误interrupt 13
当应用程序试图破坏段寄存器内容设定的权限时,会发生该错误。通常如下企图会导致该错误:
写只读的段;读不可读的段,写代码段

栈错误interrupt 12
由于往栈内压入值时,栈会增长,当它到达描述符中的Limit值时,就会发生该错误

特权级检测
一共有三个与特权相关的数据结构:
CPL:CS寄存器中的最后两位,为当前运行时代码的权限
DPL:描述符中的特权级
RPL:selector中的最后两位,代表创建该selector的代码的权限

高权限级别的代码可以访问代权限级别的数据段,而由于每个特权级别都有一个对应的栈,所以只有同级别的selector可以load到相应的段寄存器(SS)中。

当用CALL,JMP,RET,INT和IRET等切换代码的执行时,目标selector必须为:
1。另外一个代码段
2。一个gate(call,interrupt 或者 trap)
3。任务状态段(一个新的任务)


线性地址到物理地址的转换:
用线性地址的最高10位为索引,在CR3所指向的页目录表中找到对应的目录项(即页表)。以线性地址的中间10位为索引,在页表中找到对应的页面地址。将该20位地址与线性地址中低12位组合即为最终的物理地址。

任务gate描述符和中断以及陷阱gate描述符几乎一样,除了type域为00101不一致。都保存在GDT中。

TR(任务寄存器)通过其内容为16bit的Selector指向GDT中的TSS描述符,从而可以实现任务的切换。
阅读(2473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~