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 コマンドラインのバックアップとリカバリを実装します

推薦する

HTML テーブルの使い方 (Web ページの視覚効果を表示する)

NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...

Linux のユーザーとグループ管理によく使われるコマンドの概要

この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...

Mysql 複数データベースのバックアップ コード例

この記事は主にMysqlの複数データベースのバックアップのコード例を紹介します。この記事ではサンプル...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

ウェブページ読み込み時に左右にジャンプする原因の分析と解決

最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...

SQL実行ステップの詳細な分析

SQL実行ステップの詳細な分析まず、ステートメントが実行される順序を見てみましょう。 (8)選択する...

alpineをベースにdockerfileで作成したtomcatイメージの実装

1.アルパインイメージをダウンロードする [root@docker43 ~]# docker pul...

Mysql マスタースレーブレプリケーションの注意事項の説明

1. マスター'x@xxxx:x'への接続エラー- 再試行時間: 60 再試行回数:...

HTML ベースタグ target=_parent の使用の紹介

<base> タグは、ページ上のすべてのリンクのデフォルトのアドレスまたはデフォルトのタ...

Net Core実装プロセス分析のDoc​​kerインストールと展開

1. Dockerのインストールと設定 #CentOS をインストールし、Docker パッケージを...

Mysql で自動増分主キー ID を更新するときに問題が発生しました

目次自動インクリメント ID を更新する理由は何ですか?質問解決方法これは私が知っている問題ですが、...

最も完全なpackage.json分析

目次1. 概要2. 名前フィールド3. バージョンフィールド4. 説明フィールド5. キーワードフィ...

MySQL の挿入ステートメントの使用実体験

目次1. 挿入のいくつかの構文1-1. 通常の挿入文1-2. 挿入または更新1-3. 挿入または交換...

mysql5.7 ユーザー権限の作成、ユーザーの削除、権限の取り消し

1. ユーザーを作成します。注文: 'password' によって識別される ...