Linux mtdとは何ですか
Linux では、mtd は「メモリ テクノロジ デバイス」を指し、ストレージ デバイス内のサブシステムです。 MTD システムは、NOR フラッシュおよび NAND フラッシュ デバイスに統合インターフェイスを提供するために Linux に導入されました。 MTD デバイスは通常、デバイス ノード、MTD デバイス層、MTD オリジナル デバイス層、ハードウェア ドライバー層の 4 つの層に分割できます。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
Linux MTD とは何ですか?
MTD は「Memory Technology Device」の略で、「メモリ テクノロジー デバイス」を意味し、Linux ストレージ デバイスのサブシステムです。
Linux カーネルでは、NOR フラッシュおよび NAND フラッシュ デバイスに統合インターフェイスを提供するために MTD レイヤーが導入されました。 MTD は、ファイル システムを基盤となるフラッシュ メモリから分離します。
この MTD システムを設計する目的は、メモリ タイプのデバイスに抽象化レイヤーとインターフェイスを提供することで、ハードウェア ドライバーの設計者が最も単純な基盤となるハードウェア デバイスを提供するだけで済むようにすることです。 /erase 関数で十分ですが、MTD ストレージ デバイス サブシステムが自動的にデータを表示するため、上位レベルのユーザーに対してデータがどのように表示されるかは問題ではありません。
MTD フレームワーク
Linux の MTD デバイスは drivers/mtd/ の下にあります。
MTD ファイルの内容は次のとおりです。
MTD 機器は通常 4 つの層に分割できます
上から下へデバイス ノード、MTD デバイス層、MTD オリジナル デバイス層、およびハードウェア ドライバー層です。
1.cmdlinepart.c
mtd パーティション テーブルが cmd パラメーターを介して u-boot によって Linux に送信されると、 Linux カーネルでは、mtdparts を登録して追加する必要はなく、MTD でコマンド ライン パーティション オプションをオンにするだけで済みます。この方法を使用するには、u-boot が MTD をサポートする必要があり、送信される mtd パーティション パラメーターが形式要件を満たしている必要があります。
2.devices フォルダー
spi フラッシュ デバイスがあり、それを管理するために mtd を使用したい場合、通常はそれを devices フォルダーの下に置きます。 devices フォルダーにある m25p80.c は、典型的な spi フラッシュ デバイスです。
3.chips/nand/onenand フォルダー
nand フラッシュ ドライバーは nand フォルダーの下にあります;
oneanand フラッシュ ドライバーは onenand フォルダーの下にあります。
nor フラッシュは比較的複雑で、次のファイルにあります。
chips:cfi/jedec インターフェイス ユニバーサル ドライバー
devices:nor flash ボトム ドライバー (spi flash)
maps:フラッシュ マッピング関係関連関数
4. コア ファイル
mtdchar.c: MTD キャラクター デバイス インターフェイス関連の実装、デバイス番号 31 ;
mtdblock.c: MTD ブロック デバイス インターフェイス関連の実装、デバイス番号 90、;
mtdcore.c: MTD オリジナルのデバイス インターフェイス関連の実装;
mtdpart. c: MTD パーティション インターフェイス関連の実装。
5.ubi
ubifs ファイルのサポート層。ubifs ファイル システムを使用する場合は、デバイス ドライバー -> メモリ テクノロジー デバイス (MTD) サポートを変更する必要があります。 -> ; UBI で UBI を有効にする -未分類のブロック画像が選択されています。
[ファイル システム] -> [その他のファイル システム] で [UBIFS ファイル システム サポート] を選択します。
MTD パーティション テーブルの実装
ブート プロセス中に、コンソールから次のような情報が表示されることがよくあります。
0x000000000000-0x000000100000 : "Bootloade" 0x000000100000-0x000002000000 : "Kernel" 0x000002000000-0x000003000000 : "User" 0x000003000000-0x000008000000 : "File System"
これは MTD が提供する最も直観的な表現形式で、メモリ内の各モジュールのパーティション構造を示しますが、これらのパーティションはどのように実装されるのでしょうか?パーティション テーブルを実装するにはいくつかの方法があり、それについては以下で説明します。
注: パーティション テーブルの実装の前提条件は、MTD デバイス ドライバが成功していることです。そうでない場合、パーティションは存在しません。ドライバーが成功しない場合でも話します。
1. カーネルへの追加
カーネルへの追加は、より一般的に使用される方法であり、ドライバー移植の本に記載されているはずです。プラットフォーム デバイスに mtd_partition を追加し、次のような情報を追加します。これ以上の説明は省略します。
struct mtd_partition s3c_nand_part[] = { { .name = "Bootloader", .offset = 0, .size = (1 * SZ_1M), .mask_flags = MTD_CAP_NANDFLASH, }, { .name = "Kernel", .offset = (1 * SZ_1M), .size = (31 * SZ_1M) , .mask_flags = MTD_CAP_NANDFLASH, }, { .name = "User", .offset = (32 * SZ_1M), .size = (16 * SZ_1M) , }, { .name = "File System", .offset = (48 * SZ_1M), .size = (96 * SZ_1M), } }; static struct s3c_nand_set s3c_nand_sets[] = { [0] = { .name = "nand", .nr_chips = 1, .nr_partitions = ARRAY_SIZE(s3c_nand_part), .partitions = ok6410_nand_part, }, }; static struct s3c_platform_nand s3c_nand_info = { .tacls = 25, .twrph0 = 55, .twrph1 = 40, .nr_sets = ARRAY_SIZE(s3c_nand_sets), .sets = ok6410_nand_sets, }; static void __init s3c_machine_init(void) { s3c_nand_set_platdata(&s3c_nand_info); }
MTD ドライバーが完成したため、デバイスとドライバーが一致すると、プローブがドライバーはインターフェイス関数と呼ばれます。パーティション テーブルを追加するには、プローブ関数で add_mtd_partitions(s3c_mtd,ets->partitions,sets->nr_partitions);
を呼び出す必要があります。
2.u-boot パラメータの転送
u-boot では、mtdparts 情報を bootargs に追加できます。u-boot の起動後、bootargs 内の情報はカーネルに送信されると、カーネルは起動時に bootargs の mtdparts 部分を解析します。例は次のとおりです:
mtdparts=nand.0:1M(Bootloader)ro,31M(Kernel)ro 、16M(ユーザー)、96M(ファイル システム)
、より具体的な mtdparts 形式については、関連情報を確認できます。
カーネルが mtdparts 情報を解析するには、前述のように、カーネルで [デバイス ドライバー] -> [メモリ テクノロジ デバイス (MTD) サポート] -> [コマンド ライン パーティション テーブル解析] オプションを有効にする必要があります。
在内核中添加分区表的时候,我们是在平台设备里面加入mtd_partition信息。这边通过u-boot传参则取消平台设备里面的partition信息,那我们需要怎样解析u-boot的传过来的mtdparts呢。
u-boot传参过来后,cmdlinepart.c中会将这些参数解析好,存在里面LIST_HEAD(part_parsers)
链表里面,然后我们在驱动的probe函数中,通过调用mtd_device_parse_register(mtd, probe_types,&ppdata, NULL, 0);
函数。
mtd_device_parse_register()
函数位于drivers/mtd/mtdcore.c 中,内容如下:
int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, struct mtd_part_parser_data *parser_data, const struct mtd_partition *parts, int nr_parts) { int err; struct mtd_partition *real_parts; err = parse_mtd_partitions(mtd, types, &real_parts, parser_data); if (err <= 0 && nr_parts && parts) { real_parts = kmemdup(parts, sizeof(*parts) * nr_parts, GFP_KERNEL); if (!real_parts) err = -ENOMEM; else err = nr_parts; } if (err > 0) { err = add_mtd_partitions(mtd, real_parts, err); kfree(real_parts); } else if (err == 0) { err = add_mtd_device(mtd); if (err == 1) err = -ENODEV; } return err; }
可以看到该函数会先执行parse_mtd_partitions(mtd, types, &real_parts, parser_data);
函数,后面还是通过add_mtd_partitions()
函数来实现分区表的添加。
parse_mtd_partitions()
函数位于drivers/mtd/mtdpart.c中,内容如下:
int parse_mtd_partitions(struct mtd_info *master, const char *const *types, struct mtd_partition **pparts, struct mtd_part_parser_data *data) { struct mtd_part_parser *parser; int ret = 0; if (!types) types = default_mtd_part_types; for ( ; ret <= 0 && *types; types++) { parser = get_partition_parser(*types); if (!parser && !request_module("%s", *types)) parser = get_partition_parser(*types); if (!parser) continue; ret = (*parser->parse_fn)(master, pparts, data); put_partition_parser(parser); if (ret > 0) { printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n", ret, parser->name, master->name); break; } } return ret; }
进入parse_mtd_partitions()
函数会先判断types的类型,如果为空则给默认值,types的类型一般就两种,如下:
static const char * const default_mtd_part_types[] = { "cmdlinepart", "ofpart", NULL };
第一个"cmdlinepart"即u-boot传参的方式,第二个"ofpart"即下面要讲到的使用dts传参的方式,判断完类型后,就通过get_partition_parser
去解析part_parsers
链表里面的数据,这样就完成u-boot参数的解析。
3.dts传参
在Linux3.14以后的linux版本中,加入一个新的知识DTS(Device tree),dts其实就是为了解决ARM Linux中的冗余代码,在Linux2.6版本的arch/arm/plat.xxx和arch/arm/mach.xxx中充斥着大量的垃圾代码,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码,关于dts可以自行查阅资料。
dts传参的原理其实和u-boot一样,区别在于:u-boot的时候是通过cmdlinepart.c文件实现分区信息写入LIST_HEAD(part_parsers)
链表,dts则是用过ofpart.c文件实现分区信息写入LIST_HEAD(part_parsers)
链表,所以同样要把ofpart.c文件的宏打开,在调用mtd_device_parse_register(mtd, probe_types,&ppdata, NULL, 0);
函数的时候types要设置成ofpart。
如果去对比Linux2.6版本和Linux3.14版本,会发现drivers/mtd/ofpart.c和drivers/mtd/mtdpart.c文件有所不同,Linux3.8版本里面多了Device tree这一部分的内容,感兴趣的可以自己深究下。
这边举个dts的例子:
pinctrl-0 = <&s3c_nand_flash>; ranges = <0 0 0x000000000000 0x000008000000>; /* CS0: NAND */ nand@0,0 { partition@1 { label = "Bootloader"; reg = <0x000000000000 0x000000100000>; }; partition@2 { label = "Kernel"; reg = <0x000000100000 0x000002000000>; }; partition@3 { label = "User"; reg = <0x000002000000 0x000003000000>; }; partition@4 { label = "File System"; reg = <0x000003000000 0x000008000000>; }; };
Linux mtd system的分析就到这边,有感悟时会持续会更新。
相关推荐:《Linux视频教程》
以上がLinux mtdとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Centosとubuntuの重要な違いは次のとおりです。起源(CentosはRed Hat、for Enterprises、UbuntuはDebianに由来します。個人用のDebianに由来します)、パッケージ管理(CentosはYumを使用し、安定性に焦点を当てます。チュートリアルとドキュメント)、使用(Centosはサーバーに偏っています。Ubuntuはサーバーやデスクトップに適しています)、その他の違いにはインストールのシンプルさが含まれます(Centos is Thin)

Dockerデスクトップの使用方法は? Dockerデスクトップは、ローカルマシンでDockerコンテナを実行するためのツールです。使用する手順には次のものがあります。1。Dockerデスクトップをインストールします。 2。Dockerデスクトップを開始します。 3。Docker Imageを作成します(DockerFileを使用); 4. Docker画像をビルド(Docker Buildを使用); 5。Dockerコンテナを実行します(Docker Runを使用)。

Centosのインストール手順:ISO画像をダウンロードし、起動可能なメディアを燃やします。起動してインストールソースを選択します。言語とキーボードのレイアウトを選択します。ネットワークを構成します。ハードディスクをパーティション化します。システムクロックを設定します。ルートユーザーを作成します。ソフトウェアパッケージを選択します。インストールを開始します。インストールが完了した後、ハードディスクから再起動して起動します。

Centosは廃止されました、代替品には次のものが含まれます。1。RockyLinux(最高の互換性)。 2。アルマリン(Centosと互換性); 3。Ubuntuサーバー(設定が必要); 4。RedHat Enterprise Linux(コマーシャルバージョン、有料ライセンス); 5。OracleLinux(CentosとRhelと互換性があります)。移行する場合、考慮事項は次のとおりです。互換性、可用性、サポート、コスト、およびコミュニティサポート。

Dockerプロセス表示方法:1。DockerCLIコマンド:Docker PS; 2。SystemDCLIコマンド:SystemCTL Status Docker; 3。CLIコマンドを作成するDocker:Docker-Compose PS。 4。プロセスエクスプローラー(Windows); 5。 /procディレクトリ(Linux)。

障害のあるDocker画像ビルドのトラブルシューティング手順:DockerFileの構文と依存関係バージョンを確認します。ビルドコンテキストに必要なソースコードと依存関係が含まれているかどうかを確認します。エラーの詳細については、ビルドログを表示します。 -targetオプションを使用して、階層フェーズを構築して障害点を識別します。 Dockerエンジンの最新バージョンを使用してください。 -t [image-name]:デバッグモードで画像を作成して、問題をデバッグします。ディスクスペースを確認し、十分であることを確認してください。 Selinuxを無効にして、ビルドプロセスへの干渉を防ぎます。コミュニティプラットフォームに助けを求め、DockerFilesを提供し、より具体的な提案のためにログの説明を作成します。

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

VSコードシステムの要件:オペレーティングシステム:オペレーティングシステム:Windows 10以降、MACOS 10.12以上、Linux Distributionプロセッサ:最小1.6 GHz、推奨2.0 GHz以上のメモリ:最小512 MB、推奨4 GB以上のストレージスペース:最低250 MB以上:その他の要件を推奨:安定ネットワーク接続、XORG/WAYLAND(Linux)
