Notes [ Linux Device Drivers, 3rd Edition ( Ch02 ) - The Hello World Module ]

很想接触一下Linux的内核,最近加入了LKML(Linux Kernel Mailing List),犹如潮水般的mail涌入了我的Gmail>_<

一开始很迷茫,如此庞大了Linux内核代码,从何开始?网上看到了一条建议:从Linux设备驱动的编写开始。

于是找到了一本这方面比较好的教材:Linux Device Drivers, 3rd Edition(LDD3)

不过这本书里面讲的第一个Hello world程序就不知道该如何编译,书里讲的也不是很详细,可能是认为读者已经有相关的知识了,可惜俺没有ToT

后来网上又找到了一篇文章,讲得比较详细,这里给个链接http://linux.chinaunix.net/bbs/viewthread.php?tid=904034&highlight=Godbach

接下来就是整个编译的过程

dolphin@dolphin-laptop:~/Documents/LDD$ gedit Makefile
dolphin@dolphin-laptop:~/Documents/LDD$ gedit hello.c
dolphin@dolphin-laptop:~/Documents/LDD$ make
make -C /lib/modules/2.6.31-21-generic/build M=/home/dolphin/Documents/LDD modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.31-21-generic'
  CC [M]  /home/dolphin/Documents/LDD/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/dolphin/Documents/LDD/hello.mod.o
  LD [M]  /home/dolphin/Documents/LDD/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.31-21-generic'
dolphin@dolphin-laptop:~/Documents/LDD$ ls
hello.c   hello.ko     hello.mod.o  Makefile        modules.order
hello.c~  hello.mod.c  hello.o      Module.markers  Module.symvers
dolphin@dolphin-laptop:~/Documents/LDD$ sudo insmod ./hello.ko
[sudo] password for dolphin:
dolphin@dolphin-laptop:~/Documents/LDD$ lsmod
Module                  Size  Used by
hello                   1052  0

 

模块已经被加载了,不过没有该有字符串输出,不知道是怎么回事,也许是我没有用标准的内核,而是偷懒用了Ubuntu自带的内核

下面是hello.c和Makefile文件

dolphin@dolphin-laptop:~/Documents/LDD$ cat 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, cruel world/n" );
}

module_init( hello_init );
module_exit( hello_exit );
dolphin@dolphin-laptop:~/Documents/LDD$ cat Makefile
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.31-21-generic/build
PWD := $(shell pwd)

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

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

 

我知道为什么没有字符串输出了,刚才又仔细看了一遍LDD3,里面有这么一段话

According to the mechanism your system uses to deliver the message lines, your out-
put may be different. In particular, the previous screen dump was taken from a text
console; if you are running insmod and rmmod from a terminal emulator running
under the window system, you won’t see anything on your screen.

俺就是在Xwindows环境的gnome-terminal下运行的,难怪没有输出,后来(CTRL+ALT+F1)切换到CLI下去运行的时候,结果有输出了

dolphin@dolphin-laptop:~/Documents/LDD$ sudo insmod hello.ko

[ 8842.019793] Hello, world

dolphin@dolphin-laptop:~/Documents/LDD$ sudo rmmod hello

[8862.015773] Goodbye, cruel world

不过前面还多了串数字,不知道这是什么东东了,大概和时间有关吧~~暂且先放着,以后再研究了

接着看下去后貌似有点冤枉作者了,其实他在后面的“Compiling and Loading”一节中讲述了如何编写Makefile文件来编译模块的

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
     obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
     KERNELDIR ?= /lib/modules/$(shell uname -r)/build
     PWD := $(shell pwd)
default:
     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
不过他也说了这不是完整的Makefile,完整的Makefile应该包括清除一些不需要的文件,安装模块之类的。以下是此文章中的原文:

Do note that the above is not a complete makefile; a real makefile includes the usual sort of targets for cleaning up unneeded files, installing modules, etc. See the makefiles in the example source directory for a complete example.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值