【Linux内核分析与驱动编程】内核调试实验-指定helloworld作为系统init入口

2 指定helloworld作为系统init入口
(1)编写一个helloworld.c程序
/hello.c/
#include <stdio.h>
void main()
{
printf(“Hello World\n”);
printf(“This is an entry\n”);
printf(“Author:fenghao\n”);
fflush(stdout);
while(1);
}
(2)gcc编译
gcc -static -o helloworld helloworld.c
在这里插入图片描述
(3)将helloworld制作成cpio
echo helloworld | cpio -o --format=newc > hellofs
在这里插入图片描述
(4)qemu启动目标机
sudo qemu-system-x86_64 -kernel bzImage -initrd hellofs -append “root=/dev/sda rdinit=/helloworld”
在这里插入图片描述
(5)观察qemu输出结果
在这里插入图片描述
(6)用调试模式启动,为该过程加入断点,调试
sudo qemu-system-x86_64 -kernel bzImage -initrd hellofs -append “root=/dev/sda rdinit=/helloworld nokaslr kgdboc=ttyS0,115200 kgdbwait” -k en-us -m 1024 -serial tcp::4321,server
在这里插入图片描述
gdb vmlinux
(gdb) target remote localhost:4321

在这里插入图片描述
在这里插入图片描述
Q1: 结合课件,描述一下Linux系统的启动过程是什么?
答:整个过程基本可以分为POST–>BIOS–>MBR(GRUB)–>Kernel–>Init–>Runlevel。
(1)BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。
(2)MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。
(3)GRUB(Grand Unified Bootloader),多系统启动程序,GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
(4)Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。
(5)Init,初始化,顾名思义,该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。
Q2: 结合源代码,描述一下start_kernel()函数是怎样一步步进入kernel_init()中的。(写出函数调用结构层次)在kernel_init()中做了哪些工作?
答:通过start_kernel进行调用,来初始化rest_init函数,rest_init函数调用kernel_init函数。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在kernel_init()中做了这些工作
1)打开控制台设备
2)挂载根文件系统
3)启动init进程

欢迎大家提出问题。

猜你喜欢

转载自blog.csdn.net/iefenghao/article/details/88199510