一、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可以查看当前运行的内核版本。

Logo

更多推荐