精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● Linux>>Linux之开发篇>>内核技术>>Linux内核模块编程指南(七)

主题:Linux内核模块编程指南(七)
发信人: arira(大天使)
整理人: qiaoqian(2001-12-31 00:01:56), 站内信件
主题:《Linux内核模块编程指南》(七) 
发信人: kevintz()
整理人: kevintz(2000-06-24 00:41:53), 站内信件  
《Linux内核模块编程指南》 
《Linux Kernel Module Programming Guide》 
作者:Ori Pomerantz 中译者:谭志([email protected]
   
译者注: 
1、LKMPG是一本免费的书,英文版的发行和修改遵从GPL version 2的许可。为了
节省时间,我只翻译了其中的大部分的大意,或者说这只是我学习中的一些中文
笔记吧,不能算是严格上的翻译,但我认为这已经足够了。本文也允许免费发布
,但发布前请和我联系,但不要把本文用于商业目的。鉴于本人的水平,文章中
难免有错误,请大家不吝指正。 
2、本文中的例子在Linux(kernel version 2.2.10)上调试通过。你用的Linux必
须支持内核模块的加载,如果不支持,请在编译内核时选上内核模块的支持或升
级你的内核到一个支持内核模块的版本。 
    

       
                         第七章  启动参数 


    在之前的许多例子,我们必须在内核模块里硬性规定一些东西,例如生成/p
roc文件的文件名或主设备号等。这违背了Unix和Linux的哲学--写灵活的程序,
方便用户定制。 

    在程序或内核模块运作之前取得所需的参数是通过命令行参数。内核模块在
这种情况下,我们不会取得argc和argv,而是更好的方法。我们可以在内核模块
里定义全局变量,insmod命令将会为我们填写参数。 

    在本章的例子,我们定义了两个参数:str1和str2。我们要做的只是编译内
核模块并用insmod str1=xxx str2=yyy命令运行。init_module被调用的时候,s
tr1和str2将分别指向"xxx"和"yyy"。 

    警告:参数是没有类型检查的。如果xxx和yyy是数字,内核将用数字填充st
r1和str2,而不是字符串"xxx"和"yyy"。实际应用中你要自己检查。 
(kevintz注:这似乎可以用MODULE_PARM来处理) 

/* param.c  
 *  
 * Receive command line parameters at module installation 
 */ 

/* Copyright (C) 1998-99 by Ori Pomerantz */ 

/* The necessary header files */ 

/* Standard in kernel modules */ 
#include <linux/kernel.h>   /* We're doing kernel work */ 
#include <linux/module.h>   /* Specifically, a module */ 

/* Deal with CONFIG_MODVERSIONS */ 
#if CONFIG_MODVERSIONS==1 
#define MODVERSIONS 
#include <linux/modversions.h> 
#endif         


#include <stdio.h>  /* I need NULL */ 


/* In 2.2.3 /usr/include/linux/version.h includes a  
 * macro for this, but 2.0.35 doesn't - so I add it  
 * here if necessary. */ 
#ifndef KERNEL_VERSION 
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) 
#endif 



/* Emmanuel Papirakis: 
 * 
 * Prameter names are now (2.2) handled in a macro. 
 * The kernel doesn't resolve the symbol names 
 * like it seems to have once did. 
 * 
 * To pass parameters to a module, you have to use a macro 
 * defined in include/linux/modules.h (line 176). 
 * The macro takes two parameters. The parameter's name and 
 * it's type. The type is a letter in double quotes. 
 * For example, "i" should be an integer and "s" should 
 * be a string. 
 */ 


char *str1, *str2; 


#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0) 
MODULE_PARM(str1, "s"); 
MODULE_PARM(str2, "s"); 
#endif 


/* Initialize the module - show the parameters */ 
int init_module() 

  if (str1 == NULL || str2 == NULL) { 
    printk("Next time, do insmod param str1=<something>"); 
    printk("str2=<something>\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; 



/* Cleanup */ 
void cleanup_module() 

}   

本章的例子很简单,相信大家自己都可以搞定:-)

--
那一刹那,我开始用心去看这个世界,所有的事物真的可以看得前 
所未有的那么清楚……  

 
 

[关闭][返回]