liangwc

Linux内核的学习(二)

linux的驱动模块的参数

大家在学习C语言时,应该学过在运行C程序时,给模块里面的变量定义具体的值,内核是怎么实现的呢。

方法如下:

#include <linux/moduleparam.h>

static int num = 0; //当加载模块不指定num的值为0

module_param(变量名,类型,权限)// 类型有 byte, int , uint ,short ,ushort,long ulong ,bool ,charp
//权限:其它用户所占的权限里不能有写的权限

module_param(num, int ,0644);
//

 insmod test.ko  变量名 = 值

编译成KO文件后,可用modinfo查看到模块参数的信息

Linux怎么定义全局变量(函数),驱动模块里默认情况下不管函数还是全局变量都是局部使用(相当于在函数/变量名前加了 “static”),要作为全局使用,需要使用导出符号“EXPORT_SYMBOL(函数名/变量)”,声明函数/变量作全局使用。

myfunc.c:

#include <linux/init.h>
#include <linux/module.h>

void myfunc(char *str)
{
    printk("in myfunc:%s\n");
}

EXPORT_SYMBOL(myfunc);

MODULE_LICENSE("GPL");

test.c

#include <linux/init.h>
#include <linux/module.h>

extern void myfunc(char *);

static int __init myinit(void)
{
         myfunc("test init");
         return 0;    
}

static void __exit myexit(void)
{
    myfunc("test exit");
}

module_init(myinit);
module_exit(myexit);

MODULE_LICENSE("GPL");

//需注意加载驱动模块的顺序, 如果myfunc驱动模块不先加载,则test模块会加载不成功.

查看elf文件的信息
readelf test.ko -a

 

分类:

技术点:

相关文章: