問題タブ [kernel]
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.
linux - 送信元ホストでIPパケットがフラグメント化される頻度はどれくらいですか。
IPペイロード>MTUの場合、ルーターは通常IPパケットをフラグメント化します。最後に、すべてのフラグメント化されたパケットは、フィールドIP-ID、IPフラグメントオフセット、およびフラグメンテーションフラグを使用して宛先でアセンブルされます。IPペイロードの最大長は64Kです。したがって、L4が64Kのペイロードを引き渡すのは非常に妥当です。L2プロトコルがイーサネットの場合(これはよくあることですが)、MTUは約1600バイトになります。したがって、IPパケットは送信元ホスト自体でフラグメント化されます。ただし、LinuxでのIP実装について簡単に検索すると、最近のカーネルでは、L4プロトコルはフラグメントに対応していることがわかります。つまり、MTUに近いサイズのバッファーを渡すことで、IPのフラグメント化作業を節約しようとします。
これらの2つの事実を考慮すると、IPパケットが送信元ホスト自体でフラグメント化される頻度について疑問に思っています。それは時々/まれに/決して起こりませんか?Linuxカーネルの断片化のルールに例外があるかどうか(つまり、L4プロトコルが断片に対応していない状況があるかどうか)を知っている人はいますか?これは、Windowsなどの他の一般的なOSでどのように処理されますか?一般に、IPパケットはどのくらいの頻度で断片化されますか?
ruby - Kernel.loopメソッドには「do」が必要です。セミコロンは許可されていませんか?
do
以下の例のように、特定の構成では、ステートメントの終わりを区切るためにセミコロンまたはキーワードを使用することを選択できuntil
ます。
しかし、これはでは不可能Kernel.loop
です。
こんな理由はありますか?
c - カーネルの開発と仮想マシンでのテスト
私はプログラミングの挑戦が好きで、カーネルを書くことはプログラミングの挑戦のようです。
残念ながら、カーネルは基本的にオペレーティング システムのコアであり、オペレーティング システム上で簡単に実行できないため、特にテストが困難です。
ただし、コンピューター ハードウェアをエミュレートできる仮想マシンと呼ばれるアプリケーションについては知っています。
仮想マシンを使用してカーネル (C+Assembly) を開発およびテストする最も簡単で最良の方法は何ですか?
linux - カーネル モジュールのメモリ使用量
カーネル モジュール (通常はデバイス ドライバー) が消費するメモリ量を見積もる際に、.ko (.bss、.data、.text など) の静的メモリ領域のサイズを示すsizeユーティリティを使用してみました。したがって、これらの値の合計は、モジュールを挿入した直後にlsmodコマンドによって得られる出力と正確に等しいと予想していました。
init() 関数では動的メモリ割り当て (kmalloc または vmalloc) が実行されないため、違いが生じていないことが保証されます。では、なぜ不一致があるのでしょうか?
不思議なことに、ほとんどの場合、ミスマッチは固定量であることがわかりました!!
コマンド出力は次のとおりです。
サイズ chardev.ko
lsmod
linux - コードとデータを Linux カーネル モジュールの同じセクションに配置する
同じセクションにコードと関連データを入れたいLinuxカーネルモジュールを書いています。次のように、属性タグを使用してデータと関数を宣言します。
ただし、これを行うと、gcc は次のように文句を言います。
特定のセクション名で関数を宣言しない場合、gcc は問題ありません。しかし、関数と変数の両方を同じセクションに入れたいです。
gccでそれを行う方法はありますか? 私のgccバージョンはgcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
visual-studio - Visual Studioを使用してカーネルイメージを構築するにはどうすればよいですか?
VisualC++を使用してx86マシン用の組み込みカーネルを構築したいと思います。コンパイルするCおよびアセンブリコードファイルがいくつかあり、GRUBなどのマルチブートブートローダーと互換性のある方法でそれらをすべてリンクしたいと思います。
windows - Windows XP ブートローダー (NTLDR) はカーネルのインポート宣言に注意を払いますか?
Windows XP ブートローダ ( ntldr
) は実際に Windows カーネル ( ntoskrnl.exe
) のインポート宣言を利用するのでしょうか?
ntoskrnl.exe
には次のインポートされたモジュールがあります: BOOTVID.dll
、HAL.dll
およびKDCOM.dll
。したがって、これら 3 つのモジュールが最初にロードされます。カーネルに、インポート済みとして宣言された別のモジュールがあるとします。ntldr
それもそれをロードする原因になりますか?それともntldr
、これら 4 つのモジュールをロードする必要があることを知っているだけで、それを変更する方法はありませんか?
c++ - 特定のコードで g++ が -mregparm を無視するようにするにはどうすればよいですか?
背景:
個人的なプロジェクトとして、C++ でカーネルを開発しています。順調に進んでいます。実際、私はカーネル ランドで利用可能な多くの C++ を非常によくサポートしています (libc と libstdc++ のほぼ全体を実装しました)。
より困難でコンパイラ固有のものの 1 つは、RTTI と例外のサポートです。今のところ、例外を完全に無効にしていますが、RTTI などはdynamic_cast
非常に便利なので、RTTI が必要です。これを機能させるために、g++ が期待するものと一致する std::type_info の基本的な実装を用意してから、g++ のlibsupc++.a
andにリンクしlibgcc_eh.a
ます。これはうまくいきます。RTTI はチャンピオンのように機能します。
質問:
私はいくつかの最適化オプションをいじっていましたが、いつか -mregparm をコンパイル時の選択肢として使用したいと考えています。明らかに、これはカーネルであり、アセンブリ コードと対話する必要があります。スタックにパラメーターがない場合、適切に機能しない特定の関数があります。これを解決するために、次のマクロを使用します。
繰り返しますが、これは非常にうまく機能します。問題は、dynamic_cast
. コンパイルは、いくつかの暗黙的に定義された内部関数 (前述のサポート ライブラリで定義されている) への呼び出しを発行し、-mregparm フラグを考慮して行います。もちろん、私はシステムのサポート ライブラリにリンクしているので、互換性のある呼び出し規約がある場合とない場合があります (私の場合はありません)。これらの関数は暗黙的 (どのファイルにもプロトタイプがない) であり、長くて壊れた名前を持っているため、asmlinkage 属性をそれらに追加することは (ほぼ) 不可能です。
頭に浮かぶ3つの可能な解決策があります。
- -mregparm を一緒にサポートすることを忘れてください。
- これら 2 つのサポート ライブラリをカーネルと同じフラグで再コンパイルします。これは煩わしく、少し非現実的かもしれません (gcc ビルドからきれいに分離できるかどうかはわかりませんし、ツールチェーンのアップグレードは非常に苦痛になる可能性があります) が、うまくいくはずです。
- 特定の .a/.o ファイルにあるコードを呼び出すときに、何らかの方法でコンパイラが -mregparm を無視するようにします。
オプション3は可能ですか?私の直感はノーですが、ここにはいくつかのg ++の専門家がいるので、私は尋ねると思いました:-)。
linux - オペレーティングシステムのスケジューリングアルゴリズム
I / Oが多いがCPU使用率が低い10Kの同時スレッドをサポートするアプリケーションをスケジュールするために使用するのに最適なアルゴリズムは何ですか?論文へのリンクをいただければ幸いです。