現在のカーネルにドライバーを追加する

カーネルのコンパイルに関する前の記事に進みます

カーネルをコンパイルした後、独自のドライバーをカーネルに追加する必要があります。追加するとどうなりますか?

独自のドライバファイルを追加するディレクトリを選択してください

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があることがわかります。その方法に従って、独自のドライバ構成を追加します。

今持っている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/

追加した後、さらに2つの関数があります。

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のメニューにある文字列です。

 

.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を保存し、コンパイルして見てください

注文の実行

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$ 

エラーが報告され、アクセス許可が拒否されました。カーネルのコンパイル時に使用されたsudoコマンドもここで使用されたことを思い出しました。

nasri@ubuntu:~/Work/linux-source-3.13.0$ sudo make 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モジュールを使用する必要があります

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ドライバーがカーネルに登録されました。

koが実行されているかどうかを知るには、カーネルログを確認する必要があります。

カーネルログを表示する

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」taintsカーネルが表示される場合は、MODULE_LICENSE( "GPL");を追加してください。このエラーは表示されません。

OK、この文を追加した後、コンパイルして参照してください

モジュールも作りますか?

このモジュールをコンパイルするだけです

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

ええと、最初にこのドライバーを削除してから追加する必要があります

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がないことを確認してください:モジュールライセンス「unspecified」はカーネルを汚染します。

これで、ドライバーをそれに注入する方法がわかりました。

 

さらに、モジュールのコンパイルに関しては、より良い方法、またはより簡単な選択方法があります。

たとえば、ドライバーを作成する場合は、カーネルソースファイルディレクトリにない可能性のある通常のディレクトリを作成します。

nasri@ubuntu:~$ mkdir Work2
nasri@ubuntu:~$ cd Work2/

Makefile、nasritest.c、およびKconfigに加えて、生成された他のfiles.o.koがあるため、Work2ディレクトリを作成し、前のnasritestディレクトリをコピーします。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モジュールとして直接記述します

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'.

'モジュール'に対しては何もしません

最初は、モジュールは以前にコンパイルされたことがあると思っていましたが、変更せずに再度コンパイルすると発生します。

次に、コードを変更して再度コンパイルしたところ、まだエラーが発生していることがわかりました。

最後にオンラインで記事を読んでください:

http://blog.chinaunix.net/uid-30184083-id-5028504.html

Makefileで警告の色が赤で表示されました

od -cMakefileで表示

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でsetexpandtabをコメントアウトし、Makefileで作成する前にタブを変更します

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

セット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