一、计算机的三个法宝

存储程序计算机,函数调用堆栈,中断
二、操作系统的两把剑:
1.中断上下文的切换,保存现场和恢复现场
2.进程上下文的切换。

三、linux内核源代码的分析:

·arch/目录保存支持多种CPU类型的源代码,重点是x86
·init目录:含有main.c,内核启动相关的代码基本都在init目录下
·ipc目录:进程间的通信
·kernel目录:有Linux内核的核心代码。
四、构造一个简单的Linux系统

使用实验楼的虚拟机打开shell

1.cd LinuxKernel/
2.qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

内核启动完成后进入menu程序,支持三个命令help、version和quit。

五、使用gdb跟踪调试内核

使用gdb跟踪调试内核

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) cpu初始化之前把它冻结起来
//-s shorthand for -gdb tcp::1234 在1234端口上建立了一个gdb server
若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

gdb

(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

(gdb)c # 系统开始启动,启动到start_kernel

(gdb)list # 可以看到start_kernel上下的代码

(gdb)break rest_init

(gdb)c # 当前系统执行到rest_init

(gdb)list # 可以看到rest_init是在start_kernel的尾部调用的。

(gdb)break kernel_thread

(gdb)c # 当前系统执行到kernel_thread

(gdb)list # 这一步可以看到kernel_thread(kernel_init,NULL,CLONE_FS)

(gdb)break kernel_init

(gdb)c # 当前系统执行到kernel_init

(gdb)list #

(gdb)break run_init_process

(gdb)c

(gdb)d 3 # kernel_thread的编号为3

(gdb)c # 停在run_init_process

(gdb)list

六、Linux内核的启动过程

启动Linux内核的三个参数:kernel initrd root所在分区、目录

最重要的一行代码:

qemu -kernel (文件名) -initrd (rootfs.img)

qemu相当于打开一个虚拟机

kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。

initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。

所以就是要启动一个内核,挂一个硬盘,然后再运行一个init即1号进程。
也就是说,init中main.c中有一个start_kernel函数
在start_kernel函数的尾部调用了一个rest_init
有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

0号进程创建了1号进程和其他
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
kernel_init中有run_init_process,
run_init_process创建了一号进程,默认路径下的程序。

七、实验过程

构造一个简单的Linux系统MenuOS:

构造一个简单的Linux系统MenuOS

1、使用gdb跟踪调试内核

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选项

当前状态是被冻结起来的。

2、gdb设断点

(1)另外打开一个shell窗口

gdb

(gdb)file linux-3.18.6/vmlinux  #在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234  #建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel  #断点的设置可以在target remote之前,也可以在之后

(2)设置完断点后,输入c命令继续执行,函数会停在断点处。

(3)输入list指令可以查看断点处的代码。

八、简单分析start_kernel

1、全局变量init_tast:即手工创建的pcb,0号进程即最终的idle进程。

2、trap_init:硬件中断,初始化一些中断向量,系统调用。

   set_intr_gate:设置中断门。

set_system_trap_gate:系统陷阱门SYSCALL VECTOR。

3、mm_init:内存管理模块初始化。

4、sched_init:进程调度初始化函数,函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。

5、rest_init:其他初始化函数,函数内将创建1号进程,即init进程。

6、init_process:是linux系统中的1号进程,是第一个用户态进程,默认根目录下的init程序。

7、kthreadd:内核线程,用来管理系统资源

linux内核分析 第三周 构造一个简单的Linux系统MenuOS的更多相关文章

  1. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  2. Linux内核分析第三周——构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  3. Linux内核设计第三周——构造一个简单的Linux系统

    Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...

  4. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  5. 第三周 构造一个简单的Linux系统MenuOS

    一.   Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ...

  6. 第三周 构造一个简单的Linux系统

    20135331文艺 首先 在上周内容中我们学习了 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 本周中得知 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程 ...

  7. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  8. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  9. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

随机推荐

  1. POJ-3122(二分算法)

    //题意:这是一个分蛋糕的游戏, t个测试数据,输入n, f n代表的是n块蛋糕,蛋糕的高为1, f代表的是f个人朋友,然后输入每份蛋糕的半径 // 将n块蛋糕分成 f+1 份 每一份都是完成的一块蛋 ...

  2. 套接口socket编程(Client/Server编程实例)

    基本概念 套接口也就是网络中的ID.网络通信,归根到底还是进程间通信(不同计算机上的进程间的通信).在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地址. IP地址:在网络中唯一标识 ...

  3. 基于日志报警插件 elastalert 实现告警

    1.官方http://elastalert.readthedocs.io/en/latest/ 2.报警规则示例 http://elastalert.readthedocs.io/en/latest/ ...

  4. RC电路简介,RC串并联电路的工作原理及应用

    RC电路简介,RC串并联电路的工作原理及应用 RC电路全称Resistance-Capacitance Circuits.一个 相移电路(RC电路)或称 RC滤波器. RC网络, 是一个包含利用电压源 ...

  5. Tim Cook在电话会议上宣布,Burberry前CEO Angela Ahrendts将在下周加入苹果

    在今天的第二季度财报电话会议上,苹果公司的 CEO Tim Cook 宣布 Burberry 的前 CEO Angela Ahrendts 将在下周入职苹果,出任苹果负责零售和网上商店的高级副总裁. ...

  6. os模块大全详情

    python常用模块目录 一:os模块分类: python os.walk详解 二:os模块大全表 序号 方法 方法 1 os.access(path, mode) 检验权限模式 2 os.chdir ...

  7. kafka可靠性

    文章转载自: http://blog.csdn.net/u013256816/article/details/71091774

  8. CSS布局之圣杯布局和双飞翼布局

    其实圣杯布局和双飞翼布局实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果都是一样的,差别在于其实现的思想. 一.圣杯布局 html代码中,将重要的内容 ...

  9. 效能检测 psp

    1.本周psp: 2.本周进度条: 3.累计进度图(折线图) 4.psp饼状图:

  10. 王者荣耀交流协会-小组互评Alpha版本

    小组分工如下: 1.探路者---贪吃蛇(测评人:王玉玲) 链接:http://www.cnblogs.com/WYLFZ/p/7805520.html    http://www.cnblogs.co ...