linux 第三周
linux内核目录结构
-
arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
-
include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
-
init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
-
mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
-
drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
-
ipc目录包含了核心进程间的通信代码。
-
modules目录存放了已建好的、可动态加载的模块。
-
fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
-
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
-
net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
-
lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
-
scripts目录包含用于配置核心的脚本文件。
-
documentation目录下是一些文档,是对每个目录作用的具体说明。
实验楼环境
cd Linuxkernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
qemu:启动一个虚拟机平台
-kernel:给一个内核,操作系统
-initrd:驱动所需的硬盘
rootfs.img:放一个可执行文件由menuOS源代码编译成的init
进入menu系统,支持三个命令 help version quit
自己搭建
1、下载内核源代码编译内核(下载,解压,编译)
2、制作根文件系统(创建目录存放文件系统)
3、启动menuOS
三、分析start_kernel函数的执行过程
在init目录下的main.c有函数 ,其中包含start_kernel函数
基本所有模块,都需要start_kernel来进行初始化。
asmlinkage __visible void __init start_kernel(void)
其中,有init_ task,set_ task_ stack_ end_ magic(&init_task);这个是手工创建的PCB,0号进程,即最终的idle进程。
trap_init();//中断向量初始化
mm_init();//内存管理模块初始化
sched_init();//调度模块初始化
console_init();//控制模块初始化
rest_init(); //其他模块初始化
其中rest_ init()调用了
-->kernel_ thread(kernel_ init, NULL, CLONE_ FS); 调用了
-->run_ init_ process(ramdisk_ execute_ command);
//init是第一个用户态进程,是1号进程
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
//创建了线程
在rest_init中,各部分启动完毕后,
/* Call into cpu_idle with preempt disabled */
cpu_startup_entry(CPUHP_ONLINE);
调用static void cpu_idle_loop(void);
里面有个while(1)
也就是在系统没有进程需要执行时就调度idle进程
总结下来:在start_ kernel启动后,rest_ init的中0号进程会一直存在。