主题 : [设备驱动]最简单的HelloWorld驱动实验碰到的问题和经验分享 复制链接 | 浏览器收藏 | 打印
no z no d
级别: 侠客
UID: 12281
精华: 1
发帖: 68
金钱: 750 两
威望: 79 点
贡献值: 1 点
综合积分: 156 分
注册时间: 2010-01-03
最后登录: 2015-08-09
楼主  发表于: 2010-05-31 15:15

 [设备驱动]最简单的HelloWorld驱动实验碰到的问题和经验分享

此帖售价 25 金钱,已有 1 人购买
若发现会员采用欺骗的方法获取财富,请立刻举报,我们会对会员处以2-N倍的罚金,严重者封掉ID!
[ 此帖被cumt2009在2015-08-09 22:23重新编辑 ]
嵌入式博大精深
:)
级别: 骑士
UID: 61588
精华: 5
发帖: 248
金钱: 1500 两
威望: 300 点
贡献值: 5 点
综合积分: 596 分
注册时间: 2012-01-02
最后登录: 2018-03-05
1楼  发表于: 2013-02-15 22:22
引用楼主cumt2009于2010-05-31 15:15发表的 [设备驱动]最简单的HelloWorld驱动实验碰到的问题和经验分享 :
参考tekkaman的linux设备驱动程序学习:http://blog.chinaunix.net/u1/34474/showart.php?id=407202
    小弟新手,初次接触设备驱动学习,写的不对的还请指正呀~~
今天实验了第一个设备驱动Hello,world!模块,期间碰到了几个问题,在此分享下经验,希望以后的朋友碰到了类似问题能少走弯路.
实验环境:
主机:Ubuntu10.04,emacs,minicom等.
.......

情况是这样的,在/lib/modules/2.6.32.2/目录下面,有多个*.ko文件,这里是hello.ko和hellop.ko,于是我将hello.ko和另外一个modules.dep.bb删除后,只剩下hellop.ko文件,接着重新测试后,不再提示"rmmod: module 'hellop' not found"
今天在进行字符设备scull驱动实验的时候,也同样出现了这个问题,其实这里只需要将/lib/modules/2.6.32.2/目录下面的modules.dep.bb删除即可搞定!!!
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我在这里看到,不是modules.dep.bb的原因,我在mini2440上也实验了,modules.dep.bb会再次产生的。在这里找到了原因:http://blog.chinaunix.net/uid-20564848-id-74053.html,是这个版本的busybox中的rmmod这个命令的问题,实质已经卸载成功了,它还在提示这个not found。
修改这个remmod这个命令的源代码就Ok了。


[root@FriendlyARM /]# ls
bin      home     linuxrc  proc     root     tmp      www
dev      kangear  mnt      rmmod    sbin     usr
etc      lib      opt      rmmod.c  sys      var
[root@FriendlyARM /]# insmod /kangear/alloc_mem.ko
get_free_page: pagemem va addr=c7af6000 pa addr=37af6000
get_free_pages: pagesmem va addr=c7ac8000       pa addr=37ac8000
__get_zeroed_page: pagezmem va addr=c7af2000    pa addr=37af2000
kmalloc: kmallocmem va addr=c7a3cb80 |tpa addr=37a3cb80
kmalloc: kmallocmem say <<<--- Kmalloc Mem OK!--- >>>
vmalloc: vmallocmem va addr=c94f0000
[root@FriendlyARM /]# rmmod alloc_mem.ko
[root@FriendlyARM /]# rmmod alloc_mem  
<<<<--- Module Exit --->>>
rmmod: module 'alloc_mem' not found
[root@FriendlyARM /]#                
[root@FriendlyARM /]# //再来一遍
[root@FriendlyARM /]#
[root@FriendlyARM /]# insmod /kangear/alloc_mem.ko
get_free_page: pagemem va addr=c7b1b000 pa addr=37b1b000
get_free_pages: pagesmem va addr=c7b00000       pa addr=37b00000
__get_zeroed_page: pagezmem va addr=c7b18000    pa addr=37b18000
kmalloc: kmallocmem va addr=c7a3c100 |tpa addr=37a3c100
kmalloc: kmallocmem say <<<--- Kmalloc Mem OK!--- >>>
vmalloc: vmallocmem va addr=c95e7000
[root@FriendlyARM /]# ./rmmod alloc_mem  
<<<<--- Module Exit --->>>
[root@FriendlyARM /]#//没有了
rmmod的源代码:
复制代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. int main(int argc, char *argv[])
  8. {
  9.     const char *modname = argv[1];
  10.     int ret = -1;
  11.     int maxtry = 10;
  12.     while (maxtry-- > 0) {
  13.         ret = delete_module(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_module
  14.         if (ret < 0 && errno == EAGAIN)
  15.             usleep(500000);
  16.         else
  17.             break;
  18.     }
  19.     if (ret != 0)
  20.         printf("Unable to unload driver module \"%s\": %s\n",
  21.              modname, strerror(errno));
  22. }


luther@gliethttp:/vobs/tmp$ arm-linux-gcc -o rmmod rmmod.c 
[ 此帖被kangear在2013-02-15 22:39重新编辑 ]