fedora14 环境下 编译成模块/
来源:互联网 发布:arm linux gcc安装包 编辑:程序博客网 时间:2024/04/28 01:12
#include <linux/kernel.h>#include <linux/module.h>static int __init mini2440_hello_module_init(void){ printk("Hello, Mini2440 module is installed !\n"); return 0;}static void __exit mini2440_hello_module_cleanup(void){ printk("Good-bye, Mini2440 module was removed!\n");}module_init(mini2440_hello_module_init);module_exit(mini2440_hello_module_cleanup);MODULE_LICENSE("GPL");以上是driver/char/mini2440_hello_module.c
如果想想让driver/char/mini2440_hello_module.c编译成一个模块
在driver/char/目录下必须有mini2440_hello_module.c这个文件
在driver/char/Makefile中添加obj-m+= mini2440_hello_module.o这么一行
然后再源代码根目录下执行
make modules
即可生成driver/char/mini2440_hello_module.ko
如果继续想让make menuconfig中会出现mini2440_hello_module的影子
则在driver/char/Kconfig中添加 类似
config MINI2440_HELLO_MODULE
tristate "Mini2440 module sample"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
Mini2440 module sample.
并把上段的driver/char/Makefile那行obj-m+= mini2440_hello_module.o改成
obj-$(CONFIG_MINI2440_HELLO_MODULE)+= mini2440_hello_module.o
这样make menuconfig的配置才会在make modules下管用
上面作法不方便做测试,如果想要将任意一个目录下的.c文件比如/home/mymodule.c编译成一个模块,可以
在/home下创建一个Makefile
内容是
ifneq ($(KERNELRELEASE),)obj-m := mymodule.oelseKDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2#KDIR := /lib/modules/$(uname-r)*/buildall: make -C $(KDIR) M=$(PWD) modulesclean: rm -f *.ko *.o *.mod.o *.mod.c *.symversendifline 2 名字要与mymodule.c对应,写成mymodule.o
line 4 指定源代码所在目录
line 6 PWD,指定源文件mymodule.o.c在当前目录
如果KDIR := /lib/modules/$(uname-r)*/build/
那么编译出的模块便可以运行在本机
在home下执行make,可以生成mymodule.ko
其实这个Makefile是调用的源代码下的Makefile生成的ko
如果是有多个依赖,则Makefile可以如下
ifneq ($(KERNELRELEASE),) obj-m:= mymodule.o mymodule-objs := file1.o file2.o file3.o else KDIR := /lib/modules/$(uname-r)*/build/all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers *~ modules.orderendif
/**file1.c**/#include <linux/kernel.h> #include <linux/module.h> extern test2(void);extern test3(void);static int __init mini2440_hello_module_init(void) { printk("Hello, Mini2440 module is installed !\n"); test2();test3();return 0; } static void __exit mini2440_hello_module_cleanup(void) { printk("Good-bye, Mini2440 module was removed!\n"); } module_init(mini2440_hello_module_init); module_exit(mini2440_hello_module_cleanup); MODULE_LICENSE("GPL");
/**file2.c**/#include <linux/kernel.h> void test2(void){printk("test2\n");}
/**file3.c**/#include <linux/kernel.h> void test3(void){printk("test3 \n");}执行make,即可生成mymodule.ko
加载用insmod mymodule.ko
或modprobe mymodule(此命令需要将ko考到/lib/modules/linuxxxx下)
卸载用 rmmod mymodule
查看用lsmod
注意:上面的Makefile中,
①写成obj-y := mymodule.o或obj- := mymodule.o,执行make均不会生成file1.o,file2.o,file3.o,mymodule,ko
②写成obj-m:= mymodule.o,make时会生成file1.o,file2.o,file3.o,mymodule.ko
③
obj-m := mymodule.o 和mymodule-objs := file1.o file2.o file3.o,名字需要对应,生成mymodule.ko,又如
obj-m := song.o 和song-objs := file1.o file2.o file3.o,生成song.ko
obj-m := song.o 和song-y:= file1.o file2.o file3.o
看一下.o和.ko的哪里不同
代码段一样
[root@localhost test]# arm-linux-objdump -S mymodule.ko mymodule.ko: file format elf32-littlearmDisassembly of section .exit.text:00000000 <cleanup_module>: 0:e1a0c00d movip, sp 4:e92dd800 push{fp, ip, lr, pc} 8:e24cb004 subfp, ip, #4; 0x4 c:e59f0004 ldrr0, [pc, #4]; 18 <cleanup_module+0x18> 10:ebfffffe bl0 <printk> 14:e89da800 ldmsp, {fp, sp, pc} 18:00000000 .word0x00000000Disassembly of section .init.text:00000000 <init_module>: 0:e1a0c00d movip, sp 4:e92dd800 push{fp, ip, lr, pc} 8:e24cb004 subfp, ip, #4; 0x4 c:e59f0008 ldrr0, [pc, #8]; 1c <init_module+0x1c> 10:ebfffffe bl0 <printk> 14:e3a00000 movr0, #0; 0x0 18:e89da800 ldmsp, {fp, sp, pc} 1c:00000028 .word0x00000028
[root@localhost test]# arm-linux-objdump -S mymodule.o mymodule.o: file format elf32-littlearmDisassembly of section .exit.text:00000000 <cleanup_module>: 0:e1a0c00d movip, sp 4:e92dd800 push{fp, ip, lr, pc} 8:e24cb004 subfp, ip, #4; 0x4 c:e59f0004 ldrr0, [pc, #4]; 18 <cleanup_module+0x18> 10:ebfffffe bl0 <printk> 14:e89da800 ldmsp, {fp, sp, pc} 18:00000000 .word0x00000000Disassembly of section .init.text:00000000 <init_module>: 0:e1a0c00d movip, sp 4:e92dd800 push{fp, ip, lr, pc} 8:e24cb004 subfp, ip, #4; 0x4 c:e59f0008 ldrr0, [pc, #8]; 1c <init_module+0x1c> 10:ebfffffe bl0 <printk> 14:e3a00000 movr0, #0; 0x0 18:e89da800 ldmsp, {fp, sp, pc} 1c:00000028 .word0x00000028[root@localhost test]#refer to
国嵌视频
http://blog.csdn.net/songqqnew/article/details/6762566
ldd3-2.4
- fedora14 环境下 编译成模块/
- Linux下的ds18b20驱动(编译成模块)
- 编译成内核模块的方法
- OpenWrt驱动编译成模块方法
- 如何把MATLAB编译成C++模块
- Fedora14下配置开发环境
- matlab文件编译成库在C++环境下使用遇到的问题记录
- VS2015环境下查看C语言编译成的汇编语句的方法
- eclipse环境下java文件不自动编译成classes的原因
- 模块静态编译到内核和编译成模块实例
- 模块静态编译到内核和编译成模块实例
- Fedora14下httpd常用模块安装
- SystemTap----将SystemTap脚本编译成内核模块
- 多个源文件编译成一个模块注意Makefile 书写
- 关于linux内核无法编译成模块的解决方法
- linux 编译进内核 && 编译成模块module
- Fedora14 64位环境下minicom使用方法
- Fedora14下qt开发环境的安装
- android:shape的使用
- 【WinCE】WinCE中开机启动应用程序,并且不进桌面的解决办法!
- 【Ubuntu下 ftp应用】【窗口没有最大化最小化】【调整关闭按钮到菜单栏右侧】【Movie Player和Gnome MPlayer 中文字幕问题】【修改Ubuntu启动项】
- 数据库连接池的配置
- 模态窗口提交
- fedora14 环境下 编译成模块/
- C++中的&表示引用与取址的用法
- Java流_2
- java流_3
- flash(as3.0)在线聊天室
- java流_3转换流
- 多线程技术博客二
- 随时关注的毕业生就业网址
- Java流_4总结