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 コマンドラインのバックアップとリカバリを実装します
NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...
この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...
この記事は主にMysqlの複数データベースのバックアップのコード例を紹介します。この記事ではサンプル...
この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...
最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...
SQL実行ステップの詳細な分析まず、ステートメントが実行される順序を見てみましょう。 (8)選択する...
1.アルパインイメージをダウンロードする [root@docker43 ~]# docker pul...
1. マスター'x@xxxx:x'への接続エラー- 再試行時間: 60 再試行回数:...
<base> タグは、ページ上のすべてのリンクのデフォルトのアドレスまたはデフォルトのタ...
1. Dockerのインストールと設定 #CentOS をインストールし、Docker パッケージを...
目次自動インクリメント ID を更新する理由は何ですか?質問解決方法これは私が知っている問題ですが、...
目次1. 概要2. 名前フィールド3. バージョンフィールド4. 説明フィールド5. キーワードフィ...
目次1. 挿入のいくつかの構文1-1. 通常の挿入文1-2. 挿入または更新1-3. 挿入または交換...
#include <linux/moduleparam.h> 1. モジュールパラメータ...
1. ユーザーを作成します。注文: 'password' によって識別される ...