一:给MenuOS增加命令
本次实验要将实验四的两个实验集成到MenuOS系统中,将其作为MenuOS系统的两个命令。
1.打开QEMU
2.使用以下指令打开test.c:
3.给menu中的test.c 中MenuOS增加rename函数和rename_asm函数:
后面主函数也要进行修改:
然后再次运行发现增加了rename,rename_asm:
二:使用gdb跟踪系统调用内核函数sys_time
需要调试跟踪time命令所用到的系统调用内核处理函数。
1.先启动gdb,把3.18.6的内核加载进来之后连接到target remote 1234.
2.设置断点。在 start_kernel 处设置断点。
三:system_call流程示意图
三:系统调用总结
1)系统调用可以通过编程语言的API和汇编代码实现
2)调用是一个用户态->内核态->用户态的过程
3)当调用一个系统调用时,CPU从用户态切换到内核态并开始执行一个system_call和系统调用内核函数。在Linux中通过执行int 0x80来触发系统调用,内核为每个系统调用分配一个系统调用号,用户态进程必须明确指明系统调用号,需要使用EAX寄存器来传递。
4)系统调用可能需要参数,但是不能通过像用户态进程函数中将参数压栈的方式传递,因为用户态和内核态有不同的堆栈,必须通过寄存器的方式传递参数。
5)普通情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程。
6)操作系统通常是通过中断从用户态切换到内核态。中断就是一个硬件或软件请求,要求CPU暂停当前的工作,去处理更重要的事情。
比方在x86机器上能够通过int指令进行软件中断。而在磁盘完毕读写操作后会向CPU发起硬件中断。
中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table)。这个数组存储了全部中断处理程序的地址,而中断号就是对应中断在中断向量表中的偏移量。
一般地,系统调用都是通过软件中断实现的,x86系统上的软件中断由int $0x80指令产生,而128号异常处理程序就是系统调用处理程序system_call()。