2022-2023-1 20222810《Linux内核原理与分析》第六周作业

一:给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()。
 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值