怎么分析linux的内核程序,Linux内核分析——跟踪分析Linux内核的启动过程

万子惠 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程

实验部分

menu程序:

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

其中:

1.qemu 是一个快速的动态译指的虚拟机

2.-kernel bzImage: 内核镜像

3.-initrd file使用file作为初始的ram磁盘。

92a3e9cc11c3ec425ca039801b6458ea.png

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之前,也可以在之后

019b2ee522b1be651fbcb37b2f2f50cb.png

第一个断点(start_kernel):很多重要的模块都在这里初始化

01e2fddc5e3122585876d80611074957.png

list查看上下文

bfc286c677726f1af1917b4508383c18.png

第二个断点(rest_init):

6ae3b9fe3cb3e2f3ca93412ae47d0d4d.png

list查看上下文:

d6e83f5771e198f16825946d11b76b88.png

mm_init(有两处)

dfcdc7f0191ce8cd8b04330cb91dca75.png

3748cbc236fced52b0cbfc30f9bb3dc4.png

kernel_thread

d8b1d37e4de0670996175ee261745cf5.png

run_init_process

cd3f6fdcf64c60925924f4aae0cd2c04.png

316354b74ce63df0cd8306ee6b6634cc.png

总结部分:

Part1知识点总结

Linux-3.18.6/:(笔记只放一些比较重要的目录)

arch/ 占有量相当大,有支持不同cpu的源代码 (x86重要)

Documentation/ 文档

fs/ 文件系统(file system)

init/ 内核启动相关代码大部分都在此处 (其中的main.c 整个内核启动起点)

ipc/ 进程之间通信

kernel/ 内核核心代码(进程调度)

mm/ memory management

//一号进程部分(run_init_process:第一个用户态进程)

if (ramdisk_execute_command) {

ret = run_init_process(ramdisk_execute_command);

if (!ret)

return 0;

pr_err("Failed to execute %s (error %d)\n",

ramdisk_execute_command, ret);

}

//kernel_init,kthreadd

kernel_thread(kernel_init, NULL, CLONE_FS);

numa_default_policy();

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//创建内核线程管理资源

//0号进程 内核一启动就会一直存在。

static noinline void __init_refok rest_init(void)

{

int pid;

rcu_scheduler_starting();

/*

* We need to spawn init first so that it obtains pid 1, however

* the init task will end up wanting to create kthreads, which, if

* we schedule it before we create kthreadd, will OOPS.

*/

kernel_thread(kernel_init, NULL, CLONE_FS);

numa_default_policy();

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

rcu_read_lock();

kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);

rcu_read_unlock();

complete(&kthreadd_done);

/*

* The boot idle thread must execute schedule()

* at least once to get things moving:

*/

init_idle_bootup_task(current);

schedule_preempt_disabled();

/* Call into cpu_idle with preempt disabled */

cpu_startup_entry(CPUHP_ONLINE);

}

内核启动参考资料:

x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置

BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。这里一般是把硬盘的第一个扇区MBR和活动分区的引导程序加载到内存(即加载BootLoader),加载完整后把控制权交给BootLoader。

引导程序BootLoader开始负责操作系统初始化,然后起动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img

内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。

一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules) 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去

Part2 start_kernel

/init/main.c中 很多重要的模块都在这里进行初始化

lockdep_init 初始化hash表,只调用一次

init_task:手工创建的PCB,0号进程即最终的idle进程

trap_init():这里初始化很多中断向量

mm_init():内存管理模块

sched_init 进程调度初始化

关于Linux的启动

0号进程即最终的idle进程,当系统没有进程需要执行时就调度到idle进程(一直循环啊循环)

道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...

Linux必知必会的目录与启动过程

第1章 /etc/目录 1.1 /etc/sysconfig/network-scripts/ifcfg-eth0 linux第一块网卡的配置文件 [root@znix ~]# cat /etc/sy ...

nova分析(6)—— nova service启动过程

