2016-02-08 11 views
5

私はLinux用のPCIeドライバ(現在はDMAなし)を作成しており、ユーザー空間からPCIeデバイスを有効にすると、PCIeデバイスを読み書きする方法を知る必要があります。PCIeドライバ - ユーザ空間はどのようにそれにアクセスしますか?

pci_enable_device(); 
pci_request_regions(); 
pci_iomap(); 

しかし、その後、私は読み書きするユーザ空間から、このメモリへのアクセス方法:私はプローブ()で基本を行うドライバで

?私のPCIeドライバにファイル操作を追加しますか? pci_iomapのメモリは、ユーザスペースコードが呼び出せる場所を示していますか?

もしそうなら、その場所は何ですか?

注: PCIeデバイスは、あなたがregister_chrdevdevice_createのような機能を使用してデバイスを登録することができます

+0

これが推奨される方法であるかどうかはわかりませんが、他のカーネルドライバは '/ dev/vboxnetctl'のような仮想デバイスを公開しています。私は、Linuxカーネルがどんなユーザスペースプログラムでも、PCIeデバイスを読み書きすることを許してくれるとは確信していません。 –

+0

私もそれを見ていました。私のデバイスがそこに現れるようにするために必要なことはありますか?たとえば、ドライバではどのようなAPI呼び出しを行いますか? – user2205930

+0

おそらくVirtualBoxドライバのソースコードを見てみましょう。 –

答えて

0

などオーディオ、イーサネット、などの任意のLinuxのサブシステムに差し込むことはありません。あなただけのユーザ空間にカーネル空間からメモリをエクスポートして、割り込みを取得し、UIO driver考えるようにしたい場合は

static int __init chr_dev_init(void) 
{ 
    int minor; 

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) 
     printk("unable to get major %d for memory devs\n", MEM_MAJOR); 

    mem_class = class_create(THIS_MODULE, "mem"); 
    if (IS_ERR(mem_class)) 
     return PTR_ERR(mem_class); 

    mem_class->devnode = mem_devnode; 
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) { 
     if (!devlist[minor].name) 
      continue; 

     /* 
     * Create /dev/port? 
     */ 
     if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) 
      continue; 

     device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), 
        NULL, devlist[minor].name); 
    } 

    return tty_init(); 
} 

fs_initcall(chr_dev_init); 
+0

はい、私は最終的にPCIeデバイス用のキャラクタデバイスドライバを作成しました。私は他の人にLinuxデバイスドライバの第3章を読んで、もっと学ぶことを勧めます。それは時代遅れですが、あなたはあなたのためにいくつかの基本を選ぶことができます。 – user2205930

2

kernel source for /dev/null and /dev/memを考えてみましょう。

すべてのアクセスは/ dev/uioXファイルで行われます。メモリをエクスポートするにはmmap()を実行し、割り込みを "キャッチ"するために(ブロック読み出しで)読み込みます。

UIOはPCIeに完全に適しており、そのためにカーネルにはalready is a driverがあります。

関連する問題