問題タブ [osdev]
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.
kernel - 上位ハーフカーネルの初期化
カーネルを初期化するとき、発生する必要があることがいくつかあります。1)ページングを有効にする必要があります。2)物理メモリマネージャーはgrubからメモリマップを解析する必要があります。3)さまざまな起動コードは必要なデータにアクセスする必要があります。後で使用するためにそこにとどまる(たとえば、GDT、IDT、メモリ管理構造)。
これらのステップ間の依存関係は私を夢中にさせています。上半分では、カーネルはその仮想アドレスでリンクされているため、私が思いついたオプションは次のとおりです。1)アセンブリでページングを有効にします。これには、(アセンブリ内の)すべてのマルチブートポインターをたどって、引き続きアクセスできるようにする必要があります。物理メモリマネージャに接続し、後でそれらすべてのマッピングを解除します。2)起動コードをその物理アドレスにリンクし、ポインタ操作を行って物理アドレスのカーネル構造にもアクセスします。または3)上位半分を使用しないでください。カーネル。
また、コンパイル時に物理メモリの量を知らなくても、物理メモリマネージャをブートストラップすることも含まれます。最初の構造を割り当てるときにすべてのマルチブート構造を慎重に回避するか、最初にすべてを使用してからそれらを上書きすることを心配しないでください(ただし、モジュールとこのアプローチを処理する必要があります)マルチブートテーブルを、物理メモリマネージャーのセットアップ中に必要な既知の場所にコピーする必要があります)。
これらの問題が、私がこれまで上位半分のカーネルを避けてきた理由です。これらの依存関係を解決するための優れたシステムを持っている人はいますか?リンク/仮想アドレスのカーネルと物理アドレスのマルチブートテーブルの両方にアクセスするためのこのGDTトリックのバリエーション、または上記の問題を回避するある種の事前定義されたページテーブルを使用する場合、おそらくPSEが関係しますか?
c - ミニOS:コンパイルおよびアセンブルされた.oファイルのリンク
このページに従って、ブートローダーを組み立て、単純なカーネルをコンパイルしてリンクするための作業環境をセットアップしようとしています。ここにリンクの説明を入力してください
これまでのところすべてがうまくいきましたが、このリンカーエラーを回避できないようです。
私の意見では、古いマニュアルページはあまりにも不可解であり、この特定のエラーメッセージに対する回答はありません。
(私はWindows 7 64ビットを使用しています)
c - stdioなしのC、何が可能ですか?
私はしばらくの間、オペレーティングシステムのプログラミングに興味を持っていました。いくつかの異なるサイトを調べてみると、(言い換えれば)興味深い概念に出くわしました。#includeを使用してブートローダーを書き始めた場合、すでに致命的な間違いを犯しています。
私はK&Rを経験しました、そして本全体が各レッスンを通してそれを含みます。Cの学習全体でそれを使用してきましたが、stdioを使用するものと使用しないものについて、何を学んだかわかりません。stdioなしでCで何ができますか?
c - プロトタイプカーネルとモジュール
最近、古いプロジェクトの1つを選び、ほとんどゼロから再開しました。私はしばらく病気だったので、一生懸命取り締まり、たくさんの機能を実装する時間がありました。ただし、実装するのが良いと思うことの1つは、モジュールのロードです。モジュールのカーネルモードの動的ローディングを実行したい。
モジュールという言葉は少し曖昧です。正しい用語は、カーネルモードドライバ用のCライブラリのミニチュア実装や、 IRQ 0および1にあるPITやキーボードなどの標準的なものなど、ライブラリをロードすることです。私が達成しようとしている方法は、少し自立しています。私のカーネルがロードするモジュールの側面では、ユーザーモードに入るためにカーネル自体で使用されます。
例として、私のカーネルは、自分で実装したCライブラリの関数をほとんど使用していません。これらの関数自体は、GDT、IDT、IRQ、ISRなどのセットアップで使用されます。これらの関数を、カーネルがロードして使用できるライブラリに抽象化したいと思います。つまり、カーネル自体は、何かをセットアップする前に、最初の段階でモジュールをロードする必要があります。
ここで、これを自分で行ういくつかの方法を考えました。たとえば、ライブラリ自体の関数のアドレスが割り当てられた関数ポインターのテーブルを使用して、このライブラリに構造を追加するなどです。ライブラリをout-kludgeファイルとしてコンパイルし、ライブラリをvoid *としてカーネルにロードし(アロケータが機能しているので問題ありません)、構造のオフセットを計算し、voidポインタにその分ステップインします。カーネルで構造を再作成します。関数ポインタのテーブルを割り当てる必要があるため、これは機能するようには聞こえません。つまり、ライブラリ自体に初期化関数が必要です。住所を知っていたとしても、それはどのように呼ばれるのでしょうか?
そのようなローダーをどのように実装できるかについてはわかりませんが、それだけの価値はありますか?可能な限り抽象化したいのですが、私のカーネルはモジュラー設計になっています。また、このメソッドを使用してドライバーやその他のものをロードすることも期待していますが、どのように実装するかはわかりません。私はすでにさまざまな方法を試しましたが、すべて失敗しました。私は何をすべきか?
macos - OS X、gcc、x86、セグメンテーション、ページング、セグ フォールト、バス エラー
osx、gcc、最新の x86 の場合:
x86 セグメンテーション ハードウェアとページング ハードウェアはどのように使用されますか?
c - CPUID を使用してマザーボード情報を見つける方法は?
マザーボード情報 (名前、ID など) を取得する C 関数を開発しようとしていますが、これらの情報が保存されている場所が見つかりません。CPUID を調べましたが、マザーボードに関連するものは見つかりませんでした (ただし、CPU に関する情報はたくさんあります)。
これらの情報をどこから入手できるか知っている人はいますか?
どうもありがとう。
assembly - カスタム割り込み記述子テーブルの混乱
プロテクトモードで動作する小さなOSを書いています。カスタム割り込み記述子テーブルをロードしたいところですが、どこから始めればよいかわかりません。OS Dev wikiでいくつかのことを読みましたが、回答が必要な質問がいくつかあります。
OS Dev wiki ではthe first 32 (0-31) interrupts are reserved and used by the CPU, as exceptions, so don't use those for APIs or IRQs.
、カスタム割り込みテーブルをロードしている場合、それらすべての割り込みにエントリを提供する必要はないということです。
また、ウィキには、BIOS が IRQ0-7 を割り込み 8-15 にマップすると記載されています。この場合、IRQ 割り込みは予約された割り込みと競合しませんか?
私が得ていないものはありますか?割り込み 0 ~ 31 は別のテーブルか何かにありますか? 誰かが私を正しい方向に向けて、物事を片付けてください。
tlb - Intel プロセッサは TLB の無効化を遅らせることができますか?
これは、インテルのソフトウェア開発者マニュアル (注文番号: 325384-039US 2011 年 5 月) を参照して、セクション 4.10.4.4「無効化の遅延」で、TLB エントリの無効化の潜在的な遅延について説明しています。変更されました。
ソフトウェア開発者は、ページング構造エントリの変更とセクション4.10.4.2で推奨されている無効化命令の実行の間に、プロセッサが使用する可能性があることを理解する必要があります。ページング構造エントリの古い値または新しい値のいずれかに基づく変換. 次の項目は、遅延無効化の潜在的な結果のいくつかを説明しています: ページング構造エントリが変更され、R/W フラグが 0 から変更された場合1 にすると、このエントリによって変換が制御されるリニア アドレスへの書き込みアクセスで、ページ フォールト例外が発生する場合と発生しない場合があります。 "
線形アドレスのページ構造エントリが変更され (r/w フラグが 0 から 1 に反転)、その後、対応する TBL 無効化命令がすぐに呼び出される単純なケースを考えてみましょう。私の質問は、TLB の無効化の遅延の結果として、TLB の無効化を呼び出した後でも、問題の線形アドレスへの書き込みアクセスが失敗しない可能性があるということです (ページ フォールト)。
または、「遅延無効化」は、ページ構造が変更された線形アドレスの「無効化」命令が発行されていない場合にのみ、予測できない結果を引き起こす可能性がありますか?
c# - ngen.exeを使用してカーネルをコンパイルする
CosmosとSharpOSが独自のコンパイラを作成してC#からバイナリコードを構築していることは理解していますが、Microsoftの.NET AOTを使用して同じことを行うことはできますか?C#をx86にコンパイルします。ステートメントを含める場合は、OS開発のように、ステートメントの使用を省略しなければならないと思います。フィードバックをいただければ幸いです。ありがとう
編集:カーネル開発でC#を使用したい主な理由は、マネージコードがもたらすメモリ管理、特に単一のアドレス空間プロパティのためです。JITコンパイラを起動してから、C#をコンパイルする必要がありますか?それとも、その時点で環境はまだ機能不全に陥っていますか?フィードバックをありがとう