newbieからバイナリアンへ

newbieからバイナリアンへ

人参の秘めたる甘さに気づいた大学生日記

【LKM 1.1】引数を取れるモジュール

 

 

 

0: 参考

www.oreilly.co.jp

www.oreilly.com

 




1: イントロ

今回はモジュールの基礎に慣れるために

前回のハローモジュールが引数を取れるようにする




2: 引数を取れるモジュール

insmodでは引数をとることができる

引数をモジュール内で利用するには /linux/moduleparam.h をインクルードする必要がある

作ったモジュールは以下の通り

 

#include<linux/module.h>
#include<linux/init.h>
#include<linux/moduleparam.h>

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("smallkirby");
MODULE_DESCRIPTION("this is hello module which takes parameters");

static char *name = "kirby";
static int num = 4;
module_param(num,int,S_IRUGO);
module_param(name,charp,S_IRUGO);

static __init int hello_init(void)
{
  int ix = 0;
  for(ix=0;ix != num; ++ix){
    printk(KERN_ALERT "Hello, %s",name);
  }
  
  return 0;
}

static __exit void hello_exit(void)
{
  printk(KERN_ALERT "Goodbye, %s.",name);
}

module_init(hello_init);
module_exit(hello_exit); 

 引数を受取り設定するのは module_param()関数

#1には格納先の変数を

#2には型を入れる

この際使用できる型も限られており

文字列へのポインタにはchar*ではなく charp 型を用いる

#3にはパーミッションフラグを入れる

これはlinux/stat.hで定義されている

#in linux/stat.h
#define S_IRWXUGO▸(S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO▸(S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO▸▸-(S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO▸▸-(S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO▸▸-(S_IXUSR|S_IXGRP|S_IXOTH)

 

S_IRUGOsys/moduleに作成される仮想ファイルを読み出し専用にする

基本的には書き込み不可能にするべきらしい

 

あとは前回までとほとんど変わらない内容である

強いて言えばfor文で次のエラーが出た

/home/vagrant/shared_data/work/hello_module_param.c:16:3: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
   for(int ix=0;ix != num; ++ix){

この記法は新しめのCじゃないと使えないんだった





 

3: モジュールのインストール

makeしたモジュールをインストールしてみる

引数は以下のように指定する

$ insmod hello_module_param.ko name="KIRBY" num=10

 

そうしてメッセージを見てみると

$ dmesg | tail -n 10
[ 2483.091787] Hello, KIRBY
[ 2483.091810] Hello, KIRBY
[ 2483.091822] Hello, KIRBY
[ 2483.091832] Hello, KIRBY
[ 2483.091843] Hello, KIRBY
[ 2483.091854] Hello, KIRBY
[ 2483.091865] Hello, KIRBY
[ 2483.091875] Hello, KIRBY
[ 2483.091886] Hello, KIRBY
[ 2483.091897] Hello, KIRBY

 

ちゃんと10回表示されているし名前も変更されている





4: アウトロ

そういえばクリーンアップ関数についてだが

そこで設定したメッセージはどうやら

そのモジュールを取り除いて初めて他のモジュールをインストールしたときに

表示されているような気がする





続く・・・・・