Linux内核分析作业 NO.5

 

 

 

拔掉系统调用的三层皮(下)

于佳心 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

在视频中老师给MenuOS增加time和time_asm命令,并使用gdb跟踪调用内核函数sys _time,在这里我选择02 fork函数,执行相似的流程

 

在MenuOS中添加命令的过程分四步:

1.更新menu代码到最新版

2.在main函数中增加MenuConfig

3.增加对应函数

4.make rootfs

首先输入以上命令

-rf表示强制删除,然后再进行克隆

打开test.c,添加上面的代码

通过make rootfs打开MenuOS界面,输入help,发现新增命令fork和fork-asm已经加入其中

运行一下(图截的不太好)

接下来使用gdb跟踪调试内核

这里我们需要跟踪的函数是sys_time

输入代码

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 
gdb

此时的gdb是stopped阶段

(gdb)file linux-3.18.6/vmlinux # 加载符号表
(gdb)target remote:1234 # 建立连接

将断点设置在start_kernel

接下来按c,让qemu上的Linux继续运行

果然,运行到start_kernel就停下来了

通过list看到start_kernel的函数

换一个地方设置断点再试试,把断点设置在sys_fork

结果也如我所料,运行到这里

接下来可以一步一步的运行,输入s即可

如果一直单步执行会进入schedule函数

sys_tiem返回后进入汇编代码处理,gdb无法继续跟踪

执行int 0x80之后执行system_call对应的代码,但是发现运行后无法停在那里

这是因为,system_call不是正常的函数,只是一般的汇编代码的起点,gdb不支持,停不下来

 

我们还学习了系统调用在内核代码中的工作机制和初始化

enter description here

简化代码的流程图:

通过这次实验,我们发现了,在系统调度返回之前有可能发生进程调度,进程调度又会引发进程上下文的切换

内核是很多种不同的中断处理过程的集合

转载于:https://www.cnblogs.com/javablack/p/5312546.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值