マイドライバ
#include <asm/uaccess.h>
#include <linux/uaccess.h>
上記コードの上側がraw_copy_to_userコールを呼び出し下のほうがcopy_to_userを呼び出せる。
今回は上の行をコメントアウトして使用した。
static struct file_operations fops = {
.read=dev_read,
.write=dev_write,
.open=dev_open,
.release=dev_release,
};
ここでwriteとreadを登録している。
皆さんの予想通り読み込み関数は自由に付けられdev_readになっている。
ではdev_readを見る。
static ssize_t dev_read(struct file* file, char* buf,size_t len, loff_t* off){
char greeting[6] = "hello";
int j;
for(j = 0; j < 7;j++){
copy_to_user(&buf[j], &greeting[j], 1);
}
copy_to_user(&buf,&ret,1);
return 7;
}
上記コードでcopy_to_userを呼び出しているのが読み込みの本体だ。
copy_to_userからメモリアドレス一文字ずつをbufにコピーしている。
bufって何? といえばここにコピーしておくと読み出しができるくらいに考えている。
見ればわかると思うがhelloをメモリに書き込んでいる。
読み出しのソースは以下だ。
#include <stdio.h>
int main(){
FILE *fp;
fp = fopen("/dev/myzero","r");
int *ch[8];
fread(ch,1,8,fp);
printf("%s\n",ch);
return 0;
}
/dev/myzeroが何なのかだが、これは任意に付けたデバイス名だ。
なぜcatコマンドで読み込まないかといえば現状無限ループになるからだ。
cat /dev/myzero
を実行した場合画面がhelloを埋められる、ここは現状改善の余地が大いにある。
デバイス名がmyzeroなのははじめはzeroを書き出す実装を考えていたからだ、正直に言えばMakefileでインストールするときにデバイス名を決めるのに変更を面倒臭がった結果なのでデバイス名については触れないでもらいたい。
以上、現状の解説だ。現在はFATを読んでいる、ファイルシステムとしては非常に原始的なものでコードが少ないのでありがたい。
では、お読みいただきありがとうございます!