1. Linux的单内核与微内核
1.1 两者整体框图比较
1.2 单内核
- 操作系统的各个子系统,比如说文件系统,内存管理,进程管理,网络系统,进程间通信,互相之间可以直接调用。
- 特点,由于各个子系统可以相互访问,所以性能比较高。但是可维护性比较差。
- 典型的Linux就是单内核
1.3 微内核
- 只有一些核心的代码放到了微内核里,比如核心进程间通信,中断,调度程序。
- 而文件系统,内存管理。可能以服务器的形式放在外部。
- 特点,由于各个模块访问是通过通信的方式访问,所以效率比较低,但是每个服务器相对独立,可维护性和安全性比较高。
- 典型的Mini3,QNX,L4 Fuchsia就是微内核。
2.模块
- Linux系统了模块的机制,可以将编译好的模块插入到linux内核或卸载出linux内核。
- 内核模块不是独立的可执行文件,但在运行时其目标文件被链接到内核中。只有超级用户才能加载和卸载模块。
2.1 模块基础模板
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
/*模块的初始化函数hello_init
__init是用于初始化的修饰符*/
static int __init hello_init(void)
{
printk("1_hello_init\n");
return 0;
}
module_init(hello_init);
/*模块的退出和清理函数hello_exit
__exit是用于退出的修饰符*/
static void __exit hello_exit(void)
{
printk("1_hello_exit\n");
}
module_exit(hello_exit);
/*模块的许可证声明GPL*/
MODULE_LICENSE("GPL");
2.2 模块编译Makefile模板
obj-m:=1_hello.o #产生1_hello模块的目标文件
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 #清理模块
2.4 插入,查看,卸载模块
-
插入模块需要root权限:
- sudo insmod 1_hello.ko
-
查看模块是否被插入:
- sudo lsmode
- sudo lsmode
-
内核打印存放在/proc/kmsg中可以通过输入dmesg
- dmesg
- dmesg
-
删除插入的模块
- sudo rmmod 1_hello
- sudo rmmod 1_hello