LINUX驱动版本的hello world(转)

本文详细介绍了如何在Linux环境下进行内核驱动开发,包括目录结构、编译流程、源码编写、Makefile使用及驱动加载与卸载等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自  jjzhang166
最终编辑  jjzhang166

http://hi.baidu.com/ah%5F%5Ffu/blog/item/57b76201e27095de267fb5d4.html

终于下决心好好学习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

01#include <linux/init.h>
02 
03#include <linux/module.h>
04 
05 
06 
07static int hello_init(void)
08 
09{
10 
11    printk(KERN_INFO " Hello World enter\n");
12 
13    return 0;
14 
15}
16 
17 
18 
19static void hello_exit(void)
20 
21{
22 
23    printk(KERN_INFO " Hello World exit\n ");
24 
25}
26 
27 
28 
29module_init(hello_init);
30 
31module_exit(hello_exit);
32 
33 
34 
35MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
36 
37MODULE_LICENSE("Dual BSD/GPL");
38 
39MODULE_DESCRIPTION("A simple Hello World Module");
40 
41MODULE_ALIAS("a simplest module");

Makefile

01KVERS = $(shell uname -r)
02 
03# Kernel modules
04obj-m += hello.o
05 
06# Specify flags for the module compilation.
07#EXTRA_CFLAGS=-g -O0
08 
09build: kernel_modules
10 
11kernel_modules:
12    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
13 
14clean:
15    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值