相关知识点
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 ...
随机推荐
-
DIV+CSS自适应布局
自适应布局分两类:高度和宽度,方法有很多,我用三列布局举例,我就列几个通俗易懂的例子呗,懂了三列的,两列的原理一样,呵呵哒. 效果图如下:高度自适应——宽度自适应 1,高度自适应 ...
-
【redis】 redis 创建集群时,Waiting for the cluster to join.... 一直等待
redis 搭建集群时,一直join.... ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1: ...
-
admob 广告Android不显示
我弄个了ane,iOS上好好的,Android上打死不显示, 最后发现是少在xml里面增加一个配置,百度半天没搜索到. <android> <manifestAddi ...
-
SqlServer中quotename用法与实例
语法 QUOTENAME ( 'character_string' [ , 'quote_character' ] ) 参数 'character_string' Unicode 字符数据构成的字符串 ...
-
?--Porg.springframework.beans.MethodInvocationException: Property &#39;username&#39; threw exception; nested exception is java.lang.NullPointerException
使用BoneCP作为连接池,在启动Tomcat报出以下异常: 一月 02, 2016 2:12:17 下午 org.apache.tomcat.util.digester.SetPropertiesR ...
-
[HIve - LanguageManual] LateralView
Lateral View Syntax Description Example Multiple Lateral Views Outer Lateral Views Lateral View Synt ...
-
yield 生成器例子
#!/usr/bin/env python #encoding: utf-8 import time def consumer(name): print ('%s 来吃包子了...' % (name) ...
-
mongodb内嵌文档的查询
本文转自:http://blog.163.com/wm_at163/blog/static/1321734902012526103825481/ 1 > db.blog.findOne() { ...
-
send()和recv()函数详解
send()函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连 ...
-
shell编程-项目部署(优化篇)
在实际工作中小编遇到了一个问题那就是当我去操作部署脚本的时候,另一个人也可以操作,这怎么能行啊,后来小编就觉得重新优化下代码,给它加一个进程锁 老规矩,先梳理下思路: 同一时间内,脚本只能够允许一个人 ...