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

📄 x377.html

📁 linux驱动开发
💻 HTML
字号:
<HTML
><HEAD
><TITLE
>Modules Spanning Multiple Files</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="Passing Command Line Arguments to a Module"
HREF="x350.html"><LINK
REL="NEXT"
TITLE="Preliminaries"
HREF="c427.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="x350.html"
ACCESSKEY="P"
>返回</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>第二章. Hello World</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c427.html"
ACCESSKEY="N"
>继续</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN377"
></A
>2.7. 由多个文件构成的内核模块</H1
><P
>有时将模块的源代码分为几个文件是一个明智的选择。在这种情况下,你需要:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>只要在一个源文件中添加 <B
CLASS="COMMAND"
>#define __NO_VERSION__</B
>预处理命令。这很重要因为 <TT
CLASS="FILENAME"
>module.h</TT
> 通常包含 <TT
CLASS="VARNAME"
>kernel_version</TT
>的定义,此时一个存储着内核版本的全局变量将会被编译。
但如果此时你又要包含头文件 <TT
CLASS="FILENAME"
>version.h</TT
>,你必须手动包含它,因为 <TT
CLASS="FILENAME"
>module.h</TT
> 不会再包含它如果打开预处理选项 <TT
CLASS="VARNAME"
>__NO_VERSION__</TT
>。</P
></LI
><LI
><P
>像通常一样编译。</P
></LI
><LI
><P
>将所有的目标文件连接为一个文件。在x86平台下,使用命令<B
CLASS="COMMAND"
>ld -m elf_i386 -r -o &#60;module
			name.o&#62; &#60;1st src file.o&#62; &#60;2nd src file.o&#62;</B
>.</P
></LI
></OL
><P
>这里是这样的一个模块范例。</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN413"
></A
><P
><B
>Example 2-8. start.c</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>/*  start.c - Illustration of multi filed modules
 */

#include &#60;linux/kernel.h&#62;       /* We're doing kernel work */
#include &#60;linux/module.h&#62;       /* Specifically, a module */

int init_module(void)
{
  printk("Hello, world - this is the kernel speaking\n");
  return 0;
}</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
>另一个文件:</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN420"
></A
><P
><B
>Example 2-9. stop.c</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>/*  stop.c - Illustration of multi filed modules
 */

#if defined(CONFIG_MODVERSIONS) &#38;&#38; ! defined(MODVERSIONS)
   #include &#60;linux/modversions.h&#62; /* Will be explained later */
   #define MODVERSIONS
#endif        
#include &#60;linux/kernel.h&#62;  /* We're doing kernel work */
#include &#60;linux/module.h&#62;  /* Specifically, a module  */
#define __NO_VERSION__     /* It's not THE file of the kernel module */
#include &#60;linux/version.h&#62; /* Not included by module.h because of
	                                      __NO_VERSION__ */
	
void cleanup_module()
{
   printk("&#60;1&#62;Short is the life of a kernel module\n");
}  </PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
>最后是该模块的Makefile:</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN424"
></A
><P
><B
>Example 2-10. 多文件组成的模块的Makefile</B
></P
><TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
>CC=gcc
MODCFLAGS := -O -Wall -DMODULE -D__KERNEL__
   	
hello.o:	hello2_start.o hello2_stop.o
   ld -m elf_i386 -r -o hello2.o hello2_start.o hello2_stop.o
   	
start.o: hello2_start.c
   ${CC} ${MODCFLAGS} -c hello2_start.c
   	
stop.o: hello2_stop.c
   ${CC} ${MODCFLAGS} -c hello2_stop.c</PRE
></FONT
></TD
></TR
></TABLE
></DIV
></DIV
><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="x350.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="c427.html"
ACCESSKEY="N"
>继续</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>从命令行传递参数给内核模块</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 + -