linux及安全第三周总结——跟踪分析LINUX内核的启动过程
linux内核目录结构
arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
ipc目录包含了核心进程间的通信代码。
modules目录存放了已建好的、可动态加载的模块。
fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
scripts目录包含用于配置核心的脚本文件。
documentation目录下是一些文档,是对每个目录作用的具体说明。
QEMU是一个面向完整PC系统的开源仿真器。在本次实验中它就起到仿真一个Linux系统的作用。
- -kernel 引用一个linux内核
- -initrd 初始化一个临时的RAM磁盘,是系统引导过程中挂载的一个临时文件系统。
start_kernel
- start_kernel函数之前的内容基本都是汇编语言,而从该函数开始内核进入c语言部分,功能则是内核主要功能的初始化。
- 步骤如下:
- smp_setup_processor_id(); 制定当前cpu的逻辑号,当系统中只有一个cpu的情况,则此函数不做出操作
- lockdep_init(); 初始化内核依赖的关系表(hash表)
- localirq_disable(); 关闭当前CPU中断
- early_boot_irqs_off(); early_boot_irqs_enabled,通过该标记可以让我们知道是否在early bootup code。
- early_init_irq_lock_class(); 设置所有IRQ描述符的锁是统一的锁还是各有各的小锁
- lock_kernel(); 获得大内核锁,该锁可以用来锁定整个内核。
- time_init(); 初始化tick控制功能,注册clockevents的框架
- boot_cpu_init(); 设置第一个CPU核为活跃CPU核。若系统为单CPU核系统,则设置仅有的CPU为活跃CPU核。
- printk(KERN_NOTICE); printk(linux_banner);输出打印版本信息。
- setup_arch(&command_line); 设置与初始化硬件体系相关的环境并调用
- setup_per_cpu_areas(); 每个cpu分配pre-cpu结构内存
- sched_init(); 进程调度器初始化
- preempt_disable(); 内核的抢占
- printk(boot_command_line); 提取分析核心启动参数过程(从bootloader中传递)
- build_all_zonelists(); 建立系统内存页区(zone)链表
- printk(KERN_NOTICE "Kernel command line: %s/n", boot_command_line); 打印Linux启动命令行参数
- parse_early_param(); 解析早期格式的内核参数
- trap_init(); 设置CPU的异常处理函数。
- init_IRQ(); 初始化IRQ中断和终端描述符。
- pidhash_init(); 初始化hash表
- init_timers(); 初始化定时器Timer相关的数据结构。
- hrtimers_init(); 对高精度时钟进行初始化。
- softirq_init(); 初始化软中断。
- time_init(); 初始化系统时间
- profile_init();对内核的一个性能测试工具profile进行初始化。
- local_irq_enable(); 使能IRQ中断
- console_init(); 初始化控制台以显示printk的内容
- 接下来就是执行rest_init();
进程产生
- 从rest_init()开始,Linux系统就开始产生进程,通过kernel(kernel_init,NULL,CLONE_FS)启动内核进程kernel_init,也就是1号进程,它管理调度其他的内核进程,并由kthread_create_list全局链表管理其内核线程列表。
- 接着创建二号进程kthreadadd()
- 当系统没有进程需要执行的时候,就会调度到idle进程,也就是0号进程,它自系统开始运作时便一直存放于系统之中。在某种角度来说,它创建了1号进程和其他的进程。
实验截图
- 设置start_kernel的断点与rest_init的断点


linux及安全第三周总结——跟踪分析LINUX内核的启动过程的更多相关文章
- Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...
- Linux第三周——跟踪分析内核的启动过程
跟踪分析内核的启动过程实验 张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周主要学习的是对内核 ...
- linux内核分析第三周-跟踪分析Linux内核的启动过程
一.实验流程 1.打开环境 执行命令:cd LinuxKernel/ 执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...
- Linux内核分析 实验三:跟踪分析Linux内核的启动过程
贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...
- 实验三:跟踪分析Linux内核的启动过程
实验三:跟踪分析Linux内核的启动过程 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.16 ...
- 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结
实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核分析之跟踪分析Linux内核的启动过程
一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...
- 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点
跟踪分析Linux内核的启动过程 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.stud ...
随机推荐
- Python3编写网络爬虫05-基本解析库XPath的使用
一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...
- Go学习笔记02-基本语法
目录 变量定义 代码示例 变量定义 内建变量类型 复数回顾 强制类型转换 常量 枚举类型 变量定义 代码示例 package main import "fmt" /* 此处定义的变 ...
- vue实例生命周期详解
每个 Vue 实例在被创建之前都要经过一系列的初始化过程. 例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM . 在这个过程中,实 ...
- Django之ORM查询
ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象图书管理系统的增删改查:代码如下:views ...
- mac下更改Jupyter notebook工作目录
Jupyter notebook运行之后,默认的工作目录在mac下是个人文件夹,在windows下貌似也是如此.显然不太合理,需要修改它. 具体办法是: 进入终端命令行模式,输入下面的代码: jupy ...
- redis类与用法
<?phpnamespace app\common\model; class Cache { public $redis = null; public function __construct( ...
- ROS教程3 ROS自定义msg类型及使用
1ROS自定义msg类型及使用 http://blog.csdn.net/u013453604/article/details/72903398 首先创建一个空的package单独存放msg类型(当然 ...
- solidity学习-cryptoPunks为实例
在这里使用cryptoPunks为实例来进行solidity的介绍,一般这些内容理解了就能够进行相对简单的智能合约的编写了,同时会添加一些我认为也十分重要的内容学习文档为http://solidity ...
- 《深入理解Java虚拟机》笔记(转)
文章来自http://www.cnblogs.com/tianchi/archive/2012/11/11/2761631.html 在C里面我们想执行一段自己编写的机器指令的方法大概如下: type ...
- jmeter(十三)常见问题及解决方法
jmeter作为一个开源的纯Java性能测试工具,工作中极大的方便了我们进行接口.性能测试,但使用过程中也遇到了很多的问题,下面就记录一下自己遇到的问题,后续会不断更新... 1.获取日志 在使用jm ...