【问题标题】:Who initializes the IDT, the kernel or the processor?谁初始化 IDT、内核或处理器?
【发布时间】:2011-02-26 17:47:12
【问题描述】:

这是来自维基百科...

中断描述符表 (IDT) 是 x86 使用的数据结构 实现中断的架构 向量表。 IDT 由 处理器确定正确的 响应中断和 例外...在 8086 处理器中,IDT 驻留在内存中从地址 0x0000 到 0x03ff 的固定位置...

这是来自http://www.linuxjournal.com/article/4048?page=0,1

当 start_kernel(在 /usr/src/linux/init/main.c) 被调用, 它调用 trap_init(在 /usr/src/linux/kernel/traps.c)。 trap_init 通过 宏 set_trap_gate(在 /usr/include/asm/system.h) 和 初始化中断描述符 表中所示的“偏移量 描述是”表。

我很困惑,因为这两个描述似乎对比...第一个说 IDT 与处理器相关并且独立于内核(实际上它甚至不位于内核中)。第二个说Linux内核初始化IDT并实现ISR的代码,所有ISR的代码都在内核中。

另外,当一个设备对CPU产生一个中断时,是内核还是处理器负责执行中断例程? 请向我解释一下...提前谢谢您

【问题讨论】:

    标签: x86 interrupt interrupt-handling


    【解决方案1】:

    我猜是内核加载和初始化 IDT。[Source]

    请记住,在内核启用中断之前,它必须将 IDT 表的初始地址加载到 idtr 寄存器中并初始化该表的所有条目。此活动在初始化系统时完成。

    IDT 被初始化并由 BIOS 例程,而计算机仍然 在实模式下运行。一旦Linux 接管,但是,IDT 被移动 到 RAM 的另一个区域并初始化 第二次,因为 Linux 没有 使用任何 BIOS 例程。

    查看以下链接:

    【讨论】:

    • @Vivek:谢谢!所以它帮助了你。 ?
    • 是的,确实如此……不过,我还有一个疑问……当设备发出 IRQ 时会发生什么。 CPU 停止并保存执行并查找 IDT。内核如何让 CPU 知道它必须查找的 IDT 是它已经加载的那个,而不是 BIOS 中的那个?
    • 内核“让 CPU 知道”通过执行 LIDT 指令来指定一个新的 IDT。内核不知道是 BIOS 还是内核设置了 IDT。核心仅使用最近加载 LIDT 的表。
    【解决方案2】:

    BIOS 设置初始 IDT,供 BIOS 和引导加载程序使用。它也可以被 16 位操作系统使用,因为它标准化了硬件接口,例如处理一些视频输出的 INT 10h 指令。当 32 位或 64 位内核启动时,它必须指定自己的 IDT 才能切换到保护模式。

    【讨论】:

      【解决方案3】:

      IDT 由位于某个内存位置的多个中断函数地址组成。

      系统启动时由 BIOS 设置默认 IDT。

      当内核启动时,它通常会设置自己的内核。

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多