我按照下面的程序和方法试了下,很不错,开始是放在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内核模块编译讨论(总结)相关推荐

  1. 实践2.2 内核模块编译

    实践2.2 内核模块编译 1.模块代码的编写 模块构造函数: module_init() 即执行insmod或modprobe指令加载内核模块时会调用的初始化函数. 模块析构函数: module_ex ...

  2. centos 自定义内核模块 编译运行

    简单记录一下 centos 自定义内核模块的一些编译运行记录,代码如下: 主要功能是通过rdtsc 指令直接从 CPU MSR 寄存器中获取时钟,尝试获取两次,两次之间会做一些赋值操作什么的,并记录一 ...

  3. 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: ...

  4. linux编译寻找包含的头文件,Linux编写内核模块编译时找不到头文件

    //所有模块都需要的头文件#include // init&exit 相关宏MODULE_LICENSE("GPL");static int __init hello_in ...

  5. linux内核编译ccflag,Linux内核模块编译失败

    我的上一次内核开发是在2.6~版本中 现在我尝试编译一个模块,在内核树外编译时出现以下错误. /bin/sh: 1: /home/blabla/workspace/kernel35/linux-3.5 ...

  6. c需要实现安装卸载Linux模块,Linux内核模块编译与加载

    Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用所需要的组件? 方法一: 把所有的组件都编译进内核文件,即Zlmage或bzlmage,但会导致两个问题:一是生成的内核文件过大:二是如 ...

  7. LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译

    本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用.功能及基本编程方法,以便于读者能快速理解什么是Linux内核,能看懂Linux内核. 拥有超过1300万行的代码,Linux ...

  8. linux内核模块编译

    1 Makefile编写 ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else ...

  9. linux内核模块编译出现找不到include/generated/asm/unistd_32.h” 问题解决

    模块编译的时候出现该错误,Makefile如下,结果是M= 赋值出错(空值或者有空格).更改之后没问题. $(MAKE) -C $(KERNEL_DIR) M=${PWD} modules

最新文章

  1. 云笔记项目-Spring事务学习-传播MANDATORY
  2. jsp stc_为什么说jsp的本质是servlet?
  3. QT的QHttpMultiPart类的使用
  4. 如何在IE浏览器里面定位到关键字的位置(页面代码)和这个关键字位置模块的请求
  5. windows下使用net-snmp实现agent扩展(一)
  6. fastjson和json-lib的区别
  7. centos 4.4配置使用
  8. @JVM内存模型(运行时数据区)
  9. 蘑菇街直播实战技巧带你解决直播开发难题
  10. 计算机十六进制ABCD,16进制计算(十六进制计算器在线)
  11. 函数部分编程大作业(持续更新)
  12. 架构--网络关键指标公式
  13. Tableau图表 | 3、区域图/面积图/折线图
  14. laravel会话控制和缓存操作
  15. ZUCC_操作系统实验_Lab7进程通信---共享内存
  16. comgt General Commands Manual
  17. Winform使用第三方库控件出现“NoLicenseInformation”或“变量未声明或从未赋值”问题总结
  18. 光纤耦合透镜的设计与公差分析
  19. 手机话费充值API事例_话费接口DEMO
  20. 合肥工业大学计算机科学起薪,合肥工业大学什么级别?附合肥工业大学专业排名及最低分数线...

热门文章

  1. Android 8.0 系统学习(6)---Linux内核接口要求
  2. MTK 驱动开发(16)---LCM 移植
  3. linux内核 快速分片,linux内核学习笔记------ip报文的分片
  4. Python正在褪色,最晚2030年就被淘汰
  5. 返工在即,国家级“赛马”!多家技术公司发力,AI解决“大规模人群”零接触测温...
  6. 热榜第一!GitHub 标星 5.6w,用 Python 实现所有算法!
  7. 书籍推荐:Machine Learning Yearning
  8. 原创第13篇~while循环
  9. 驯龙大师稳了!iQOO Neo6游戏实测:两款手游均接近满帧
  10. 快狗打车通过港交所上市聆讯