linux第五周
第五周
给MenuOS增加time和time-asm命令
更新menu代码到最新版
在main函数中增加MenuConfig
增加对应的Time函数和TimeAsm函数
make rootfs



- 使用gdb跟踪系统调用内核函数sys_time

一直按n单步执行会进入schedule函数
sys_time返回后进入汇编代码处理gdb无法继续跟踪
执行int 0x80之后执行system_call对应的代码

- 系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化

2.系统调用机制的初始化


3.中断上下文的切换和进程上下文的切换
- 实验:使用gdb跟踪分析一个系统调用内核函数
1.运行MenuOS系统
在实验楼的虚拟机环境里,打击打开shell,使用命令
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
即可启动这个用于实验的Linux系统MenuOS,实际上就是一个在Linux内核的基础上,再运行一个简单菜单命令行程序。我们可在MenuOS>的提示符下输入help,看到其全部支持的命令.

2.调试运行
1)使用带参数命令启动MenuOS
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
-S freeze CPU at startup (use ’c’ to start execution)
-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
也就是在启动MenuOS系统的时候,添加了-S和-s这两个参数,这样可以使得系统在刚刚启动的时候,暂停执行。以便等待我们调试器跟踪执行。

2)启动gdb,设置断点,运行
在shell窗口上,右键单击,选择水平分割,在分割出的新的窗口中,输入gdb,在出现gdb提示符后,加载符号文件
(gdb)file linux-3.18.6/vmlinux
建立和被调试程序的连接
(gdb)target remote:1234
在start_kernel函数入口处设置断点
(gdb)break start_kernel
继续输入c,使得系统运行到start_kernel处停住
(gdb)c

在gdb下,使用list,列出断点附近的源代码,使用n,单步执行等命令,从而可以详细的跟踪到Linux系统启动的过程。
gdb调试常用参数
- r(run) : 开始运行程序;
- c(continue) : 继续运行一直到断点停止
- b(break) : 设置程序断点;
- p(print) : 打印出变量值;如 p var,会把var变量的值输出
- s(step) : 单步跟踪,会进入函数内部
- n(next) : 单步跟踪,不进入函数
- finish : 跳出函数调试,并打印返回时的信息
- u(until) : 跳出循环体
- q(quit) : 退出gdb
- l(list) : 显示当前行后面的源程序
- bt (backtrace) : 查看堆栈信息
- info : 查看各类gdb信息以及环境信息,比如:info break 可以查看断点信息
- clear : 清除全部已定义的断点
- delete : 删除指点的断点号,后面接断点号
3. 总结
start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。start_kernel就像是c代码中的main函数。不管你关注Linux的内核模块,总是离不开start_kernel函数的,因为大部分模块的初始化工作都是在start_kernel中完成的。在start_kernel()中Linux将完成整个系统的内核初始化,因此start_kernel函数也比较复杂,好在我们只需要关注自己感兴趣的部分即可。内核初始化的最后一步就是启动init进程这个所有进程的祖先。
在start_kernel的最后,是调用rest_init函数,在rest_init函数,内核将使用下面的代码产生第一个真正的进程,即pid=1的1号进程,而init_task是静态制造出来的,pid=0,我们可以在start_kernel函数的开始处,看到其被初始化的代码 。
课后作业
(一)使用gdb跟踪分析一个系统调用内核函数
加载Linux内核符号表:
设置断点:
在sys_fork函数处设置断点:
列出执行的位置:
单步调试:
linux第五周的更多相关文章
- Linux第五周学习总结——扒开系统调用的三层皮(下
Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...
- 20135320赵瀚青LINUX第五周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...
- 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...
- Linux 第五周 实验: 分析system_call中断处理过程
姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一个系统调用内核函数 ...
- 20135316王剑桥 linux第五周课实验笔记
4.1.1程序员的可见的状态 ———— Y86的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态.如图1所示. 1.程序寄存器(Program registers): %eax, %ec ...
- Linux第五周学习总结
作者:黎静 一.知识点总结 (一)给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.test.c中main函数里,增加MenuConfig() 3.增加对应的两个函数 ...
- Linux内核设计第五周——扒开系统调用三层皮(下)
Linux内核设计第五周 ——扒开系统调用三层皮(下) 一.知识点总结 1.给MenuOS增加新的命令的步骤 更新menu代码到最新版 test.c中main函数里,增加MenuConfig() 增加 ...
- 《Linux内核分析》第五周学习总结
<Linux内核分析>第五周学习总结 ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...
- 《Linux内核分析》第五周学习笔记
<Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
随机推荐
- JS:“分享到”之类的悬浮框的运动原理(代码)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JavaWeb温习之HttpServletResquest对象
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息. 1 ...
- C# MVC跳转
MVC方式: 显示提示框,并返回上一页 return Content("<script>alert('暂时没有实践作业!');history.go(-1);</script ...
- 【BZOJ3275】Number 最小割
[BZOJ3275]Number Description 有N个正整数,需要从中选出一些数,使这些数的和最大.若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c ...
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- 微信小程序 --- 设置app.js/page.js参数的方法
设置 app.js 文件: //app.js App({ globalData: { is_login:false, userInfo:{} } }) 设置gloabalData的方法: // 定义a ...
- 从零打造在线网盘系统之Struts2框架起步
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
- mysql 远程连接超时解决办法
设置mysql远程连接root权限 在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接. 需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程 ...
- Centos6.8 防火墙设置
1.指令 vi /etc/sysconfig/iptables 添加以下内容和要开放的端口 # Firewall configuration written by system-config-fire ...
- Oracle表的维护(字段,重命名表名)
案例:银行里建的开卡信息 字段 字段类型 Id Number name Varchar2(64) sex Char2() birth Date money Number(10,2) 创建银行卡表 cr ...