📄 x377.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 <module
name.o> <1st src file.o> <2nd src file.o></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 <linux/kernel.h> /* We're doing kernel work */
#include <linux/module.h> /* 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) && ! defined(MODVERSIONS)
#include <linux/modversions.h> /* Will be explained later */
#define MODVERSIONS
#endif
#include <linux/kernel.h> /* We're doing kernel work */
#include <linux/module.h> /* Specifically, a module */
#define __NO_VERSION__ /* It's not THE file of the kernel module */
#include <linux/version.h> /* Not included by module.h because of
__NO_VERSION__ */
void cleanup_module()
{
printk("<1>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 + -