Linux内核结构以及内核模块编程

Linux内核结构以及内核模块编程

单内核与微内核

单内核:操作系统的各个子系统

比如文件系统、内存管理 、进程管理以及网络系统,进程通信它们互相之间可以直接调用

 

微内核:只有一些核心的代码放在微内核里

比如核心的进程间通信终端以及调度程序放在微内核,类似于文件系统放在外部

 

单内核的性能比较高,但是可维护性比较差

微内核与服务器之间是一种通信的关系,效率低,但是因为这种架构各个服务器之间,服务器之间相对独立,维护性比较好

 

常见的微内核操作系统:Minix3,QNX,L4 Fuchsia

 

linux编译非常慢,为了方便Linux内核编程,不用每次加装模块的时候都要重新编译

linux有一个可加装的linux内核模块(LKM),方便用户加载和卸载模块

 

linux内核模块编程入门()

这里的printk就是print kernal,意思是输出到内核,输出到日志文件

#include 
#include 
#include 
/*
    模块的初始化函数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应用的对比
Linux内核结构以及内核模块编程_第1张图片

你可能感兴趣的:(linux)