· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

Linux内核模块编程源码范例—启动参数

发布时间:2006.08.15 08:46     来源:互联网    作者:komeng

启动参数

在前面的很多例子中,我们不得不硬性的将一些东西写如内核模块,例如在 /proc 中的文件名或设备的主设备号,因此我们可以对它 ioctl。 这和 Unix及 Linux的编写用户可以定制的灵活的程序精神是相矛盾的。

在程序或内核模块能开始工作之前告诉它一些需要的东西的办法是通过命令行参数。在内核模块的情况下,我们不能得到 argc 和 argv -- 代替的,我们得到更好的东西。我们可以在内核模块中定义全局变量并且 insmod将为我们填充它们。

在这个内核模块中,我们定义了两个: str1 和 str2。你所需要做的全部就是编译那个内核模块然后用insmod str1=xxx str2=yyy运行它。当init_module 被调用,str1 将指向字符串‘xxx’, str2 将指向‘yyy’。

在 2.0 版中对这些参数6.1没有类型检查。如果str1 或 str2 的第一个字符是数字,内核将用整数值填充变量而不是字符串指针。如果是在实际的情形下你需要检查这个。

另一方面,在 2.2 版中你用宏 MACRO_PARM 告诉 insmod 你期待一个参数,它的名字和类型 。这解决了类型的问题并且允许内核模块接收以数字开始的字符串。

范例 param.c
/* param.c
*
* 在模块被安装时接收命令行参数
*/
/* Copyright (C) 1998-99 by Ori Pomerantz */
/* 必要头文件 */
/* 标准头文件 */
#include /* 内核工作 */
#include /* 明确指定是模块 */
/* 处理 CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif
#include /* 我需要 NULL */
/* 在 2.2.3 版/usr/include/linux/version.h 包含这个宏
* 但 2.0.35版不包括-因此加入以备需要 */
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
#endif
/* Emmanuel Papirakis:
*
* 现在(2.2版),在宏里参数名现在被处理。内核不能像它好象已经作过的那样解决符号名。
*
* 为了向模块传送参数,你不得不使用 include/linux/modules.h (第 176 行)里面定义的一个宏。
* 宏需要两个参数。参数名和它的类型。类型是用双引号引住的一个字母。例如:
* "i" 将为整数, "s" 将为字符串。
*/
char *str1, *str2;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
MODULE_PARM(str1, "s");
MODULE_PARM(str2, "s");
#endif
/* 初始化模块--显示参数 */
int init_module()
{
if (str1 == NULL || str2 == NULL) {
printk("Next time, do insmod param str1=");
printk("str2=\n");
} else
printk("Strings:%s and %s\n", str1, str2);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
printk("If you try to insmod this module twice,");
printk("(without rmmod'ing\n");
printk("it first), you might get the wrong");
printk("error message:\n");
printk("'symbol for parameters str1 not found'.\n");
#endif
return 0;
}
/* 清除 */
void cleanup_module()
{
}

(t113)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 几个重要的RedHat Linux内核文件介绍 (10-08) · 高手进阶必读:Linux内核的同步机制 (08-25)
· Linux内核编译全过程详解(kernel2.6.7) (05-08) · 教你怎样隐藏Linux2.6内核模块 (12-06)
· 内核比较:从2.4到2.6内核开发中的改进 (04-20) · 看Linux内核源码 练内力必备技能 (04-14)
· 启动linux内核配置 (12-13) · 编译和安装linux内核 (12-13)
· 如何配置linux内核 (12-13) · 编译Linux内核教程 (12-15)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..