1.源码总体介绍
学习linux内核最好的方式当然是阅读内核源码,内核源码下载:
https://www.kernel.org/
使用版本:linux-3.0.20
1.1源码目录介绍
文件夹 | 简介 |
---|---|
arch | 体系架构相关 |
block | 块设备管理 |
crypto | 算法相关 |
drivers | 驱动相关 |
firmware | 固件相关 |
fs | 文件系统 |
include | 公共的头文件 |
init | 内核启动的初始化代码 |
ipc | 进程通信 |
kernel | 内核最核心的模块,进程调度等 |
lib | 内核公用的库函数 |
mm | 内存管理模块 |
net | 网络子系统 |
samples | 内核参考示例代码 |
scripts | 脚本文件 |
security | 安全相关 |
sound | 音频处理相关 |
tools | 一些linux工具 |
usr | 内核启动相关的 |
virt | 虚拟机相关 |
linux内核主要包括:
文件系统、内存管理、进程调度、网络管理
驱动管理五大子系统。
驱动管理:管理系统的硬件接口,如iic spi pcie等驱动
进程调度:进程调度包括调度策略、进程切换等
网络管理:协议栈tcp/ip协议、arp协议等
内存管理:物理内存管理、虚拟内存管理、内存映射等内容
文件系统:vfs proc等文件系统
其他:中断、定时器、进程通信等
内核源码学习是一个漫长的过程,不要一下淹没在源码的海洋中,不知如何入手,用普通电脑的source insight软件进行加载源码可能需要几分钟,我们可以对其进行适当裁剪。
例如,我们主要研究基于arm的内核,那么我们可以对部分文件进行裁剪,源码多采用c语言的函数指针进行挂接,因此不影响阅读。
arch 目录,主要是处理器相关的,可以删除不需要的,留下arm arm64;
drivers目录,内核驱动相关的,此目录占据了源码的大部分,可以裁剪掉一部分暂时不需要的,留下iic spi gpio uart等常用的;
1.2 使用source insight软件查看内核源代码
使用软件:windows可使用source insight进行大型项目查看
source insight默认是不支持汇编代码的查看的,需要进行简单配置,
在Options->Document Options->File filter中增加.S .s .asm文件;
在Project->Add and Remove Project Files增加文件即可;
2.内核启动过程简介
内核源码主线: 个人建议学习应把握主线,逐渐细化,这也是每一个大型项目所共有的学习思路。
把握主线:即linux内核启动过程
逐渐细化:即深入学习进程调度、内存管理、驱动管理、文件系统、网络管理等模块
内核启动过程:内核作为uboot与应用程序的桥梁,uboot的宿命是启动内核,启动完之后uboot就结束了,启动内核后第一句指令为head.s的stext处,最终的出口则为加载init程序,从而启动应用程序。和uboot不同的是,内核为应用程序提供文件系统、驱动管理、进程调度等系统支撑,一直运行。
arch/arm/kernel/vmlinux.lds.S
arch/arm/kernel/head.s
kernel/init/main.c
从vmlinux.lds.S我们了解到内核入口为head.s的stext处,经过简短的汇编处理后最终会调用main.c的start_kernel,最终通过rest_init调用kernel_init启动init(嵌入式一般为busybox生成的linuxrc,最终调用etc中rcS脚本启动应用程序)。