对于嵌入式Linux驱动开发有些培训和书做的非常不好的一点就是忽视先讲基础再讲实例,一上来就讲实例一则笔试面试题目不会二则不能归纳总结。嵌入式Linux的驱动开发是有很多套路的,那些套路就是基础,而实例是可以演化出很多种来的。
1、内核用哪个C语言库还是说根本没有库
与普通用户程序不同,内核代码不能使用标准C函数库及其他一些函数库。主要原因是由于完整的C函数库很大。因此在内核源代码中有专门一个lib/目录提供内核需要用到的一些函数。内核函数库用于为内核初始化程序init/main.c运行在用户态的进程(进程0、1)提供调用支持。它与普通静态库的实现方法完全一样。读者可从中了解一般libc函数库的基本组成原理。在lib/目录中共有12个C语言文件,除了一个由Tytso编制的malloc.c程序较长以外,其他的程序很短,有的只有一二行代码,实现了一些系统调用的接口函数。
这些文件中主要包括退出函数_exit()、关闭文件函数close(fd)、复制文件描述符函数dup()、文件打开函数open()、写文件函数write()、执行程序函数execve()、内存分配函数malloc()、等待子进程状态函数wait()、创建会话系统调用setsid()以及在include/string.h中实现的所有字符串操作函数。
这本《Linux内核API完全参考手册》就可以囊括基本的内核api函数,至于很多开发者说linux内核不断在更新API函数也在更新,这个就看个人跟不跟了。
2、从API函数分解出来的内核各部分基础开发
https://blog.csdn.net/o0avalon0o/article/details/98475542这篇文章写的不错
模块机制:module_init()
进程管理:kernel_thread
进程调度:
中断机制:enable_irq()
内存管理:kmalloc()
内核定时机制:init_timer()
内核同步机制:
文件系统:
驱动:
3、驱动子系统和它们之间的组合
不要单一的看驱动子系统很多都是组合在一起才能用的,比如input+I2C才能组成触摸输出驱动;V4L2+USB或者mipi才是摄像头驱动;ALSA+I2S才是音频驱动;LCD+framebuffer才是显示驱动;LCD+DRM才是GPU驱动;mac+phy+linux TCP/IP协议栈才是网络驱动;sdio+linux TCP/IP协议栈才是wifi驱动……
这些组合没办法只能靠不断看源代码学习。培训机构或者书本都是单讲的,对于实际项目使用非常不利。