20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS

李辰希 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

第三周构造一个简单的Linux系统MenuOS

一、Linux内核源代码简介

  1. 三个法宝和两把宝剑:

三个法宝:存储程序计算机、函数调用堆栈、终断

操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场)、进程上下文的切换

2.linux内核源代码简介

  arch/x86目录下的代码是重点关注的

  init目录:内核启动相关的代码基本都在init目录下

  init/main.c中start_kernel函数就相当于普通C程序的main函数

  fs目录:file system文件系统

  ipc目录:进程间通信

  kernel目录:Linux内核核心代码在kernel目录中

二.构造一个简单的Linux系统

实验过程

1.使用实验楼的虚拟机打开shell输入

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

2.启动kernel



3.启动gdb调试



4.用水平分割另外打开一个shell窗口之后,进行调试

设置断点(break)设置完断点之后,输入c命令continue继续执行,函数会停在断点处输入list指令之后,可以详细地查看断点附近的代码,输入list指令之后,可以详细地查看函数停留的位置







2.简单分析一下start_kernel

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

不管分析内核的哪一部分都会涉及到start_kernel

当系统没有进程需要执行时就调度到idle进程

三.总结

1.总结内核启动过程

kernelthread是0号进程,它创建了1号进程kernelinit,以及它的一些服务的内核线程,这样整个系统及启动起来了。然后init进程会再启动一些进程。

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

2.从restinit开始,Linux开始产生进程,因为inittask是静态制造出来的,pid=0,它试图将从最早的汇编代码一直到startkernel的执行都纳入到inittask进程上下文中在restinit函数中,内核将通过下面的代码产生第一个真正的进程(pid=1),也就是 kernelthread(kernelinit, NULL, CLONEFS | CLONE_SIGHAND);【0号进程创建1号进程】

3.一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。

initrd文件的功能主要有两个:

               1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)

                 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去



时间: 2025-01-05 01:44:05

20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS的相关文章

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

《Linux内核分析》 第三节 构造一个简单的Linux系统

黄胤凯   原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000

《Linux内核分析》MOOC课程 反汇编一个简单的C程序,分析汇编代码

一个简单c程序 分析一个简单的c程序 main.c 如下图: 用命令 gcc –S –o main.s main.c -m32编译成汇编文件.在汇编文件中有许多的虚指令并不会形成机器指令,为了使分析简单我们把大部分去掉: 得到如下图所示: 栈的介绍 APUE中指出每一个c程序,都有一个独立的地址空间,在内存中的典型布局如下: 对栈的操作和我们在数据结构中的栈的操作是类似的,ebp,esp(具体名称与cpu体系结构相关) 这两个寄存器直接与栈的操作相关. 栈地址是从高到低的方向分配的. 开始一个新

《Linux内核分析》MOOC课程 完成一个简单的时间片轮转多道程序内核代码

上一篇文章中介绍了一个进程执行的过程,分析了在调用子程序时栈的变化过程.本文介绍一下多进程的执行过程,当一个进程需要停下来等待某个条件或者cpu给它分配的时间片用完时需要切换给别的进程,在切换时首先会产生一个中断,然后cpu会执行相应的中断处理操作,比如一个重要的操作就是保护当前进程的栈和cpu寄存器的值,当cpu再次调度时可以恢复上一次状态继续执行下去. 按照mykernel上的步骤安装好程序,执行qemu -kernel arch/x86/boot/bzImage看到如下图: 执行的程序如下

《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE(2.29——3.6)构造一个简单的Linux系统MenuOS SECTION 1 Linux内核源代码简介 1.操作系统的两把宝剑(回顾上一讲) 中断上下文的切换——保存现场&恢复现场 进程上下文的切换 2.Linux内核源代码简介 打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的

Linux内核分析——第三周学习笔记20135308

第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 一.阅读Linux内核代码 本周我们要学习如何阅读Linux内核源代码,首先打开Lstest Stable Kernel:linux-3.18.6 arch/目录在Linux内核中占有相当庞大的代码量,因为Linux支持很多CPU,这个arch/x86目录下的代码是我们重要关注的代码 根目录中比较关

“Linux内核分析”实验三报告

构造一个简单的Linux系统 张文俊+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容: 一.gdb跟踪调试内核从start_kernel到init进程启动 1.qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明: // -S freeze CPU at s