搜索
bottom↓
回复: 30

求助:linux设备驱动开发环境搭建

[复制链接]

出0入0汤圆

发表于 2012-3-29 15:36:48 | 显示全部楼层 |阅读模式
本帖最后由 longfeix86 于 2012-3-29 16:23 编辑

本人最近在学linux设备驱动,所用的操作系统为ubuntu10.10-i386,为了以防万一,在虚拟机下运行,按照如下方式搭建开发环境:
1、在宿主机上安装开发工具和下载linux源码:sudo apt-get install build-essential
2、下载内核sudo apt-get install linux-source-2.6.35
3、进入到 usr/src/目录下解压源码包
4、执行:$make oldconfig
$make prepare
$make scripts
到这里后全部出错,哪位大侠给帮忙解决下啊,不胜感激

编译简单的程序:hello world


#include "linux/init.h"
#include "linux/module.h"

static int hello_init(void)
{
    printk(KERN_ALERT "Hello World linux_driver_module/n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbey linux_driver_module/n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lpj");


Makefile

#sample driver module
obj-m := hello.o
KDIR = /usr/src/linux-source-2.6.35/

all:
     $(MAKE) -C $(KDIR) M=$(PWD)
.PHONY:clean
clean:
     rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions


出错信息:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-29 15:50:28 | 显示全部楼层
出的什么错啊,贴出来看看

出0入0汤圆

发表于 2012-3-29 15:51:37 | 显示全部楼层
<<Linux设备驱动程序>>(Linux Device Driver,简称LDD) 一书是linux驱动程序开发的经典,这里阐述的是怎么编写一个 hello 的内核驱动程序。
配置的环境和程序对应 LDD 第二章的内容。

我的系统是 ubuntu 10.04 LTS,对应的内核是 2.6.32-38-generic
要开发驱动程序,则必须先构造你运行的环境的内核树,例如我的系统内核是 2.6.32-38-generic ,而写好的驱动程序我想就在本机上运行,那么久需要构造一个 2.6.32 的内核树了,否则运行的时候就提示版本不对了。

网上有一篇文章叫 “Ubuntu 下构造内核源码树” 写得挺好,我就是按照上面的来做。

依赖的包,因为我的系统是用来开发用的,所以已经安装了很多包,这次编译内核树是直接一次成功的,并没有需要额外安装的包,一般来说 ncurse 和 build-essential 是必要要的,因为 menuconfig 工具就是基于 ncurse 开发的。build-essential 则包含了基本的编译需要工具

# apt-get install libncurses-dev build-essential


1. 进入root工作 :-)
2. 下载内核树,大概80M 内核源代码一般放在 /usr/src 里面,解压缩并进入该目录
3. 配置,当然用现成的配置文件,menuconfig 装载一下现在的配置就行了。
4. 编译源码树,要编译才能用的

$ su root
# apt-get install linux-source-2.6.32
# cd /usr/src
# tar xjf linux-source-2.6.32.tar.bz2
# cd linux-source-2.6.32
# cp ../linux-headers-2.6.32-38-generic/.config .
# make menuconfig
# make -j2

最后的make参数 -j2 是启用了2个任务同时编译,因为我的是双核系统,这样会快至少三分一的,不过这是系统会很卡,因为两个核心都 100% 的在工作了,不过好处是编译时间大幅度减少。我的系统是编译内核大概 20分钟。如果一切正常的话,则可以开始编写驱动,我们写hello world驱动

进入工作目录,例如我的是
# cd /mini2440/driver

创建 hello.c 内容如下:其实就是LDD第二章的内容,照抄就行了。

#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,其实在 LDD 的P28-29 页已经是有介绍的了。如果你是第一次写 Makefile的话则需要注意了,命令的开始一定是要 Tab 比如说这里的 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 命令的开始就必须是一个 Tab ,而不可以是空格,Tab 是指键盘上字母Q左边的那个按键。因为我的代码贴到网上的时候很可能 Tab 变成了空格符号,也就出错了,想当年我开始的时候不懂复制人家网上的代码后死活不行,折腾了好一番。

