5

現在、私はLinuxのデバイスドライバを学習しています。そして、デバイスファイルを開く方法を教えてください。通常のファイルとデバイスドライバのopenはどのように動作しますか

が今まで... は、上記のプログラムでは

#incldue<stdio.h> 
int main() { 
    FILE fp; 
    char buffer[20]; 
    fp = fopen(/home/yoggi/foo.txt, "r"); 
    fread(buffer, 5, 1, fp); 
} 

..通常のファイルを開き、単純なコードのfopen()、Cライブラリ関数を考えてみましょう。私が得たもの、ラッパー関数でありますシステムコールopen()、インターンはVFSレイヤーのsys_open()またはfile_open()を呼び出します。 Linuxがファイルシステムの数をサポートするように、仮想ファイルシステムは、実際のファイルシステムハンドラにそのファイルを開くために制御を転送します。

1) How does virtual file system(VFS) get to know on which file system the 
    underline file resides? 
2) How does it then calls the file_open or open function of that particular 
    filesystem to open file. 

同様のことが起こります。シンプルなデバイスドライバを考えてみましょう。

#include <linux/module.h> 
// othher includes... 
static dev_t first; // Global variable for the first device number 
static struct cdev c_dev; // Global variable for the character device structure 
static struct class *cl; // Global variable for the device class 
static int my_open(struct inode *i, struct file *f) 
{ 
    printk(KERN_INFO "Driver: open()\n"); 
    return 0; 
} 
static ssize_t my_read(struct file *f, char __user *buf, size_t len, loff_t *off) 
{ 
    printk(KERN_INFO "Driver: read()\n"); 
    return 0; 
} 
struct file_operations pugs_fops = 
{ 
.owner = THIS_MODULE, 
.open = my_open, 
.read = my_read, 
}; 

static int __init ofcd_init(void) /* Constructor */ 
{ 
    printk(KERN_INFO "Namaskar: ofcd registered"); 
    if (alloc_chrdev_region(&first, 0, 1, "Shweta") < 0) 
    { 
    return -1; 
    } 
    if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL) 
    { 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
if (device_create(cl, NULL, first, NULL, "mynull") == NULL) 
{ 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    cdev_init(&c_dev, &pugs_fops); 
if (cdev_add(&c_dev, first, 1) == -1) 
{ 
    device_destroy(cl, first); 
    class_destroy(cl); 
    unregister_chrdev_region(first, 1); 
    return -1; 
} 
    return 0; 
} 

static void __exit ofcd_exit(void) /* Destructor */ 
{ 
cdev_del(&c_dev); 
device_destroy(cl, first); 
class_destroy(cl); 
unregister_chrdev_region(first, 1); 
printk(KERN_INFO "Alvida: ofcd unregistered"); 
} 
module_init(ofcd_init); 
module_exit(ofcd_exit); 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>"); 
MODULE_DESCRIPTION("Our First Character Driver"); 

まず、デバイスのメジャーマイナー番号を割り当てます。デバイスファイルの範囲に登録し、デバイスファイル操作をデバイスドライバ機能にリンクする。

私は取得していない用語の一部..です

1) What does actually cdev_add() do? in terms of registering a device to the 
    kernel. 
2) Registering a device to the kernel means? 
3) How does a open(/dev/mynull, O_RONLY); called on a device file actually calls 
    the open function of driver which is mapped while initializing the device 
    by calling routine cdev_init(&c_dev, &pugs_fops); ? 

答えて

7

1)どのように仮想ファイルシステム(VFS)は 下線のファイルが存在するファイルシステムに知ってもらうのでしょうか?

は、あなたがそのフルパス名(または現在作業ディレクトリ)で開くしようとしているファイルを指定する必要があります。
このディレクトリパスを後方に走査することにより、マウントポイントへの最初の一致(最も深いパス)は、マウントされたファイルシステム、ファイルシステムのタイプ、およびデバイスを提供します。

各ファイルシステムは、マウント時にこの情報を提供し、マウントテーブルに保存されます。
mountコマンドを使用して、この(現在の状態)情報を表示できます。

2)ファイルシステムを開くには、その特定のファイルシステム のfile_openまたはopen関数をどのように呼び出しますか?ファイルシステムが知られたら

は、そのためのops構造が取得され、FS、及びopen()エントリポイントを呼び出すことができます。

1)実際にcdev_add()は何をしますか?デバイスを カーネルに登録するという点では、

ドライバ登録(チャーデバイスの例えばcdev_init())ドライバが実行できる機能のエントリポイントを一覧表示し、運転者のops構造をインストールします。
cdev_add()は、ドライバがそのcharデバイスタイプの特定のインスタンスを制御できることをカーネルに通知します。そのデバイスインスタンスには、/devのデバイス名をドライバの状態情報に関連付けるマイナー番号が割り当てられます。
char以外のデバイスタイプ(ネットワークデバイスやプラットフォーム(バス)デバイスなど)は、異なるサブシステムに属し、異なる登録手順を使用することに注意してください。

2)デバイスをカーネルに登録することは意味しますか?

このデバイスへのアクセスが有効になりました。

3)オープン(/ dev/mynull、O_RONLY);デバイスファイルで呼び出された場合、実際には デバイスの初期化中にマップされるドライバのオープン機能が呼び出されます。ルーチンcdev_init(& c_dev、& pugs_fops)を呼び出して を呼び出します。 ?

ドライバのinit()ルーチンは、ドライバがロードされたときに一度呼び出される必要があります。このルーチンは、デバイスのすべてのインスタンスの存在と動作状態を調べる必要があります。割り込みライン、DMAチャネル、I/Oポート、メモリ空間などのリソースを取得する必要があります。ドライバは、ops構造体をカーネルに登録します。ドライバは、デバイスの各インスタンスをカーネルに登録します。

open()コールのユーザスペースは、Cライブラリによって処理されます。 /devのデバイス名は、デバイスのメジャー番号(デバイスのサブシステムまたはクラスを識別します(例:ttyまたはオーディオ)をマイナー番号(どのデバイスドライバを使用するか、どのインスタンスデバイスにアクセスする)。プロセッサはスーパバイザモードに切り替えられ、カーネルドライバのopen()ルーチンが呼び出され、ドライバのops構造体から取得されます。 ops構造のもう少し詳しくは、other answerを参照してください。

関連する問題