命令行、图形按钮、应用程序
操作系统接口表现为函数调用,又由系统提供,所以称为操作系统——System_Call
系统调用:
用户程序
内核内存
用户程序为什么不能直接访问内核内存?
不能随意调用数据,不能随意的jmp。
凭什么? ---------------------> 硬件设计,将内核段和用户段隔离
DPL 目标段的特权级
CPL 当前段的特权级
如何进入内核?----------------------> 中断指令int
以实现一个whoaim来深入理解系统调用过程
对于include/unistd.h中给出的每个系统调用宏,都有2+2*n个参数。其中第1个参数对应系统调用返回值的类型;第2个参数是系统调用的名称;随后是系统调用所携带的类型和名称。这个宏会被扩展成包含内嵌汇编语句的C语言函数
这里讲述了syscall3的宏定义对应的是一个内嵌汇编代码,把_syscall3(int, write, int, fd, char*, buf, off_t, count)带入将得到对应翻译代码,解释成汇编,大致意思即
int 0x80
mov %eax, __NR__write
mov %ebx, fd
mov %ecx, count
所以int 0x80, 找IDT表,找到如下的中断处理程序。通过IDT表我们找到的对应CS,此时的CS段选择子,最后两位是0,也即代表此时进入内核态!
通过call _sys_call_table(, %eax, 4)找到我们真正需要调用的内核函数
上面的中断表是什么时候设置的呢,其实就是在上一节main()初始化sched_init()函数里实现的