资料介绍
在Linux 2.6内核下编译可以加载的内核模块
By: Wu Yin
Date: 2007-05-18
Email: lazy_fox#msn.com
Homepage:
http://blog.csdn.net/wooin
版权信息: 该文章版权由Wu Yin所有。可在非商业目的下任意传播和复制。
对于商业目的下对本文的任何行为需经作者同意。
联系方式:lazy_fox#msn.com
1. 在旧的版本下(如linux 2.4)linux内核模块的编译只需要有内核的头文件就行了,就可以通过和编译其他程序一样的方法编译成filename.o文件,这个.o文件是直接可以加载道内核中的,加载之后就可以用了。然而在2.6下就截然不同了,在linux 2.6下内核的编译要有系统内核树的支持,下面介绍一下这个“内核树”是如何建立的。
2. 本文的工作环境是Fedora Core 5,用“uname -r”查看内核版本是:2.6.15-1.2054_FC5
Fedora Core 5 与旧版本不同,不包含 kernel-source 软件包,我是网上下载的rpm包,地址是:
下面的工作都是用root用户执行的。
3. 安装内核源码包:
# rpm –Uvh kernel-2.6.15-1.2054_FC5.src.rpm
这个命令将 RPM 内容写到路径
/usr/src/redhat/SOURSE
和
/usr/src/redhat/SPECS
4. build源码包:
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target i686 kernel-2.6.spec
这个命令将会把内核源码树放到 目录
/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686
5. 配置内核:
Fedora Core 附带的内核配置文件在 configs/ 目录。
例如,i686 SMP 配置文件被命名为
configs/kernel-version-i686-smp.config。
使用下列命令来将需要的配置文件复制到合适的位置,用来编译:
# cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686
# cp configs/kernel-version-i686-smp .config
您也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。
注意:
您的内核必须已经启用这些选项进行了编译(用make menuconfig调出内核配置菜单):
Loadable module support ---》
Enable loadable module support
Module unloading
[ ] Module versioning support (EXPERIMENTAL)
Automatic kernel module loading
6. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,如果 uname -r 返回字符串 2.6.15-1.2054_FC5,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2054_FC5
也就是最后一个连字符后面的所有内容。
7. 编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
8. 完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所谓的“内核代码树”
但是“/lib/modules/2.6.15-1.2054_FC5/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”
9. 编写内核模块源文件:
// hello.c
#include 《linux/init.h》
#include 《linux/module.h》
MODULE_LICENSE(“Dual BSD/GPL”);
static int hello_init(void) {
printk(KERN_ALERT “Hello, worldn”);
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT “Goodbye, cruel worldn”);
}
module_init(hello_init);
module_exit(hello_exit);
编写Makefile:
# Makefile
obj-m:=hello.o
KDIR:=/lib/modules/2.6.15-1.2054_FC5/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
10. 执行make命令进行编译就行了, 执行完毕后,会生成几个文件:
hello.ko
hello.mod.c
hello.mod.o
hello.o
运行命令:
# insmod hello.ko
应该可以看到返回的信息:Hello, world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
如果没看到,就是输出到系统的日志文件中去了,可以查看文件:
/var/log/messages
应该有信息的输出。
By: Wu Yin
Date: 2007-05-18
Email: lazy_fox#msn.com
Homepage:
http://blog.csdn.net/wooin
版权信息: 该文章版权由Wu Yin所有。可在非商业目的下任意传播和复制。
对于商业目的下对本文的任何行为需经作者同意。
联系方式:lazy_fox#msn.com
1. 在旧的版本下(如linux 2.4)linux内核模块的编译只需要有内核的头文件就行了,就可以通过和编译其他程序一样的方法编译成filename.o文件,这个.o文件是直接可以加载道内核中的,加载之后就可以用了。然而在2.6下就截然不同了,在linux 2.6下内核的编译要有系统内核树的支持,下面介绍一下这个“内核树”是如何建立的。
2. 本文的工作环境是Fedora Core 5,用“uname -r”查看内核版本是:2.6.15-1.2054_FC5
Fedora Core 5 与旧版本不同,不包含 kernel-source 软件包,我是网上下载的rpm包,地址是:
下面的工作都是用root用户执行的。
3. 安装内核源码包:
# rpm –Uvh kernel-2.6.15-1.2054_FC5.src.rpm
这个命令将 RPM 内容写到路径
/usr/src/redhat/SOURSE
和
/usr/src/redhat/SPECS
4. build源码包:
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target i686 kernel-2.6.spec
这个命令将会把内核源码树放到 目录
/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686
5. 配置内核:
Fedora Core 附带的内核配置文件在 configs/ 目录。
例如,i686 SMP 配置文件被命名为
configs/kernel-version-i686-smp.config。
使用下列命令来将需要的配置文件复制到合适的位置,用来编译:
# cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686
# cp configs/kernel-version-i686-smp .config
您也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。
注意:
您的内核必须已经启用这些选项进行了编译(用make menuconfig调出内核配置菜单):
Loadable module support ---》
Enable loadable module support
Module unloading
[ ] Module versioning support (EXPERIMENTAL)
Automatic kernel module loading
6. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,如果 uname -r 返回字符串 2.6.15-1.2054_FC5,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2054_FC5
也就是最后一个连字符后面的所有内容。
7. 编译内核:
跟普遍的编译方法一样了:
# make bzImage 编译内核
# make modules 编译模块
# make modules_install 安装编译
8. 完成“内核树”的安装:
目录“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所谓的“内核代码树”
但是“/lib/modules/2.6.15-1.2054_FC5/build”是个符号链接,也指向这个目录,所以这里也可以叫做“内核代码树”
9. 编写内核模块源文件:
// hello.c
#include 《linux/init.h》
#include 《linux/module.h》
MODULE_LICENSE(“Dual BSD/GPL”);
static int hello_init(void) {
printk(KERN_ALERT “Hello, worldn”);
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT “Goodbye, cruel worldn”);
}
module_init(hello_init);
module_exit(hello_exit);
编写Makefile:
# Makefile
obj-m:=hello.o
KDIR:=/lib/modules/2.6.15-1.2054_FC5/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
10. 执行make命令进行编译就行了, 执行完毕后,会生成几个文件:
hello.ko
hello.mod.c
hello.mod.o
hello.o
运行命令:
# insmod hello.ko
应该可以看到返回的信息:Hello, world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye, cruel world
如果没看到,就是输出到系统的日志文件中去了,可以查看文件:
/var/log/messages
应该有信息的输出。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- Linux内核模块简介
- 嵌入式Linux的内核编译
- 嵌入式LINUX系统内核和内核模块调试
- Linux内核的编译与运行 16次下载
- Asterisk内核模块介绍 7次下载
- 嵌入式LINUX系统内核和内核模块调试教程 21次下载
- 如何才能编译Linux的内核 8次下载
- 什么是内核模块?如何编写一个简单的模块? 20次下载
- Linux内核模块编程必须了解哪些知识? 8次下载
- modutils是什么?内核模块的命令介绍内核模块的实用程序简介免费下载 8次下载
- 基于Arm的Linux内核编译指导 15次下载
- Linux内核编译详谈 7次下载
- 《Linux设备驱动开发详解》第4章、Linux内核模块 0次下载
- 基于Linux 2.6内核Makefile分析 0次下载
- 编译Linux2.6内核并添加一个系统调用 46次下载
- Linux内核编译失败?移动硬盘和虚拟机的那些事儿 856次阅读
- 详解linux内核的uevent机制 2.9k次阅读
- NVIDIA全面转向开源GPU内核模块 1.8k次阅读
- 使用 PREEMPT_RT 在 Ubuntu 中构建实时 Linux 内核 4.7k次阅读
- Linux:QEMU调试内核的步骤 3.8k次阅读
- 深入linux内核架构 Linux内核架构分析解读 4.3k次阅读
- 什么是 Linux 内核模块? 3.8k次阅读
- Linux内核与Android的关系 4.9k次阅读
- 基于Linux2.6内核的实时性增强方案设计 1.2k次阅读
- 如何自行编译一个Linux内核的详细资料概述 3.7k次阅读
- Linux内核地址映射模型与Linux内核高端内存详解 3.8k次阅读
- Linux内核模块介绍,使用Linux模块的优点 8k次阅读
- 嵌入式Linux内核编译步骤和经验 1w次阅读
- 内核模块的原理以及其模块编写 5.4k次阅读
- petalinux(二)开启petalinux内核调试模式 1.2w次阅读
下载排行
本周
- 1FS4054H 输入电压范围3.8V~6.8V 输入最大耐压28V 输入过压关闭充电阈值6.8V
- 4.22 MB | 2次下载 | 免费
- 2AC/DC 225W 开板电源 LOF225-23BxxR2系列数据手册
- 2.70 MB | 1次下载 | 1 积分
- 3晶振技术解析---电子设备的“时钟心脏”
- 1.55 MB | 1次下载 | 免费
- 4AU6830M 集成音频 DSP 的 2 × 41W 数字型 Class D 音频功率放大器数据手册
- 1.86 MB | 次下载 | 免费
- 5AU6815E 集成音频 DSP 的2×32W数字型 Class D 音频功率放大器数据手册
- 1.21 MB | 次下载 | 免费
- 6I-PEX 82652-100B-02-D_CABLINE-CA系列40P极细同轴线束SI设计图纸
- 293.34 KB | 次下载 | 免费
- 7I-PEX 82863-100B-02-D_CABLINE-CA系列PCIe/USB4极细同轴线图纸
- 301.83 KB | 次下载 | 免费
- 8YA-002S屏幕挂灯说明书
- 1.25 MB | 次下载 | 免费
本月
- 1人形机器人执行、感知系统技术及市场解析
- 3.52 MB | 5次下载 | 免费
- 2WD431产品规格书
- 1.32 MB | 3次下载 | 免费
- 3A-29回音消除模块
- 1.28 MB | 2次下载 | 免费
- 4 双麦阵列回音消除及降噪模块 A-47 说明书
- 1.96 MB | 2次下载 | 免费
- 5FS4054H 输入电压范围3.8V~6.8V 输入最大耐压28V 输入过压关闭充电阈值6.8V
- 4.22 MB | 2次下载 | 免费
- 6A-68语音处理模组规格书V1
- 1.47 MB | 1次下载 | 免费
- 7A-29P回音消除模块
- 1.42 MB | 1次下载 | 免费
- 8瑞芯微RK3562开发板资料-飞凌嵌入式
- 2.80 MB | 1次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935137次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233095次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191469次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183361次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81608次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73836次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App





创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论