最小的16位示例
首先学习如何创build一个最小的bootloader操作系统,并在QEMU和真正的硬件上运行它,正如我在这里解释的: https : //stackoverflow.com/a/32483545/895245
现在你可以运行在16位实模式下:
movw $handler0, 0x00 mov %cs, 0x02 movw $handler1, 0x04 mov %cs, 0x06 int $0 int $1 hlt handler0: /* Do 0. */ iret handler1: /* Do 1. */ iret
这将按顺序进行:
Do 0.
Do 1.
hlt :停止执行
注意处理器如何查找第一个地址为0处理程序,第二个处理程序是4 :这是一个称为IVT的处理程序表,每个条目有4个字节。
最小的例子,做一些IO使处理程序可见。
最小保护模式
现代操作系统以所谓的保护模式运行。
在这种模式下处理有更多的select,所以更复杂,但精神是一样的。
关键的一步是使用LGDT和LIDT指令,它们指向描述处理程序的内存数据结构(中断描述符表)的地址。
最小的例子
Linux使用0x80
Linux为0x80设置中断处理程序,以便实现系统调用,这是用户程序与内核进行通信的一种方式。
你不能直接从userland设置你自己的处理程序,因为你只有ring 3,Linux会阻止你这样做。
你好世界的例子:
.data s: .ascii "hello world\n" len = . - s .text .global _start _start: movl $4, %eax /* write system call number */ movl $1, %ebx /* stdout */ movl $s, %ecx /* the data to print */ movl $len, %edx /* length of the buffer */ int $0x80 movl $1, %eax /* exit system call number */ movl $0, %ebx /* exit status */ int $0x80
编译并运行:
gcc main.S as -o main.o main.s ld -o main.out -s main.o ./main.out
更好的select
int 0x80已经被更好的select::第一个sysenter ,然后是VDSO。
x86_64有syscall 。
另请参阅:有什么更好的“INT 0x80”或“系统调用”?