2020-2021-1 20209313 《Linux内核原理与分析》第四周作业

实验一 实验楼实验

实验要求:

  • 使用gdb跟踪调试内核从start_kernel到init进程启动
  • 分析从start_kernel到init进程启动的过程

在实验楼环境运行与重新编译

  1. 测试文件系统

  2. 冻结内核

3、分析:gdb跟踪调试断点

启动过程分析

来源:https://blog.csdn.net/u013291303/article/details/61643673

第一步:完成硬件系统初始化后,访问内核软件系统接口start_kernel()

第二步:start_kernel()顺序执行初始化模块,创建0号进程init

1、init_task中保存了一个进程的所有基本信息,如进程状态,栈起始地址,进程号pid等,pid=0
init_task,其在文件linux-3.18.6/init/init_task.c中定义如下:
struct task_struct init_task = INIT_TASK(init_task);

内核的初始化程序在start_kernel这个函数中,可以在线查看这些代码: start_kernel。通过阅读start_kernel代码,可以大致了解到内核在初始化的时候,做了以下工作:
1)lockdep_init():初始化内核依赖关系表,初始化hash表
2)boot_init_stack_canary():为栈增加保护机制,预防一些缓冲区溢出之类的攻击
3)tick_init():初始化内核时钟系统
4)boot_cpu_init():激活当前CPU
5)setup_arch():对不同体系结构的CPU设置不同的参数、选项等
6)trap_init():初始化硬件中断,函数中设置了很多中断门
7)mm_init():建立内核的内存分配器
8)sched_init():初始化任务调度
9)init_IRQ():中断向量的初始化
…….
n)rest_init():剩下的初始化工作,

第三步:创建1号进程

从rest_init开始,产生第一个1号进程:
kernel_thread(kernel_init, NULL, CLONE_FS);
其中kernel_thread()的源码在文件linux-3.18.6/kernel/fork.c中定义,通过execve()执行磁盘文件上的init程序。而init程序是用户态程序的1号进程,从而实现了内核态向用户态的转化。

第四步:0号进程的转变

在linux-3.18.6/init/main.c文件中看rest_init()函数的代码如下:

static noinline void __init_refok rest_init(void)
{
int pid;
rcu_scheduler_starting();
//很重要,创建一个内核线程init,PID=1,创建好了,但不能去调度它
kernel_thread(kernel_init, NULL, CLONE_FS);
numa_default_policy();
//很重要,创建第二个内核线程,PID=2,负责管理和调度其它内核线程。
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);
init_idle_bootup_task(current);
schedule_preempt_disabled();
cpu_startup_entry(CPUHP_ONLINE);
}

总结

阐明自己对“Linux系统启动过程”的理解,尤其是idle进程、1号进程是怎么来的。
rest_init()创建了1号进程,init_idle_bootup_task(current)创建idle
0号进程在fork了1号进程并且做了其余的启动工作之后,转化成为了idle进程。完成其使命,并一直处于内核态中无限循环。

实验二 MenuOS扩展

内容

  1. git clone https://github.com/mengning/menu.git 下载menu代码,
  2. 增加一个hello的命令,输出“hello 你的学号”
  3. 重新制作文件系统,并用qmenu运行测试。
  4. 上方提交hello相关代码的链接
  5. 下方附件提交测试截图

操作

  1. hello代码

  2. 重新制作文件系统

  3. qmenu运行测试

原文地址:https://www.cnblogs.com/assignment/p/13892281.html