Linux内核分析 NO.3

跟踪分析Linux内核的启动过程

于佳心 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

在之前的课程中,我们学习了操作系统的三个法宝(存储程序计算机、函数调用堆栈、中断机制),以及两把剑(中断上下文切换和进程上下文切换),而这节课我们的实验主要围绕的是中断机制

在此之前我们首先了解了Linux内核源代码,这其中有几个重要的代码:

arch目录下的代码十分庞大,而arch/x86目录下的代码很重要

init/main.c是内核启动相关代码,Linux内核的起点是start-kernel,相当于普通c程序中的main函数

kernel/里装的是进程调度相关代码

其他还有很多目录和代码,在此不做详述

接下来构造一个MenuOs,就是实验里的内容

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

在实验楼里只要输入这两行代码就可以了

下面附上使用自己的Linux系统环境搭建MenuOS的过程

  1. # 下载内核源代码编译内核
  2. cd ~/LinuxKernel/
  3. wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
  4. xz -d linux-3.18.6.tar.xz
  5. tar -xvf linux-3.18.6.tar
  6. cd linux-3.18.6
  7. make i386_defconfig
  8. make # 一般要编译很长时间,少则20分钟多则数小时
  9. # 制作根文件系统
  10. cd ~/LinuxKernel/
  11. mkdir rootfs
  12. git clone https://github.com/mengning/menu.git  # 如果被墙,可以使用附件menu.zip
  13. cd menu
  14. gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
  15. cd ../rootfs
  16. cp ../menu/init ./
  17. find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
  18. # 启动MenuOS系统
  19. cd ~/LinuxKernel/
  20. qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
  • 重新配置编译Linux使之携带调试信息
  1. 在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息
    1. kernel hacking—>
    2. [*] compile the kernel with debug info
  2. make重新编译(时间较长)

MenuOs构建成功

打开目录

其中linux-3.18.6是内核源代码,rootfs储存可执行文件(用menu编译好的可执行文件存储在里面)

  • 使用gdb跟踪调试内核
  1. qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
  2. # -S freeze CPU at startup (use ’c’ to start execution)
  3. # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

其中-S是指让CPU在执行前冻结,-s是指在1234端口创建gdp server

另开一个shell窗口

  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
  3. (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  4. (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

将断点设置在start-kernel之前

程序就只执行到start-kernel

输入list,可以看到start-kernel的代码

同理,设置一个rest-init的断点,程序执行到rest-init,输入list,可以看到rest-init的代码

通过这次实验我们发现,不管分析内核的哪一部分都会涉及到start-kernel。

下面我们来分析一下start-kernel

这里面有一个init_task,它是手工创建的PCB

trap_init 初始化中断--》set-system-trap-gate(SYSCALL_VECTOR,&system_call)设置系统陷阱门,其中SYSCALL_VECTOR是系统调用,系统调用也是一种中断,只是用指令来触发

start-kernel里还有很多模块

mm_init() 内存管理模块

sched_init() 调度模块

rest_init() 其他 -->kernel-init-->run-init-process是系统的一号进程,默认根目录下的init

kthreadd用一个内核进程来管理资源

-->call into cpu-idle

-->cpu-idle-loop

idle即是系统的0号进程,上面的指令是循环0号进程

当系统没有进程需要执行时就调度0号进程

rest-init在程序启动时就一直存在,创造了1号进程和内核进程

总结:这一次课程的内容有点难,有些地方没有弄懂。idle即是0号进程,关于0号进程和1号进程,所谓道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)。

时间: 2024-08-08 22:07:15

Linux内核分析 NO.3的相关文章

《linux 内核分析》 第4周

王一 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.linux 系统的状态 Linux在x86平台下支持0内核态和3用户态.在内核态32位平台能访问0x00000000以上的空间,而用户态只能访问小于0xc0000000一下的地址空间 (此处的地址空间为逻辑地址).当用户态切换到内核态的时候主要方式为中断. 1.当int128调用时,系统会自动的两个状态下的cs:eip,ss:es

《linux 内核分析》 第二周 实验

王一 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次课的核心是通过中断机制完成进程的调度 ,在本次课程中__init my_start_kernel作为入口函数,定义0号进程的tPCB结构体,通过复制来制造其他进程的tPCB数据结构,中断时间函数被 my_timer_handler周期性的调用来修改my_need_sched 的值,而0号进程一直在检测my_need_sched 的

Linux内核分析8

周子轩 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb跟踪分析一个schedule()函数,理解Linux系统中进程调度的时机. 实验过程: 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel rm -rf menu git clone https://git

《Linux内核分析》课程第七周学习总结

姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 学习内容:Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式: 使用gdb跟踪分析一个execve系统调用内核处

LINUX内核分析第七周学习总结——可执行程序的装载

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 2.目标文件的格式ELF 3.静态链接的ELF可执行文件和进程的地址空间 (二)可执行程序.共享库和动态加载 1.装载可执行程序之前的工作 2.装载时动态链接和运行时动态链接应用举例 (三)

《Linux内核分析》第六周学习小结

进程的描述和进程的创建 一.进程的描述 进程描述符task_struct数据结构: (1)操作系统的三大功能: 进程管理.内存管理.文件系统 (2)进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 (3)进程控制块PCB——task_struct数据结构 提供了内核需要了解的信息 (4)task_struct结构庞大,有400多行代码.包含了进程状态.内核堆栈等相关信息的定义. (5)Linux的进程和操作系统原理中描述的进程状态有所不同,实际内核中,就绪和运行状态都用TASK_RU

20135201李辰希《Linux内核分析》第六周 进程的描述与创建

李辰希 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大管理功能: 进程管理(最重要的) 内存管理 文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct: 进程状态 进程打开的文件 进程优先级信息 task_struct总体数据结构的抽象: tty:控制台 fs:文件系统

Linux内核分析——进程的描述和进程的创建

Linux内核分析——进程的描述和进程的创建 20135111李光豫 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)用户态.内核态和中断处理过程 (二)系统调用概述 系统调用概述和系统调用的三层皮 (三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用 使用库函数API获取系统当前时间 C代码中嵌入汇编代码的方法(复习) 使用C代码中嵌入汇编代码触发系统调