dae*_*hee 4 x86 assembly kernel
在x86架构中,有一些段寄存器,如SS,CS,DS,FS,GS.
我知道这些16位寄存器表示LDT,GDT条目(作为段选择器),MMU引用它(GDT,LDT)来计算段基+偏移值.并检查权限等.
我很好奇的是:谁根据什么填写段寄存器内容?内核调度程序?
当应用程序更改段寄存器值本身时会发生什么?我知道只有CS才能更改,因为它具有当前CPU的CPL.但是其他寄存器(SS,DS ......)可以改变.
谁根据什么??(内核调度程序??)填写段寄存器内容
引导加载程序.ISR和异常处理程序.系统调用处理程序.调度程序.其他一些部分可能需要.假定寄存器是私有的,并且必须在各种上下文切换期间保存和恢复.当然,它们也需要在之前的某个时刻进行初始化.
基于这些寄存器中需要的内容.它们的价值不是在操作系统的不同部分之间以及不同程序之间普遍共享的.
当应用程序自行更改段寄存器值时会发生什么?我知道只有CS才能更改,因为它具有当前CPU的CPL.但是其他寄存器(SS,DS ......)可以改变.
怎么了?它要么成功地更改它,要么导致异常(通常是#GP)然后发生异常处理程序所做的事情,或者如果没有或它有错误,三重故障,CPU重置以及可能重启整个计算机.
如果您知道在当前权限级别可以加载哪些其他段,则可以更改任何段寄存器.如果您的程序处于第3级并且操作系统为其设置了DPL = 3的两个代码段,则程序可以将它们中的任何一个用于CS寄存器.如果你不知道,你更有可能只是崩溃程序.
我想知道x86段寄存器的细节.
给自己一份副本并阅读:
英特尔®64和IA-32架构软件开发人员手册合并卷:1,2A,2B,3A和3B.
您可以查看相关章节(内存管理,中断/异常处理,任务切换)或搜索特定寄存器(例如CS或SS或DS),或查看特定指令的伪代码说明.
你不会对这些模糊的问题得到任何更准确的答案.
| 归档时间: |
|
| 查看次数: |
1381 次 |
| 最近记录: |