赵连讯 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
linux源代码目录结构
为了熟悉操作系统,我们首先查看linux的源代码目录结构
- arch是各种架构的芯片的总目录
进入ls后,可以进一步的看到,我们常见的芯片架构。比如我们正在学习的x86的芯片架构,常见的嵌入式的控制芯片arm架构的芯片,mips的架构芯片。 boot目录是用来生成可执行文件的目录。
我们编译x86架构的内核后,生成的镜像文件bzImage就是在这个目录下。include文件夹下是编译过程中使用的头文件,同样在我们基于内核编译驱动文件时也要使用到这些头文件,才能保持一致性。在include/asm/下就能看到很多头文件。以gpio.h为例子。内部其实包含了linux/gpio.h而已。说明我们以后基于x86的平台编译gpio相关的程序时,并不需要包含此处asm/gpio.h而是使用通用的linux/gpio.h即可。
在setup.c中就定义了setup_arch这个函数的实现。这是与架构启动有关的代码。在启动过程中被调用。- mm文件夹有内存管理有关。mmap与内存的映射有关。
- drivers管理linux下所有驱动实现
- fs是文件系统的管理,包括虚拟文件系统
- include是常用的包含文件目录
- ipc进程间通信
- kernel目录和arch目录下的kernnel目录不同。以一个文件为例子。比如此目录下没有setup.c,不和具体的架构相关。但是都有signal.c。而且都被编译到内核中,至于两者是不是有相同的函数,如何调用的,以后再研究,本报告中不查看了。
- init目录是linux的启动目录,第一个函数在main.c中start_kernel函数。此外还有各种mount的文件,这些文件与是linux 内核启动成功之后,去mount到文件系统的。现在最主要关系的是main.c文件。也是我们跟踪的文件。
除了上述分析之外,我们在嵌入式工作中,使用的平台是arm处理器。这里也列出与嵌入式处理器相关的目录。
- arm下的目录结构比x86的架构下的目录更多。在arm下能够看到多出了不同的mach。个人理解,由相同的arm架构形成了不同的芯片类型。比如TI的芯片归类mach-omap2,比如三星的mach-s3c24xx。这里的omap2并不单指一个芯片而是一类芯片。在此目录下再细分。此外还有平台相关代码。plat-omap是针对omap类型的芯片的公共性代码。i2c.c完成了平台下的总线注册和设备添加功能。
start_kernel
start_kernel是操作系统中的入口函数,在这个函数中最后调用的一个函数是rest_init。
在rest_init函数中完成了线程的创建。首先创建了用户空间的1号进程,处理函数叫做init。应用空间所有的函数都从此进程派生出来。
随后创建了内核进程kthreadd进程。创建结束后自己作为0号进程进入到空闲状态。
cpu_startup_entry函数中会进入到while(1)循环中。
实验
按照实验要求,设置第一个断点,让程序停止在start_kernel的入口函数中 。
图示:
kernel文件夹下的部分文件列表