2019-2020-1 20199301《Linux内核原理与分析》第四周作业
Week4 MenuOS的构造
一、上周复习
计算机的三大法宝:
- 存储程序计算机;
- 函数调用堆栈;
- 中断。
操作系统的两把宝剑:
- 中断上下文—保存现场和恢复现场
- 进程上下文
二、Linux内核源代码简介
- Linux内核的版本号按照A,B,C的方式命名:
- A代表大幅度转变的内核
- B代表重大修改的内核
- C指轻微修改的内核(C是内核的真实版本)
- D是安全补丁和bug修复
Linux内核源代码的根目录
- arch
- arch目录中的代码在Linux内核代码中占比相当庞大
- arch/x86目录下的代码是需要重点关注的,arch下其他目录可以删掉。
- block
- 存放Linux存储体系中关于块设备管理的代码。
crypto - 存放常见的加密算法的C语言代码
- 存放Linux存储体系中关于块设备管理的代码。
- Documentation
- 存放一些文档
- dirvers
- 驱动目录,里面分门别类地存放了Linux内核支持的所有硬件设备的驱动源代码
- firmware
- 固件
- fs
- 文件系统,里列出了Linux支持的各种文件系统的实现
- include
- 头文件目录,存放公共的(各种CPU体系结构公用的)头文件
- init(关键目录)
- init是初始化的意思,存放Linux内核启动时的初始化代码。内核启动相关的基本代码基本都在init目录下,
main.c 文件中有一个start_kernel函数,初始化Linux内核的起点,这个函数相当于普通c程序的main函数
- init是初始化的意思,存放Linux内核启动时的初始化代码。内核启动相关的基本代码基本都在init目录下,
- ipc
- 进程间通信,ipc目录里面是Linux支持的IPC的代码实现
- kernel目录
- 存放内核本身需要的一些核心代码文件
- lib
- 公用的库文件,里面是一些公用的库函数
- mm
- mm是memory management,即内存管理,存放Linux的内存管理代码
- net
- 该目录下是网络相关的代码
- 此外还有一些与声音、安全、脚本、工具相关的目录。
三、构造Linux系统MenuOS
cd LinuxKernel
qemu -kernel linux3.18.6/arch/x86/boot/bzImage --initrd rootfs.img

四、跟踪调试Linux内核的启动过程
qemu -kernel linux3.18.6/arch/x86/boot/bzImage --initrd rootfs.img -S -s
启动gdb
file linux-3.18.6/vmlinux
target remote:1234


五、简单分析start_kernel
1、init/main.c -> stat_kernel
- start_kernel是一切的起点,start_kernel相当于C语言中的main函数。
- tart_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
- 在start_kernel()中Linux将完成整个系统的内核初始化。内核初始化的最后一步就是启动init进程,这个所有进程的祖先。
2、一些init函数
(1)、init_task
- 全局变量init_task,即手工创建的PCB,0号进程初始化,0号进程就是最终的idle。
(2)、初始化一些中断向量 trap_init()
- 中断向量表的初始化函数,设置了很多中断门
(3)、内存管理模块初始化 mm_init()
(4)调度模块初始化 sched_init()
- 函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。
(5)其它模块初始化 rest_init()
- 注:内核中并没有线程的概念,这里创建的init是一个任务(进程)。如果把系统当成是一个大进程,那么init进程就相当于大进程中的一个线程,因为内核中的进程调度会为每一个像init进程分配时间片来执行。
六、总结
- 在init目录下main.c里找到start_kernel函数有一个全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程。
- 1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先
- 内核启动过程:rest_init()就是一个0号进程,在start_kernel内核一启动时就一直存在;然后这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程如kthreadd。这样整个系统就启动起来了。
2019-2020-1 20199301《Linux内核原理与分析》第四周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- 20169219linux 内核原理与分析第四周作业
系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业
<Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...
随机推荐
- jvm面试常见题
背景:jvm相关题目面试必问,后面要深入的进行总结. JVM 面试知识整理 jvm调优命令 调优工具 Minor GC ,Full GC 触发条件 Minor GC触发条件:当Eden区满时,触发Mi ...
- celery无法启动的问题 SyntaxError: invalid syntax
遇到了celery无法启动的问题,报错:SyntaxError: invalid syntax ,这是因为我使用的python版本为最新3.7.3 ,而async已经作为关键字而存在了 在 celer ...
- CF1260D A Game with Traps
http://codeforces.com/problemset/problem/1260/D 首先很明显可以想到二分答案,把能力值数组排个序就好. 考虑怎么check. 设当前二分值为w,即不能直接 ...
- PHP_MySQL高并发加锁事务处理
1.背景: 现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz’的记录. 2.一般程序 ...
- [转帖]Xshell改字体,改大小,改快捷键方法
Xshell改字体,改大小,改快捷键方法 -- :: Jason Ho 阅读数 62更多 分类专栏: Software 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...
- Prometheus入门到放弃(6)之AlertManager进阶
前面几个篇幅,我们介绍了alertmanger报警配置,在实际运维过程中,我们都会遇到,报警的重复发送,以及报警信息关联性报警.接下来我们就介绍下通过alertmanger对告警信息的收敛.一.告警分 ...
- Python的运算符和编码
1.格式化输出 1.有两种方式: 1.1.%的方式 addr = "我家住在%s" % ("黄土高坡") 1.2.format()的方式 addr = &quo ...
- python基础 — Selenium 详细介绍
一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 ...
- 数据结构-二叉树的遍历实现笔记C++
二叉树的遍历实现,可以用递归的方法也可以用非递归的方法.非递归的方法可以借助栈(前序遍历,中序遍历,后序遍历),也可以借助队列(层次遍历).本次笔记只使用了递归的方法来进行前序遍历,中序遍历,后序遍历 ...
- 第13章 Salesforce Lightning应用程序
13.1 Lightning应用程序 13.1.1 什么是闪电应用程序 Salesforce应用程序有两种风格:经典应用程序和闪电应用程序.经典应用程序在Salesforce Classic中创建和管 ...