如何编译一个linux下的驱动linux内核模块编译

 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
操作系统课程设计_Linux内核模块编程和设备驱动程序
下载积分:1000
内容提示:操作系统课程设计_Linux内核模块编程和设备驱动程序
文档格式:DOC|
浏览次数:30|
上传日期: 21:01:06|
文档星级:
该用户还上传了这些文档
操作系统课程设计_Linux内核模块编程和设备驱动程序.DOC
道客巴巴认证
机构认证专区
加  展示
享受成长特权
官方公共微信新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分104 UID阅读权限10积分17帖子精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 17, 距离下一级还需 183 积分
帖子主题精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
linux系统下编译的驱动模块(.ko)如何在arm上运行,要配置那些东西?
(3.08 KB, 下载次数: 13)
13:23 上传
下载次数: 13
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分365 UID阅读权限10积分197帖子精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
白手起家, 积分 197, 距离下一级还需 3 积分
帖子主题精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
论坛徽章:0
你用交叉编译工具编译出来的ko 才能可以在目标板上运行
另外注意你的编译的内核和你目标板上的内核要一致
空间积分0 信誉积分104 UID阅读权限10积分17帖子精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 17, 距离下一级还需 183 积分
帖子主题精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
obj-m:= hello.o& & & &
KDIR:= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
& & & & make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
.PHONY: clean
& & & & rm -f *.o *mod.c
按你说的 这样写 编译不通过 请问怎么回事
空间积分0 信誉积分104 UID阅读权限10积分17帖子精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 17, 距离下一级还需 183 积分
帖子主题精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
obj-m:= hello.o& && &&&
KDIR:= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
& && &&&make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
.PHONY: clean
& && &&&rm -f *.o *mod.c
按你说的 这样写 编译不通过 请问怎么回事
空间积分0 信誉积分365 UID阅读权限10积分197帖子精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
白手起家, 积分 197, 距离下一级还需 3 积分
帖子主题精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
论坛徽章:0
这是我在网上找的一个makefile
obj-m :=hello.o
KRNELDIR :=/opt/FriendlyARM/mini6410/linux/linux-2.6.36
CROSS_COMPILE =arm-linux-
CC :=$(CROSS_COMPILE)gcc
LD :=$(CROSS_COMPILE)ld
PWD :=$(shell pwd)
& & & & make -C $(KRNELDIR) M=$(PWD) modules&&
.PHONY :clean
& & & & rm -rf *.o *ko
你把红色部分改成你目标板运行内核的目录
(一定要保证你编译过该内核)
空间积分0 信誉积分104 UID阅读权限10积分17帖子精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 17, 距离下一级还需 183 积分
帖子主题精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
& & 还是不能,我是在宿主机pc的虚拟机里面redhat里面编译的,没有这个目录,编译不通过。。有没有别的办法?
空间积分0 信誉积分365 UID阅读权限10积分197帖子精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
白手起家, 积分 197, 距离下一级还需 3 积分
帖子主题精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
论坛徽章:0
你目标板的运行的内核是从哪里来的?不是你自己编译出来的吗?
空间积分0 信誉积分104 UID阅读权限10积分17帖子精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 17, 距离下一级还需 183 积分
帖子主题精华可用积分17 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
& & 不是,是买的时候光盘里面附带的,现在不让其在arm上运行,现在在pc上编译都不能通过。
空间积分0 信誉积分365 UID阅读权限10积分197帖子精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
白手起家, 积分 197, 距离下一级还需 3 积分
帖子主题精华可用积分197 专家积分0 在线时间997 小时注册时间最后登录
论坛徽章:0
你的标题是“linux系统下编译的驱动模块(.ko)如何在arm上运行”
8l 又说 “现在不让其在arm上运行”
你到底是想在arm 运行,还是在pc上运行?
不管你在哪运行
KRNELDIR :=/opt/FriendlyARM/mini6410/linux/linux-2.6.36
都要把上面设置成目前机器运行内核的目录(并且已经编译)
比如要在arm 中运行,按照我上面说的试试
空间积分0 信誉积分100 UID阅读权限10积分10帖子精华可用积分10 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 10, 距离下一级还需 190 积分
帖子主题精华可用积分10 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
& & +++++1
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处linux下编译运行驱动 - zeroboundary的专栏
- 博客频道 - CSDN.NET
3856人阅读
linux下编译运行驱动
嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。
按照如下方法就可以成功编译出hello world模块驱动。
1、首先确定本机linux版本
怎么查看Linux的内核kernel版本?
'uname'是Linux/unix系统中用来查看系统信息的命令,适用于所有Linux发行版。配合使用'uname'参数可以查看当前服务器内核运行的各个状态。
Linux whh 3.5.0-19-generic #30-Ubuntu SMPTue Nov 13 17:49:53 UTC
i686 i686 GNU/Linux
只打印内核版本,以及主要和次要版本:
3.5.0-19-generic
要打印系统的体系架构类型,即的机器是32位还是64位,使用:
/proc/version 文件也包含系统内核信息:
# cat /proc/version
Linux version 3.5.0-19-generic(buildd@aatxe) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012
发现自己的机器linux版本是:3.5.0-19-generic
2、下载机器内核对应linux源码
到下面网站可以下载各个版本linux源码
如我的机器3.5.0版本源码下载地址为:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2
下载完后,找一个路径解压,如我解压到/linux-3.5/
然后很重要的一步是:执行命令uname -r,可以看到Ubuntu的版本信息是3.5.0-19-generic
。进入linux源码目录,编辑Makefile,将EXTRAVERSION = &修改为EXTRAVERSION= -19-generic。
这些都是要配置源码的版本号与系统版本号,如果源码版本号和系统版本号不一致,在加载模块的时候会出现如下错误:insmod: error inserting 'hello.ko': -1 Invalid module format。
原因很明确:编译时用的hello.ko的kenerl
不是我的pc的kenerl版本。
执行命令cp /boot/config-3.5.0-19-generic ./config,覆盖原有配置文件。
进入linux源码目录,执行make menuconfig配置内核,执行make编译内核。
3、写一个最简单的linux驱动代码hello.c
/*======================================================================
&&& Asimple kernel module: &hello world&
======================================================================*/
#include &linux/init.h&
#include &linux/module.h&
MODULE_LICENSE(&zeroboundaryBSD/GPL&);
static int hello_init(void)
&&&&&&&& printk(KERN_INFO&Hello World enter\n&);
&&&&&&&& return0;
static void hello_exit(void)
&&&&&&&& printk(KERN_INFO&Hello World exit\n &);
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR(&zeroboundary&);
MODULE_DESCRIPTION(&A simple HelloWorld Module&);
MODULE_ALIAS(&a simplestmodule&);
4、写一个Makefile对源码进行编译
KERN_DIR = /linux-3.5
&&&&&&&& make-C $(KERN_DIR) M=`pwd` modules
&&&&&&&& make-C $(KERN_DIR) M=`pwd` clean
obj-m += hello.o
5、模块加载卸载测试
insmod hello.ko
rmmod hello.ko
然后dmesg|tail就可以看见结果了
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
最后,再次编译驱动程序hello.c得到hello.ko。执行insmod ./hello.ko,即可正确insert模块。
使用insmod hello.ko
将该Module加入内核中。在这里需要注意的是要用 su
命令切换到root用户,否则会显示如下的错误:insmod: error inserting 'hello.ko': -1 Operation not permitted
内核模块版本信息的命令为modinfo hello.ko
通过lsmod命令可以查看驱动是否成功加载到内核中
通过insmod命令加载刚编译成功的time.ko模块后,似乎系统没有反应,也没看到打印信息。而事实上,内核模块的打印信息一般不会打印在终端上。驱动的打印都在内核日志中,我们可以使用dmesg命令查看内核日志信息。dmesg|tail
可能还会遇到这种问题insmod: error inserting 'hello.ko': -1 Invalid module format
用dmesg|tail查看内核日志详细错误
disagrees about version of symbolmodule_layout,详细看这里。
/developerworks/cn/linux/l-cn-kernelmodules/index.html
在X86上我的办法是:
make -C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD modules
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91620次
排名:千里之外
原创:17篇
转载:18篇
评论:85条
(1)(1)(1)(16)(6)(2)(2)(1)(1)(4)

我要回帖

更多关于 linux驱动编译进内核 的文章

 

随机推荐