1.在编译安装内核模块(驱动)之前先确认时候有安装kernel-devel
输入: ls -d lib/modules/$(uname -r)/build
如果有目录存在说明有安装,否则没安装
下载相应内核的kernel-devel ,版本可是使用命令 uname -r 查看
安装kernel-devel执行命令:
rpm -ivh kernel-devel-$(uname -r).rpm
安装完成
以下是一个hello内核模块简单例子
hello.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int hello_init(void)
{
printk("hello world");
return 0;
}
static void hello_exit(void)
{
printk("good byte");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile 内容如下
obj-m:=hello.o
KDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
defalut :
$(MAKE) -C $(KDIR) M=$(PWD) modules
执行make编译命令
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules //编译
# make -C /lib/modules/$(uname -r)/build M=$(pwd) clean //清除
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install //安装
加入到slickedit ide 中
首先建立一个新GNU C/C++工程 取名 hello
在Source file 内加入 hello.c
在Other files 内加入 MakeFile
右键点工程选择 project Properties...
选择 Tools 那页
点 Build
在Command Line: 输入 :make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
设置tag文件 tools -> Tag Files
点Add Tree 把 /usr/src/kernels/2.6.25.-14.fc9/include 加入 tag
这样在写驱动模块的时候就就会有丰富的提示信息了。可以加快输入速度和减少错误发生
然后点工程build 就可以完成编译了。
# insmod hello.ko 加载模块
# lsmod 显示已经加载的模块
# rmmod hello 卸载模块
由于优先级别的问题。在图形shell中是看不到模块的printk输出的,在text模式下是可以看到。
可以使用命令 dmesg 来查看输出信息 或者修改shell的优先级别
当日志级别小于console_loglevel时,消息才能显示出来。
可以通过以下命令查看和修改优先级别
cat /proc/sys/kernel/printk
6 4 1 7
第一个是控制台日志级别;第二个是默认的消息日志级别;第三个是最低的控制台日志级别;第四个是默认的控制台日志级别
修改级别。
# echo 8 > /proc/sys/kernel/printk
不知为什么我改完以后还是输出不了信息 ???(谁能告诉我这个是什么问题?)
goole 对于fedora 9 还有一种方法让printk输出console
执行
#gedit /etc/rsyslog.conf
// 不同的Linux发行版使用不同syslog程序来记录系统日志。
// 的Debain 4.0/Ubuntu8.04(桌面版)默认使用的是sysklogd,配置文件为/etc/syslog.conf。
// Fedora9默认使用rsyslogd,配置文件为/etc/rsyslog.conf。
// opensuse11使用syslog-ng,配置文件为/etc/syslog
#kern.* /dev/console
//把kern.*前的注视去掉。这样printk的信息就可以直接显示到终端了!
保存就好了