[求助]Page Fault

CodeLyoko 2012-04-18 08:56:33
最近在写操作系统,已经写到了进程部分,进程调度都已经没有问题了,内存分配也正常,但是……

给每个进程分配了一个4K的页面用作PDE用来重新Map,一个4K的页面用作堆栈。问题就在堆栈。只要特权级变换到User之后,一写这个堆栈就出问题,出现Page Fault,Error Code=0x5,Intel手册中的描述是非页不存在错误,并且在用户模式下出现的错误,我就不知道为什么了,这个堆栈的PDE和PTE的权限都是User,可读写,存在的。而把进程特权级改成0、1、2就不会出现任何错误……

求助啊!!
...全文
233 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeLyoko 2012-05-06
  • 打赏
  • 举报
回复
我感觉应该是分页机制部分的问题,不然不应该出现Page Fault,而应该是出现GP了……
CodeLyoko 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

两个段的9和3都正确,没有问题,但两个段的DPL不对了,都是01,只能由CPL=0、1的进程访问,2和3是不能访问的。
[/Quote]
现在改过来了,所有的LDT和对应的特权级别一样了,现在USER级别的LDT整个的是这样的:
0x00000000c010f320 <bogus+ 8>: 0xff 0xff 0x00 0x00 0x00 0xf9 0xcf 0x00
第五位是0xf9,CPL=03,依旧是那个问题。
我这里对这部分空间有双重映射,高地址也映射到这个地方来了,高地址部分的PDE和PTE都是Supvisor级别的,而其他的线性映射部分就是正常使用的部分都是User级别的,代码地址在高地址。
飞天御剑流 2012-04-20
  • 打赏
  • 举报
回复
两个段的9和3都正确,没有问题,但两个段的DPL不对了,都是01,只能由CPL=0、1的进程访问,2和3是不能访问的。
CodeLyoko 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

DT处于段描述符第5字节第4位,0表示该段是系统段或各种门,1表示存储段,ring3只能访问存储段,不能访问系统段或门。请检查该进程LDT中堆栈段的描述符,看看是否设置成DT0了。
[/Quote]
恩,LDT没与任何问题,第五字节的内容Code是B9,Data是B3,DT位都是1,。
现在的问题是——在ring3下会出现Page Fault,分段应该是没与任何问题的……
飞天御剑流 2012-04-19
  • 打赏
  • 举报
回复
DT处于段描述符第5字节第4位,0表示该段是系统段或各种门,1表示存储段,ring3只能访问存储段,不能访问系统段或门。请检查该进程LDT中堆栈段的描述符,看看是否设置成DT0了。
飞天御剑流 2012-04-19
  • 打赏
  • 举报
回复
可检查LDT中的栈段描述符的DT位,是否搞成系统段了?此位应该置1。
CodeLyoko 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

可检查LDT中的栈段描述符的DT位,是否搞成系统段了?此位应该置1。
[/Quote]
DT位?第几位?LDT中没有这么个东西啊?
CodeLyoko 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

看发生错误的地址所在的页,确定是可读的。
[/Quote]
我确定是可读的,Bochs显示PTE和PDE的属性都是U W P,就是User Write 存在,在0、1、2特权级下都是没有任何问题的……
大熊猫侯佩 2012-04-18
  • 打赏
  • 举报
回复
看发生错误的地址所在的页,确定是可读的。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