読者です 読者をやめる 読者になる 読者になる

ioctlサンプルコードの修正【デバイスドライバ】

Linuxデバイスドライバプログラミングを参考に実装をしたところ
Kernelのバージョンアップによるエラーが発生したので記録しておく。
本書のサンプルコードはカーネルバージョン2.6で書かれている。
私の環境は3.13のため、修正が必要となった。

Linuxデバイスドライバプログラミング


P.154-160の"IOCTLサンプルコード"を打ち込み、
makeを実行したところ下記3つのエラーが発生した。

IOCTL/sample/devone.c:116:3: error: implicit declaration of function ‘kfree’ [-Werror=implicit-function-declaration]
   kfree(dev);
   ^

IOCTL/sample/devone.c:145:2: error: unknown field ‘ioctl’ specified in initializer
  .ioctl = devone_ioctl,
  ^

IOCTL/sample/devone.c:174:2: error: implicit declaration of function ‘class_device_create’ [-Werror=implicit-function-declaration]
  class_dev = class_device_create(

一つ目はこちらよりslab.hのインクルードが必要とのこと。

二つ目はfile_operations構造体の仕様変更でioctlが削除されたため、発生した。
こちらより32bitカーネルの場合はunlocked_ioctlを代用すれば良さそう。

三つめはclass_device_create/destroyが廃止されたため、発生した。
こちらよりdevice_create/destroyを代用すれば良さそう。

以上から、サンプルコードを下記のように変更することでビルドに成功し、書籍と同様の結果が得られた。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <asm/uaccess.h>
//Cherno add 
#include <linux/slab.h>

~中略~

	//---------------------------------------------------
	// Cherno 
	//int devone_init()
	//class_device_create --> device_create 
	//---------------------------------------------------
	class_dev = device_create(
                      devone_class,NULL,devone_dev,NULL,"devone%d",devone_minor);
	printk(KERN_ALERT "%s driver(major %d) installed.\n",
                      DRIVER_NAME, devone_major);

~中略~

	//---------------------------------------------------
	// Cherno 
	//void devone_exit()
	//class_device_destroy --> device_destroy
	//---------------------------------------------------
	device_destroy(devone_class, devone_dev);
	class_destroy(devone_class);

~以下略~

サンプルコードファイル:SBクリエイティブ:Linuxデバイスドライバプログラミング
なお、本サンプルはp147のルールファイルも必要。




考察:
仕様変更に関する情報は英語記事を含めて検索すればかなり収集できる。
そのため、今回は検索して情報収集して対処できた。
まずは、この情報収集が迅速にできるようになることが目標。
本来ならばカーネルのドキュメントなどを読んで解決できるべきである。

Linuxデバイスドライバプログラミング

Linuxデバイスドライバプログラミング