第三周 构造一个简单的Linux系统MenuOS
2016-03-10 12:43
246 查看
一. Linux内核源代码简介
稳定版内核:Linux-3.18.6
Linux内核源代码的目录结构:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175741632-2018235528.png)
arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构,而arch目录是支持不同的CPU的源代码.arch/x86目录下的代码是重点
Documentation目录:文档目录
fs目录:文件系统
init目录:内核启动相关的代码基本都在init目录下,其中的main.c代码里的start_kernel函数相当于普通C程序的main函数
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175829210-76679148.png)
ipc目录:进程间通信
kernel目录:Linux内核的核心代码在kernel目录中
lib目录:公用的库文件
mm目录:内存管理的
README目录:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175901772-1167806440.png)
二. 构造一个简单的Linux系统
l 使用实验楼的虚拟机打开shell
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175920100-1154311922.png)
内核启动完成后进入menu程序,支持三个命令help、version和quit
l 通过gdb跟踪内核
l 使用自己的Linux系统环境搭建MenuOS
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175953554-185971377.png)
init是第一个用户态进程
l 重新配置编译Linux使之携带调试信息
在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180028475-587979554.png)
make重新编译(时间较长)
l 使用gdb跟踪调试内核
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180045038-1110047667.png)
-S:CPU初始化之前把它冻结起来
-s:端口上创建了一个gdbserver
另开一个shell窗口
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180100100-812728551.png)
三. 跟踪调试Linux内核的启动过程
实验截图如下:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180122772-1325787158.png)
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180145991-168477353.png)
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180204147-877832874.png)
简单分析一下start_kernel:
init_task即手工创建的PCB,0号进程即最终的idle进程
不管分析内核的哪一部分都会涉及到start_kernel
trap_init():初始化一些中断
当系统没有进程需要执行时就调度到idle进程
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180228600-905406546.png)
四.总结
init是第一个调用的使用标准C库编译的程序。在此之前,还没有执行任何标准的C应用程序。在桌面Linux系统上,第一个启动的程序通常是/sbin/init,它的进程号为1。init进程是所有进程的发起者和控制者,它有两个作用:
(1)扮演终结父进程的角色:所有的孤儿进程都会被init进程接管。
(2)系统初始化工作:如设置键盘、字体,装载模块,设置网络等。
在完成系统初始化工作之后,init进程将在控制台上运行getty(登录程序)等任务,我们熟悉的登录界面就出现了。
稳定版内核:Linux-3.18.6
Linux内核源代码的目录结构:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175741632-2018235528.png)
arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构,而arch目录是支持不同的CPU的源代码.arch/x86目录下的代码是重点
Documentation目录:文档目录
fs目录:文件系统
init目录:内核启动相关的代码基本都在init目录下,其中的main.c代码里的start_kernel函数相当于普通C程序的main函数
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175829210-76679148.png)
ipc目录:进程间通信
kernel目录:Linux内核的核心代码在kernel目录中
lib目录:公用的库文件
mm目录:内存管理的
README目录:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175901772-1167806440.png)
二. 构造一个简单的Linux系统
l 使用实验楼的虚拟机打开shell
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175920100-1154311922.png)
内核启动完成后进入menu程序,支持三个命令help、version和quit
l 通过gdb跟踪内核
l 使用自己的Linux系统环境搭建MenuOS
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307175953554-185971377.png)
init是第一个用户态进程
l 重新配置编译Linux使之携带调试信息
在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180028475-587979554.png)
make重新编译(时间较长)
l 使用gdb跟踪调试内核
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180045038-1110047667.png)
-S:CPU初始化之前把它冻结起来
-s:端口上创建了一个gdbserver
另开一个shell窗口
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180100100-812728551.png)
三. 跟踪调试Linux内核的启动过程
实验截图如下:
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180122772-1325787158.png)
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180145991-168477353.png)
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180204147-877832874.png)
简单分析一下start_kernel:
init_task即手工创建的PCB,0号进程即最终的idle进程
不管分析内核的哪一部分都会涉及到start_kernel
trap_init():初始化一些中断
当系统没有进程需要执行时就调度到idle进程
![](http://images2015.cnblogs.com/blog/744620/201603/744620-20160307180228600-905406546.png)
四.总结
init是第一个调用的使用标准C库编译的程序。在此之前,还没有执行任何标准的C应用程序。在桌面Linux系统上,第一个启动的程序通常是/sbin/init,它的进程号为1。init进程是所有进程的发起者和控制者,它有两个作用:
(1)扮演终结父进程的角色:所有的孤儿进程都会被init进程接管。
(2)系统初始化工作:如设置键盘、字体,装载模块,设置网络等。
在完成系统初始化工作之后,init进程将在控制台上运行getty(登录程序)等任务,我们熟悉的登录界面就出现了。
相关文章推荐
- 深入理解SELinux SEAndroid
- linux 常识
- Linux中用户、组、权限管理
- Android 安全策略实例讲解:SEAndroid和SELinux
- linux系统下c程序分多文件实现
- 20135220谈愈敏Blog3_构造一个简单的Linux系统MenuOS
- Linux valgrind 部署安装
- linux查看系统版本
- Linux用户和权限管理
- Linux 的cp命令
- linux如何修改文件或目录的权限(chmod)
- linux下安装pycharm
- 用十条命令在一分钟内检查Linux服务器性能[转]
- CentOS使用YUM安装php运行环境(安装EPEL源和Remi源)
- 对Linux命令进一步学习
- linux awk命令详解
- linux kernel 中断子系统 -- ARM GIC 硬件
- linux 静态库、共享库
- 《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h(转载)
- Linux常见目录作用(一级目录)