Linxu设备驱动之Hello World!

      接下来准备记录一下Linux驱动学习的点点滴滴!接触一段时间了,但是没有记录,恰巧想把手头的ARM11的板子整整!所以,准备从今天开始系统记录一下,主要就是学习驱动的架构,然后编写板子上面外设的驱动程序,并进行测试!

      关于驱动学习最好的资料就是内核源码了,但是也推荐几本书。

       1、《Linux设备驱动》

       2、 《Linux设备驱动开发详解》

      今天是作为一个系列的开篇,保持优良传统,写一个Hello World!的驱动程序。

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void) 
{
	printk(KERN_INFO "hello world!\n");
	return 0;
}

static void hello_exit(void) 
{
	printk(KERN_INFO "Goodbye!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");
        Makefile文件如下:

ifneq ($(KERNELRELEASE),)
# call from kernel build system

obj-m	:= helloworld.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

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

endif
         输入make命令进行编译,可以看看终端上编译的输出信息,这有助于我们对编译过程的了解:


       可以看出整个编译过程是分为两个过程,首先是进入内核编译系统,做一些处理,因为我们的模块是针对一个内核版本编译的,所以要进入内核编译系统进行处理,然后在第二个过程才是从内核编译系统出来进入我们模块源码的目录下编译我们的模块! 

       编译后的文件比较多,有第一阶段产生的也有第二阶段产生的,具体如下:


        最后使用命令:sudo insmod ./helloworld.ko来加载模块,利用lsmod命令查看是否加载成功:


         但是并没有在终端输出"hello world!",但是可以查看/var/log/message文件就可以看到:

          或者使用dmesg命令查看也行,输出如下:


          接下来我们使用rmmod命令卸载模块,输出结果如下:


         可以看出来这里并没有卸载成功,但是经过我检查,这里并不是因为我的内核禁止卸载模块造成的!

         以上测试的环境是fedora16,内核版本是3.2.7。由于出现上述不能卸载模块的问题,在网上看了很多人都遇到同样的问题,只是说用之前的版本可以卸载,最新的发行版本不行,但是没给出原因,接下来我就用ubuntu_9.0.1版本测试,内核是2.6.28的。

         这里直接就是加载模块,用lsmod命令查看如下:


       这里大家能对比上面在fedora16下的测试就可以看到区别了吧!

        接下来我们卸载模块:


        这里就运行成功了,在用lsmod命令看一下:


        OK,可以看到确实卸载成功了!但是这到底是什么原因导致这样的区别呢?到现在还没查出来,希望那个知道的人可以指教以下,在下面留言!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值