Ubuntu Linux 模块编程

首先需要构建系统内核的源代码树,因为 模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在。

内核模块

一种机制能让内核文件(zImage或bzImage)本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中Linux提供了一种叫做“内核模块”的机制,就可以实现以上效果。

特点
•模块本身并不被编译进内核文件(zImage或者bzImage)
• 可以根据需求,在内核运行期间动态的安装或卸载。

第一步,创建源代码:hello.c

root@Ubuntu:/home/Mydocument/Modules#vi hello.c

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("fudan_abc");

static int __init hello_init(void)
{
        printk(KERN_ALERT "Hello, world!\n\n\n");
        return 0;
}

static void __exit hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel workd!\n\n\n");
}

module_init(hello_init);
module_exit(hello_exit);

第二步,创建Makefile

root@ubuntu:/home/Mydocument/Modules#vi Makeile


obj-m += hello.o
all:
        make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) modules

clean:
        make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) clean

第三步,编译

root@ubuntu:/home/Mydocument/Modules#make

root@ubuntu:/home/Mydocument/Modules#ls

hello.c      hello.mod.o    Module.symvers hello.ko   


hello.o    Makefile hello.mod.c    modules.order

第四步, 安装模块

root@ubuntu:/home/Mydocument/Modules# insmod hello.ko
root@ubuntu:/home/Mydocument/Modules# lsmod
Module                  Size  Used by
hello                  12393  0
rfcomm                38408  0
bnep                  17923  2
bluetooth            148839  10 rfcomm,bnep
parport_pc            32114  0

第五步, 查看输出, 卸载模块

root@ubuntu:/home/Mydocument/Modules#dmesg

[29665.689269] Hello, world!

root@ubuntu:/home/Mydocument/Modules# rmmod hello
root@ubuntu:/home/Mydocument/Modules# lsmod

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/66cdc936af85451b76c292cef6c7b894.html