hello world 级别模块程序

来源:互联网 发布:java的socket编程 编辑:程序博客网 时间:2024/06/08 17:29
模块是内核执行的代码,与应用也没有什么本质的差别。
只不过它有它的书写规范
下面看一个简单的hello world 级别module 代码。
--------------------------------------------------------------------------------
[root@hjj /home/samba/test]# cat test.c
--------------------------------------------------------------------------------
#include <linux/module.h>

int mod_entry(void)
{
    unsigned long d =  be64_to_cpu(0x12345678abcdef);
    printk("d is 0x%lx\n", d);
    return 0;
}

void mod_exit(void)
{
    printk("bye bye! module.\n");
}

module_init(mod_entry);
module_exit(mod_exit);

MODULE_AUTHOR("hjjdebug");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("test only");

格式定义了入口,出口以及其它辅助信息。
下面看看怎样把它编译成module.
--------------------------------------------------------------------------------
[root@hjj /home/samba/test]# cat Makefile
--------------------------------------------------------------------------------
$(warning KERNELRELEASE = $(KERNELRELEASE))
ifneq ($(KERNELRELEASE),)
    obj-m := test.o
else
PWD=$(shell pwd)
KVER=$(shell uname -r)

KDIR=/lib/modules/$(KVER)/build

all:

    make -C $(KDIR) M=$(PWD)
clean:
    rm *.o *.ko modules.* Module.symvers test.mod.c
endif
[root@hjj /home/samba/test]#

makefile 写得如此奇怪,到底是什么意思呢? 下面先看看它的执行过程
--------------------------------------------------------------------------------
[root@hjj /home/samba/test]# make
--------------------------------------------------------------------------------
Makefile:1: KERNELRELEASE =
make -C /lib/modules/3.10.17/build M=/home/samba/test
make[1]: Entering directory `/usr/src/linux-3.10.17'
/home/samba/test/Makefile:1: KERNELRELEASE = 3.10.17
  LD      /home/samba/test/built-in.o
  CC [M]  /home/samba/test/test.o
  Building modules, stage 2.
/home/samba/test/Makefile:1: KERNELRELEASE = 3.10.17
  MODPOST 1 modules
  CC      /home/samba/test/test.mod.o
  LD [M]  /home/samba/test/test.ko
make[1]: Leaving directory `/usr/src/linux-3.10.17'

source Makefile, 第一遍KERNELRELEASE 为空,执行all 目标,将进入kernel 目录进行编译,
并指定了M 宏定义。
第2遍source Makefile, KERNELRELEASE 已经赋值,所以它读走了obj-m.
开始编译出test.o. 以上过程叫第一阶段,与普通make差别不大。
编译模块第2阶段。叫module 后处理阶段。由test.mod.c编译出test.mod.o
其中test.mod.c 是第一阶段生成的中间产物。是每一个.o 文件对应的头文件部分。
然后把头.o和体.o 连接成.ko

--------------------------------------------------------------------------------
模块测试,使用
--------------------------------------------------------------------------------
insmod, rmmod, modinfo, modprobe 来安装,卸载,查看模块
dmesg 可以查看模块中printk 信息输出。
~                                                                                                                                                                           
~                                                                                                                                                                           
                                                                                                                                                          40,4          Bot


0 0
原创粉丝点击