【发布时间】:2013-11-01 08:06:33
【问题描述】:
BIOS 调用在 Linux 操作系统中不可用。我想知道内核如何阻止执行包含对 BIOS 子例程的调用的指令?
【问题讨论】:
-
你的意思是在用户空间调用bios例程吗?
-
Linux 根本不公开 irq 以供任何程序员使用,因此 bios irq 的。
BIOS 调用在 Linux 操作系统中不可用。我想知道内核如何阻止执行包含对 BIOS 子例程的调用的指令?
【问题讨论】:
BIOS 主要在 16 位模式下可用,而不是在运行 Linux 的x86 的 32 位或 64 位模式下。
一个Linux进程在user mode中运行,使用virtual memory,它有自己的虚拟address space。
某些机器指令(尤其是用于进入 BIOS 的 INT)具有特权,因此无法在用户模式下运行。如果你尝试在用户模式下运行它们,处理器会产生一个机器异常,内核会通过发送一些信号来处理它。 (一些INT 也用于系统调用,但SYSENTER 指令是首选)。
应用程序使用syscalls 与内核交互(可能通过VDSO)。
阅读assembly howto。也可以在kernelnewbies.org询问
Linux 内核为open source,您可以从kernel.org 下载并研究其源代码
PS。 2020 年后注意UEFI。这是一件复杂的事情。
【讨论】:
INT n 指令生成对目标操作数指定的中断或异常处理程序的调用。目标操作数指定一个从 0 到 255 的中断向量号,编码为 8 位无符号中间值。每个中断向量号都为 IDT 中的门描述符提供了一个索引。
选定的中断描述符又包含一个指向中断或异常处理程序的指针。在保护模式下(Linux 仅在保护模式下工作),IDT 包含一个 8 字节描述符数组,每个描述符是一个中断门、陷阱门或任务门。
此 IDT 由操作系统设置。 Linux 对其进行了设置,以便描述符指向它自己的处理程序,而不是 BIOS 处理程序。
【讨论】: