Linux内核第三节 20135332武西垚

总结部分:

Linux内核源代码:

Arch 支持不同cpu的源代码;主要关注x86

Init   内核启动的相关代码;主要关注main.c,整个Linux内核启动代码start_kernel函数

Kernel 核心代码

   installing the kernel source:如何安装内核源代码

构建Linux系统os

使用gdb跟踪内核运行过程

-S cpu在初始化之前将其冻结

-s 在tcp端口创建server

分析start_kernel函数

Trap init 涉及中断

这个函数用来做体系相关的中断处理的初始化,在该函数中调用__trap_init((void *)vectors_base())

  函数将exception vector设置到vectors_base开始的地址上。 __trap_init函数位于entry-armv.S文件中,对于ARM处理器,共有复位、未定义指令、SWI、预取终止、数据终止、IRQ和FIQ 几种方式。

  SWI主要用来实现系统调用,而产生了IRQ之后,通过exception vector进入中断处理过程,执行do_IRQ函数。

Rest_init: init_process初始化1号进程

Start_kernel:创建0号进程

mm_init:内存管理模块初始化

sched_init:调用进程调度初始化

初始化系统调度进程,主要对定时器机制和时钟中断的Bottom Half的初始化函数进行设置。

  与时间相关的初始化过程主要有两步:

  (1)调用 init_timervecs()函数初始化内核定时器机制;

  (2)调用init_bh()函数将BH向量TIMER_BH、TQUEUE_BH和 IMMEDIATE_BH所对应的BH函数分别设置成timer_bh()、tqueue_bh()和immediate_bh()函数

kthreadd:内核线程,用来管理系统资源

当系统没有进程需要执行时就调度闲置idle进程,即0号进程,一直存在。

Qemu 启动虚拟机

:先启动第一个进程,所有的东西都是由第一个进程启动的。

  -kernel 文件名 –initrd rootfs.img

  内核启动以后需要访问硬盘,网卡。

Linux启动的理解:

最初始阶段

计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许你从软盘、光盘或者硬盘中选择一个来启动计算机。

第二阶段

计算机将从你所选择的存储设备中读取起始的512 bytes(比如光盘一开是的512 bytes,如果我们从光盘启动的话)。这512 bytes叫做主引导记录MBR (master boot record)。MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader)。Boot loader储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核 (kernel)所在位置等。常用的boot loader有GRUB和LILO。

第三阶段

boot loader会帮助我们加载kernel。kernel实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过kernel传达给硬件。Windows和Linux各自有自己kernel。狭义的操作系统就是指kernel,广义的操作系统包括kernel以及kernel之上的各种应用。

加载kernel阶段

如果我们加载的是Linux kernel,Linux kernel开始工作。kernel会首先预留自己运行所需的内存空间,然后通过驱动程序(driver)检测计算机硬件。这样,操作系统就可以知道自己有哪些硬件可用。随后,kernel会启动一个init进程。它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,kernel就完成了在计算机启动阶段的工作,交接给init来管理。

小结: kernel -> init process

运行init process阶段

(根据boot loader的选项,Linux此时可以进入单用户模式(single user mode)。在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误)

随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts。这些脚本执行如下功能:

设置计算机名称,时区,检测文件系统,挂载硬盘,清空临时文件,设置网络……

总结

BIOS -> MBR -> boot loader -> kernel -> init process

参考资料:

http://www.linuxidc.com/Linux/2015-03/114679.htm

http://www.jb51.net/LINUXjishu/214026.html

实验部分:  

cd LinuxKernel/

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

qemu相当于打开一个虚拟机

kernel启动一个内核,位置由其后的文件名指定。

initrd指令是挂载一个虚拟硬盘,,rootfs.img就是这个虚拟硬盘

可以看到menuOS只支持三个命令

使用gdb跟踪调试内核

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:

# -S freeze CPU at startup (use ’c’ to start execution)

# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

水平分割shell窗口

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

list查看其附近的代码:

第二个断点:rest_init

时间: 2024-11-10 11:42:10

Linux内核第三节 20135332武西垚的相关文章

Linux内核第八节 20135332武西垚

第一种分类: I/O-bound:频繁进行I/O,并且需要花费很多时间等待I/O完成 CPU-bound:计算密集,需要大量的CPU时间进行运算 第二种分类: 批处理进程:不必与用户交互,常在后台进行:不必很快响应(典型的批处理系统:编译程序.科学计算). 实时进程:有实时需求,不应被低优先级进程阻塞,响应时间短.要稳定(典型的实时进程:视频/音频.机械控制等). 交互式进程:需要经常与用户交互,因此要花很多时间等待用户输入操作,响应时间要快,平均延迟要低(典型的交互式程序:shell.文本编辑

Linux内核第五节 20135332武西垚

20135332武西垚 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 由于本周实验是在Kali虚拟机上进行操作的,具体实现过程中的代码和实验楼里的环境有一定的差异,在解决了各种报错之后终于完成了实验,在这次的实验报告中将较为详细的记录实验过程中遇到的问题以及解决方案,以便以后更加熟练地理解与掌握Kali的操作原理和步骤. 实验——分析system_call中断处理过程 给MenuOS增加time

Linux内核第七节 20135332武西垚

预处理.编译.链接和目标文件的格式 可执行程序是怎么得来的 以C语言为例,c代码经过编译器的预处理,编译成汇编代码,由汇编器编译成目标代码,再链接成可执行文件,由操作系统加载到cpu里来执行. (截图) .c----.asm(.s)-----.o(二进制文件)-----A.out(可执行文件) 预处理负责把include的文件包含进来及宏替换等工作 可执行文件是使用共享库的. 静态编译 -static 把库里的东西都放在里面了所以比较大 可执行文件的内部是怎样的? 目标文件的格式ELF (截图)

Linux内核第六节 20135332武西垚

如何描述一个进程:进程描述符的数据结构: 如何创建一个进程:内核是如何执行的,以及新创建的进程从哪里开始执行: 使用gdb跟踪新进程的创建过程. 进程的描述 操作系统三大功能: 进程管理(最核心最基础) 内存管理 文件系统 进程描述符task_struct数据结构 task _ struct:为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息.struct task_struct数据结构很庞大. 进程的状态:Linux进程的状态(就绪态.运行态.阻塞态)与操作

Linux内核总结博客 20135332武西垚

http://www.cnblogs.com/wuxiyao/p/5220677.htmlhttp://www.cnblogs.com/wuxiyao/p/5247571.htmlhttp://www.cnblogs.com/wuxiyao/p/5272748.htmlhttp://www.cnblogs.com/wuxiyao/p/5299117.htmlhttp://www.cnblogs.com/wuxiyao/p/5325392.htmlhttp://www.cnblogs.com/wu

Linux内核第二节

作者:武西垚 深入理解函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 esp,堆栈指针,指向栈顶 ebp,基址指针,指向栈底,在C语言中用作记录当前函数调用基址. 其他关键寄存器 cs(代码段寄存器) : eip:总是指向下一条的指令地址 顺序执行:总是指向地址连续的下一条指令 跳转/分支:执行这样的指令的时候, cs : eip的值会根据程序需要被修改 参数传递与局部变量 建立框架(相

20135239 益西拉姆 linux内核分析 可执行程序的装载

益西拉姆 + 原创作品请勿转载 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” week 7 可执行程序的装载 1.预处理.编译.链接和目标文件的格式 从c语言到可执行程序的由来过程 可执行文件的创建——预处理.编译和链接 以helloworld为例 -s assembler 汇编 gcc -o hello hello.o -m32 是把hello.o链接成可执行文件. ELF格式的文件是怎么回事? v

20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程

益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机是如何工作的? 什么是冯诺依曼体系结构? 简单来讲就是存储程序计算机,而存储程序计算机又是指从硬件角度来看, X86汇编基础 学习笔记 详细内容都写在笔记中.再次不多说. 总结:以前一直搞不太懂汇编代码,学的不明不白,虽然现在也是学的不是太明白,至少知道了各个代码什么意思,以及该如何表现,这让我觉得老师的课时

20135239益西拉姆 Linux内核分析 进程的描述和进程的创建

[益西拉姆 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 第六周 进程的描述和进程的创建 一. 进程的描述 进程控制块PCB——task_struct 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct数据结构很庞大 Linux进程的状态与操作系统原理中的描述的进程状态似乎有所不同,比如就绪状态和运行状态都是