先查看Ubuntu的版本
cat /etc/issue
lin@lin-virtual-machine:~$ cat /etc/issue
Ubuntu 12.04 LTS \n \l
或者使用
lin@lin-virtual-machine:~$ sudo lsb_release -a
[sudo] password for lin:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
在看一下内核版本
lin@lin-virtual-machine:~$ uname -r
3.2.0-23-generic
现在开始我们第一个代码
hello.c
/*
* a simple kernel module: hello
*
* Copyright (C) 2014 Barry Song (baohua@kernel.org)
*
* Licensed under GPLv2 or later.
*/ #include <linux/init.h>
#include <linux/module.h> static int __init hello_init(void)
{
printk(KERN_INFO "Hello World enter\n");
return ;
}
module_init(hello_init); static void __exit hello_exit(void)
{
printk(KERN_INFO "Hello World exit\n ");
}
module_exit(hello_exit); MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
makfile
KVERS = $(shell uname -r) # Kernel modules
obj-m += hello.o # Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
先cd到文件所在路径,后make
lin@lin-virtual-machine:~$ cd hello
lin@lin-virtual-machine:~/hello$ ls
hello.c Makefile
lin@lin-virtual-machine:~/hello$ make
make -C /lib/modules/3.2.--generic/build M=/home/lin/hello modules
make[]: 正在进入目录 `/usr/src/linux-headers-3.2.--generic'
CC [M] /home/lin/hello/hello.o
Building modules, stage .
MODPOST modules
CC /home/lin/hello/hello.mod.o
LD [M] /home/lin/hello/hello.ko
make[]:正在离开目录 `/usr/src/linux-headers-3.2.--generic'
lin@lin-virtual-machine:~/hello$ ls
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
lin@lin-virtual-machine:~/hello$
加载模块使用 sudo insmod ./hello.ko
查询当前加载模块lsmod
in@lin-virtual-machine:~/hello$ sudo insmod ./hello.ko
[sudo] password for lin:
lin@lin-virtual-machine:~/hello$ lsmod
Module Size Used by
hello
...
我们之前代码中printk的内容怎么查看呢
使用dmesg指令后
....
[ 1751.580930] Hello World enter
[ 2107.145420] Hello World exit
[ 2107.145422]
....
小结:
下面我们来看几个驱动中常用的命令
1、加载驱动模块insmod
将生成驱动模块.ko文件加载,
insmod xxx.ko
加载后就会执行xxxx_init函数
2、卸载驱动模块rmmod
对应的卸载驱动的命令
rmmod xxxx 注意不用带.ko
3、查看内核中的模块信息
lsmod
4、查看模块的描述信息
modinfo xxxx.ko
我们可以在驱动程序添加一些辅助信息,例如作者 ,驱动描述等。
5、查看模块打印信息
dmesg
printk是内核打印函数,默认模式下在中断下无法显示(当然,可以设置成打印到终端),用dmesg可以查看一下打印到内核的信息。
cat /var/log/syslog | grep Hello
lin@lin-virtual-machine:~/hello$ cat /var/log/syslog | grep Hello
Jul :: lin-virtual-machine kernel: [ 844.246862] Hello World enter