往当前内核添加驱动程序

接上前面编译内核的文章

内核编译好了之后,自己要往内核中添加自己的驱动程序,如果加呢?

选择一个目录加入自己的驱动文件

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 <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
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.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters are hotkeys.  Pressing    │  
  │  <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help, </> for Search.  Legend: [*] built-in  │  
  │  [ ] excluded  <M> module  < > module capable                                                                                          │  
  │                                                                                                                                        │  
  │ ┌───────────────────────────────^(-)─────────────────────────────────────────────────────────────────────────────────────────────────┐ │  
  │ │                               <M>   HDLC line discipline support                                                                   │ │  
  │ │                               <M>   GSM MUX line discipline support (EXPERIMENTAL)                                                 │ │  
  │ │                               <M>   Trace data router for MIPI P1149.7 cJTAG standard                                              │ │  
  │ │                               <M>   Trace data sink for MIPI P1149.7 cJTAG standard                                                │ │  
  │ │                               [ ] /dev/kmem virtual device support                                                                 │ │  
  │ │                                   Serial drivers  --->                                                                             │ │  
  │ │                               [*] TTY driver to output user messages via printk                                                    │ │  
  │ │                               <M> Parallel printer support                                                                         │ │  
  │ │                               [ ]   Support for console on line printer                                                            │ │  
  │ │                               <M> Support for user-space parallel port device drivers                                              │ │  
  │ │                               [*] Xen Hypervisor Console support                                                                   │ │  
  │ │                               [*]   Xen Hypervisor Multiple Consoles support                                                       │ │  
  │ │                               <*> Virtio console                                                                                   │ │  
  │ │                               <M> IPMI top-level message handler  --->                                                             │ │  
  │ │                               <*> Hardware Random Number Generator Core support                                                    │ │  
  │ │                               <M>   Timer IOMEM HW Random Number Generator support                                                 │ │  
  │ │                               <M>   Intel HW Random Number Generator support                                                       │ │  
  │ │                               <M>   AMD HW Random Number Generator support                                                         │ │  
  │ │                               < >   Atmel Random Number Generator support                                                          │ │  
  │ │                               <M>   VIA HW Random Number Generator support                                                         │ │  
  │ │                               <M>   VirtIO Random Number Generator support                                                         │ │  
  │ │                               < > EXYNOS HW random number generator support                                                        │ │  
  │ │                               <M> TPM HW Random Number Generator support                                                           │ │  
  │ │                                   NASRI TEST Driver   --->                                                                         │ │  
  │ │                               {M} /dev/nvram support                                                                               │ │  
  │ │                               <M> Siemens R3964 line discipline                                                                    │ │  
  │ │                               <M> Applicom intelligent fieldbus card support                                                       │ │  
  │ └───────────────────────────────┴(+)─────────────────────────────────────────────────────────────────────────────────────────────────┘ │  
  ├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤  
  │                                        <Select>    < Exit >    < Help >    < Save >    < Load >                                        │  
  └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘  
    

看到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.  <Enter> selects submenus ---> (or empty submenus ----).  Highlighted letters are hotkeys.  Pressing    │  
  │  <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help, </> for Search.  Legend: [*] built-in  │  
  │  [ ] excluded  <M> module  < > module capable                                                                                          │  
  │                                                                                                                                        │  
  │ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │  
  │ │                                   *** NASRI TEST Driver Config ***                                                                 │ │  
  │ │                               <M> 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]: <info>   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]: <info> (eth0): DHCPv4 state changed renew -> renew
Nov  6 07:36:33 ubuntu NetworkManager[750]: <info>   address 192.168.230.132
Nov  6 07:36:33 ubuntu NetworkManager[750]: <info>   prefix 24 (255.255.255.0)
Nov  6 07:36:33 ubuntu NetworkManager[750]: <info>   gateway 192.168.230.2
Nov  6 07:36:33 ubuntu NetworkManager[750]: <info>   nameserver '192.168.230.2'
Nov  6 07:36:34 ubuntu NetworkManager[750]: <info>   domain name 'localdomain'
Nov  6 07:36:34 ubuntu NetworkManager[750]: <info>   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内核》书中的例子

猜你喜欢

转载自blog.csdn.net/yangkunhenry/article/details/102945019
今日推荐