CSDN内核模块编译讨论(总结)
我按照下面的程序和方法试了下,很不错,开始是放在driver/char目录下的,但由于内核文件不全,编译不成功,所以把该程序拷贝到其他目录,然后新建Makefile文件。不过先要在user/src的源码中执行make oldconfig,然后在存放该程序的目录下运行make,生成了内核模块hello.ko。^_^。
然后使用insmod ./hello.ko 加载模块,用tail /var/log/message 查看到加载信息:hello, world!
用rmmod ./hello.ko卸载模块,并查看到卸载信息:goodbye world
#include <linux/module.h> //needed by all modules
#include <linux/kernel.h> //needed for KERN_ALERT
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO "hello, world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "goodbye world\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile:
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //这里要用TAB缩进
clean:
$(RM) *.o *.ko *.mod.c Module.symvers //同上
现在make编译
结果是这样子:
make -c /lib/modules/2.6.27.5-117.fc10.i686/build M=/home/woods/linux_dd modules
make: *** /lib/modules/2.6.27.5-117.fc10.i686/build: No such file or directory.
stop
make: *** [default] error 2
还有大侠说:
不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。
然后我就忙乎一通:
[hh@F12 work]$ cd /usr/src/kernels/
[hh@F12 kernels]$ ls
2.6.31.5-127.fc12.i686.PAE
[hh@F12 kernels]$ cd 2.6.31.5-127.fc12.i686.PAE/ //内核根目录显然是没有问题的。
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ ls
arch drivers include kernel mm net security tools
block firmware init lib Module.markers samples sound usr
crypto fs ipc Makefile Module.symvers scripts System.map
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ make //内核根目录下开始干活。
rm: 无法删除"include/config/kernel.release": 权限不够
make: *** [include/config/kernel.release] 错误 1
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ make modules
rm: 无法删除"include/config/kernel.release": 权限不够
make: *** [include/config/kernel.release] 错误 1
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$
一个最简单的hello驱动程序的编译,大侠们竟然给出了如此多的方法以及解释,我们菜鸟一步步紧跟出现的问题却是层出不穷,难道这个Hello驱动就复杂到这个程度么? 是大侠们水平实在菜还是不屑菜鸟这种问题? 就不能稍微用点心思让菜鸟们迈出驱动的第一步么?
我火了,以后将采取如下结贴方法,没有解决问题的所谓的大侠1分, 其它的正确解均分。
原帖如下(楼主并没有解决问题,因为后来他想用QQ向我求救,可惜我也是菜鸟):
http://topic.csdn.net/u/20100305/14/4e469bd7-e0cf-4ebb-8abe-05f284635fc1.html
第一个回答:
首先我不是大侠,我也是菜鸟,提点意见
Makefile:
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers
makefile那么写是没有问题的。
make: *** /lib/modules/2.6.27.5-117.fc10.i686/build: No such file or directory.
这个错误就是说/lib/modules/2.6.27.5-117.fc10.i686/目录下没有build这个文件,这个文件其实是个链接文件,它链接的就是内核目录,像我用如下命令
file /lib/modules/2.6.30.10-105.fc11.i686.PAE/build
结果是
/lib/modules/2.6.30.10-105.fc11.i686.PAE/build: symbolic link to `../../../usr/src/kernels/2.6.30.10-105.fc11.i686.PAE'
所以如果你的目录下没有那个文件,那你可以用ln自己建一个
应该就没问题了
还有,通过你内核目录下的是fc12的内核,但是你运行的是fc10的内核
[hh@F12 kernels]$ cd 2.6.31.5-127.fc12.i686.PAE/ //内核根目录显然是没有问题的。
但是make的时候报的却是/lib/modules/2.6.30.10-105.fc11.i686.PAE/build
可能主要问题还是楼主的环境不对吧
所以楼主可以改一下makefile
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernels/2.6.31.5-127.fc12.i686.PAE/
然后再编译,改是没问题的
第二个回答:
make -C 你的内核源代码目录(例如:/opt/bcm97405/kernel/stblinux-2.6.18) M=`pwd`
`pwd`,是shell 脚本,`和~在同一个键,即Tab键上面的那个键。
命令方法和下面一样
还有一种方法是:
为你的helloworld程序建一个makefile文件,在里面加入一行: obj-m :=hello.o
然后执行命令: make -C /内核代码路径/ M=/helloworld程序路径/ modules
第三个回答:
引用:
还有大侠说:
不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。
第一,把hello.c放到/drivers/char
第二,makefile中增加obj-m +=hello.o
第三,在Kconfig中添加
config HELLO
tristate "hello driver"
depends on 目标板 //如depends on ARCH_s3c2440
help
QQ:652780062
第四,根目录下,make menuconfig //配置内核
Device Drivers -->
Character drivers -->
<M> hello driver //一定要配置成M这才会生成模块.KO
第五, 回到根目录下,执行make modules
第六,进入到/drivers/char,即可看到hello.ko文件
其实,第五步make、make modules、make SUBDIR=drivers/char/ modules,
三个命令工具都一样,在/drivers/char生成同样的文件(.o .ko .mod.c .mod.o )
最后,insmod hello.ko 到你的板子子,就行了
用测试程序看看,我一直这样做,在不得,请贴出错误,可以的要嘉奖呵呵
Makefile 如下,(由于按照大家的操作了一把,改乱了,我就把原来的重新粘贴上。)
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers
竟然没有出现以前的错误,好像是make成功了吧?
CSDN内核模块编译讨论(总结)相关推荐
- 实践2.2 内核模块编译
实践2.2 内核模块编译 1.模块代码的编写 模块构造函数: module_init() 即执行insmod或modprobe指令加载内核模块时会调用的初始化函数. 模块析构函数: module_ex ...
- centos 自定义内核模块 编译运行
简单记录一下 centos 自定义内核模块的一些编译运行记录,代码如下: 主要功能是通过rdtsc 指令直接从 CPU MSR 寄存器中获取时钟,尝试获取两次,两次之间会做一些赋值操作什么的,并记录一 ...
- linux 内核模块 编译错误 include/linux/mmzone.h:18:26: fatal error: linux/bounds.h: No such file or director
解决方案:内核编译后 不要执行make clean 出现的问题:编译的时候提示缺少头文件 mmzone.h ....bounds.h...等 include/linux/mmzone.h:18:26: ...
- linux编译寻找包含的头文件,Linux编写内核模块编译时找不到头文件
//所有模块都需要的头文件#include // init&exit 相关宏MODULE_LICENSE("GPL");static int __init hello_in ...
- linux内核编译ccflag,Linux内核模块编译失败
我的上一次内核开发是在2.6~版本中 现在我尝试编译一个模块,在内核树外编译时出现以下错误. /bin/sh: 1: /home/blabla/workspace/kernel35/linux-3.5 ...
- c需要实现安装卸载Linux模块,Linux内核模块编译与加载
Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用所需要的组件? 方法一: 把所有的组件都编译进内核文件,即Zlmage或bzlmage,但会导致两个问题:一是生成的内核文件过大:二是如 ...
- LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译
本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用.功能及基本编程方法,以便于读者能快速理解什么是Linux内核,能看懂Linux内核. 拥有超过1300万行的代码,Linux ...
- linux内核模块编译
1 Makefile编写 ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else ...
- linux内核模块编译出现找不到include/generated/asm/unistd_32.h” 问题解决
模块编译的时候出现该错误,Makefile如下,结果是M= 赋值出错(空值或者有空格).更改之后没问题. $(MAKE) -C $(KERNEL_DIR) M=${PWD} modules
最新文章
- 云笔记项目-Spring事务学习-传播MANDATORY
- jsp stc_为什么说jsp的本质是servlet?
- QT的QHttpMultiPart类的使用
- 如何在IE浏览器里面定位到关键字的位置(页面代码)和这个关键字位置模块的请求
- windows下使用net-snmp实现agent扩展(一)
- fastjson和json-lib的区别
- centos 4.4配置使用
- @JVM内存模型(运行时数据区)
- 蘑菇街直播实战技巧带你解决直播开发难题
- 计算机十六进制ABCD,16进制计算(十六进制计算器在线)
- 函数部分编程大作业(持续更新)
- 架构--网络关键指标公式
- Tableau图表 | 3、区域图/面积图/折线图
- laravel会话控制和缓存操作
- ZUCC_操作系统实验_Lab7进程通信---共享内存
- comgt General Commands Manual
- Winform使用第三方库控件出现“NoLicenseInformation”或“变量未声明或从未赋值”问题总结
- 光纤耦合透镜的设计与公差分析
- 手机话费充值API事例_话费接口DEMO
- 合肥工业大学计算机科学起薪,合肥工业大学什么级别?附合肥工业大学专业排名及最低分数线...
热门文章
- Android 8.0 系统学习(6)---Linux内核接口要求
- MTK 驱动开发(16)---LCM 移植
- linux内核 快速分片,linux内核学习笔记------ip报文的分片
- Python正在褪色,最晚2030年就被淘汰
- 返工在即,国家级“赛马”!多家技术公司发力,AI解决“大规模人群”零接触测温...
- 热榜第一!GitHub 标星 5.6w,用 Python 实现所有算法!
- 书籍推荐:Machine Learning Yearning
- 原创第13篇~while循环
- 驯龙大师稳了!iQOO Neo6游戏实测:两款手游均接近满帧
- 快狗打车通过港交所上市聆讯