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

Posted ^_^|

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统实验02——添加系统调用(理论知识)相关的知识,希望对你有一定的参考价值。

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

操作系统接口表现为函数调用,又由系统提供,所以称为操作系统——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()函数里实现的
在这里插入图片描述

以上是关于操作系统实验02——添加系统调用(理论知识)的主要内容,如果未能解决你的问题,请参考以下文章

Liunx系统中磁盘分区及相关指令——实验操作篇(理论基于理论篇)

Linux内核分析—完成一个简单的时间片轮转多道程序内核代码

完成一个简单的时间片轮转多道程序内核代码

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

实验作业:使gdb跟踪分析一个系统调用内核函数