無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

/dev/portと/dev/full


先の項目タイトルの流れで、ここでの2つの関連性まったくありましぇん。で、/dev/portは、カーネルコンパイルオプションCONFIG_DEVPORTで作成され、IOを参照するデバイスです。
#ifdef CONFIG_DEVPORT
static const struct file_operations port_fops = {
       .llseek         = memory_lseek,
       .read           = read_port,
       .write          = write_port,
       .open           = open_port,
};
#endif
read_port()で読み込み処理。access_ok()で指定されたバッファエンドがユーザ空間かまずチェック。OKなら、count分inp()でIOを読み込んで、__put_user()で、順次引数のユーザバッファーに設定するだけです。なお、読み込みサイズの最大をi < 65536としているのは、IOアドレスが16ビットという事でしょう。(たぶん)

write_port()は同じ処理で、inp()がoutp()に変わっただけって感しです。
static ssize_t read_port(struct file *file, char __user *buf,
                        size_t count, loff_t *ppos)
{ 
       unsigned long i = *ppos;
       char __user *tmp = buf;

       if (!access_ok(VERIFY_WRITE, buf, count))
               return -EFAULT;
       while (count-- > 0 && i < 65536) {
               if (__put_user(inb(i), tmp) < 0)
                       return -EFAULT;
               i++;
               tmp++;
       }
       *ppos = i;
       return tmp-buf;
}

/dev/fullは以下のとうりです。説明によると、DISKフルの検証を行うためらしいです。読み込みについては、常識的に/dev/zeroと言うことです。
static const struct file_operations full_fops = {
       .llseek         = full_lseek,
       .read           = read_full,
       .write          = write_full,
};

#define read_full       read_zero

static ssize_t write_full(struct file *file, const char __user *buf,
                         size_t count, loff_t *ppos)
{
       return -ENOSPC;
}


最終更新 2012/07/05 19:07:53 - north
(2012/07/05 19:07:53 作成)