パステル実験室

アクセスカウンタ

zoom RSS Linuxドライバことはじめ(その2)

<<   作成日時 : 2012/11/26 13:37   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

さて、相変わらずWriting・・に従って、kmallocをして1バイトだけリード/ライトするものに。細かいミスもあったけども何とかmakeが通るようになった。最後まで問題だったのは
#include <linux/config.h>

が不要だということと、
struct file_operations memory_fops = {
read: memory_read,
write: memory_write,
open: memory_open,
release: memory_release
};

のmemory_writeが気に入らないとエラーになる。/usr/src/linux-headers-3.2.0-26-generic-pae/linux/fs.hで確認してみると、どうやら
ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);
の第二引数はcharではなく、const charだということ。更にこの影響で
tmp=(char *)buf+count-1;

という具合にcharへのポインタとしてキャストしてやる必要がある。(この部分は要するに与えられたデータの最後の1バイト分だけをバッファに格納しておくという処理)
例によってmakeができたらinsmodすればいいのだけど、このままでは単に鎮座しているだけで使えない。そこで、
mknod --mode=0666 /dev/memory c 60 0
という具合に、メジャー番号60、マイナー番号0のキャラクタデバイスを/dev/memoryとしてアクセスできるようにノード(デバイスファイル)をこしらえておく。この60というのはとりあえず空いてる番号なら何でもいい。ちなみに、これを削除したいときは
rm -f /dev/memory
てな具合にrmしてしまえばいいようだ。
/* Major number */
int memory_major = 60;
(中略)
/* Registering device */
result = register_chrdev(memory_major, "memory", &memory_fops);

なんていう具合にregisterするときに指定している。これで/dev/memoryにアクセスすると、メジャー番号60のデバイス、即ち今作っているmemoryデバイスドライバがアクセスされるわけだ。
試しに
echo -n abc >/dev/memory
として
cat /dev/memory
とすると、"c"がエコーバックされる。(改行されないので、ちょっと見づらい)
さて、このドライバへのRead/Write要求がどんな具合になるのかと思ってprintkを入れてcountを見てみると、writeは、3,2,1という具合に3回呼び出されている。readの方はというと、count値32768で2回呼び出されている。書き込み時は与えられたものが全部送られるまで、読み出しのときは0が返るまで繰り返すというところか。

そんなことをしているうちにUbuntuがアップグレード3.2.0-33になってしまった。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Linuxドライバことはじめ(その2) パステル実験室/BIGLOBEウェブリブログ
文字サイズ:       閉じる