LDD 里面已经有解释的了,我也多说一句,obj-m 是内核里面使用的符号,所以在这里看不到任何的关联,其实是传递到内核树里面,他就懂的了,然后设置内核源码树,也就是上面构造的那棵树的位置,PWD 是当前的目录,$(MAKE) -C 是指进入到某个目录执行该目录下的Make 命令的意思,在这里的意思是,跳转到内核树的目录,执行make指令,然后 M 表示构造完之后返回当前目录。

obj-m := hello.o
KERNELDIR ?= /usr/src/linux-source-2.6.32
PWD := $(shell pwd)

all:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

一切正常的话生成 hello.ko ,这个就是驱动模块的,只需要加载进系统。

# insmod ./hello.ko
# rmmod hello

前一个命令是加载驱动,后一个是去除驱动,如果是在 ubuntu 的话,可以通过查看系统log 来查看结果,
# dmesg

看到一堆记录,最后的两个就是我们的驱动程序工作

[ 4814.679760] Hello, world
[ 4823.680729] Goodbye,cruel world

接着就可以根据 LDD 继续学习了,至少环境是搞好了,如果是嵌入式linux的驱动程序,其实原理一样的,首先要构造源码树,开发板上面的linux的内核是什么,就用那个作为源码树,因为开发的驱动最终是用在他上面的。

这个是之前就懂的了,只不过没有做笔记,今天突然想折腾一下,最好笔记而已。

Etual
2012-3-22

出0入0汤圆

发表于 2012-3-29 15:52:03 | 显示全部楼层
这是我几天前写的一篇笔记,我的机器上是没有问题的,楼主对比一下看哪里出问题了?

出0入0汤圆

 楼主| 发表于 2012-3-29 16:25:38 | 显示全部楼层
Etual 发表于 2012-3-29 15:52
这是我几天前写的一篇笔记,我的机器上是没有问题的,楼主对比一下看哪里出问题了? ...

谢谢,我试试

出0入0汤圆

 楼主| 发表于 2012-3-29 16:26:20 | 显示全部楼层
出错信息:

longfei@ubuntu:/usr/src/linux-source-2.6.35$ make oldconfig
  HOSTCC  scripts/basic/fixdep
scripts/basic/fixdep.c:398: fatal error: opening dependency file scripts/basic/.fixdep.d: Permission denied
compilation terminated.
make[1]: *** [scripts/basic/fixdep] Error 1
make: *** [scripts_basic] Error 2

出0入0汤圆

发表于 2012-3-29 17:28:33 | 显示全部楼层
很不错的参考例子。

出0入0汤圆

 楼主| 发表于 2012-3-29 20:23:03 | 显示全部楼层
Etual 发表于 2012-3-29 15:51
(Linux Device Driver,简称LDD) 一书是linux驱动程序开发的经典,这里阐述的是怎么编写一个 hello 的内 ...

非常感谢

出0入0汤圆

发表于 2012-3-29 21:14:33 | 显示全部楼层
helloworld这种例程事实上用ubuntu的内核文件也是可以的……
更换内核说起来还是件比较烦的事,如果不是要求特定版本的内核的话,用slackware就不用自己编译内核了,因为这个发行版使用的就是原版内核……

出0入0汤圆

发表于 2012-3-29 23:30:21 | 显示全部楼层
出错的地方提示你权限不够,命令前加sudo

出0入0汤圆

发表于 2012-3-29 23:41:12 | 显示全部楼层
Etual 发表于 2012-3-29 15:51
(Linux Device Driver,简称LDD) 一书是linux驱动程序开发的经典,这里阐述的是怎么编写一个 hello 的内 ...

我是来看3楼的

出0入0汤圆

发表于 2012-3-30 11:31:46 | 显示全部楼层
mark              

出0入0汤圆

 楼主| 发表于 2012-3-31 19:33:40 | 显示全部楼层
