⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x350.html

📁 linux驱动开发
💻 HTML
字号:
<HTML
><HEAD
><TITLE
>从命令行传递参数给内核模块</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
TITLE="The Linux Kernel Module Programming Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Hello World"
HREF="c143.html"><LINK
REL="PREVIOUS"
TITLE="Hello World (part 4): Licensing and Module Documentation"
HREF="x317.html"><LINK
REL="NEXT"
TITLE="Modules Spanning Multiple Files"
HREF="x377.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux内核驱动模块编程指南 (内核版本2.2, 2.4)</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x317.html"
ACCESSKEY="P"
>返回</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>第二章. Hello World</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x377.html"
ACCESSKEY="N"
>继续</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN350"
></A
>2.6. 从命令行传递参数给内核模块</H1
><P
>模块也可以从命令行获取参数。但不是通过以前你习惯的<TT
CLASS="VARNAME"
>argc</TT
>/<TT
CLASS="VARNAME"
>argv</TT
>。</P
><P
>要传递参数给模块,首先将获取参数值的变量声明为全局变量。然后使用宏
<TT
CLASS="FUNCTION"
>MODULE_PARM()</TT
> macro, (在头文件<TT
CLASS="FILENAME"
>linux/module.h</TT
>)。运行时,insmod将给变量赋予命令行的参数。为使代码清晰,
变量的声明和宏都应该放在模块代码的开始部分。以下的代码范例也许将比我公认差劲的解说更好。
</P
><P
>宏 <TT
CLASS="FUNCTION"
>MODULE_PARM()</TT
> 需要两个参数,变量的名字和其类型。支持的类型有"<TT
CLASS="LITERAL"
>b</TT
>": 比特型, "<TT
CLASS="LITERAL"
>h</TT
>": 短整型, "<TT
CLASS="LITERAL"
>i</TT
>": 整数型,"<TT
CLASS="LITERAL"
>l</TT
>": 长整型和 "<TT
CLASS="LITERAL"
>s</TT
>": 字符串型。 字符串类型应该声明为 "<SPAN
CLASS="TYPE"
>char *</SPAN
>" 这样insmod就可以为它们分配内存空间。你应该总是为你的变量赋初值。这是内核编程,代码要编写的十分谨慎。举个例子:</P
><TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
>    int myint = 3;
    char *mystr;

    MODULE_PARM (myint, "i");
    MODULE_PARM (mystr, "s");
	</PRE
></FONT
></TD
></TR
></TABLE
><P
>数组同样被支持。在宏MODULE_PARM中在类型符号前面的整型值意味着一个指定了最大长度的数组。
用'-'隔开的两个数字则分别意味着最小和最大长度。下面的例子中,就声明了一个最小长度为2,最大长度为4的整形数组。</P
><TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
>    int myshortArray[4];
    MODULE_PARM (myintArray, "2-4i");
	</PRE
></FONT
></TD
></TR
></TABLE
><P
>将初始值设为缺省使用的IO端口或IO内存是一个不错的作法。如果这些变量有缺省值,则可以进行自动设备检测,
否则保持当前设置的值。我们将在后续章节解释清楚相关内容。在这里我只是演示如何向一个模块传递参数。</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN373"
></A
><P
><B
>Example 2-7. hello-5.c</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>/*  hello-5.c - Demonstrates command line argument passing to a module.
 */
#include &#60;linux/module.h&#62;
#include &#60;linux/kernel.h&#62;
#include &#60;linux/init.h&#62;
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Peiter Jay Salzman");

static short int myshort = 1;
static int myint = 420;
static long int mylong = 9999;
static char *mystring = "blah";

MODULE_PARM (myshort, "h");
MODULE_PARM (myint, "i");
MODULE_PARM (mylong, "l");
MODULE_PARM (mystring, "s");


static int __init hello_5_init(void)
{
   printk(KERN_ALERT "Hello, world 5\n=============\n");
   printk(KERN_ALERT "myshort is a short integer: %hd\n", myshort);
   printk(KERN_ALERT "myint is an integer: %d\n", myint);
   printk(KERN_ALERT "mylong is a long integer: %ld\n", mylong);
   printk(KERN_ALERT "mystring is a string: %s\n", mystring);
   return 0;
}


static void __exit hello_5_exit(void)
{
   printk(KERN_ALERT "Goodbye, world 5\n");
}


module_init(hello_5_init);
module_exit(hello_5_exit);</PRE
></FONT
></TD
></TR
></TABLE
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x317.html"
ACCESSKEY="P"
>返回</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>返回首页</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x377.html"
ACCESSKEY="N"
>继续</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Hello World (part 4): 内核模块证书和内核模块文档说明</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="c143.html"
ACCESSKEY="U"
>回到本章开始</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>由多个文件构成的内核模块</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -