Linux内核分析实验五
2016-03-27 21:17
253 查看
一、给MenuOS增加time和time-asm命令
1. 克隆并自动编译MenuOS
rm menu -rf
强制删除原
menu
文件
git clone http:
cd menumake
rootfs
运行自动编译脚本,生成根文件系统,启动
MenuOS
2. 给MenuOS增加time和time-asm命令
更新menu代码到最新版test.c中main函数里,增加MenuConfig
增加对应的两个函数:Time和TimeAsm
make rootfs
![](http://images2015.cnblogs.com/blog/744799/201603/744799-20160327211835401-493444906.jpg)
二、调试内核
1. 使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/
x86/boot/
bzImage -initrd rootfs.img -s -S
gdb
(
gdb
)
file linux-3.18.6/vmlinux
(
gdb
)
targetremote:1234 [/code]
b sys_time:在系统调用time的位置设置断点
c:在MenuOs里使用time,停在断点处
s 单步调试—一步一步执行(PS:无法执行time_asm中的int 0X80部分)
![](http://images2015.cnblogs.com/blog/744799/201603/744799-20160327211847058-1501768728.jpg)
三、系统调用在内核代码中的处理过程
1. 系统调用在内核代码中的工作机制和初始化
main.c中start_kernel函数:trap_init()set_system_trap_gate(SYSCALL_VECTOR,&system_call)
SYSCALL_VECTOR:系统调用的中断向量
&system_call:汇编代码入口
一执行int 0x80,系统直接跳转到system_call。
2. 系统调用——一个特殊的中断
![](http://images2015.cnblogs.com/blog/744799/201603/744799-20160327211802854-912031852.png)
SAVE_ALL:保存现场
call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序。
sys_call_table:系统调用分派表
syscall_after_all:保存返回值
若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
work_pending -> work_notifysig,用来处理信号
可能call schedule:进程调度代码
可能跳转到restore_all,恢复现场。
若无sys_exit_work,就执行restore_all恢复,返回用户态。
INTERRUPT_RETURN <=> iret,结束。
- [code]在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换。-
进程间通信可能有信号需要处理。-
可以将内核视为一系列中断指令的集合。
四、实践
1. 使用gdb跟踪分析122号系统调用内核函数:uname
先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。在test.c中增加我编写的两个函数:Uname()和UnameAsm()
在main函数中增加两个函数的MenuConfig命令项:
make rootfs编译错误:
原因:忘记添加头文件<sys/utsname.h>
编译运行,在MenuOS中输入help,可以查看当前所有的系统调用,分别执行uname、uname-asm进行系统调用:
插入断点并调试:
2. 从system_call到iret
五、总结:从系统调用处理过程到一般的中断处理过程
系统调用就是特殊的一种中断
1. 保存现场
在系统调用时,我们需要SAVE_ALL,用于保存系统调用时的上下文。
同样,中断处理的第一步应该也要保存中断程序现场。目的:在中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。
2. 确定中断信息
在系统调用时,我们需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调
同样,中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。
3. 处理中断
跳转到相应的中断处理程序后,对中断进行处理。4. 返回
系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。
相关文章推荐
- 《Linux内核设计与实现》——第18章(调试)
- Linux学习笔记_常用命令2
- linux内核分析第五周学习笔记
- Linux启动流程概述
- Linux内核协议栈(8)IO复用select函数
- linux权限之su和sudo的区别
- Linux内核协议栈(7)listen函数分析
- Linux磁盘及文件系统管理
- Linux磁盘及文件系统管理
- Linux下DHCP服务器配置与应用
- Linux进程管理工具top/htop/glances/dstat的使用
- Linux文件系统管理之一(文件权限管理)
- CentOS6 编译安装python 3.5
- Linux学习笔记——切换并取代用户身份命令——su
- 《Linux内核设计与实现》——第5章(系统调用)
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)
- Linux内核分析——系统调用(下)
- Linux开发环境搭建 一 (Ubuntu安装的方式,如何选择?)
- CentOS启动流程、Grub legacy配置、linux kernel模块管理、伪文件系统介绍
- Linux内核协议栈(附3)udp_lib_get_port函数