Etual 发表于 2012-3-29 15:51
(Linux Device Driver,简称LDD) 一书是linux驱动程序开发的经典,这里阐述的是怎么编写一个 hello 的内 ...

我已经按照上面的步骤来了,可是用insmod的时候还是出现下面的错误:
insmod: error inserting 'hello.ko': -1 Invalid module format
这个是我/usr/src/目录下的文件:
root@ubuntu:/usr/src# ls
linux-headers-2.6.35-22          linux-source-2.6.35
linux-headers-2.6.35-22-generic  linux-source-2.6.35.tar.bz2
这是makefile:
obj-m := hello.o
KERNELDIR ?= /usr/src/linux-source-2.6.35
PWD := $(shell pwd)

all:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

编译没什么问题就是不能insmod,请高手指点下啊

出0入0汤圆

发表于 2012-4-1 22:54:14 | 显示全部楼层
你要先看看你自己运行的内核是什么版本,可以使用这个命令查看
uname -r
当前运行的内核版本必须和你使用的内核目录相一致
试试用下面的内容替换makefile,这个方法就不用下载内核源码,初学使用这个比较简单
obj-m += hello.o     
all:   make -C /lib/modules/`uname -r`/build M=$(PWD) modules     
clean:   make -C /lib/modules/`uname -r`/build M=$(PWD) clean

出0入0汤圆

发表于 2012-4-11 13:53:01 | 显示全部楼层
也在看这些资料,学习中!

出0入0汤圆

发表于 2012-4-11 14:01:22 | 显示全部楼层
EngineV100 发表于 2012-3-29 16:45
文件读写权限问题,试试用 sudo make oldconfig看看

挺神奇的,一个二个怎么都在教人用 root 编译内核啊?都那样玩干嘛不索性用回 Windows 去?

给楼主个建议,如果内核源码是用 apt 安装的(那样自然会装成属主是 root),那么你试试看 lndir 这个命令吧

或者开个组,叫 wsrc 什么的,把常规登录用户加进这个组,然后

sudo chown -R :wsrc /usr/src
sudo chroot -R g+w /usr/src

这样也可以直接在源码树中编译

出0入0汤圆

 楼主| 发表于 2012-4-13 19:36:21 | 显示全部楼层
waitingconfirm 发表于 2012-4-11 14:01
挺神奇的,一个二个怎么都在教人用 root 编译内核啊?都那样玩干嘛不索性用回 Windows 去?

给楼主个建 ...

非常强大

出0入0汤圆

发表于 2012-4-13 22:18:41 | 显示全部楼层
Permission denied
没权限……

出0入0汤圆

 楼主| 发表于 2012-4-13 23:19:56 | 显示全部楼层
hackerboygn 发表于 2012-4-13 22:18
Permission denied
没权限……

我也是新手,直接root吧

出0入0汤圆

发表于 2012-4-16 09:10:11 | 显示全部楼层
在Ubuntu中,需要加权限的命令前加sudo就可以了。
Ubuntu默认禁用root用户,改root密码后自动启用……

出0入0汤圆

发表于 2012-4-17 23:57:02 | 显示全部楼层
用root操作起来舒服,对新手适用。大不了重装系统
况且搞的是嵌入式

出0入0汤圆

发表于 2012-4-18 21:57:20 | 显示全部楼层
Etual 发表于 2012-4-17 23:57
用root操作起来舒服,对新手适用。大不了重装系统
况且搞的是嵌入式 ...

就是因为搞嵌入式的一个二个都你这想法,所以果粉才天天嘲笑安卓没安全性恶意软件多什么的……

要我说,都这想法,干嘛还用 linux?乖乖用回 windows 去不好么?

出0入0汤圆

 楼主| 发表于 2012-4-19 13:30:54 | 显示全部楼层
waitingconfirm 发表于 2012-4-18 21:57
就是因为搞嵌入式的一个二个都你这想法,所以果粉才天天嘲笑安卓没安全性恶意软件多什么的……

