织梦CMS - 轻松建站从此开始!

罗索

LINUX驱动版本的hello world

落鹤生 发布于 2012-05-28 21:07 点击:次 
终于下决心好好学习LINUX内核和驱动开发了,不怕千万人耻笑,勇敢将自己的学习过程写出来
TAG:

终于下决心好好学习LINUX内核和驱动开发了,不怕千万人耻笑,勇敢将自己的学习过程写出来:

1、关于目录
    /lib/modules/2.6.9-42.ELsmp/build/   这个是内核源码所在的目录
    一般使用这样的命令进入这个目录:cd /lib/modules/$(uname -r)/build/
   这个目录实际上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686

2、编译驱动所使用的makefile
    实际上编译驱动的时候是使用预先提供的一个makefile的,位置在:
/lib/modules/$(uname -r)/build/Makefile
    注意:M是大写的

3、网上抄录的Linux驱动Hello world的源码:
// 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!\n");
}

module_init(hello_init);
module_exit(hello_exit);

4、写个makefile来编译这个驱动:(版本一,最简单的)
#下面这行是文件Makefile的内容,注意M是大写的
obj-m := hello.o

把hello.c和Makefile保存在同一目录,然后执行:
make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
这样驱动就编译好了,成果是hello.ko文件。
注意:makefile一定要写成Makefile,如果写成makefile就编译不过。(折腾啊,就这一步耗了N多时间)

5、再写另一种Makefile:(版本二:最省事的)
#以下是Makefile文件的内容
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
    rm *.o *.ko

然后执行:make就编译成功了,命令行不再加参数,很省事。
注意:all: 和clean:下面的行,前面是一个TAB键

6、加载驱动:
执行
insmod ./hello.ko
屏幕上没反应。(因为我是在WINDOWS上用远程终端连上去的嘛)
OK,先让时光倒流,回到加载驱动以前,先另开一个窗口,执行:
tail -f /var/log/message
然后在原来的窗口里执行:
insmod ./hello.ko
哈哈,/var/log/message文件里面看见了盼望已久的hello world!

7、查看驱动:
lsmod   看见 hello这个驱动在其中

8、卸载驱动:
rmmod hello 
看见/var/log/message里显示了goodbye

附录为通过编译的helloworld程序

hello.c

  1. #include <linux/init.h> 
  2. #include <linux/module.h> 
  3.   
  4. static int hello_init(void
  5.     printk(KERN_INFO " Hello World enter\n"); 
  6.     return 0; 
  7.  
  8. static void hello_exit(void
  9.     printk(KERN_INFO " Hello World exit\n "); 
  10.   
  11. module_init(hello_init); 
  12. module_exit(hello_exit); 
  13. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 
  14. MODULE_LICENSE("Dual BSD/GPL"); 
  15. MODULE_DESCRIPTION("A simple Hello World Module"); 
  16. MODULE_ALIAS("a simplest module"); 

Makefile

  1. KVERS = $(shell uname -r) 
  2.   
  3. # Kernel modules 
  4. obj-m += hello.o 
  5.   
  6. # Specify flags for the module compilation. 
  7. #EXTRA_CFLAGS=-g -O0 
  8.   
  9. build: kernel_modules 
  10.   
  11. kernel_modules: 
  12.     make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules 
  13.   
  14. clean: 
  15.     make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean 

 

(ah%5F%5Ffu)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201205/16039.html]
本文出处:百度博客 作者:ah%5F%5Ffu 原文
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容