接上前面编译内核的文章
内核编译好了之后,自己要往内核中添加自己的驱动程序,如果加呢?
选择一个目录加入自己的驱动文件
nasri@ubuntu:~/Work/linux-source-3.13.0/$
因为前面编译内核是在上面这个目录下编译的
所以就在这里添加自己的驱动文件,在driver/char 下创建一个目录nasritest
nasri@ubuntu:~/Work/linux-source-3.13.0/drivers/char$
在nasritest下建立驱动文件
nasri@ubuntu:~/Work/linux-source-3.13.0/drivers/char$ vim nasritest/nasritest.c
nasritest.c驱动文件如下
#include
#include
#include
static int __init my_init(void)
{
int i = 0;
for(i = 0 ; i < 4 ; i++)
printk("nasritest i = %d\n",i);
printk("my_init");
return 0;
}
static void __exit my_exit(void)
{
printk("nasritest exit!");
}
module_init(my_init);
module_exit(my_exit);
当然少不了Makefile 和Kconfig
在nasrittest目录下吗建立Mafile文件,内容:
obj-$(CONFIG_NASRITEST) += nasritest.o
Kconfig文件
menu "NASRI TEST Driver "
comment "NASRI TEST Driver Config"
config NASRITEST
tristate "nasritest module test"
default m
help
This is the hello test driver
endmenu
Kconfig是就是内核用来让内核配置工具识别的配置文件,有了这些Kconfig,你才可以通过menuconfig来很快的配置各种驱动
仅仅这些还不够
怎么和其他配置文件联系起来呢?或者怎么和上一级目录联系起来呢?
那直接找这个目录的上一级目录
我们看到上一级目录下有和nasritest类似的文件夹hw_random,我们就按照它的方式去添加我们自己的驱动配置,可以看到
source 一下我们刚才的Kconfig就可以了
config NWFLASH
tristate "NetWinder flash support"
depends on ARCH_NETWINDER
---help---
If you say Y here and create a character device /dev/flash with
major 10 and minor 160 you can manipulate the flash ROM containing
the NetWinder firmware. Be careful as accidentally overwriting the
flash contents can render your computer unbootable. On no account
allow random users access to this device. :-)
To compile this driver as a module, choose M here: the
module will be called nwflash.
If you're not sure, say N.
source "drivers/char/hw_random/Kconfig"
source "drivers/char/nasritest/Kconfig"
同样编译的时候也需要找到nasritest这个文件夹,那么这个char目录的Makefile中添加
obj-$(CONFIG_MWAVE) += mwave/
obj-$(CONFIG_AGP) += agp/
obj-$(CONFIG_NASRITEST) += nasritest/
obj-$(CONFIG_PCMCIA) += pcmcia/
到这里就好了,添加好了之后又两个作用:
1:我们可以通过 menuconfig 内核配置工具来配置想要的驱动
2:可以通过make命令编译到我们的驱动文件
那首先来看下menuconfig
nasri@ubuntu:~/Work/linux-source-3.13.0$ make menuconfig
scripts/kconfig/mconf Kconfig
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
在menuconfig界面上搜索下(“按斜杠/ 搜索nasri,就可以看到我们的驱动的配置路径”)
┌──────────────────────────────────────────────────────────── Search Results ────────────────────────────────────────────────────────────┐
│ Symbol: NASRITEST [=m] │
│ Type : tristate │
│ Prompt: nasritest module test │
│ Location: │
│ -> Device Drivers │
│ -> Character devices │
│ (1) -> NASRI TEST Driver │
│ Defined at drivers/char/nasritest/Kconfig:4 │
│
找到这个路径下面,可以看到我们已经选中了这个模块
.config - Linux/x86 3.13.11-ckt39 Kernel Configuration
> Device Drivers > Character devices ────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────── Character devices ───────────────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. Pressing │
│ includes, excludes, modularizes features. Press to exit, > for Help, > for Search. Legend: [*] built-in │
│ [ ] excluded module < > module capable │
│ │
│ ┌───────────────────────────────^(-)─────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ HDLC line discipline support │ │
│ │ GSM MUX line discipline support (EXPERIMENTAL) │ │
│ │ Trace data router for MIPI P1149.7 cJTAG standard │ │
│ │ Trace data sink for MIPI P1149.7 cJTAG standard │ │
│ │ [ ] /dev/kmem virtual device support │ │
│ │ Serial drivers ---> │ │
│ │ [*] TTY driver to output user messages via printk │ │
│ │ Parallel printer support │ │
│ │ [ ] Support for console on line printer │ │
│ │ Support for user-space parallel port device drivers │ │
│ │ [*] Xen Hypervisor Console support │ │
│ │ [*] Xen Hypervisor Multiple Consoles support │ │
│ │ <*> Virtio console │ │
│ │ IPMI top-level message handler ---> │ │
│ │ <*> Hardware Random Number Generator Core support │ │
│ │ Timer IOMEM HW Random Number Generator support │ │
│ │ Intel HW Random Number Generator support │ │
│ │ AMD HW Random Number Generator support │ │
│ │ < > Atmel Random Number Generator support │ │
│ │ VIA HW Random Number Generator support │ │
│ │ VirtIO Random Number Generator support │ │
│ │ < > EXYNOS HW random number generator support │ │
│ │ TPM HW Random Number Generator support │ │
│ │ NASRI TEST Driver ---> │ │
│ │ {M} /dev/nvram support │ │
│ │ Siemens R3964 line discipline │ │
│ │ Applicom intelligent fieldbus card support │ │
│ └───────────────────────────────┴(+)─────────────────────────────────────────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│
看到NASRI TEST Driver,看到了把,这就是前面我们的nasritest目录下的Kconfig中的menu中的字符串,进去看到:
.config - Linux/x86 3.13.11-ckt39 Kernel Configuration
> Device Drivers > Character devices > NASRI TEST Driver ───────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────── NASRI TEST Driver ──────────────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. Pressing │
│ includes, excludes, modularizes features. Press to exit, > for Help, > for Search. Legend: [*] built-in │
│ [ ] excluded module < > module capable │
│ │
│ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ *** NASRI TEST Driver Config *** │ │
│ │ nasritest module test │ │
│ │
已经选中为M了
这里说下表选中为Y和选中为M的意思
y: 模块驱动编译到内核中,启动时自动加载
m:模块会被编译,但是不会被编译到内核中
好了,保存下menuconfig,直接make 编译下看看
执行命令
nasri@ubuntu:~/Work/linux-source-3.13.0$ make drivers
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
CHK include/config/kernel.release
/bin/sh: 1: cannot create include/config/kernel.release.tmp: Permission denied
make: *** [include/config/kernel.release] Error 2
nasri@ubuntu:~/Work/linux-source-3.13.0$
报了错误,Permission denied,想起来了,之前编译内核的时候是用的sudo 命令这里也用sudo
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo make drivers
make drivers就是编译drivers目录下的内容
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo make drivers
[sudo] password for nasri:
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
就这样编译完了?好像没有编译到我们的驱动模块把?
想起来了,我之前编译过,现在把这个驱动文件修改一下,编译工具看到没有改动,所以就没有再次编译我们的代码
额,好像不对,这个应该用make modules
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo make modules
.......
LD [M] arch/x86/crypto/twofish-x86_64-3way.ko
LD [M] arch/x86/crypto/twofish-x86_64.ko
CC drivers/char/nasritest/nasritest.mod.o
LD [M] drivers/char/nasritest/nasritest.ko
最后生成.ko文件
有了ko文件,我们就可以通过insmode往内核中“注入”
尝试一下!
记得要用sudo
nasri@ubuntu:~/Work/linux-source-3.13.0$ insmod drivers/char/nasritest/nasritest.ko
insmod: ERROR: could not insert module drivers/char/nasritest/nasritest.ko: Operation not permitted
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo insmod drivers/char/nasritest/nasritest.ko
nasri@ubuntu:~/Work/linux-source-3.13.0$
insmode之后,我们发现什么也没有,我们做了insmod之后呢,这个ko驱动就注册进内核中了
我们要看下内核的log就知道这个ko有没有运行了:
查看内核log
nasri@ubuntu:~/Work/linux-source-3.13.0$ vim /var/log/syslog
看到最后nasritest有没有?
Nov 6 07:22:35 ubuntu NetworkManager[750]: wins '192.168.230.2'
Nov 6 07:22:35 ubuntu dbus[413]: [system] Activating service name='org.freedesktop.nm_dispatcher' (using servicehelper)
Nov 6 07:22:35 ubuntu dbus[413]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Nov 6 07:30:01 ubuntu CRON[23035]: (root) CMD (start -q anacron || :)
Nov 6 07:30:01 ubuntu anacron[23038]: Anacron 2.3 started on 2019-11-06
Nov 6 07:30:01 ubuntu anacron[23038]: Normal exit (0 jobs run)
Nov 6 07:31:39 ubuntu kernel: [ 2832.390445] nasritest: module license 'unspecified' taints kernel.
Nov 6 07:31:39 ubuntu kernel: [ 2832.390902] Disabling lock debugging due to kernel taint
Nov 6 07:31:39 ubuntu kernel: [ 2832.393993] nasritest: module verification failed: signature and/or required key missing - tainting kernel
Nov 6 07:31:39 ubuntu kernel: [ 2832.400330] nasritest i = 0
Nov 6 07:31:39 ubuntu kernel: [ 2832.400333] nasritest i = 1
Nov 6 07:31:39 ubuntu kernel: [ 2832.400334] nasritest i = 2
Nov 6 07:31:39 ubuntu kernel: [ 2832.400335] nasritest i = 3
不过看到有出息unspecified这行这个错误
在驱动时出现module license 'unspecified' taints kernel,要加入MODULE_LICENSE("GPL");就不会出现这个错误。
好的,将这句话加上之后,编译下看看
还要make modules?
可以只编译这个模块
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo make modules SUBDIRS=drivers/char/nasritest/
CC [M] drivers/char/nasritest/nasritest.o
Building modules, stage 2.
MODPOST 1 modules
CC drivers/char/nasritest/nasritest.mod.o
LD [M] drivers/char/nasritest/nasritest.ko
nasri@ubuntu:~/Work/linux-source-3.13.0$
有没有想打我冲动?前面直接用这个命令不就可以了嘛?哈哈
嗯,再尝试insmod看看
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo insmod drivers/char/nasritest/nasritest.ko
insmod: ERROR: could not insert module drivers/char/nasritest/nasritest.ko: File exists
额,需要先remove掉这个驱动,再添加
nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo rmmod drivers/char/nasritest/nasritest.ko
再次用sudo insmod添加之后,查看syslog
nasri@ubuntu:~/Work2/nasritest$ vim /var/log/syslog
nasri@ubuntu:~/Work2/nasritest$
Nov 6 07:30:01 ubuntu anacron[23038]: Normal exit (0 jobs run)
Nov 6 07:31:39 ubuntu kernel: [ 2832.390445] nasritest: module license 'unspecified' taints kernel.
Nov 6 07:31:39 ubuntu kernel: [ 2832.390902] Disabling lock debugging due to kernel taint
Nov 6 07:31:39 ubuntu kernel: [ 2832.393993] nasritest: module verification failed: signature and/or required key missing - tainting kernel
Nov 6 07:31:39 ubuntu kernel: [ 2832.400330] nasritest i = 0
Nov 6 07:31:39 ubuntu kernel: [ 2832.400333] nasritest i = 1
Nov 6 07:31:39 ubuntu kernel: [ 2832.400334] nasritest i = 2
Nov 6 07:31:39 ubuntu kernel: [ 2832.400335] nasritest i = 3
Nov 6 07:36:33 ubuntu dhclient: DHCPREQUEST of 192.168.230.132 on eth0 to 192.168.230.254 port 67 (xid=0x33172383)
Nov 6 07:36:33 ubuntu dhclient: DHCPACK of 192.168.230.132 from 192.168.230.254
Nov 6 07:36:33 ubuntu dhclient: bound to 192.168.230.132 -- renewal in 865 seconds.
Nov 6 07:36:33 ubuntu NetworkManager[750]: (eth0): DHCPv4 state changed renew -> renew
Nov 6 07:36:33 ubuntu NetworkManager[750]: address 192.168.230.132
Nov 6 07:36:33 ubuntu NetworkManager[750]: prefix 24 (255.255.255.0)
Nov 6 07:36:33 ubuntu NetworkManager[750]: gateway 192.168.230.2
Nov 6 07:36:33 ubuntu NetworkManager[750]: nameserver '192.168.230.2'
Nov 6 07:36:34 ubuntu NetworkManager[750]: domain name 'localdomain'
Nov 6 07:36:34 ubuntu NetworkManager[750]: wins '192.168.230.2'
Nov 6 07:36:34 ubuntu dbus[413]: [system] Activating service name='org.freedesktop.nm_dispatcher' (using servicehelper)
Nov 6 07:36:34 ubuntu dbus[413]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Nov 6 07:43:45 ubuntu kernel: [ 3557.621564] nasritest i = 0
Nov 6 07:43:45 ubuntu kernel: [ 3557.621567] nasritest i = 1
Nov 6 07:43:45 ubuntu kernel: [ 3557.621568] nasritest i = 2
Nov 6 07:43:45 ubuntu kernel: [ 3557.621569] nasritest i = 3
/nasri 35,47 Bot
看到没有最后的那个nasritest: module license 'unspecified' taints kernel.
现在我们就知道如何注入驱动到内中了。
另外说到编译模块,可以有更好的方式,或者说更简便的方法供我们选择
比如我想写一个驱动,就创建一个普通的目录,可以不在内核源文件目录中
nasri@ubuntu:~$ mkdir Work2
nasri@ubuntu:~$ cd Work2/
创建个Work2目录,然后将之前的nasritest目录copy过来,因为目录里面除了有Makefile ,nasritest.c,Kconfig之外还有生成的其他文件.o .ko等文件,我们只保留Makefile 和 nasritest.c,其他都删掉
Makefile 写成这样
obj-m += nasritest.o
m就表示我们是模块
然后直接编译,注意编译的命令:
nasri@ubuntu:~/Work2/nasritest$ make -C ../../Work/linux-source-3.13.0/ SUBDIRS=~/Work2/nasritest/ modules
make: Entering directory `/home/nasri/Work/linux-source-3.13.0'
CC [M] /home/nasri/Work2/nasritest/nasritest.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/nasri/Work2/nasritest/nasritest.mod.o
LD [M] /home/nasri/Work2/nasritest/nasritest.ko
make: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
nasri@ubuntu:~/Work2/nasritest$
make -C 后面跟着一个目录,目录就是我们的内核目录,编译过的内核源文件的目录
当然像这样的目录在我们整个系统中还存在于根目录的lib目录下
nasri@ubuntu:~/Work2/nasritest$ ls /lib/modules/3.13.11-ckt39/build/
arch crypto firmware ipc lib modules.builtin notes.txt scripts sound usr x509.genkey
block Documentation fs Kbuild MAINTAINERS modules.order README security System.map virt
COPYING drivers include Kconfig Makefile Module.symvers REPORTING-BUGS signing_key.priv tools vmlinux
CREDITS dropped.txt init kernel mm net samples signing_key.x509 ubuntu vmlinux.o
nasri@ubuntu:~/Work2/nasritest$
所以有人将编译命令写成:make -C /lib/modules/`uname -r`/build SUBDIRS=~/Work2/nasritest/ modules
nasri@ubuntu:~/Work2/nasritest$ make -C /lib/modules/`uname -r`/build SUBDIRS=~/Work2/nasritest/ modules
make: Entering directory `/home/nasri/Work/linux-source-3.13.0'
CC [M] /home/nasri/Work2/nasritest/nasritest.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/nasri/Work2/nasritest/nasritest.mod.o
LD [M] /home/nasri/Work2/nasritest/nasritest.ko
make: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
nasri@ubuntu:~/Work2/nasritest$
或者直接写为make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
nasri@ubuntu:~/Work2/nasritest$ make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
make: Entering directory `/home/nasri/Work/linux-source-3.13.0'
Building modules, stage 2.
MODPOST 1 modules
make: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
nasri@ubuntu:~/Work2/nasritest$
注意这里是$PWD ,大写的PWD是环境变量,表示当前目录
而小写的pwd是命令,
这里可以看下其区别
nasri@ubuntu:~/Work2/nasritest$ echo $(pwd)
/home/nasri/Work2/nasritest
nasri@ubuntu:~/Work2/nasritest$ $PWD
bash: /home/nasri/Work2/nasritest: Is a directory
nasri@ubuntu:~/Work2/nasritest$ echo $PWD
/home/nasri/Work2/nasritest
nasri@ubuntu:~/Work2/nasritest$ echo $(PWD)
PWD: command not found
nasri@ubuntu:~/Work2/nasritest$ echo $pwd
nasri@ubuntu:~/Work2/nasritest$
好了言归正传
所以make 命令写成这样也可以
nasri@ubuntu:~/Work2/nasritest$ make -C /lib/modules/`uname -r`/build SUBDIRS=$(pwd) modules
make: Entering directory `/home/nasri/Work/linux-source-3.13.0'
Building modules, stage 2.
MODPOST 1 modules
make: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
nasri@ubuntu:~/Work2/nasritest$
考虑到方便期间,可以修改下Mafile,可让编译起来更方便
Makefile:
obj-m := nasritest.o
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
MAKE := make
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
好勒 ,编译下看看
nasri@ubuntu:~/Work2/nasritest$ make
make: Nothing to be done for `modules'.
Nothing to be done for 'modules'
开始以为是模块之前已经编译过了,没有改动的情况下再次编译就会出现这样的情况
然后自己把代码改了之后再次编译发现仍然出错,
最后再网上看了一篇文章:
http://blog.chinaunix.net/uid-30184083-id-5028504.html
看了下自己的这个Makefile 中显示了警告色 红色
用od -c Makefile查看
nasri@ubuntu:~/Work2/nasritest$ od -c Makefile
0000000 o b j - m : = n a s r i t e
0000020 s t . o \n K E R N E L D I R ?
0000040 = / l i b / m o d u l e s / $ (
0000060 s h e l l u n a m e - r ) /
0000100 b u i l d \n P W D : = $ ( s
0000120 h e l l p w d ) \n M A K E :
0000140 = m a k e \n m o d u l e s : \n
0000160 $ ( M A K E ) - C $
0000200 ( K E R N E L D I R ) M = $ (
0000220 P W D ) m o d u l e s \n m o d
0000240 u l e s _ i n s t a l l : \n
0000260 $ ( M A K E ) - C $ ( K
0000300 E R N E L D I R ) M = $ ( P W
0000320 D ) m o d u l e s _ i n s t a
0000340 l l \n
0000343
发现在 $(MAKE)之前不是\t
对照着网上说的:
vimrc中把set expandtab注释掉,再修改Makefile中make前的制表符
nasri@ubuntu:~/Work2/nasritest$ vim /etc/vim/vimrc
nasri@ubuntu:~/Work2/nasritest$
nasri@ubuntu:~/Work2/nasritest$
" Source a global configuration file if available
set ts=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent
if filereadable("/etc/vim/vimrc.local")
source /etc/vim/vimrc.local
endif
把 set expandtab注释掉
然后修改Makefile ,在$(MAKE)之前写入4个空格
nasri@ubuntu:~/Work2/nasritest$ od -c Makefile
0000000 o b j - m : = n a s r i t e
0000020 s t . o \n K E R N E L D I R ?
0000040 = / l i b / m o d u l e s / $ (
0000060 s h e l l u n a m e - r ) /
0000100 b u i l d \n P W D : = $ ( s
0000120 h e l l p w d ) \n M A K E :
0000140 = m a k e \n m o d u l e s : \n
0000160 \t $ ( M A K E ) - C $ ( K E
0000200 R N E L D I R ) M = $ ( P W D
0000220 ) m o d u l e s \n m o d u l e
0000240 s _ i n s t a l l : \n \t $ ( M A
0000260 K E ) - C $ ( K E R N E L D
0000300 I R ) M = $ ( P W D ) m o d
0000320 u l e s _ i n s t a l l \n
0000335
nasri@ubuntu:~/Work2/nasritest$
但是不知道为什么变成了\t,这样也尝试下:
nasri@ubuntu:~/Work2/nasritest$ make
make -C /lib/modules/3.13.11-ckt39/build M=/home/nasri/Work2/nasritest modules
make[1]: Entering directory `/home/nasri/Work/linux-source-3.13.0'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
nasri@ubuntu:~/Work2/nasritest$ od -C Makefile
od: invalid option -- 'C'
Try 'od --help' for more information.
果然可以了。
因为之前已经编译过了,所以没有看到有没有编译成.ko,修改一下nasritest.c
再编译下看看:
nasri@ubuntu:~/Work2/nasritest$ make
make -C /lib/modules/3.13.11-ckt39/build M=/home/nasri/Work2/nasritest modules
make[1]: Entering directory `/home/nasri/Work/linux-source-3.13.0'
CC [M] /home/nasri/Work2/nasritest/nasritest.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/nasri/Work2/nasritest/nasritest.mod.o
LD [M] /home/nasri/Work2/nasritest/nasritest.ko
make[1]: Leaving directory `/home/nasri/Work/linux-source-3.13.0'
好的,可以,生成了.ko.
再把这个ko导入内核看看
用insmod命令
nasri@ubuntu:~/Work2/nasritest$ sudo insmod nasritest.ko
Nov 7 08:44:41 ubuntu dbus[413]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Nov 7 08:46:09 ubuntu kernel: [ 5385.250995] nasritest: module verification failed: signature and/or required key missing - tainting kernel
Nov 7 08:46:09 ubuntu kernel: [ 5385.273230] nasritest i = 0
Nov 7 08:46:09 ubuntu kernel: [ 5385.273234] nasritest i = 1
Nov 7 08:46:09 ubuntu kernel: [ 5385.273235] nasritest i = 2
Nov 7 08:46:09 ubuntu kernel: [ 5385.273236] nasritest i = 3
Nov 7 08:46:09 ubuntu kernel: [ 5385.273236] nasritest i = 4
Nov 7 08:46:09 ubuntu kernel: [ 5385.273237] nasritest i = 5
Nov 7 08:46:09 ubuntu kernel: [ 5385.273238] nasritest i = 6
Nov 7 08:46:09 ubuntu kernel: [ 5385.273239] nasritest i = 7
Nov 7 08:46:09 ubuntu kernel: [ 5385.273239] nasritest i = 8
Nov 7 08:46:09 ubuntu kernel: [ 5385.273240] nasritest i = 9
Nov 7 08:46:09 ubuntu kernel: [ 5385.273241] nasritest i = 10
Nov 7 08:46:09 ubuntu kernel: [ 5385.273242] nasritest i = 11
Nov 7 08:46:09 ubuntu kernel: [ 5385.273243] nasritest i = 12
Nov 7 08:46:09 ubuntu kernel: [ 5385.273244] nasritest i = 13
Nov 7 08:46:09 ubuntu kernel: [ 5385.273244] nasritest i = 14
Nov 7 08:46:09 ubuntu kernel: [ 5385.273245] nasritest i = 15
Nov 7 08:46:09 ubuntu kernel: [ 5385.273246] nasritest i = 16
Nov 7 08:46:09 ubuntu kernel: [ 5385.273247] nasritest i = 17
Nov 7 08:46:09 ubuntu kernel: [ 5385.273247] nasritest i = 18
Nov 7 08:46:09 ubuntu kernel: [ 5385.273248] nasritest i = 19
至此,书写驱动的第一个环节结束了。下面真正进入《奔跑吧 Linux内核》书中的例子