Linux ユーザー状態とカーネル状態間の通信方法の詳細な説明

Linux ユーザー状態とカーネル状態間の通信方法の詳細な説明

CPU 権限の制限により、Linux ユーザー状態とカーネル状態間の通信は、プロセス間通信を使用した場合のように簡単ではありません。この記事では、Linux ユーザー状態とカーネル状態間の通信方法について説明します。

コードを書くときは通常、ユーザー空間のシステム コール関数を介してカーネル空間にアクセスします。これは、ユーザー空間とカーネル空間間の通信に最もよく使用される方法です。 (Linuxのユーザーモードとカーネルモードの詳細については、xxを参照してください)

さらに、次の 4 つの方法があります。

  • procfs(/proc) の
  • sysctl (/proc/sys)
  • sysfs(/sys)
  • ネットリンクソケット

procfs(/proc) の

procfsはプロセス ファイル システムの略称です。本質的には疑似ファイル システムです。なぜ疑似ファイル システムと呼ばれるのでしょうか?外部ストレージスペースを占有せず、少量のメモリのみを占有するため、通常は/procディレクトリにマウントされます。

このディレクトリにあるファイルは、実際にはカーネル変数です。カーネルはこのディレクトリを使用して、内部情報をファイルの形式で表示します。これは、ユーザー状態とカーネル状態間の相互作用のためのブリッジを構築する/procディレクトリに相当します。ユーザー状態は/procの下のファイルを読み書きします。つまり、カーネル関連の構成パラメータを読み書きすることになります。

たとえば、共通の/proc/cpuinfo/proc/meminfo/proc/net 、それぞれ CPU、メモリ、ネットワークの関連パラメータを提供します。さらに、以下に示すように、多くのパラメータがあります。

root@ubuntu:~# ls /proc/
1 1143 1345 1447 2 2292 29 331 393 44 63 70 76 acpi ディスク統計 irq ロック sched_debug sysvipc ゾーン情報
10 1145 1357 148 20 23 290 332 396 442 64 7019 77 asound dma kallsyms mdstat schedstat スレッドセルフ
1042 1149 1361 149 2084 2425 291 34 398 45 65 7029 8 buddyinfo ドライバー kcore meminfo scsi timer_list
1044 1150 1363 15 2087 25 3 3455 413 46 66 7079 83 バス execdomains キー その他 セルフ timer_stats
1046 1151 1371 16 2090 256 30 35 418 47 6600 7080 884 cgroups fb key-users モジュール slabinfo tty
1048 1153 1372 17 21 26 302 36 419 5 67 71 9 cmdline ファイルシステム kmsg マウント ソフトIRQ 稼働時間
11 1190 1390 18 22 27 31 37 420 518 6749 72 96 コンソール fs kpagecgroup mtrr stat バージョン
1126 12 143 182 2214 28 32 373 421 524 68 73 97 cpuinfo 割り込み kpagecount ネットスワップ バージョン署名
1137 1252 1434 184 2215 280 327 38 422 525 69 74 98 暗号 iomem kpageflags pagetypeinfo sys vmallocinfo
1141 13 144 190 2262 281 33 39 425 5940 7 75 985 デバイス IOポート loadavg パーティション sysrq-trigger vmstat

ご覧のとおり、数字で表されたファイルがたくさんあります。これらは、実際には現在のシステムで実行されているプロセス ファイルです。数字はプロセス ID (PID) を表します。各ファイルには、プロセスの状態、ファイル記述子、メモリ マッピングなど、プロセスのすべての構成情報が含まれています。見てみましょう。

root@ubuntu:~# ls /proc/1/
attr/ cmdline environ io mem ns/ pagemap schedstat stat timers
autogroup comm exe 制限 mountinfo numa_maps personality sessionid statm uid_map
auxv coredump_filter fd/ loginuid マウント oom_adj projid_map setgroups ステータス wchan
cgroup cpuset fdinfo/ map_files/ mountstats oom_score root/ smaps syscall     
clear_refs cwd/ gid_map maps net/ oom_score_adj sched stack task/

要約すると、カーネルはシステム構成情報をファイルを通じて 1 つずつ公開します。これらのファイルには読み取り専用、書き込み可能、​​動的に変更されるものがあります。たとえば、アプリケーションが/proc/ファイルを読み取ると、カーネルはファイルを登録し、一連のカーネル関数を呼び出してファイルを処理し、対応するカーネル パラメータをユーザー スペースにコピーします。これにより、ユーザーはファイルを読み取ることでカーネル情報を取得できます。大まかな図を以下に示します。

sysctl

私たちがよく知っている sysctl は Linux コマンドです。その機能と使用方法は、 man sysctl確認できます。主にカーネルのランタイムパラメータを変更するために使用されます。つまり、カーネルの実行中にカーネルパラメータを動的に変更することができます。

