Linux内核结构以及内核模块编程
单内核与微内核
单内核:操作系统的各个子系统
比如文件系统、内存管理 、进程管理以及网络系统,进程通信它们互相之间可以直接调用
微内核:只有一些核心的代码放在微内核里
比如核心的进程间通信终端以及调度程序放在微内核,类似于文件系统放在外部
单内核的性能比较高,但是可维护性比较差
微内核与服务器之间是一种通信的关系,效率低,但是因为这种架构各个服务器之间,服务器之间相对独立,维护性比较好
常见的微内核操作系统:Minix3,QNX,L4 Fuchsia
linux编译非常慢,为了方便Linux内核编程,不用每次加装模块的时候都要重新编译
linux有一个可加装的linux内核模块(LKM),方便用户加载和卸载模块
linux内核模块编程入门()
这里的printk就是print kernal,意思是输出到内核,输出到日志文件
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
/*
模块的初始化函数lkp_init()
__init是用于初始化的修饰符
*/
static int __init lkp_init(void)
{
printk("<1>Hello,world!from the kernel space...\n");
}
/*
模块的退出和清理函数lkp_exit()
*/
static void __exit lkp(void)
{
printk("<1>Goodbye,world!leaving kernel space...\n");
}
/*
调用函数
*/
module_init(lkp_init);
module_exit(lkp_exit);
/*
模块的许可证声明GPL
*/
MODULE_LICENSE("GPL");
内核模块不是独立的可执行文件,但在运行时其目标文件被链接到内核中。只有超级用户才能加载和卸载模块
编译内核模块
makefile文件
obj-m:=module_example.o #产生moudle_example模块的目标文件
CURRENT_PATH := $(shell pwd) #模块产生的当前路径
LINUX_KERNEL := $(shell uname -r) #linux内核源代码的当前版本
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) #linux内核源代码的绝对路径
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理模块
模块插入命令:
$insmod module_example.ko
模块删除(卸载)命令:
#rmmod module_example
linux内核模块与C应用的对比