要我说, ...

开源不就这样吗,不断的发现漏洞,不断的补漏洞,要是IOS被hack发现漏洞可够苹果吃一壶了

出0入0汤圆

发表于 2012-4-19 15:30:39 | 显示全部楼层
longfeix86 发表于 2012-4-19 13:30
开源不就这样吗,不断的发现漏洞,不断的补漏洞,要是IOS被hack发现漏洞可够苹果吃一壶了 ...

IOS 要没漏洞的话,大家也就不用越狱了

出0入0汤圆

 楼主| 发表于 2012-4-19 17:22:46 | 显示全部楼层
waitingconfirm 发表于 2012-4-19 15:30
IOS 要没漏洞的话,大家也就不用越狱了

那是破解了安全机制,就跟破解密码类似,但肯定复杂点,我指的是利用系统漏洞获取用户资料那种

出0入0汤圆

发表于 2012-4-21 00:14:57 | 显示全部楼层
longfeix86 发表于 2012-4-19 17:22
那是破解了安全机制,就跟破解密码类似,但肯定复杂点,我指的是利用系统漏洞获取用户资料那种 ...

拿你没话讲

破解安全机制那是 Cydia 软件包管理器的事儿,但如果没有系统漏洞,你连 root 权限都获取不了, cydia 更装不上

出0入0汤圆

 楼主| 发表于 2012-4-21 10:20:08 | 显示全部楼层
EngineV100 发表于 2012-4-21 00:25
搞linux内核和驱动开发的,没有root权限是根本搞不定的。你可以用普通用户权限把内核和驱动编译出来,但 ...

是LDD说的,做研究型学习的就要做好牺牲系统的准备,如果连这都做不到的话,那就别研究了,直接拿别人的代码编编玩吧

出0入0汤圆

发表于 2012-4-21 10:26:45 | 显示全部楼层
EngineV100 发表于 2012-4-21 00:25
搞linux内核和驱动开发的,没有root权限是根本搞不定的。你可以用普通用户权限把内核和驱动编译出来,但 ...

摊手,有些事情,光说嘴是讲不明白的

不过,如果你说的真是正确的话,那么 linux 也就不会出现用户态内核了

出0入0汤圆

发表于 2012-5-3 00:06:26 | 显示全部楼层
longfeix86 发表于 2012-4-21 10:20
是LDD说的,做研究型学习的就要做好牺牲系统的准备,如果连这都做不到的话,那就别研究了,直接拿别人的 ...

楼主,在linux设备驱动开发之前,个人觉得应该有以下几个知识点需要补齐:
1. Linux OS环境下,哪些操作需要某些权限;
2. Linux设备驱动开发环境,包含哪些基本的组件;
3. 是否比较熟悉linux界面操作;(只对设备驱动开发)
4. linux环境下,有没有你熟悉的编辑器;
5. 找对一个稳定的Linux发行版。个人感觉,redhat比ubuntu好用,redhat是较为稳定的,虽然ubuntu也不是那么脆弱,但确实它不那么像开发环境,因为它本身可以说就是一个开发版本。

具备上述这些后,那么接下来才是体现我们对C语言的认知程度、是否懂得操作系统、是否清晰体系结构了。
直接空降到Linux设备驱动开发,缓冲不够。

比如报错信息:
invaild module......
你是否查看了modinfo和系统的导出的vermagic匹配?

出0入0汤圆

发表于 2012-5-3 00:08:15 | 显示全部楼层
系统并没有那么脆弱,设备驱动是可插拔的,驱动写坏了。重启一下不会牺牲系统的,我觉得:)

出0入0汤圆

发表于 2012-5-3 08:15:25 | 显示全部楼层
长夜漫漫,无心睡眠。

对于Linux的当前权限,在shell对话框中其实是非常直观的呈现:
1. "$":表示普通用户权限;
2. "#":表示root用户权限;

祝楼主搭建环境成功!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表