操作系统实验02——添加系统调用(理论知识)

命令行、图形按钮、应用程序

操作系统接口表现为函数调用,又由系统提供,所以称为操作系统——System_Call

系统调用:

操作系统实验02——添加系统调用(理论知识)_第1张图片

用户程序
内核内存

用户程序为什么不能直接访问内核内存?
不能随意调用数据,不能随意的jmp。

凭什么? ---------------------> 硬件设计,将内核段和用户段隔离
操作系统实验02——添加系统调用(理论知识)_第2张图片
DPL 目标段的特权级
CPL 当前段的特权级

如何进入内核?----------------------> 中断指令int

以实现一个whoaim来深入理解系统调用过程
操作系统实验02——添加系统调用(理论知识)_第3张图片
操作系统实验02——添加系统调用(理论知识)_第4张图片
操作系统实验02——添加系统调用(理论知识)_第5张图片
对于include/unistd.h中给出的每个系统调用宏,都有2+2*n个参数。其中第1个参数对应系统调用返回值的类型;第2个参数是系统调用的名称;随后是系统调用所携带的类型和名称。这个宏会被扩展成包含内嵌汇编语句的C语言函数

操作系统实验02——添加系统调用(理论知识)_第6张图片
这里讲述了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,也即代表此时进入内核态!

操作系统实验02——添加系统调用(理论知识)_第7张图片
通过call _sys_call_table(, %eax, 4)找到我们真正需要调用的内核函数
操作系统实验02——添加系统调用(理论知识)_第8张图片

上面的中断表是什么时候设置的呢,其实就是在上一节main()初始化sched_init()函数里实现的
操作系统实验02——添加系统调用(理论知识)_第9张图片

你可能感兴趣的:(操作系统实验)