linux内核学习之三 跟踪分析内核的启动过程
一 前期准备工作
1 搭建环境
1.1下载内核源代码并编译内核
创建目录,并进入该目录:

下载源码:

解压缩,并进入该目录:xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6
cd linux-3.18.6
选定x86架构的相关文件编译:

编译:

1.2 制作根文件系统
在工作目录下新建一个文件夹:
mkdir rootfs
下载老师提供的资料:git clone https://github.com/mengning/menu.git

cd menu
gcc -o init linktable.c menu.c test.c -m32 -static -lpthread
cd ../rootfs
cp ../menu/init ./
find . cpio -o Hnewc |gzip -9 > ../rootfs.img
返回工作目录,即可启动Menuos
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

运行效果:

2 调试工具gdb 简介
gdb 调试器是一款GNU开发组织并发布的UNIX/linux 下的程序调试工具。虽然没有图形化的界面,但是它的强大调试功能足以和windows 下专业工具如Visual studio 媲美,甚至更简洁。(注意:gdb进行调试的是可执行文件,而不是如“**.c”的源代码 。)
使用的命令 命令介绍
gdb // 进入需要调试的文件所在目录,进入gdb调试环境
l //查看文件(所有载入的文件)
b //设置断点,如b 6 ,表示在第6行设置断点
info b //查看断点信息
r // 运行代码
p “变量名 ” //查看变量的值,如 :p n ,查看变量n的值
n //单步运行
s //单步运行,与上面的区别是,当发生函数调用时,“s”会进入该函数,但是“n”不会进入该函数
二 调试跟踪
为了直观显示在调试过程中的内核动态,使用qemu模拟器,初始时使为停止态:

-S 表示冻结在开始状态
-s 为gdb 调试工具设定端口1234,也可用其他

再打开一个gdb调试窗口,加载符号表,建立连接,设定断点

其中第一个断点在start_kernel 处,第二个断点在rest_init处,继续执行,停在第一个断点处:

输入“c”,继续执行,停在第二个断点处:

接着执行:

三 个人对linux启动过程的理解
start_kernel()函数的作用是完成linux内核的初始化,几乎所有模块都是由这个函数初始化的,通过阅读代码和使用gdb 工具,完成了下列动作:
调用sched_init()函数来初始化调度程序;调用page_alloc_init()初始化伙伴系统分配程序;调用trap_init()和init_IRQ()完成异常和中断初始化;调用softirq_init()函数初始化软中断;调用time_init()函数初始化系统和时间;等等。。。
启动过程分析:计算机上电后,加载BIOS的硬件信息与进行自我测试,读取并执行第一个启动设备内主引导记录内的Bootloader,依据bootloader的设置加载Kernel ,Kernel会开始检测硬件与加载驱动程序。这其中的每一部分都需要大篇的文字描述,这里只是重点从进程角度来了解一下:init_task进程(0号进程)是静态创造的,是内核开发人员创造的,而不是其他进程通过do_fork形成的。它从start_kernel()初始化直到start_kernel()中最后一个函数rest_init(),从rest_init开始,Linux开始产生进程,在rest_init函数中,内核将通过kernel_thread()产生第一个真正的进程(pid=1),而此时init_task的任务基本上已经完全结束了,它将沦落为一个idle 进程,事实上在更早前的sched_init()函数中,通过init_idle(current, smp_processor_id())函数的调用就已经把init_task初始化成了一个idle 进程。
by:方龙伟
原创作品 转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
linux内核学习之三 跟踪分析内核的启动过程的更多相关文章
- Linux第三周——跟踪分析内核的启动过程
跟踪分析内核的启动过程实验 张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周主要学习的是对内核 ...
- Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程
陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚 ...
- Linux内存都去哪了:(1)分析memblock在启动过程中对内存的影响
关键词:memblock.totalram_pages.meminfo.MemTotal.CMA等. 最近在做低成本方案,需要研究一整块RAM都用在哪里了? 最直观的的就是通过/proc/meminf ...
- Android 核心分析 之八Android 启动过程详解
Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...
- Linux必知必会的目录与启动过程
第1章 /etc/目录 1.1 /etc/sysconfig/network-scripts/ifcfg-eth0 linux第一块网卡的配置文件 [root@znix ~]# cat /etc/sy ...
- wxWidgets源码分析(1) - App启动过程
目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wx ...
- Netty源码分析之客户端启动过程
一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...
- tomcat8 源码分析 | 组件及启动过程
tomcat 8 源码分析 ,本文主要讲解tomcat拥有哪些组件,容器,又是如何启动的 推荐访问我的个人网站,排版更好看呦: https://chenmingyu.top/tomcat-source ...
- Hive源码分析(1)——HiveServer2启动过程
1.想了解HiveServer2的启动过程,则需要找到启动HiveServer2的入口,hive服务的启动命令为hive --service HiveServer2,通过分析$HIVE_HOME/bi ...
随机推荐
- 动态加载框架DL分析
动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...
- 关于content-type","application/x-www-form-urlencoded;charset=utf-8"的说明
在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urlen ...
- Thread.join()方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B.t.join() ...
- MFC编程入门之二十(常用控件:静态文本框)
上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...
- jQuery 移动端ajax请求列表数据,实现点击翻页效果(还有手势往下滑动翻页)。
1 首先是html部分 <div class="content"> <div class="list"></div> // ...
- 还有 3 天,苹果就要关上 HTTP 大门了
版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/274113001482113656 来源:腾云阁 h ...
- 通过a标签在页面上显示视频网站中的视频
1.把视频传到优酷.腾讯等视频网站中 <!DOCTYPE html> <html> <head lang="en"> <meta char ...
- SPSS数据分析—生存分析
生存分析是对生存时间进行统计分析的一种技术,所谓生存时间,就是指从某一时间点起到所关心的事件发生的这段时间.这里的时间不一定就是钟表日历上的时间,也有可能是其他的度量单位,比如长度单位等. 生存时间有 ...
- Timing Attack 周边感应sql
直接上硬菜.盲注的一段语句: 1170 UNION SELECT IF(SUBSTRING(current,1,1)) = CHAR(119) , BENCHMARK(5000000,ENCODE(' ...
- css学习笔记 3
css选择符: 通配选择符:* 类选择符:.className 标签选择符 后代选择符:例:p strong ,选择的是p标签内的所有strong标签. 子选择符:> ,只选择父标签内的直接子标 ...