Linux内核源码目录
操作系统最基本的功能应该有任务调度、资源管理、内存管理、进程通信等。然后在此基础上添加一些扩展功能,比如文件系统、HTTP协议栈、shell等。
通性
下面是RT-Thread的源码,其中src是内核源码,实现最基本的功能(include是一些头文件),而component是基于src添加的高级功能,比如文件系统,TCP/IP协议栈等。
Linux源码也是一样的,只不过源码目录比上面大很多。kernel、ipc、mm算是Linux内核的东西,drivers、fs算是基于内核的一些高级功能。
重点理解arch和drivers目录,其它目录见名知意,以及documentation目录,此目录下有许多对应的帮助/说明文档。
参考
Linux内核目录结构介绍:该文介绍了Linux内核源码的各个文件夹的作用,以及drivers文件夹下各个文件夹的作用。
arch/arm目录的理解
每种架构下,都包含有boot、config、kernel、lib、Kconfig
文件或目录,拿ARM架构来说,arch/arm/kernel目录下的head.S文件是linux系统启动的第一个文件;arch/arm/kernel目录下的trap.c文件,对CPU的异常进行初始化;arch/arm/kernel
目录下的dma.c
,对CPU的dma进行管理;Kconfig文件里的内容在执行make menuconfig
时会出现在界面中;configs目录下是一些默认配置文件,可以用来生成内核需要的配置文件.config,执行make menuconfig
也会生成一个.config
文件,.config
文件指导编译时需要编译哪些文件,最终生成的vmlinux
就是能够运行在该架构下的linux内核;mach-SoC
名 目录下的文件,描述了该SoC内部硬件资源(如地址、大小等),mach-Board文件是描述板子资源的文件。
学习嵌入式Linux驱动开发时,有时会到arch下面找驱动,有时会到drivers下找驱动,这两个文件家有什么不同呢?我的理解是这样的:
- arch下的驱动跟具体的平台有关,比如针对不同的SOC。
- 而drivers下的驱动是某一类设备的驱动,与平台无关,比如USB子系统、input子系统等,Linux内核开发者抽象出一些API给其它人使用。
如何切入Linux内核源码
如何切入Linux内核源码:该文从如何到Linux内核中寻找usb驱动说起,讲解了一些不错的学习方法。
如何移植Linux内核自带的驱动
一般驱动都在drivers下或者arch目录对应的架构下,我们可以通过阅读各个目录下的Kconfig、Makefile、Readme来获得相关信息,以及Documentation目录下对应的说明/帮助文档,以及Documentation/devicetree
目录下对应的设备树结点编写要求。
- 自带驱动在那里?
- drivers目录下
- arch目录下对应的架构中也有一些驱动
- 如何修改和使用自带驱动?
- Documentation目录下对应驱动的帮助文档(有些驱动是没有帮助文档的)
- 如果自带驱动是基于设备树的,那么应该怎么编写设备树结点?
- 参考
Documentation/devicetree
目录下对应的绑定文档 - 如果没有对应的绑定文档,那么就只有自己分析驱动程序来编写对应的设备树结点了。
- 参考
正x原x教程中出现的Linux内核自带驱动移植教程
触摸屏、pwm(如何使用nxp自带的pwm驱动)、led灯驱动、按键驱动、USB驱动、