第一个linux驱动代码遇到的问题的解决办法
来源:互联网 发布:微信数据迁移即将完成 编辑:程序博客网 时间:2024/06/11 15:19
我使用的linux是 ubuntu 12.04
首先查看自己的内核版本:
e$ uname -r
3.5.0-40-generic
安装内核树
首先查看源上的资源:
e$ apt-cache search linux-sourcelinux-source - Linux kernel source with Ubuntu patcheslinux-source-3.2.0 - Linux kernel source for version 3.2.0 with Ubuntu patches发现只有3.2.0版本的,而我的内核版本是3.5.0的(这里埋伏了一个问题)
由于找不到3.5.0的内核树就先安装这个试试:
sudo apt-get install linux-source-3.2.0 在/usr/src下会有:linux-source-3.2.0.tar.bz2解压这个包出现:arch firmware lib README ubuntublock fs MAINTAINERS REPORTING-BUGS usrCOPYING include Makefile samples virtCREDITS init mm scripts vmlinuxcrypto ipc modules.builtin security vmlinux.oDocumentation Kbuild modules.order sounddrivers Kconfig Module.symvers System.mapdropped.txt kernel net tools切换到当前目录下输入:sudo make./config出现的[n/m/y/?]的地方全部按enter,以默认方式安装;完了后输入:sudo vim ./config修改CONFIG_RTS5139=m 为 CONFIG_RTS5139=n (这是一个不成熟的选项,会给后面带来麻烦,所以就不开启了)配置好编译环境后输入:
sudo make
这个过程比较久
完了后输入:sudo make modulessudo make modules_install===============================================================================================================
代码是照着书上的:
//hello.c
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye,cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
很多网站上的Makefile文件是这样的:
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
这样的Makefile 文件执行make后会出现如下错误:
insmod: error inserting './hello.ko': -1 Invalid module format (是由于与内核版本不一致造成的,安装3.2.0是不行的)
应将Makefile文件改为这样(也不是很好(不需要保留的没删除),只是能通过)
obj-m :=hello.o
KVER ?= $(shell uname -r)
KERNELDIR := /lib/modules/$(KVER)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
注意:modules:和modules_install所在行前面没有空格,其他行前面必须是tab键,否则会报错。
输入:
make
终端输出:
make -C /lib/modules/3.5.0-40-generic/build M=/Clanguage modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.5.0-40-generic'
CC [M] /Clanguage/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /Clanguage/hello.mod.o
LD [M] /Clanguage/hello.ko
make[1]:正在离开目录 `/usr/src/linux-headers-3.5.0-40-generic'
从终端输出可以看出ubuntu 12.04 应该是安装了内核树的。所以分隔线前面的都不要安装了。
加载模块:
insmod ./hello.ko
cat /var/log/syslog
可以在尾部看到 hello world
查看模块输入:lsmod
会看到:
hello 12449 0
移除模块:
sudo rmmod hello
可以在/var/log/syslog看到sudoGoodbye,cruel world
- 第一个linux驱动代码遇到的问题的解决办法
- linux第一个驱动helloword遇到的问题
- 遇到的第一个问题
- 我的第一个Linux驱动hello world问题记录
- 2014-10-22遇到的问题----Android创建第一个项目出现appcompat_v7工程的解决办法
- 学C++遇到的第一个问题
- 在C遇到的第一个问题!
- 第一个DWR程序遇到的问题
- 写第一个VC++遇到的问题
- 第一个遇到的问题,关于KEILL
- 第一个MapReduce程序遇到的问题
- Android studio 遇到的第一个问题
- Eclipse遇到的第一个问题
- 第一个项目遇到的问题2
- Linux字符设备驱动-globalmem驱动编译加载遇到的问题及解决办法
- Visual Studio 2010 第一个C++程序成功之前遇到的问题及解决办法
- linux下的第一个驱动
- dbn_svr代码遇到的问题及解决办法
- UVa 490 Rotating Sentences (water ver.)
- hibernate中只选取某些列的写法
- HDU_1018 big number
- 【JAVA EMF】学习笔记(二)
- 注意多休息哈!身体可是本钱哈!
- 第一个linux驱动代码遇到的问题的解决办法
- Linq learning
- Win32应用程序基础——WNDCLASSEX窗口类
- 敏捷迭代
- VC++下的OpenGL配置
- 关注的计算机视觉研究组和个人主页列表
- Topcoder--SRM144 div1
- jstl学习小结
- 2014年华为上机题目