IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 2021-2022-1 20212812《Linux内核原理与分析》第四周作业 -> 正文阅读

[系统运维]2021-2022-1 20212812《Linux内核原理与分析》第四周作业

实验三

一、实验内容:跟踪分析Linux内核的启动过程

二、实验过程

1.使用实验楼的虚拟机打开 shell,输入下列命令

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

在这里插入图片描述
使用 gdb 跟踪调试内核

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

关于-s和-S选项的说明:

  1. -S -S freeze CPU at startup (use ’c’ to start execution)
  2. -s -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

在这里插入图片描述

另开一个 shell 窗口

$ gdb     // 打开 GDB 调试器 

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

运行结果如下:
在这里插入图片描述
如上图所示,我们可以看到程序执行到start_kernel断点处。
再在rest_init处为内核代码增加一个断点,运行效果如下:
在这里插入图片描述

三、代码分析:start_kernel( )函数

Linux内核:

arch:不同的CPU,不同的体系结构源代码不同,关心x86。

init:内核启动相关的代码。start_kernel

kernel:

mm_init:内存管理初始化。

rest_init:主要使命就是创建并启动内核线程init。

sched_init:进程调度初始化函数,主要做了设置进程的GDT,LDT描述符,设置系统定时器中断,系统调用终端。

trap_init:中断初始化函数,主要调用了set_trap_gate和set_system_gate。

分析:start_kernel()类似C程序中的main函数。在start_kernel()函数之前,内核的代码都是用汇编写的,主要工作是完成一些最基本的初始化与环境设置工作;在start_kernel()中Linux将完成整个系统的内核初始化,在start_kernel的最后,是调用rest_init函数,在rest_init函数中,内核将产生第一个真正的进程,即pid=1的1号进程,而在start_kernel函数中init_task是静态制造出来的,pid=0,我们可以在start_kernel函数的开始处,看到其被初始化的代码,它试图将从最早的汇编代码一直到start_kernel的执行都纳入到init_task进程上下文中,在其初始化工作完成后,就会成为系统的idle进程。事实上在更早前的sched_init函数中,通过init_idle(current, smp_processor_id())函数的调用就已经把init_task初始化成了一个idle task,init_idle函数的第一个参数current就是&init_task,在init_idle中将会把init_task加入到cpu的运行队列中,这样当运行队列中没有别的就绪进程时,init_task(也就是idle task)将会被调用,它的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。

四、总结

操作系统内核启动是一个比较复杂的过程,start_kernel做了众多初始化工作,这些初始化与硬件、堆栈、进程等相关。这些初始化工作将内核带到可以在硬件上运行的环境和状态。在没有用户进程可供调度时,操作系统就像一个死循环,不断执行idel即0号进程。idel进程是操作系统创建的第一个进程。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 20:02:05  更:2021-10-16 20:04:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:32:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码