Linux内核分析——第三周学习笔记20135308
第三周 构造一个简单的Linux系统MenuOS
计算机三个法宝:
1、存储程序计算机
2、函数调用堆栈
3、中断
操作系统两把宝剑:
1、中断上下文的切换:保存现场和恢复现场
2、进程上下文的切换
一、阅读Linux内核代码
本周我们要学习如何阅读Linux内核源代码,首先打开Lstest Stable Kernel:linux-3.18.6
arch/目录在Linux内核中占有相当庞大的代码量,因为Linux支持很多CPU,这个arch/x86目录下的代码是我们重要关注的代码
根目录中比较关键的目录:
- Documentation/文档
- fs/文件系统
- init/内核启动相关的代码基本都在init目录下,里面的main.c是整个Linux内核启动的起点。它的起点是start_kernel
start_kernel函数相当于普通C程序的main函数
如上图所示,第500行这里就是初始化Linux内核的起点,之前的部分是汇编做硬件初始化。
- ipc/进程间通信
- kernel/Linux内核的核心代码在kernel目录中
- lib/公用的库文件
- mm/memmory management内存管理
- net/与网络相关的代码
- security/与安全相关的代码
- scripts/脚本
以上加粗的部分为我们重点关注的。
二、构造一个简单的Linux系统MenuOS
方法一:使用实验楼的虚拟机打开shell
linux-3.18.6.tar就是内核源代码,rootfs里面有用menu编译好的init可执行文件,rootfs.img是它生成的。
该系统支持三条命令:help、version和quit
输入help会有以下三条命令
使用gdb跟踪调试内核
输入以下命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
-S表示:在CPU初始化之前,冻结CPU
-s表示在:1234端口上创建一个tcp接口
如图所示,是被冻结状态的。
水平分割,再打开一个shell窗口,输入gdb
这里注意:视频中孟老师是直接进入了LinuxKernel文件夹,我们要在实验楼中进入LinuxKernel再gdb,否则会显示找不到文件。
输入(gdb)file linux-3.18.6/vmlinux
在targe remote之前加载符号表
Reading后,连接到刚启动的被冻结的linux系统,设置断点,把内核启动的起点start_kernel设为断点,在init/main.c文件中,第501行
输入c,回车,系统从冻结状态开始执行,启动。
输入list,可以看见start_kernel代码上下的这段代码
再设一个断点rest_init,按c继续执行
系统已经执行到rest_init
输入list,看rest_init前后的代码
在start_kernel尾部被调用
方法二:使用自己的Linux系统环境搭建MenuOS
首先,下载内核源代码编译内核,大概几百M
接下来,make,大概会make20多分钟
下面,制作根文件系统,我首先尝试了孟老师的第一种方法,在GitHub上注册账号,登录,然而显示Error 403
之后,我用第二种办法,在课程的“课件”页面,底部单击“下载附件”
下载menu.zip,并共享到虚拟机中去
继而,gcc编译
在rootfs文件夹出现了编译出的镜像文件
由于自己的虚拟机缺少配置,不能进行下去了
三、简单分析一下start_kernel
首先设置全局变量init task,相当于手工创建的PCB,0号进程就是最终的idle进程,0号进程创建了1号进程和其他线程
trap_init();初始化一些中断向量
mm_init() 内存管理模块
sched_init() 调度模块
其中,在x86中,设置了很多中断门
还设计系统陷阱门,系统调用的,也是一种中断
rest_init
kernel_init里面的run_init_process就是linux系统的1号进程,第一个用户态进程,默认根目录下的init程序
kernel_init不仅创建了1号进程,还创建了kthreadd内核线程,来管理系统资源
系统进入了内核启动rest_init,call into cpu_idle
这里的cpu_idle_loop就是进入了while(0)的无限循环,就是idle0号进程。它一直存在在系统中,当没有进程需要执行时,就调度到idle进程。
总结:rest_init就是start_kernel内核启动时一直存在,即为0号进程。0号进程创建了1号进程kernel_init以及其他的服务线程。“道生一(start_kernel....cpu_idle)、一生二(kernel_init和kthreadd)、二生三(即前面0、1和2三个进程)、三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)”,内核就启动了。
Linux内核分析——第三周学习笔记20135308的更多相关文章
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 20135320赵瀚青LINUX内核分析第三周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...
- Linux内核分析——第三周学习笔记
20135313吴子怡.北京电子科技学院 chapter1 知识点梳理 一.Linux内核源代码简介 (视频中对目录下的文件进行了简介,记录如下) arch目录 占有相当庞大的空间 arch/x86目 ...
- Linux内核分析——第七周学习笔记20135308
第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 ...
- Linux内核分析——第八周学习笔记20135308
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...
- Linux内核分析——第六周学习笔记20135308
第六周 进程的描述和进程的创建 一.进程描述符task_struct数据结构 1.操作系统三大功能 进程管理 内存管理 文件系统 2.进程控制块PCB——task_struct 也叫进程描述符,为了管 ...
- 《Linux内核分析》第二周学习笔记
<Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
随机推荐
- SDOI 2018 R2 游记
一篇真正的“游记”. DAY -3 下午: 今天老师批准了我去省选划水的请假要求. 批准之后感觉学习非常有动力,顺便忽悠别的同学和我一起去,然而wzx是唯一一个表示可以考虑一下的同学,其他同学直接一口 ...
- 1207. [HNOI2004]打鼹鼠【线性DP】
Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探 ...
- redis集群搭建及连接(阿里云)
阿里云上面装redis集群基本被虐死,主要问题就是私有IP和公有IP. 下面分享成功搭建的步骤: 两台测试服务器,分别为:127.0.0.1,127.0.0.2.每分服务器有3个节点. 1.127.0 ...
- ansible role 理解
1.roles意为角色,主要用于封装playbook实现复用性.在ansible中,roles通过文件的组织结构来展现.
- jqgrid 设置编辑行中的某列为下拉选择项
有时,需要对编辑行中的某列的内容通过选择来完成,以保证数据的一致性.规范性. 可设置colModel的label的属性 edittype: "select",同时指定 editop ...
- 服务器端数据合法性验证:签名sign和口令token原理
有时候,你也许会想: 我写的接口,那别人要是知道url,并且知道其需要的数据结构和逻辑,那不是都可以访问了? 甚至是,客户点传递过来的数据,是不是被恶意修改了? 这时,我们可能需要“验证”一下.比如: ...
- 林帆:Docker运行GUI软件的方法
继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享. 嘉宾简介:林帆,Thought ...
- Huploadify V2.1+ SpringMVC上传文件的实现
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Exp4 恶意代码分析 20155223
Exp4 恶意代码分析 20155223 使用原生命令schtasks监视系统运行 在系统盘目录下建立脚本文件netstatlog.bat,包含以下命令: date /t >> c:\ne ...
- 20155316 《网络对抗》Exp8 Web基础
实验内容 实验1:Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 1.开启Apache服务 思路:使用service ...