一、linux内核简介
1.linux系统由两部分组成:内核空间和用户空间。
2.用户空间包括:用户应用程序和C库
3.内核空间包括:系统调用接口、内核和体系结构相关代码。
4.ARM处理器7种工作模式:用户模式,快速中断模式、外部中断模式、管理模式、数据访问终止、系统模式、未定义指令异常
5.为什么linux系统划分为用户空间和内核空间?
出于安全的考虑,linux利用处理器的分级的工作模式的特点,使用其中两级分别运行内核和应用程序。使操作系统得到充分保护。
6.系统调用和硬件中断:使程序执行在内核空间和用户空间两个状态切换。
7.Linux内核结构(组成):
系统调用接口:连接内核空间与用户空间
进程管理:进程创建、进程通信、进程调度
内存管理:内存分配回收、地址转换(虚-物理)
体系结构相关代码:CPU相关代码
设备驱动:
网络协议栈:
虚拟文件系统:
二、内核源代码
arch:architecture缩写。体系结构相关代码。
block:部分块设备驱动。
crypto:加密。
drivers:设备驱动
fs:文件系统
include:内核需要的头文件
lib:库文件
mm:内存管理代码(与体系结构无关的)
三、内核配置与编译
1.清除临时文件、中间文件、配置文件
make clean:删除大部分中间生成的文件保存配置文件.o
make mrproper:删除中间文件及配置文件
make distclean:在mrproper基础上删除补丁、编辑器备份等。
2.配置内核
make config:基于文本模式的交互式配置
make menuconfig:基于文本模式的菜单型配置(菜单由内核内scripts生成)
make oldconfig:使用已有的配置文件(.config)
make xconfig:图形化配置
3.如何配置
Arch/$cpu/configs目录下有供参考的配置文件。可以在此基础上修改,进行配置。
4.编译内核
x86:
make zImage:x86下只能用于小于512k的内核。
make bzImage。
如需获取详细编译信息,后面添加V=1,如
make zImage V=1
5.编译内核模块:(必须先编译内核)
make modules
6.安装内核模块:
make modules_install
四、Linux内核模块开发
1.什么是内核模块(特点)
模块本身不被编译进内核
可以根据需求,在内核运行期间动态的安装或卸载
2.内核模块程序
模块加载函数(必须):通过module_init宏指定。
模块卸载函数(必须):通过module_exit宏指定。
3.内核模块编译
通过makefile
单个文件的
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR :=/lib/modules/2.6.18-53.e15/build //内核源代码的路径 all: make -C $(KDIR) M=$(PWD) modules //进入-C后面的目录,使用其makefile编译;内核模块代码的位置,PWD=当前目录 clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers endif
多个文件的
ifneq ($(KERNELRELEASE),) obj-m := hello.o //内科模块的名字 hello-objs := main.o add.o //内核模块需要的源文件 else KDIR :=/lib/modules/2.6.18-53.e15/build //内核源代码的路径 all: make -C $(KDIR) M=$(PWD) modules //进入-C后面的目录,使用其makefile编译;内核模块代码的位置,PWD=当前目录 clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers endif
4.内核模块的安装与卸载
insmod 加载
rmmod 卸载
lsmod 查看
modprobe 加载:会查看依赖的模块,并首先加载
5.模块可选信息
许可证声明:MODULE_LICENSE("GPL")
作者声明:MODULE_AUTHOR
………………
模块参数:module_param指定模块参数,用于在加载模块是传递参数给模块。
module_param(name,type,perm)
name:模块参数的名称
type:参数的类型 bool,int,charp
perm:模块参数的访问权限 S_IRUGO :任何用户都有读权限 S_IWUSR
int a=3; char *st; module_param(a,int,S_IRUGO); module_param(st,charp,S_IRUGO);
6.内核符号导出
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名):只能用于包含GPL许可证的模块。
7.内核版本不匹配问题
内核模块的版本由所依赖的内核代码版本决定。
当前正在运行的内核的版本。
insmod程序在这两个版本不同时,会出现错误。
解决办法:
(1)使用modprobe --force-modversion强行加载
(2)确保相同,uname -r可以查看当前运行的内核版本。