Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのルートファイルシステムを解析する工程をマウント

Linuxのルートファイルシステムを解析する工程をマウント

  
 

ワン:はじめに上にrootfsをマウントすることはありませんコンパイル時のカーネルではいくつかの時間前に発見。画像缶の古いバージョンに同じルートオプション。この問題を解決するために。研究にrootfsの小さなプロセスをマウントします。特別な知識ポイントより混乱して友人に少し助けのこの部分を願って、以下に要約。 2:一般的にrootfs種、2種類に分けrootfsの仮想と現実のrootfsの今rootfsの動向カーネルが完了するまでに、ユーザ空間に多くの機能です。薄いカーネル滞在するために。一つの方法は、Linuxディストリビューションのメーカーが広く使われている各仮想rootfsのためのものです。初期の仕事の一部は、rootfsの仮想完了に配置することができます。次に、仮想にrootfsの開発過程で、実際のファイルシステムに切り替えます。いくつかのバージョンがあります:initramfsには:initramfsには、カーネル2.5で導入された技術では、実際には、その意味は次のとおりです。小さなファイルシステム、カーネルが起動含まカーネルパッケージのcpio、cpioのパッケージに添付ミラーcpioのアンタイドファイルシステムに解放カーネルパッケージは、その中にrootfsを含む場合、ユーザレベルの処理が行われるように、カーネル初期化コードの部分は、ファイル・システム内に配置されます。明白な利点は、カーネルの初期化コードを合理化し、カスタマイズすることが、カーネルの初期化プロセスが簡単にできますされています。このように、このrootfsのはのカーネルイメージで.cpio-のinitrdを含めることです:cpioのフォーマットrootfsの

画像のinitrd:これら二つの仮想ファイルシステム上に作られたにrootfsの伝統的な形式は、自分自身を参照してください。その他の情報3:上記にrootfsのrootfsの分析と異なっているここでの処理rootfsのファイルシステムをマウントします。これは、ルートシステムの初期化の時間を指します。それは/ノード。それは、そのメモリにrootfsのファイルシステムです。 < Linuxのブートプロセスの分析>><のこの部分の前にファイルシステム、および分析されました。ここでは、繰り返しの知識の継続のために。 Start_kernel()à mnt_init():ボイド__initのmnt_init(ボイド)

{………… init_rootfs(); init_mount_tree();}次のようにInit_rootfsコードは:INT __init init_rootfs(ボイド)

{int型のERR。ERR = bdi_init(&#038; ramfs_backing_dev_info);

IF(ERR)戻りERR; ERR = register_filesystem(&#038; rootfs_fs_type); IF(ERR)bdi_destroy(&#038; ramfs_backing_dev_info ); ERRを返す;}この関数は非常に簡単です。登録rootfsのファイルシステム.init_mount_tree()コードは以下の通りである:静的ボイド__init init_mount_tree(ボイド)

{構造体vfsmount * MNT、構造体mnt_namespace * NS、構造体経路のルート; MNT = do_kern_mount(" rootfsの"。 rootfsの"を作成することはできません;、0、" rootfsの"、NULL);

もし(IS_ERR(MNT))パニック(");

NS = kmallocの(はsizeof(* NS )、GFP_KERNEL); IF(NS)パニック("!初期名前空間"を割り当てることはできません。);

atomic_set(&#038; NS->カウント、1); INIT_LIST_HEAD(&#038; NS->。リスト); init_waitqueue_head(&#038; NS->ポール); NS->イベント= 0; list_add(&#038; mnt-> mnt_list、&#038; NS->リスト);

NS->ルート= MNT; mnt-> mnt_nsの=のNS; init_task.nsproxy-> mnt_nsの=のNS; get_mnt_ns(NS); root.mnt = NS->ルート; root.dentry = NS-> root->。 mnt_root; set_fs_pwd(電流 - > FS、&#038;ルート); set_fs_root(電流 - > FS、&#038;ルート);}ここで、rootfsのファイルシステムが搭載されています。最後に、現在のディレクトリがある' /'。これマウントポイント&'デフォルトは、スイッチングのプロセスの/&'ルートディレクトリ。これは、ルートディレクトリの原点です。しかし、ここでは、単に初期化。ローディングおよび他の特定のファイル・システム、特定のファイルシステムに通常、ルートディレクトリの完了後。だから、システムは、mountコマンドで開始した後、目に見えないrootfsの情報四マウントされた仮想ファイルシステムのルートディレクトリをマウントしますが、特定のstart_kernel()àにファイルシステムをマウントすることができ、ハングアップされています。... rest_init()à kernel_init():静的int型__init kernel_init(void *型未使用)

{………… do_basic_setup();

ramdisk_execute_command = IF(ramdisk_execute_command!) " /INIT";

IF(sys_access((CONSTチャー__user *)ramdisk_execute_command、0)!= 0){

ramdisk_execute_command = NULL;

prepare_namespace();} /** [OK]を、私たちは、初期ブートアップを完了した、と

*私たちはアップと

* initmemセグメントを取り除くと、ユーザーモードのものを起動し実行している本質的です。 ..

* /init_post(); 0を返す;} do_basic_setupを()重要な機能があり、それは始まりに直接翻訳カーネル内のすべてのモジュールが作られています。以下のコード:静的ボイド__init do_basic_setup(ボイド)

{/*ドライバは* /init_workqueues(ホットプラグ・イベントを送信する); usermodehelper_init(); DRIVER_INIT(); init_irq_proc(); do_initcalls();} Do_initcalls( )__initcall_startと__initcall_endセクションのすべての機能を起動し、静的にカーネルモジュールにコンパイルするには、このセクションの入り口に配置されます。ルートファイルシステムに関連する初期化関数は、()rootfs_initcallによって参照されるであろう。次の初期化機能注目:rootfs_initcall(populate_rootfs)を、すなわち、初期化するために、システムの初期化時にpopulate_rootfsをコールすることであろう。コードは以下の通りである:静的INT __init populate_rootfs(ボイド)

{CHAR * ERR = unpack_to_rootfs(__ initramfs_start、__ initramfs_end - __initramfs_start、0);(ERR)パニック(ERR)場合、IF(initrd_start){

INT FD;のprintk(KERN_INFO"画像がinitramfsを..."であるかどうかをチェックする;);

ERR = unpack_to_rootfs((チャー*)initrd_start、

Copyright © Windowsの知識 All Rights Reserved