gpt4 book ai didi

assembly - 段寄存器什么时候被操作系统修改?

转载 作者:行者123 更新时间:2023-12-02 19:33:06 25 4
gpt4 key购买 nike

在x86架构中,有一些段寄存器,如SS、CS、DS、FS、GS。

我知道这些16位寄存器表示LDT、GDT 条目(作为段选择器)和 MMU 引用this(GDT, LDT) 计算段基址+偏移值。并检查权限等等

我好奇的是:谁根据什么来填写段寄存器内容的?内核调度程序?

当应用程序本身更改段寄存器值时会发生什么?我知道只有CS不能改变,因为它有当前CPU的CPL。但其他寄存器(SS、DS...)可以更改。

最佳答案

who fills in the segment register contents based on what??(kernel scheduler??)

引导加载程序可以。 ISR 和异常处理程序可以。系统调用处理程序执行此操作。调度程序确实如此。其他一些部分可能需要。寄存器被假定为私有(private)的并且必须在各种上下文切换期间被保存和恢复。当然,它们也需要在之前的某个时刻进行初始化。

基于这些寄存器中需要的内容。它们的值在操作系统的不同部分和不同程序之间并不普遍共享。

and what happens when application changes the segment register value it self? I know that only CS can not be changed because it has CPL of current CPU. but other registers(SS, DS...) can be changed.

会发生什么?它要么成功地更改它,要么导致异常(通常是#GP),然后发生异常处理程序所做的任何事情,或者,如果没有异常处理程序或有错误,则会发生三重故障,CPU 重置,并且可能会重新启动整个计算机。

如果您知道在当前权限级别还可以加载什么内容,则可以更改任何段寄存器。如果您的程序处于级别 3,并且操作系统为其设置了两个 DPL=3 的代码段,则程序可以将其中任何一个用于 CS 寄存器。如果您不知道这一点,则更有可能使程序崩溃。

I want to know details of x86 segment registers.

给自己准备一份副本并阅读:

英特尔® 64 和 IA-32 架构软件开发人员手册合并卷:1、2A、2B、3A 和 3B。

您可以查阅相关章节(内存管理、中断/异常处理、任务切换)或搜索特定寄存器(例如 CS 或 SS 或 DS)或查看特定指令的描述和伪代码。

对于如此模糊的问题,您不会得到任何更准确的答案。

关于assembly - 段寄存器什么时候被操作系统修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com