《Linux内核分析》课程第五周学习总结
2016-03-27 09:09
615 查看
姓名:何伟钦
学号:20135223
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
内容:1.使用gdb跟踪分析一个系统调用内核函数
2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
[b]一、给MenuOS增加time和time-asm命令[/b]
(一) 克隆并自动编译MenuOS
(二)给MenuOS增加time和time-asm命令
1.更新menu代码到最新版
2.在test.c中main函数里,增加MenuConfig
3.增加对应的两个函数:Time和TimeAsm
4。make rootfs
[b]
[/b]
[b]二、使用gdb跟踪调试内核[/b]
[b]1.运行MenuOS系统[/b]
在实验楼的虚拟机环境里,打击打开shell,使用命令
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
[b]2.调试运行[/b]
[b]1)使用带参数命令启动MenuOS[/b]
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
输入help,可以看到当前的系统调用:
[b]2)启动gdb,设置断点,运行[/b]
(gdb)file linux-3.18.6/vmlinux //在出现gdb提示符后,加载符号文件
(gdb)target remote:1234 //建立和被调试程序的连接
(gdb)break start_kernel //在start_kernel函数入口处设置断点
(gdb)break sys_time //在系统调用time的位置设置断点
(gdb)c //继续输入c,使得系统运行到start_kernel处停住
(gdb)s //单步执行
(gdb)finish // 将这个函数执行完
list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪
(一)系统调用在内核代码中的工作机制和初始化
main.c中start_kernel函数:trap_init()
set_system_trap_gate(SYSCALL_VECTOR,&system_call) 一执行int 0x80,系统直接跳转到system_call。
SYSCALL_VECTOR:系统调用的中断向量
&system_call:汇编代码入口
[b](二)system_call到iret之间的主要代码[/b]
1.SAVE_ALL:保存现场
2.syscall_call:调用了系统调用处理函数(call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是 实际的系统调度程序。 sys_call_table:系统调用分派表)
3.restore all:恢复现场
4.syscall exit work:若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。work_pending -> work_notifysig,用来处理信号,可能call schedule:进程调度代码可能跳转到restore_all,恢复现场。
5. INTERRUPT RETURN:宏,也就是iret,系统调用到此结束
流程图如下:
学号:20135223
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
内容:1.使用gdb跟踪分析一个系统调用内核函数
2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
[b]一、给MenuOS增加time和time-asm命令[/b]
(一) 克隆并自动编译MenuOS
rm menu -rf //强制删除原menu文件
git clone http://github.com/mengning/menu.git //从github中克隆
cd menu //进入menu目录
make rootfs //运行自动编译脚本,生成根文件系统,启动MenuOS
(二)给MenuOS增加time和time-asm命令
1.更新menu代码到最新版
2.在test.c中main函数里,增加MenuConfig
3.增加对应的两个函数:Time和TimeAsm
4。make rootfs
[b]
[/b]
[b]二、使用gdb跟踪调试内核[/b]
[b]1.运行MenuOS系统[/b]
在实验楼的虚拟机环境里,打击打开shell,使用命令
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
[b]2.调试运行[/b]
[b]1)使用带参数命令启动MenuOS[/b]
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
输入help,可以看到当前的系统调用:
[b]2)启动gdb,设置断点,运行[/b]
(gdb)file linux-3.18.6/vmlinux //在出现gdb提示符后,加载符号文件
(gdb)target remote:1234 //建立和被调试程序的连接
(gdb)break start_kernel //在start_kernel函数入口处设置断点
(gdb)break sys_time //在系统调用time的位置设置断点
(gdb)c //继续输入c,使得系统运行到start_kernel处停住
(gdb)s //单步执行
(gdb)finish // 将这个函数执行完
list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪
扩展知识:
[b]三、系统调用在内核代码中的处理过程[/b]
(一)系统调用在内核代码中的工作机制和初始化
main.c中start_kernel函数:trap_init()
set_system_trap_gate(SYSCALL_VECTOR,&system_call) 一执行int 0x80,系统直接跳转到system_call。
SYSCALL_VECTOR:系统调用的中断向量
&system_call:汇编代码入口
[b](二)system_call到iret之间的主要代码[/b]
1.SAVE_ALL:保存现场
2.syscall_call:调用了系统调用处理函数(call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是 实际的系统调度程序。 sys_call_table:系统调用分派表)
3.restore all:恢复现场
4.syscall exit work:若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。work_pending -> work_notifysig,用来处理信号,可能call schedule:进程调度代码可能跳转到restore_all,恢复现场。
5. INTERRUPT RETURN:宏,也就是iret,系统调用到此结束
流程图如下:
相关文章推荐
- Linux平台下的内存泄漏检测
- LINUX磁盘加密之CRYPTO
- 【阿里云ECS】Centos6.5安装图形界面
- linux 系统上开启uRPF
- Linux 每天定时重启
- Linux内核分析——第五周学习笔记
- 分析system_call中断处理过程(Linux)
- LINUX的SOCKET 编程详解
- Linux配置lampp重定向
- Linux下创建并执行python脚本
- Linux学习笔记:Linux软件安装管理【图】
- Linux搭建Java开发环境
- vim编辑器命令小记(一)
- linux内核分析 第五周
- 【我的linux学习之路】sudo与sudoers
- Linux内核协议栈-主要函数调用栈
- Linux 内核源代码情景分析 chap 2 存储管理(一)
- linux下运行java项目
- linux yum命令详解
- 阿里云CentOS 7.1使用yum安装MySql5.6.24