Linux内核模块

Linux内核的整体架构本就非常庞大,其包含的组件非常多。而我们怎么把需要的部分包含在内核中呢?
一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是内核会非常大,而是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。

有没有一种机制可使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中?

Linux提供了这样的机制,这种机制被称为模块(Module)。具有这样的特点:

  • 模块本身不被编译入内核映像,从而控制了内核的大小。
  • 模块一旦被加载,它就和内核中的其他部分完全一样。

    为了使读者初步建立对模块的感性认识,我们先来看一个最简单的内核模块“HelloWorld”,代码如下:

//定义一个名为hello.c的文件
//模块许可证声明   
MODULE_LICENSE("Dual BSD/GPL");   
//模块加载函数   
static int hello_init(void)   
    {   
        printk("Imagination is more important than knowledge !/n");   
        return 0;   
    }   
    //模块卸载函数   
    static void hello_exit(void)   
    {   
        printk("hello world exit ! Congratulations!/n");   
    }   
    //这是驱动程序初始化的入口点。对于内置模块,内核在引导时调用该入口  //点;   
//对于可加载模块则在该模块插入内核时才调用。   

    module_init(hello_init);   
    //对于可加载模块,内核在此处调用module_cleanup()函数,而对于内置   //的模块, 它什么都不做。   
    module_exit(hello_exit);   
    //可选   
    MODULE_AUTHOR("IMAGINECUP");   
    MODULE_DESCRIPTION("A simple Hello World Module");   
    MODULE_ALIAS("A simplest module");   
模块的编译

为上面的代码编写一个简单的Makefile:

KVERS=$(shell uname -r)

#Kernel modules
obj-m +=hello.o#该名与上面.c文件同名

#Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0


build: kernel_modules

kernel_modules:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
注意:

Makefile文件与hello.c文件必须放在同一个文件夹下,然后在该文件夹下启动终端,输入sudo make ,运行结果如下:
这里写图片描述

模块的加载

加载模块命令

insmod moduleName.ko

查看当前已安装好的模块

lsmod

这里写图片描述
如上图所示,模块hello被加载到内核中。

模块的卸载

卸载模块命令

rmmod moduleName

这里写图片描述

注意

modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。

modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

语法

modprobe(选项)(参数)

选项

-a或--all:载入全部的模块;
-c或--show-conf:显示所有模块的设置信息;
-d或--debug:使用排错模式;
-l或--list:显示可用的模块;
-r或--remove:模块闲置不用时,即自动卸载模块;
-t或--type:指定模块类型;
-v或--verbose:执行时显示详细的信息;
-V或--version:显示版本信息;
-help:显示帮助。

参数

模块名:要加载或移除的模块名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值