4---Linux内核模块

Linux内核模块简介

什么是模块?

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

模块具有什么特点?

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

模块有哪些常用命令?

https://blog.csdn.net/zwmnhao1980/article/details/81029038

https://blog.csdn.net/dang_guoying/article/details/54943833

  • lsmod命令——读取并分析/proc/modules 文件,获得系统中已经加载的所有模块以及模块间的依赖关系
  • 在/sys/module/hello目录下运行“tree –a”———得到目录树
  • modinfo <模块名>命令———获得模块的信息,包括模块的作者、模块的说明、模块所支持的参数以及vermagic

Linux内核模块的程序结构 

Linux 内核模块有哪些组成部分,有什么作用?

  • 模块加载函数(必须)---通过 insmod或modprobe命令加载内核模块时,完成模块初始化
  • 模块卸载函数(必须)---通过 rmmod命令卸载某模块时,完成模块注销
  • 模块许可证声明(必须)---防止收到内核被污染(kernel tainted)的警告
  • 模块参数(可选)---对应模块内部的全局变量
  • 模块导出符号(可选)---便于其他模块可以使用本模块中的变量或函数
  • 模块作者等信息声明(可选)。

如何定义模块加载函数?

  • 以_ _init标识声明
  • 以“module_init(函数名)”的形式被指定
  • 返回整型值,若初始化成功,返回0。初始化失败,返回错误编码,错误编码是一个负值,在<linux/errno.h>中定义,包含-ENODEV、-ENOMEM 之类的符号值。
static int _ _init initialization_function(void) 
{
/* 初始化代码*/
 }
 module_init(initialization_function);

如何加载内核模块?

request_module(module_name);或request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));

如何定义模块卸载函数?

  以_ _exit标识声明,以“module_exit(函数名)”的形式来指定。不返回任何值

static void _ _exit cleanup_function(void)
{
 /* 释放代码*/
 }
module_exit(cleanup_function);

通常来说,模块卸载函数要完成与模块加载函数相反的功能,模块卸载函数完成哪些功能?

  • 若模块加载函数注册了XXX,则模块卸载函数应该注销XXX。
  • 若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。
  • 若模块加载函数申请了硬件资源(中断、DMA通道、I/O 端口和I/O 内存等),则模块卸载函数应释放这些硬件资源。
  • 若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件 

如何定义模块参数?

module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数

static char *book_name = "深入浅出Linux设备驱动"; //字符指针参数
static int num = 4000; //指针参数
module_param(num, int, S_IRUGO);
module_param(book_name, charp, S_IRUGO);

导出符号如何定义?

“/proc/kallsyms”文件对应着内核符号表,它记录了符号以及符号所在的内存地址。

导出符号有什么作用?

导出的符号将可以被其他模块使用, 使用前声明一下即可。

如何使用导出符号?

#include <linux/init.h>
#include <linux/module.h>
 MODULE_LICENSE("Dual BSD/GPL");

 int add_integar(int a,int b)
 {
 return a+b;
 }

int sub_integar(int a,int b)
{
 return a-b;
}

 EXPORT_SYMBOL(add_integar);
 EXPORT_SYMBOL(sub_integar);

模块声明与描述如何定义?

//声明模块的作者、描述、版本、设备表和别名
MODULE_AUTHOR(author);
MODULE_DESCRIPTION(description);
MODULE_VERSION(version_string);
MODULE_DEVICE_TABLE(table_info);
MODULE_ALIAS(alternate_name);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值