Wei Dongshan uboot_kernel_rootファイルシステム研究ノート5.1〜5.3-005_characterデバイスdriver_section 001〜003_characterデバイスドライバーの概念の紹介/文字デバイスドライバーLEDdriver_writeおよびコンパイル

ドライバーコンセプト紹介

ここに画像の説明を挿入
ここに画像の説明を挿入

  1. swi+XXXアセンブリ命令を実行して、カーネルの例外処理割り込みをトリガーします。
  2. システムコールインターフェイスは、割り込みソースに応じてさまざまな処理関数を呼び出します。例:open-> swi value1 / read-> swi value2 / write-> swivalue3。渡されたさまざまな値(value1 / value2 / value3)に従って、sys_read / sys_open / sys_writeを呼び出します。
  3. これらの関数sys_read / sys_open / sys_writeは、仮想ファイルシステム(VFS)に属しています。

カーネルサブシステムとして、VFSはユーザースペースプログラムにファイルシステム関連のインターフェイスを提供します。実際のすべてのファイルシステムは、VFSに依存して共存し、VFSシステム上で動作します。
1. VFSは、共通のファイルシステムインターフェイスを提供します。ユーザースペースプログラムは、open()\ read()\ write()などの標準のUNIXファイルシステム呼び出しを使用して、さまざまな物理メディア上のさまざまなファイルシステムで動作できます。
2. VFSは、ファイルシステム抽象化レイヤーを提供します。VFSは、実際のファイルシステムのすべての一般的な機能と動作を含む一般的なファイルシステムモデルを提供します。VFS抽象化レイヤーは、すべての実際のファイルシステムでサポートされる基本的および概念的なインターフェイスとデータ構造を定義するため、VFSはさまざまな実際のファイルシステムに接続できます。

  1. 同じopen関数の場合、次の2つの動作は明らかに異なります。異なる動作を実装するのは誰ですか。VFSは、開いているさまざまなファイルに応じて対応するさまざまなドライバーを検索し、さまざまなドライバーでopen / read / write関数を呼び出します。
    ここに画像の説明を挿入
    デバイスプロパティを開いてc(文字デバイス)、メジャーデバイス番号を見つけますmajor

2文字デバイスのLEDドライバーdriver_writecompile

  1. メジャーデバイス番号に関しては、メジャー
    デバイスファイルは通常/ devディレクトリにあります。ubuntu仮想マシンにロードされているデバイスを確認してください。
    ここに画像の説明を挿入
    ここに画像の説明を挿入

c:文字デバイス;
-:通常のファイル
d:ディレクトリ
10:メジャーデバイス番号、メジャー
175:マイナーデバイス番号、マイナー

  1. メインデバイス番号とregister_chrdev関数の役割について:
    アプリケーションプログラムは、メインデバイス番号に対応する特定のドライバーを見つけますfile_operationsインデックスにregister_chrdev対応するリンクリストでカーネルドライバーに対してtime関数を実行しmajor最後の場所を見つける場合、構造体file_operationsドライバーは内部にフィリングをマウントする必要があります。
major = register_chrdev(0, "hello", &hello_drv); /* /dev/hello,其中0表示主设备号,hello表示驱动程序名字,hello_drv为file_operations结构体*/

ここに画像の説明を挿入

  1. 要約プロセス:ドライバーとアプリケーション間の接続
    (1)ドライバー側
    ここに画像の説明を挿入
    (2)アプリケーション側から
    ここに画像の説明を挿入

  2. Makefile分析

(1)makefileのソースコードは次のとおりです。

KERN_DIR = /work/system/linux-2.6.22.6

all:
	make -C $(KERN_DIR) M=`pwd` modules 			//-C表示进入某个目录

clean:
	make -C $(KERN_DIR) M=`pwd` modules clean
	rm -rf modules.order

obj-m	+= myleds.o

(2)Makefile分析

obj-m += module_test.o  

これは、module_test.oをモジュールにコンパイルすることを意味します。

make -C $(KERN_DIR) M=`pwd` modules  

-C $(KERN_DIR):パラメータはカーネルソースツリーディレクトリを指定します。makeコマンドを実行すると、現在のディレクトリでmakeを実行する代わりに、このディレクトリにジャンプして実行します。これが、でモジュールを実行する場合の理由です。 ubuntuと開発ボード、KERN_DIRの理由が異なります。

