Linux用のデバイスドライバーを書いています。4 つのマイナー番号を持つデバイスを作成します。マイナー番号 3 のデバイスに書き込もうとするときはいつでも、デバイスを強制終了することが想定されており、現在のところ、booga デバイスへの書き込みを印刷する以外に何もすることは想定されていません。これが私の現在のコードの一部です。必要に応じてさらにコードを投稿できます。
書き込み方法:
static ssize_t booga_write (struct file *filp, const char *buf, size_t count, loff_t *f_pose) {
printk("Attempting to write to booga device\n");
/* need to protect this with a semaphore if multiple processes
will invoke this driver to prevent a race condition */
if (down_interruptible (&booga_device_stats->sem))
return (-ERESTARTSYS);
booga_device_stats->num_bytes_written += count;
up(&booga_device_stats->sem);
return count; // pretend that count bytes were written
}
テスト方法:
static void run_write_test(char *device, int bufsize)
{
char *buf;
int src;
int out;
src = open(device, O_WRONLY);
if (src < 0) {
perror("Open for write failed:");
exit(1);
}
buf = (char *) malloc(sizeof(char)*(bufsize+1));
fprintf(stderr, "Attempting to write to booga device\n");
out = write(src, buf, bufsize);
fprintf(stderr, "Wrote %d bytes.\n", out);
free(buf);
close(src);
}
マイナー番号を取得する方法があるかどうか疑問に思っています。linux/fs.h を調べたところ、ファイル構造体に private_data というメンバーがあることがわかりましたが、これを呼び出そうとすると、現在 null に設定されているため、システムがクラッシュします。
または、構造体ファイルからマイナー番号を取得しようとするのではなく、デバイスを最初に開いたときにそれを追跡する必要がありますか?