操作系统实验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内核分析—完成一个简单的时间片轮转多道程序内核代码
操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)