[LINUX]基本IO(ファイルシステム、ハードウェアとソフトウェアのリンク、ダイナミックライブラリと静的ライブラリ)

ファイルシステム

Linuxで表示すると、ファイルにはファイル名だけでなく、その他の属性情報も含まれていることがわかります。
ここに画像の説明を挿入
含める:

モード、
ハードリンクの数、
ファイルの所有者、
グループ、
サイズ、
最終変更時刻、
ファイル名、
ここに画像の説明を挿入
次にこの情報がどのように照会され、どこに保存されるかを検討します。ここでは、iノードとブロックを紹介します。

iノード|ブロック

ハードウェアのストレージは、最初はディスク上にありました。
ここに画像の説明を挿入
ヘッドによってディスクの表面、トラック、およびセクターを決定します。それを線形に変換し、配列と考えることができます。次の図に示す
ここに画像の説明を挿入
ブロックグループ:ext2ファイルシステムは、パーティションのサイズに応じていくつかのブロックグループに分割されます。各ブロックグループの構造は同じです。さまざまな地区の政府管理の例

スーパーブロック:ファイルシステム自体の構造情報を格納します。記録される情報には、主に、bolckとiノードの合計量、未使用のブロックとiノードの数、ブロックとiノードのサイズ、最新のマウントの時間、最新のデータ書き込みの時間、および時間が含まれます。最新のディスク検査のその他のファイルシステム関連情報。スーパーブロックの情報が破壊され、ファイルシステム全体が破壊されたと言えます。

GDT、グループ記述子テーブル:ブロックグループ記述子。ブロックグループの属性情報を記述します。

ブロックビットマップ:ブロックビットマップは、データブロック内のどのデータブロックが占有されているか、どのデータブロックが占有されていないかを記録します

iノードビットマップ:各ビットは、iノードが空いていて使用可能かどうかを示します。iノードテーブル:ファイルサイズ、所有者、最終変更時刻などのファイル属性を保存します。データ領域:ファイルコンテンツを保存します

ここに画像の説明を挿入
新しいファイルを作成するには、主に4つの操作があります。

  1. ストレージ属性
    カーネルは最初にアイドル状態のiノード(この場合は263466)を見つけます。カーネルはファイル情報をその中に記録します。
  2. データを
    保存しますファイルは3つのディスクブロックに保存する必要があります。カーネルは、300、500、800の3つの空きブロックを検出しました。カーネルバッファ内のデータの最初のブロックを300にコピーし、次のブロックを500にコピーします。
  3. レコード配布状況
    ファイル内容は300、500、800の順に保存されます。iノード上のカーネルのディスク配布領域には、上記のブロックリストが記録されています。
  4. ファイル名をディレクトリに追加します。
    新しいファイル名abc。Linuxはこのファイルを現在のディレクトリにどのように記録しますか?カーネルは、エントリ(263466、abc)をカタログファイルに追加します。ファイル名とiノードの対応により、ファイル名とファイルの内容および属性が関連付けられます。
    ディレクトリについても同じことが言えます。ファイルのiノードとマッピングの関係は内部に保存されます。

ソフトリンクとハードリンク

ソフトリンク:
ソフトリンクには独自のiノードがあり、別のファイルのパスがファイルに保存されます。独立した文書です。
ハードリンク:
ハードリンクと指定されたファイルは、別個のファイルではなく、同じiノードを持っています。Linuxでは、複数のファイルで同じiノードを使用できます。

動的および静的ライブラリ

静的ライブラリ(.a):プログラムがコンパイルおよびリンクされると、ライブラリのコードが実行可能ファイルにリンクされます。プログラムの実行中は静的ライブラリは不要になります

ダイナミックライブラリ(.so):ダイナミックライブラリのコードは、プログラムの実行時にリンクされ、ライブラリのコードは複数のプログラムで共有されます。

ダイナミックライブラリにリンクされた実行可能ファイルには、外部関数が配置されているオブジェクトファイルのマシンコード全体ではなく、使用する関数エントリアドレスのテーブルのみが含まれます。

実行可能ファイルの実行が開始される前に、外部関数のマシンコードがオペレーティングシステムによってディスク上のダイナミックライブラリからメモリにコピーされます。このプロセスはダイナミックリンクと呼ばれます。

ダイナミックライブラリは複数のプログラム間で共有できるため、ダイナミックリンクにより実行可能ファイルが小さくなり、ディスク容量が節約されます。オペレーティングシステムは仮想メモリメカニズムを使用して、物理メモリ内のダイナミックライブラリを、ライブラリを使用するすべてのプロセスで共有できるようにし、メモリとディスクスペースを節約します。

静的ライブラリ

一般に、他の人にパッケージ化するときは、静的ライブラリとヘッダーファイルを相互に提供して、他の人がコードを再利用できるようにします。これは移植性が高くなりますが、リソースが多くなり、多くの静的ライブラリが複製される可能性があります。

生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。

ライブラリ検索パス

-Lで指定したディレクトリを左から右に検索します。
環境変数(LIBRARY_PATH)
で指定されたディレクトリは、システム
/ usr / lib
/ usr / local / libで指定されたディレクトリです。

ダイナミックライブラリ

ダイナミックライブラリを生成します。

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so

コンパイルと静的ライブラリの違いは、静的ライブラリがなく、動的ライブラリの名前の後にlが続くことです。つまり、libと.soが削除されます。

例:gcc main.o -o main –L。-lhello

ダイナミックライブラリを実行する

1 .soファイルをシステム共有ライブラリパスにコピーします。通常は/ usr / libを参照します
。2。//を変更するLD_LIBRARY_PATH場合、L3の後に独自の環境変数を追加する必要はありません
。ldconfig構成/etc/ld.so.conf.d/ 、ldconfig update

外部ライブラリ

システムには実際には多くのライブラリがあり、それらは通常、共通のタスクを完了するために使用される一連の相互に関連する関数で構成されています。たとえば、画面表示の処理に使用される関数(ncursesライブラリ)
(現在、ほとんどのクラウドライブラリライブラリには、より便利な外部ライブラリもあります。仮想マシンがない場合は、前の操作を使用して操作する必要があります)
-lmは、libm.soまたはlibm.aライブラリファイルをリンクすることを意味します

おすすめ

転載: blog.csdn.net/weixin_43762735/article/details/115311460
おすすめ