第三章 MenuOs的构造

一.知识点总结

  • 计算机的三大法宝:

    • 存储程序计算机
    • 函数调用堆栈
    • 中断
  • 操作系统的两把宝剑:
    • 中断上下文的切换(保存现场和恢复现场)
    • 进程上下文的切换

它们都和汇编语言有着密不可分的联系

  • Linux内核分析比较重要的是:

    • arch目录下的x86目录下的源文件
    • init目录下的main.c(其中的start_kernel函数是初始化Linux内核启动的起点)
    • kernel目录下和进程调度相关的代码

二.跟踪分析Linux内核启动过程

1.实验过程

通过下面的命令把Linux系统和一个简单的文件系统运行起来

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



使用gdb跟踪调试内核,添加-S(在CPU开始之前把他冻结起来)和-s(在1234端口上创建一个gdb-server,可以再另外打开一个窗口用gdb把带有符号表的内核镜像加载进来,然后连接gdb srever 设置断点追踪内核)两个参数。如下图,可以看到内核被冻结起来了。



再打开一个窗口,启动gdb,把内核加载进来并且建立连接。

在gdb中输入以下命令

file linux-3.18.6/vmlinux
target remote:1234
break start_kernel
c //按c让qemu上的Linux继续运行

可以看到如下运行结果



输入list可以查看到start_kernel上下的代码

再设置一个断点rest_init继续执行

可以看到 rest_init 是在 start_kernel 的尾部进行调用的。

2.遇到的问题

当我再打开一个窗口启动gdb的时候,在gdb界面中targe remote之前加载符号表的时候出现了问题,在同学的帮助下发现是在上一步启动内核的时候把QEMU的窗口关闭导致。

3.分析start_kernel函数的执行过程

asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes; /*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
set_task_stack_end_magic(&init_task);// init_task即手工创建的PCB,0号进程即最终的idle进程
smp_setup_processor_id();
debug_objects_early_init();
// ...
trap_init(); // 中断向量的初始化
mm_init(); // 内存模块的初始化
sched_init(); // 调度模块的初始化
// ...
rest_init(); // rest_init是0号进程(是使用宏初始化的),它创建1号进程init和其他的一些服务进程
}

4.Linux系统启动的过程

内核的主要模块的初始化工作都是在start_kernel函数里调用。

idle进程是怎么来的:init_task()(PID=0)在创建init进程后,调用cpu_idle()演变成idle进程,执行一次调度之后,init进程运行。

1号进程是怎么来的:1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve加载init程序,演变成init进程(用户态1号进程),init进程是内核启动的第一个用户态进程。

kthreadd(PID=2)进程由0号进程创建,始终运行在内核空间,负责所有内核线程的调度和管理。

内核启动完成后,有一个call_cpu_idle,当系统没有需要执行的进程时就调用idle进程,即“0号进程”。idle进程从系统启动之后就一直存在,它创建了1号进程init和其他的一些服务进程,这样系统就启动起来了。

2019-2020-1 20199324《Linux内核原理与分析》第四周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 20169219linux 内核原理与分析第四周作业

    系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. MySQL的异常问题

    异常问题

  2. 和为S的连续正序列

    [问题]小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...

  3. python里的文件I/O

    Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...

  4. LeetCode随想------Single Number-----关于异或的性质

    异或满足交换律,结合律 任何数X^X=0,X^0=X 自反性 A XOR B XOR B = A xor  0 = A  设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达 ...

  5. no.9亿级用户下的新浪微博平台架构读后感

    微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层.服务层与资源层:在垂直方向,进一步细分为业务架构.技术架构.监控平台与服务治理平台. 水平分层 (1)接 ...

  6. DRF框架之序列化器初体验

    首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...

  7. jquery---利用jquery插件生成二维码

    <script type="text/javascript" src="<?php echo RESOURCE_SITE_URL;?>/js/jquer ...

  8. linux环境java程序cpu爆表问题查证

    1.top命令查找导致cup爆表的进程 2. top -H -p10832 (10832是Java进程的PID)命令找出了具体的线程 3.使用用命令 jstack 10832> jstack.t ...

  9. 当初对"软件工程"这个专业的期待和想象是什么?

    很多期待,很多幻想 印象很深刻的初中语文老师让我们背诵的一首诗<错误>: <错误> 作 者:郑愁予 我打江南走过 那等在季节里的容颜如莲花的开落 东风不来,三月的柳絮不飞 你底 ...

  10. 分糖果(BFS)

    题目描述 童年的我们,将和朋友分享美好的事物作为自己的快乐.这天,C小朋友得到了糖果,将要把这些糖果分给要好的朋友们.已知糖果从一个人传给另一个人需要1秒的时间,同一个小朋友不会重复接受糖果.由于糖果 ...