Linux驱动学习笔记 ----------内核编译系统

声明:个人学习笔记,理解、记录可能有错误,转载请注明出处,保留本文所有权

linux内核基本认知

在知道驱动程序的编写之前,需要对Linux内核有一个大概的了解。

linux为“分时系统” 调度算法以“时间片轮转”为主

Linux驱动学习笔记 ----------内核编译系统

对于上图,一个用户程序、应用程序作用于硬件,需要经过系统调用,从用户态进入内核态,相对于这两个状态,内核态可以理解为拥有管理硬件设备特权的用户态。

在内核构架之中可以分为以下几块:
进程管理、内存管理、虚拟文件系统(VFS)、网络协议栈、进程间通信

VFS对上提供接口,写入驱动程序,将接口通过VFS与上对应

一个用户程序驱动设备大体思路如下:
用户态->系统调用->内核态->vfs->设备驱动程序->驱动设备

裸机驱动与linux驱动有什么联系?
裸机驱动:通过硬件原理图直接对硬件接口进行电平控制,以此实现对应设备动作
linux驱动:还必须知道linux系统的驱动框架

linux kernel编译系统

linux kernel 源码数量庞大,且支持范围广,我们不可能将它们全部编译,故而只能选择性的编译

内核编译系统Kbuild由两个部分组成
Makefiles、kconfig

一、Makefiles
The Top Makefile:
内核源码的顶层Makefile,主要负责编译vmlinux、modules两类
编译内核的代码大多都得通过The Top Makefile

内核源码最终有三种选择

1.vmlinux : 内核印象
Image -> zImage -> boot.img
img是系统常驻,生存期随系统存亡

2.modules : 内核模块 xxx.ko
从本质上来说与vmlinux一致,都是内核源码的二进制文件,但以ko普通文件存在
生存期不随系统存亡,随个人需求加/卸载
加载命令: insmod xxx.ko
卸载命令: rmmod xxx.ko

3.不编译

.config :
内核的一个编译选项配置文件

the kbuild makefiles:
应用.config里面的信息构建
我们知道编译一个.o文件应该编译成vmlinux或者modules,但是内核编译系统是怎么知道的呢?

obj-y :指定所有编译进Vmlinux的.O文件列表
obj-m : 指定所有编译成.ko文件列表
目标-y / 目标-objs :生成“目标”所依赖的文件名

比如我欲将xxx.o编译成.ko文件
xxx.o依赖于1.o 2.o
eg:
obj-m += xxx.o
xxx-y += 1.o 2.o

二、Kconfig
1.config
语法:
类型:bool/tristate/string/hex/int
提示语 : prompt
依赖 : depends on
默认值: default
帮助 :help

eg :构建一个有三种选择的选项
config XCL //config name
tristate
prompt “This test”
default y
help “My name is xcl”
2.menuconfig :定义一个菜单选项
语法:类似config

eg:创建一个三种选择的菜单,菜单内部有两个选项
menuconfig xcl
tristate
prompt “This is test”
if CONFIG_xcl
config xcl_1
config xcl_2
endif

if/endif :类似与C的条件编译

3.source
在Kconfig中,相当于c语言中的#include ,包含
有时候,我们把自己一个目录(里面包含源码,Makefile, Kconfig)
放到内核源代码的某个目录下面去,我们期望:在make menuconfig的时候,可以看到我们自己在Kconfig定义的东西
./mk -k (make)可以去编译我们的源代码
kbuild不会自动搜索每个目录,所以,你的Kconfig要上一级或上上级……包含一下
`

`