首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于堆栈切换的TSS条目

用于堆栈切换的TSS条目
EN

Stack Overflow用户
提问于 2020-04-04 04:53:01
回答 1查看 168关注 0票数 1

我已经读到,TSS包含有关寄存器等的信息。现在,我正在尝试实现从内核到用户模式的切换。我已经阅读了英特尔80386手册,并查看了这个资源:http://www.brokenthorn.com/Resources/OSDev23.html获得一个通用工作流。他们这样做:

代码语言:javascript
复制
void install_tss (uint32_t idx, uint16_t kernelSS, uint16_t kernelESP) {

    //! install TSS descriptor
    uint32_t base = (uint32_t) &TSS;
    gdt_set_descriptor (idx, base, base + sizeof (tss_entry),
        I86_GDT_DESC_ACCESS|I86_GDT_DESC_EXEC_CODE|I86_GDT_DESC_DPL|I86_GDT_DESC_MEMORY,
        0);

    //! initialize TSS
    memset ((void*) &TSS, 0, sizeof (tss_entry));

    TSS.ss0 = kernelSS;
    TSS.esp0 = kernelESP;

    TSS.cs=0x0b;
    TSS.ss = 0x13;
    TSS.es = 0x13;
    TSS.ds = 0x13;
    TSS.fs = 0x13;
    TSS.gs = 0x13;

    //! flush tss
    flush_tss (idx * sizeof (gdt_descriptor));
}

我搞不懂为什么RPL = 3

在我的例子中,当我处于用户模式,并且我想使用一个陷阱门进入内核模式时,陷阱门中的cs段将有RPL 0 ( 16位段的最后2位),与cs段对应的GDT条目也有DPL 0。我读过一个级别间的特权交换交换机栈(只??)看着TSS。我猜上面的代码必须有一个TSS.ss = 0x10。

注意:我们假设经典的0x08 =内核代码,0x10 =内核数据,.GDT结构

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 06:43:55

TSS结构有许多用于硬件任务切换的字段(例如TSS.ss,如果发生硬件任务切换,ss寄存器的内容将被保存/加载),以及一些用于将任务切换到更高权限级别的字段(例如,(e.g.TSS.ss0`,用于切换到CPL=0)。

您正在查看用于硬件任务切换的字段(这些字段通常不值得使用,因为代替软件任务切换更快);我猜有人在其中插入了一些“硬件任务开关兼容”的值(即使它们没有被使用),以避免未初始化的值。

相反,您需要查看TSS的TSS.esp0TSS.ss0字段,这是TSS中仅有的两个与切换到CPL=0有关的字段(并且可能是您曾经使用过的TSS的唯一两个字段)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61023925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档