基本的には、ユーザー モードとカーネル モード間の通信を完了するために、ファイルの読み取りおよび書き込み操作を使用します。 /proc /proc/sysのサブディレクトリを使用します。 procfs との違いは次のとおりです。

procfs は主に読み取り専用データを出力しますが、sysctl によって出力される情報のほとんどは書き込み可能です。

たとえば、カーネル ネットワーク層が IP パケットの転送を許可しているかどうかを取得するには通常、 cat /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_forwardまたはsysctl -w net.ipv4.ip_forward=1使用します。

同じ操作のために、Linux ではバッチ変更を行うための/etc/sysctl.confファイルも提供されています。

sysfs

Sysfs は、Linux 2.6 で導入された仮想ファイル システムです。また、ユーザー モードとカーネル間の通信を完了するために/sysファイルも使用します。 procfs とは異なり、sysfs は元々 procfs にあったデバイスとドライバーの一部を分離し、「デバイス ツリー」の形式でユーザーに提示します。

Sysfs はカーネル空間からデバイスとドライバーの情報を読み取るだけでなく、デバイスとドライバーを構成することもできます。

/sys下にあるものを見てみましょう:

# ls /sys
ブロックバスクラス dev デバイス ファームウェア fs ハイパーバイザー カーネルモジュール 電源

これらのファイルは基本的にコンピューターのデバイスやドライバーと密接に関連していることがわかります。これらのファイルの説明については、ご自身で詳しく調べていただければと思いますので、ここでは詳細には触れません。

ネットリンク

Netlink は、Linux ユーザー モードとカーネル モード間の通信に最も一般的に使用される方法です。サポートは Linux カーネル 2.6.14 以降でのみ利用可能です。これは本質的にソケットであり、通常のソケットで使用される標準 API も適用されます。たとえば、netlink ソケットを作成するには、次のソケット関数を呼び出します。

#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>

netlink_socket = socket(AF_NETLINK、socket_type、netlink_family);

Netlink の柔軟なアプローチにより、ルーティング サブシステム、ファイアウォール (Netfilter)、ipsec セキュリティ ポリシーなど、カーネルとさまざまなユーザー プロセス間のメッセージ パッシング システムで使用できます。

拡大:

net-toolsツールは procfs (/proc) および ioctl システム コールを介してカーネル ネットワーク パラメータ設定にアクセスして変更しますが、 iproute2 netlink ソケット インターフェイスを介してカーネルと通信します。前者は廃止され、後者が徐々に標準になってきました。

要約する

Linux ユーザー モードとカーネル モードが通信するには主に 4 つの方法があり、その中で最も一般的なのは netlink と procfs です。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  JS変数ストレージのディープコピーとシャローコピーの詳しい説明

>>:  C# は MySQL コマンドラインのバックアップとリカバリを実装します

推薦する

JS ES6 変数分割代入の詳細な説明

目次1. 脱構築とは何か? 2. 配列の分割3. 配列モードと代入モードの統一4. デフォルト値の構...

nginx を使用して 1 つのドメイン名で複数の Laravel プロジェクトを構成する方法の例

背景会社のサブプロジェクトが増えるにつれて、さまざまなサイズのプロジェクトが10個以上になります(バ...

MySQL マルチバージョン同時実行制御メカニズム (MVCC) ソースコードの詳細な説明

目次1. はじめに2. MVCC (マルチバージョン同時実行制御メカニズム) 2.1 繰り返し読み取...

Windows 8 での ssh コマンドの使用記録

1. 仮想マシンとgit bashウィンドウを開き、接続の準備をします2. 仮想マシンでifconf...

インターフェース設計の10の一般的なルール

<br />これは私がずっと前に集めた記事です。皆さんの参考のために共有したいと思います...

MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要

この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...

DockerコンテナがJupyterにアクセスできない問題の解決策

このプロジェクトでは、環境を構築するために Docker コンテナを使用します。Dockerfile...

docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。

問題点: docker run に -v パラメータを追加すると、コンテナは常に再起動状態になります...

MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されま...

JavaScript の便利な配列トリック 12 選

目次アレイ重複排除1. from() を新しい Set() メソッドに重ねる2. スプレッド演算子 ...

Nginx プロキシ axios リクエストと注意事項

序文最近、小さなデモを作成しました。大規模な工場のオンライン データを使用したため、インターフェイス...

LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)

[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...

テキストエリアをレイアウトしたときにテキストが左下にあり、サイズを変更できない問題の解決策

2つの小さな問題ですが、長い間私を悩ませていました。最初の質問テキストエリアの左側のテキストは常にテ...

Linux サーバーと Windows システム間でファイルをアップロードおよびダウンロードする方法

背景: Linux サーバーのファイルのアップロードとダウンロード。 XShell+Xftp インス...

SQL Server データベース エラー 5123 の解決方法

なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...