- # 如果已定义了KERNELRELEASE,则说明是从内核构造系统调用的,
- # 因此可利用其内建语句:obj-m := hello.o
- ifneq ($(KERNELRELEASE),)
- obj-m := hello.o # 该语句使用了GNU make的扩展语法,说明了有一个模块需要从
- # 目标文件hello.o中构造,而从该目标文件中构造的模块名称
- # 为hello.ko。如果我们要构造的模块名称为modules.ko,并由
- # 两个源文件file1.c & file2.c生成,则这里应该写为:
- # obj-m := module.o
- # module-objs := file1.o file2.o
-
- # 否则,是直接从命令行调用的,此时要调用内核构造系统。
- else
- KERNELDIR ?= /home/moran/program/micro2440/kernel/linux-2.6.32.2
- PWD := $(shell pwd)
-
- default:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) # 此命令首先改变目录到-C选项指定的位
- # 置(即内核源代码目录),其中保存有
- # 内核的顶层Makefile文件。 M=选项让
- # 该Makefile在构造modules目标之前返
- # 回到模块源代码目录。然后,modules目
- # 标指向obj-m变量中设定的模块,此例
- # 中,我们设置成了hello.o
-
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
-
- endif
【5】安装模块:
# insmod hello.ko
或者
# insmod ./hello.ko
一个意思。
这一步完了没反应。接着再试一次:
# insmod hello.ko
提示错误:
insmod: error inserting 'hello.ko': -1 File exists
说明hello模块是安装成功的。
用
# lsmod
也能查看到hello模块。
防止打印太多,用:
# lsmod | head -5
只显示前5行等。如:
Module Size Used by
hello 9344 0
binfmt_misc 16776 1
bridge 56340 0
stp 10500 1 bridge
看到hello模块了吧~~~
可是为什么不打印呢?先不说这个。。。
【6】卸载模块
# rmmod hello.ko
再用
# lsmod | head -5
发现hello模块已经不存在了。
【7】关于printk
现在谈谈这个问题:insmod的时候,printk问什么没有在终端中显示Hello World呢?因为hello.c中明明是这么写的:
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
答案只有一句:printk不显示在超级终端上!靠!为什么?我也不知道。。。
【8】printk调试信息打印的补救方法
用命令:
# dmesg | tail -8
这个命令格式类似于lsmod(只显示最后8行)。
[ 95.586960] Good bye, ubuntu
[ 96.483964] Hello World!
[ 97.031787] Good bye, ubuntu
[ 97.594151] Hello World!
[ 98.109896] Good bye, ubuntu
[ 98.615569] Hello World!
[ 99.098943] Good bye, ubuntu
[ 1893.976170] Hello World!
以上的信息显示:笔者在95.586960做了rmmod hello.ko,在96.483964做了insmod hello.ko……
这里[]中的数字表示执行模块安装/卸载聚开机的时间,如96.483964 S(约开机一个半小时以后)。
【9】那么这些信息都存在哪儿呢?
都说默认是在/val/log/messages目录下;可是有时候你看了,没有;
那么请看看另一个目录:
# cd /etc
# ls
你会找到包含syslog的文件,如:
syslog.conf
那么就是它了。
# cat syslog.conf | head -20
同理,只显示前20行的东东;看到类似以下的东东:
# /etc/syslog.conf Configuration file for syslogd.
#
# For more information see syslog.conf(5)
# manpage.
#
# First some standard logfiles. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
#
# Logging for the mail system. Split it up so that
...
看到kern.*了吧~看到/var/log/kern.log了吧!我猜消息就在这底下。
于是,
# cat /var/log/kern.log | tail -10
显示:
Aug 4 23:40:53 ubuntu kernel: [ 38.848634] eth0: no IPv6 routers present
Aug 4 23:41:47 ubuntu kernel: [ 92.893834] Hello World!
Aug 4 23:41:50 ubuntu kernel: [ 95.586960] Good bye, ubuntu
Aug 4 23:41:51 ubuntu kernel: [ 96.483964] Hello World!
Aug 4 23:41:51 ubuntu kernel: [ 97.031787] Good bye, ubuntu
Aug 4 23:41:52 ubuntu kernel: [ 97.594151] Hello World!
Aug 4 23:41:52 ubuntu kernel: [ 98.109896] Good bye, ubuntu
Aug 4 23:41:53 ubuntu kernel: [ 98.615569] Hello World!
Aug 4 23:41:53 ubuntu kernel: [ 99.098943] Good bye, ubuntu
Aug 5 00:11:48 ubuntu kernel: [ 1893.976170] Hello World!
看到了吧!跟先前的dmesg显示的内容相似而更完整了!