先查看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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * 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 0; } 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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.0-23-generic/build M=/home/lin/hello modules make[1]: 正在进入目录 `/usr/src/linux-headers-3.2.0-23-generic' CC [M] /home/lin/hello/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/lin/hello/hello.mod.o LD [M] /home/lin/hello/hello.ko make[1]:正在离开目录 `/usr/src/linux-headers-3.2.0-23-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 12425 0 ...
我们之前代码中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 24 17:19:05 lin-virtual-machine kernel: [ 844.246862] Hello World enter