一、内核中平台无关的目录
/block:块,不是驱动,是一些调度算法
crypto:加密算法,比如printf是调用c库来实现的,所以不能用在裸机上,但是crypto跟应用程序无关,不依赖第三方库,所以可以用在裸机上
/Documentation:内核说明文档,参考书
/drivers:也就是用来放驱动的
/firmware:固件,有些板子需要
/fs:文件系统的相关信息
/include:内核所使用的头文件
/init:系统初始化的目录
/ipc:进程间通信机制:信号量、消息队列、共享内存
/Kbuild:内核编译方法
/Kconfig:内核配置方法
/Kernel:内核相关代码
二、内核中平台相关的目录
/arch:比如arm、x86等,arm和x86等里面文件的结构也有可能不同
其中/arch/arm下重要文件: mach_xxx:板子,你的开发板就在这里; plat_xxx:平台,芯片有很多复用性,比如三星各种芯片内部有很多共用的东西,所以把没区别的东西放这里
三、区别:
进入arch/arm里面看同样也有include、kernel、lib等文件,这是因为linux内核最终是要运行到具体的平台架构上面的,而arch就是和具体的平台架构有关,所以内核根目录的某个文件夹会通过某种方式依赖arch里面的同名文件夹。所以看到一个同名文件要区分它是在平台有关的目录还是在平台无关的目录,对排除问题有帮助
三、看懂内核源码的头文件
内核根目录下有个include,/arch/arm里面也有个include,怎么根据找到具体的头文件?根据头文件的前缀来区分,如:
1、#include <asm/xx.h>:xx.h前缀是asm,cpu体系结构相关的,到具体架构如/arch/arm/include中找
2、#include <linux/xx.h>:xx.h前缀是linux,平台无关的,到源码根目录下的include去找io.h
3、#include <plat/xx.h> :xx.h前缀是plat,芯片公司相关的
4、 #include <mach/xx.h>:前缀是mach,开发板相关的,到/arch/arm/中,发现也有很多mach-xxx文件夹,mach-imx6ull/include/hardware.h,mach-s7d/include/hardware.h,那到底该选哪个呢?
显然我们知道内核相当于一个仓库,但是内核不能把所有芯片、板子都编译了,所以拿到内核想编译成能在你开发板上跑最重要的第一步是在内核这个总仓库中选一个适合你板子的仓库,这就涉及到内核的配置的概念:搞懂Linux内核地图之二:配置内核Makefile