Nova project下面具有多个service,api,compute,sceduler等等,他们的启动过程都几乎类似,这一篇博客就详细记录nova-sceduler的启动过程.文章中贴出的源码都 ...

spark 源码分析之四 -- TaskScheduler的创建和启动过程

在 spark 源码分析之二 -- SparkContext 的初始化过程 中,第 14 步 和 16 步分别描述了 TaskScheduler的 初始化 和 启动过程. 话分两头,先说 TaskSc ...

HDFS源码分析之NameNode(1)————启动过程

源码:2.8.0 入口类:org.apache.hadoop.hdfs.server.namenode.NameNode main方法会调用createNameNode 创建 NameNode 实例, ...

描述linux系统从开机到登陆界面的启动过程

简述:1.开机BIOS自检2.MBR引导3.grub引导菜单4.加载内核kernel5.启动init进程6.读取inittab文件,执行rc.sysinit,rc等脚本7.启动mingetty,进入系 ...

2018-2019-1 20189206 《Linux内核原理与分析》第四周作业

linux内核分析学习笔记 --第三章 MenuOS的构造 计算机的"三大法宝"和操作系统的"两把宝剑" 三大法宝 程序存储计算机 即冯诺依曼体系结构,基本上是 ...

通过从代码层面分析Linux内核启动来探知操作系统的启动过程

通过从代码层面分析Linux内核启动来探知操作系统的启动过程 前言说明 本篇为网易云课堂Linux内核分析课程的第三周作业,我将围绕Linux 3.18的内核中的start_kernel到init进程 ...

Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

一.系统的启动(各历史节点) 在最开始的时候,计算机的启动实际上依靠一段二进制码,可以这么理解,他并不是一个真正的计算机启动一道程序.计算机在开始加电的时候几乎是没有任何用处的,因为RAM芯片中包括的 ...

随机推荐

Sql Server系列:数据库操作

1 创建数据库 1.1 CREATE DATABASE语法 CREATE DATABASE database_name [ ON [ PRIMARY ] [ ,... ...

Web性能测试的简介

一.术语 1.并发用户:并发一般分两种.1)严格意义上的并发,即所有的用户在同一时刻做同一件事情或操作,这种操作一般指做同一类型的业务:2)广义范围的并发,与前者主要区别,尽管多个用户对系统发出了请求 ...

hibernate 左链接查询

select pro from Provide as pro left join pro.labels as la left join pro.city as c where 1=1

失败经历--在windows下安装meld

缘起 在linux下,最早用的比较工具是vim,这是作为一个vimer的自尊(其实没有关系吧).终于有一天,在比较同一个项目的两个版本的时候,比较了两三个文件后,看着vim里面花花绿绿的颜色,实在是受 ...

js实现整数转化为小数

toFixed 方法 返回一个字符串,代表一个以定点表示法表示的数字. number .toFixed(i) 参数 bumber 必选项.一个 Number 对象. i 可选项.小数点 后的数字位数. ...

csv格式的数据存储到mysql

python写的,有点冗余,先码出来~~~~ 这是data_stored.py的代码 # -*- coding:utf-8 -*- # 存数据到mysql (只存了时间数字) import pymys ...

使用BeautifulSoup和正则表达式爬取时光网不同地区top100电影并使用Matplotlib对比

还有一年多就要毕业了,不准备考研的我要着手准备找实习及工作了,所以一直没有更新. 因为Python是自学不久,发现很久不用的话以前学过的很多方法就忘了,今天打算使用简单的BeautifulSoup和一 ...

Debugging Beyond Visual Studio – WinDbg

Getting started with WinDbg: 1. Download the Debugging Tools for Windows from the Microsoft website ...

【Android】LMK 工作机制

Android分析之LowMemoryKiller Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存. 那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low ...

day29 socketsever ftp功能简单讲解

今日所学 一.ftp上传简单实例 二.socketsever的固定用法 三.验证合法性连接 1.ftp上传实例 这个题目是我们现在网络编程比较基础一点的题目 下面我们只写简单上传的代码 上传服务端的代 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值