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脚本启动应用程序)。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