M = pwd: "` "ここには引用符だけでなく、makeコマンドが実行された後の戻りディレクトリ、つまり現在のディレクトリを指定するために使用される単一の逆引用符があります。

Modulesはターゲットであるため、このステートメントは次のように接続されます。makeモジュールを実行するには、指定されたディレクトリにジャンプし、実行後、現在のディレクトリに戻り、コンパイルされたモジュールを現在のディレクトリにコピーします。カーネルソースツリーの下のMakefileのターゲットになります。このターゲットはカーネルモジュールのコンパイルルールを定義するため、モジュールをランダムに変更してはなりません。したがって、ここでのMakefileは単なるエントリポイントであり、実際のモジュールのコンパイル作業です。はカーネルソースツリーの下のMakefileで行われるため、このMakefileのエントリアドレス(つまり、カーネルソースツリーへのパス)をmakemanagerに指定する必要があります。

.PHONY:clean

クリーンターゲットが疑似ターゲットであることを宣言する最後の文は、定義されたターゲットが異なることを除いて同じです。

概要:モジュールのmakefileは非常に単純で、モジュール自体をコンパイルしません。代わりに、make -Cを介してカーネルソースツリーに入り、カーネルソースコードシステムを借用して、モジュールのコンパイルとリンクを完了します。このMakefile自体は非常にモジュール化されています。パート3と4は移動されることはなく、移動する必要があるのは1と2だけです。1はカーネルソースツリーのディレクトリです。独自のコンパイル環境に応じてパスを変更する必要があります。

3文字デバイスのLEDドライバーdriver_testの改善

  1. エラーを記録する
    (1)ubuntuでコンパイルした実行可能プログラムをarm開発ボードで実行し、以下のエラーを報告します。
    ここに画像の説明を挿入
    (2)インターネットで検索したところ、コンパイル命令エラー
    原因であることがわかりました。単純なmakefileを作成したとき、コンパイルコマンドを作成したとき、次のように作成されました。
$(CC) -o $(OUT_FILE) -c $(SRC_FILE)

実際、-cオプションは削除して、実行可能ファイルに直接コンパイルする必要があります。

$(CC) -o $(OUT_FILE) $(SRC_FILE)

gccの-cオプションは、次のことを意味します。

-cは、前処理、コンパイル、およびアセンブリのみをアクティブにします。つまり、プログラムをobjファイルにするだけです。使用例:gcc -chello.c。彼は.oobjファイルを生成します

つまり、-cを追加しない場合、実行可能ファイルはデフォルトで直接コンパイルされます。-cを追加する
と、ターゲットobjファイルにのみコンパイルされ、実行可能ファイルへのコンパイルは続行されません。
詳細については、ブログ投稿を参照してください。

https://www.cnblogs.com/cainiaoaixuexi/p/3890453.html

  1. register_chrdev関数の説明
    ドライバregister_chrdevで関数を実行した/ proc / devicesファイル(実行命令cat /proc/devices)を確認してください。

/ proc / devicesファイル:このファイルには、Linuxがロードした文字デバイスとブロックデバイスの主要なデバイス番号、およびこれらのデバイス番号に割り当てられたデバイス名が一覧表示されます。
lsmod(list modules)コマンド:システムにロードされているすべてのモジュールを一覧表示します。
/ devディレクトリ:このディレクトリには、Linuxシステムで使用されるすべての外部デバイスが含まれています。

  1. デバイスノードを自動的に作成する
    (1)最も単純なドライバーフレームワーク
    ここに画像の説明を挿入

メジャーデバイス番号ごとにデバイスノードコマンド構文を手動で作成します。

 mknod /dev/??? 设备类型 主设备号 次设备号
 eg:mknod /dev/xxx c 252 0

このデバイスをアプリ側で操作する場合の構文に対応します。

fd = open("/dev/xxx", O_RDWR);

ドライバをロードするときにデバイスノードを手動で作成するのは面倒ですが、デバイスノードを自動的に作成するにはどうすればよいですか?
(2)デバイスノードの自動作成
アプリケーションには「udev」メカニズムがあります。これはbusyboxのmdevです。カーネル情報を読み取って、/ dev / xxxファイルであるデバイスノードを作成します(使用法については、busybox-1.7.0 / doc / mdev.txtファイルを参照してください)。
a。システム情報は何ですか?
ドライバは、/ sys / moduleディレクトリに対応する情報を生成し、それをmdevに提供する必要があります。

