問題タブ [userspace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
operating-system - 特権リングをさらに作成する
私が理解しているように、ほとんどのオペレーティング システムには、カーネル モードとユーザー モードの 2 つの特権リングがあります。オペレーティング システムの開発者は、ミドルウェア モードやカーネル モジュール モードなどの追加の特権リングを作成できますか?
operating-system - オペレーティング システム (クリーン インストール) のサイズが増大しているのはなぜですか?
わかりました、これは単純な質問ですが、ディストリビューション (Linux) を作成している方、または OsX や Windows に関係している方からの回答をお待ちしております。
インストール後のサイズが大きくなっているようで、Windows 10 では 20GB (64bit) のディスク容量が必要です。カーネルは問題ではないと思いますので、問題はアプリケーション (つまりユーザー空間) にあります。しかし、OS にパッケージ化されたアプリケーションの数の増加は見られません。少なくとも大幅な増加ではありません。問題は、アプリケーションの作成方法、ランタイム サポートなどです。
誰かがこれについてコメントできますか?
c - カーネル空間とユーザー空間の間の通信に Netlink を使用する msghdr の動作
私は現在、カーネルハッシュテーブルの実装をユーザー空間に公開することを含む、学校プロジェクトの Linux カーネルモジュールに取り組んでいます。
これを実現するために、Netlink ソケットを介して LKM と通信するユーザー空間 API も作成しました。
私は今それを機能させていますが、私はかなり混乱したバンプに遭遇し、本当に頭を包むことができません. そして、問題を理解するのに実際には役立たなかったすべてのドキュメントを読み、「うさぎの穴を下って」Netlinkのソースコードを調べた後、誰かがそうするかもしれないかどうかを確認するためにここで質問をすることにしました何が、なぜ、これが起こっているのかを知ってください。
そこで、問題を切り分けるために、一般的な Netlink ユーザー空間とカーネル空間の通信の例を実行する小さなテスト プログラムを作成しました。これを通じて、ユーザー空間プログラムの 3 つの小さなバリエーションを示します。これらはすべて異なる動作をしますが、それは私が疑問に思っている動作です。
最初はカーネル モジュールです。これは 3 つのバリエーションすべてで同じです。
そして、ユーザー空間プログラム:
これを実行すると、すべて問題なく、コンソール出力が表示されます。
および dmesg からのカーネル ログ出力:
しかし、このプロジェクトでは、API を呼び出すマルチスレッド アプリケーションを使用しているため、呼び出し元のスレッドごとに独自の Netlink ソケットを提供したいと考えました。そのために私は作らなければならなかった
ローカルで宣言された変数に。
問題が発生する
それをメイン関数に移動すると、すぐに壊れました。これは、カーネルが Netlink コールバック関数に入ることさえしない方法であるため、ユーザー空間プログラムはそれに書き込むことさえできないと思いますが、それでも sendmsg() 関数から正しい量の書き込まれたバイトを返します。
これは、msghdr をローカルで宣言した場合のコンソールへの出力です。
その後、ハングし、SIGINT を実行する必要があります。カーネル ログには、データを受信している LKM については何も表示されません。
それで、ローカルで宣言されたときにアドレス指定エラーが発生したのではないかと思い始めたので、試してみるために、msghdr をローカルスコープで動的に割り当てられたポインターに変換しました。元の例と同じコンソールとカーネル ログの出力が得られました。
すっごく、私の実際の質問は、実際には教育目的のためのものであり、なぜこのように振る舞うかを理解するためのものです.
グローバルに宣言された変数は機能するのに、ローカルに宣言された変数は機能しないのはなぜですか?
さらに、ローカルで宣言され、動的に割り当てられたポインターが機能するのはなぜですか?
ここで基本的なレベルで何かが欠けていますか?
TL;DR:
msghdr 構造体をユーザー空間プログラムでローカルに宣言すると機能しないのに、グローバルに宣言されたポインターまたはローカルの動的ポインターは機能するのはなぜですか?
linux - Linux ユーザー空間から使用して複数の GPIOS を切り替える
Linux組み込みでアプリケーションを作成しています。2 つの異なる GPIO ピンを使用してオンとオフを切り替えることができる 2 つの LED があります。
両方の GPIO ピンを同時に設定して、それらを同期したいと思います。GPIO HW には出力値用のレジスタが 1 つあり、各ビットが 1 つのピンを表すため、これが可能です。
しかし、カーネル ドライバーをバイパスしてそのレジスターに書き込むことなく、そうする方法を見つけることができませんでした。これは健全な方法ではありません。ユーザー空間 API を使用して同じことを行いたいと考えています。
多数のピンをエクスポートして、何らかの方法で「バインド」する方法はありますか?