20135323符运锦----第三周:构建一个简单的Linux系统MenuOS
相关知识点
1.arch目录
占据相当庞大的空间,X86目录下代码需要重点关注。
2.init目录
内核启动的相关代码基本都在此目录下,内含MAIN.C,文件中START_KERNEL是整个LINUX内核的起点。
3.kernel
后跟文件名,Linux内核的核心代码在kernel目录中。可以使用make modules进行编译,make install进行安装。
4.fs目录
filesystem 文件系统
5.补充
①.编译内核的目的:为了生成符号表.内核符号表就是在内核内部函数或变量中可供外部引用的函数和变量的符号表.
②.ipc/:进程通信
③.lib/:公用库文件
④.make mrproper:清理中间代码
⑤.README:介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等
实验:跟踪分析Linux内核的启动过程
使用实验楼的虚拟机打开shell
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
注:qemu:启动一个虚拟机平台;rootfs.img:放一个可执行文件由menuOS源代码编译成的init;-initrd:驱动所需的硬盘。

输入help,可以发现系统支持三个命令help、version和quit。
使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage - initrd rootfs.img
- S是指在CPU初始化之前(刚启动的时候)将其冻结
- s是指在1234这个端口上创建的gdb server

另开一个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之前,也可以在之后
可以设置断点(break),格式为:break [函数名](此时系统还是被冻结而并没有启动的);

设置完断点之后,输入c命令continue继续执行,函数会停在断点处。输入list指令之后,可以详细地查看断点附近的代码:


将断点设置到rest_init


详细分析start_kernel
在init目录下main.c里找到start_kernel函数,不管分析内核的哪一部分都会涉及到start_kernel,都会在init初始化。
trap_init():初始化一些中断向量,管理硬件中断
set_intr_gate:设置中断门
set_system_trap_gate:系统陷阱门SYSCALL VECTOR。
mm_init():内存管理模块初始化
sched_init():调度模块初始化
init_process(): 一号进程,默认的
rest_init():kernel_init:创建1号进程第一个用户态进程;init_process,1号进程,找默认路径下的程序作为1号进程;kthreadd:内核线程,用来管理系统资源;这也就是Linux系统中的1号进程,是第一个用户态进程,默认是根目录下的一个程序;如果根目录下没有这个进程,系统会寻找其他的默认进程作为1号进程,当系统没有进程需要执行时就调度到idle进程。
Linux系统启动过程的理解
道生一,一生二,二生三,三生万物。
从按下电源那一刻,就会开始了BIOS自检。基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。 BIOS的功能由两部分组成,分别是POST码和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。接下来就到了系统引导,分别是lilo\grub进行引导。再之后是启动内核,也就是本次学习的重点。内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)。2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去。最后再初始化系统,就正常启动了LINUX系统。
符运锦 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-10000290000
20135323符运锦----第三周:构建一个简单的Linux系统MenuOS的更多相关文章
- 第三周——构建一个简单的Linux系统MenuOS
[洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 第三周 构建一个 ...
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...
- 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS
Linux内核分析第三周 构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...
- 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS
Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- linux内核分析 第三周 构造一个简单的Linux系统MenuOS
一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持 ...
- Linux内核分析第三周——构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- 第三周 构造一个简单的Linux系统MenuOS
一. Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ...
- Linux内核设计第三周——构造一个简单的Linux系统
Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...
- 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...
随机推荐
- Alpha冲刺报告(10/12)(麻瓜制造者)
今日已完成 邓弘立: 实现了登录的所有功能 符天愉: 有点事没有参与冲刺- 江郑: 刘双玉: 写商品下架接口说明的时候,就发现一个bug,因为私人原因中间离开了很长时间,最后修改完成就很晚了. 困难: ...
- 9.Solr4.10.3数据导入(post.jar方式和curl方式)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.使用post.jar方式 java -Durl=http://192.168.137.168:8080/s ...
- 8.1Solr API使用(分页,高亮)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 一.Solr Deep Paging(深分页) 长期以来,我们一直有一个深分页问题.如果直接跳到很靠后的页数, ...
- SDOI 2018 R2 游记
一篇真正的“游记”. DAY -3 下午: 今天老师批准了我去省选划水的请假要求. 批准之后感觉学习非常有动力,顺便忽悠别的同学和我一起去,然而wzx是唯一一个表示可以考虑一下的同学,其他同学直接一口 ...
- BZOJ4919:[Lydsy1706月赛]大根堆(set启发式合并)
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- helm 部署
Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用,它包含几个基本概念 Chart:一个 Helm 包,其中包含了 ...
- linux问题整理
linux常用命令 //1.Linux如何查询进程?杀死一个进程? //2.文件权限,改变权限命令 //3.Linux中查看服务的命令 //4.linux查看内存 //5.查看磁盘空间的命令,查看文件 ...
- eclipse中ant打war包
注:有可能打包失败是eclipse没有集成的原因,用我自己的eclipse可以,同事那就有可能打包失败,一定要注意这点. 1.先在eclipse中集成或自己安装解压ant,总之有可用的ant就好. 2 ...
- win10下nvidia控制面板看不到
64位win10,nvidia控制面板看不到,控制面板里没有,服务里也没有nvidia相关服务,但驱动已经安装了. 解决办法: 1.下载GeForce Experience并安装 . 2.通过GeFo ...
- 浅谈SDN架构下的运维工作
导读 目前国内的网络运维还处于初级阶段,工作人员每天就像救火一样,天天疲于奔命.运维人员只能埋头查找系统运行的日志,耗时耗力,老眼昏花不说,有时候忙了半天还一无所获,作为运维工程师的你,有木有遇到过类 ...