/ sysディレクトリ分析:Sysfsファイルシステムは、procファイルシステムに似た特別なファイルシステムであり、システム内のデバイスを階層構造に編成し、ユーザーモードプログラムに詳細なカーネルデータ構造情報を提供するために使用されます。実際、ユーザーモードでは、sysファイルシステムにアクセスすることで、カーネルモードで一部のドライバーまたはデバイスを表示できます。
ここに画像の説明を挿入

/ sys / devicesディレクトリの分析:このディレクトリの下には、さまざまなバスに登録されている検出されたすべての物理デバイスを含む、グローバルデバイス構造システムがあります。一般的に、すべての物理デバイスは、バス上のトポロジに従って表示されます。/ sys / devicesは、カーネルによるシステム内のすべてのデバイスの階層式モデルであり、/ sysファイルシステムがデバイスを管理するための最も重要なディレクトリ構造でもあります。どうして?他のディレクトリは基本的に分類および編成されたリンクファイルであるため、実際にはディレクトリの内容を指します。
ここに画像の説明を挿入

/ sys / moduleディレクトリの分析:このディレクトリには、システム内のすべてのモジュール情報が含まれています。これらのモジュールがインライン化されたカーネルイメージファイルにコンパイルされているか、外部モジュール(.koファイル)にコンパイルされているかに関係なく、/に表示される場合があります。 sys / module。つまり、モジュールディレクトリには、カーネルにロードされたすべてのモジュールが含まれます。
ここに画像の説明を挿入

/ sys / classディレクトリの分析:このディレクトリには、カーネルに登録されているすべてのデバイスタイプが含まれています。これは、デバイス機能に従って分類されたデバイスモデルです。各デバイスタイプは、1つの機能を持つデバイスを表します。各デバイスタイプサブディレクトリには、このタイプのさまざまな特定のデバイスへのシンボリックリンクが含まれており、これらのリンクは/ sys / devices / nameの下の特定のデバイスを指します。デバイスタイプとデバイスの間には1対1の対応はありません。物理デバイスには複数のデバイスタイプがある場合があります。デバイスタイプは、1つの機能を持つデバイスのみを表します。たとえば、システム内のすべての入力デバイスは/ sys /に表示されます。クラス/入力システムに接続されているバスに関係なく。(/ sys / classもLinux統合デバイスモデルの一部です)
ここに画像の説明を挿入

ここに画像の説明を挿入

提供する方法は?

firstdrv_class = class_create(THIS_MODULE, "firstdrv");//在sys目录下创建firstdrv设备类目录:/sys/module/firstdrv

ここに画像の説明を挿入
ここに画像の説明を挿入

上記の情報に基づいてデバイスノードを作成するにはどうすればよいですか?それはmknod命令を置き換えることです。

firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); //在dev目录下创建xyz目录:/dev/xyz
//firstdrv_class:创建设备所属的类
//NULL:该设备的父设备,如果没有就指定为NULL
//MKDEV(major, 0):主设备号
//NULL:从设备号
//"xyz":设备名称

下の図:メジャーデバイス番号:252 /マイナーデバイス番号:0 / c:文字デバイス
ここに画像の説明を挿入

ここに画像の説明を挿入

  1. ドライバが自動的にロードされるときに、mdevが/ sysディレクトリ内の情報を自動的に認識するのはなぜですか?
    ルートファイルシステムが作成されると、スクリプトファイル/etc/init.d/rcSが次の図に示されるためです。デバイスがロードまたはアンロードされると、...理解できません
    ここに画像の説明を挿入

  2. デバイスノードに対応するアプリプログラムを自動的にロードします

ドライバーについては前述しました。次のコードで/ dev / xyzディレクトリを作成すると、アプリケーションはfd = open("/dev/xyz", O_RDWR);主要なデバイス番号を無視せずに直接使用して、ドライバーを呼び出すことができます

firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); //在dev目录下创建xyz目录:/dev/xyz

おすすめ

転載: blog.csdn.net/xiaoaojianghu09/article/details/104228404