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