Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@takish

書いてみようカーネルモジュール。仮想環境を作ってカーネルモジュールでHello Worldまで。

More than 3 years have passed since last update.

仮想環境の準備

Vagrant上にLinuxを用意する

% vagrant box add debian-8-jessie https://github.com/holms/vagrant-jessie-box/releases/download/Jessie-v0.1/Debian-jessie-amd64-netboot.box
% vagrant box list
% vagrant init debian-8-jessie

% vagrant up
% vagrant ssh

必要ファイルの準備

カーネルパッケージのインストール

# apt-get install kernel-package

カーネルモジュールでhello world

まず、insmod/rmmodでロード/アンロードするだけの簡単なモジュールを作成する。

% mkdir helloworld
% cd helloworld

モジュールのコード

helloworld.c
#include <linux/module.h> // カーネルモジュールを作成するときは必ずlinux/module.hをinclude
#include <linux/kernel.h>

// モジュール初期化(insmod時に呼ばれる)
static int __init helloworld_module_init( void )
{
    printk( KERN_INFO "Hello World!\n" ); // カーネルランド版のprintf
    return 0;
}

//  モジュール解放(rmmod時に呼ばれる)
static void __exit helloworld_module_exit( void )
{
    printk( KERN_INFO "Goodby World!\n" );
}

module_init( helloworld_module_init );
module_exit( helloworld_module_exit );

MODULE_DESCRIPTION( "helloworld" ); // modinfoで見れる
MODULE_LICENSE( "GPL2" );
MODULE_AUTHOR("takish");

コンパイルのための準備

バージョン名を確認

% uname -rn
% jessie 3.16.0-4-amd64

コンパイル時に/lib/modules/build以下にheadersが必要なのでインストールする

% sudo apt-get install linux-headers-3.16.0-4-amd64

インストール先を確認

# dpkg -L linux-headers-3.16.0-4-amd64

/lib/modules以下にヘッダ群が入っていることを確認できます。

続いて、コンパイルするためにMakefileを用意

Makefile
KERNEL_DIR = /lib/modules/$(shell uname -r)/build 
BUILD_DIR := $(shell pwd)
VERBOSE := 0 

obj-m := helloworld.o 

all: 
    make -C $(KERNEL_DIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules 
clean: 
    rm -rf *.o *.ko *.mod.c *.symvers *.order .tmp_versions .helloworld.*

modinfoにてモジュールの情報を確認

vagrant@jessie:~/helloworld$ /sbin/modinfo helloworld.ko
filename:       /home/vagrant/helloworld/helloworld.ko
author:         takish
license:        GPL2
description:    helloworld
depends:
vermagic:       3.16.0-4-amd64 SMP mod_unload modversions

insmod/rmmodにてモジュールのロード、アンロードを確認する

$ sudo /sbin/insmod helloworld.ko
$ lsmod
$ sudo /sbin/rmmod helloworld

dmesgにてprintkでの出力がされていることも確認して見てください。

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?