CPU 権限の制限により、Linux ユーザー状態とカーネル状態間の通信は、プロセス間通信を使用した場合のように簡単ではありません。この記事では、Linux ユーザー状態とカーネル状態間の通信方法について説明します。 コードを書くときは通常、ユーザー空間のシステム コール関数を介してカーネル空間にアクセスします。これは、ユーザー空間とカーネル空間間の通信に最もよく使用される方法です。 (Linuxのユーザーモードとカーネルモードの詳細については、xxを参照してください) さらに、次の 4 つの方法があります。
procfs(/proc) の
このディレクトリにあるファイルは、実際にはカーネル変数です。カーネルはこのディレクトリを使用して、内部情報をファイルの形式で表示します。これは、ユーザー状態とカーネル状態間の相互作用のためのブリッジを構築する たとえば、共通の 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 つずつ公開します。これらのファイルには読み取り専用、書き込み可能、動的に変更されるものがあります。たとえば、アプリケーションが sysctl 私たちがよく知っている sysctl は Linux コマンドです。その機能と使用方法は、 基本的には、ユーザー モードとカーネル モード間の通信を完了するために、ファイルの読み取りおよび書き込み操作を使用します。 procfs は主に読み取り専用データを出力しますが、sysctl によって出力される情報のほとんどは書き込み可能です。 たとえば、カーネル ネットワーク層が IP パケットの転送を許可しているかどうかを取得するには通常、 同じ操作のために、Linux ではバッチ変更を行うための sysfs Sysfs は、Linux 2.6 で導入された仮想ファイル システムです。また、ユーザー モードとカーネル間の通信を完了するために Sysfs はカーネル空間からデバイスとドライバーの情報を読み取るだけでなく、デバイスとドライバーを構成することもできます。 # 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 セキュリティ ポリシーなど、カーネルとさまざまなユーザー プロセス間のメッセージ パッシング システムで使用できます。 拡大: 要約する Linux ユーザー モードとカーネル モードが通信するには主に 4 つの方法があり、その中で最も一般的なのは netlink と procfs です。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 |
<<: JS変数ストレージのディープコピーとシャローコピーの詳しい説明
>>: C# は MySQL コマンドラインのバックアップとリカバリを実装します
目次1. 脱構築とは何か? 2. 配列の分割3. 配列モードと代入モードの統一4. デフォルト値の構...
背景会社のサブプロジェクトが増えるにつれて、さまざまなサイズのプロジェクトが10個以上になります(バ...
目次1. はじめに2. MVCC (マルチバージョン同時実行制御メカニズム) 2.1 繰り返し読み取...
1. 仮想マシンとgit bashウィンドウを開き、接続の準備をします2. 仮想マシンでifconf...
<br />これは私がずっと前に集めた記事です。皆さんの参考のために共有したいと思います...
この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...
このプロジェクトでは、環境を構築するために Docker コンテナを使用します。Dockerfile...
問題点: docker run に -v パラメータを追加すると、コンテナは常に再起動状態になります...
MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されま...
目次アレイ重複排除1. from() を新しい Set() メソッドに重ねる2. スプレッド演算子 ...
序文最近、小さなデモを作成しました。大規模な工場のオンライン データを使用したため、インターフェイス...
[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...
2つの小さな問題ですが、長い間私を悩ませていました。最初の質問テキストエリアの左側のテキストは常にテ...
背景: Linux サーバーのファイルのアップロードとダウンロード。 XShell+Xftp インス...
なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...