問題タブ [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.
assembly - x86cr3およびlinuxswqpper_pg_dir
Linuxソースコード(バージョン2.6.18)の場合:
また、load_cr3(pgdir)
およびwrite_cr3(x)
マクロ:
cr3
制御レジスタ全体がページディレクトリのアドレスを格納しているようです。ただし、Intel ia-32 Developer's_Manualを参照すると、別の話になります。インテルのマニュアルには次のように書かれています。
マニュアルによると、最上位20ビットはレジスタcr3
全体ではなくページディレクトリのアドレスを格納しますcr3
。また、ページディレクトリが正確に4kbであるため、アドレスの最下位12ビットは常にゼロであるため合理的です。
ちょっと変じゃないですか?cr3
Linuxコードは、の最上位20ビットではなく、ページディレクトリのアドレスを割り当てるだけswapper_pg_dir
です。レジスターは正確に何cr3
を保存しますか、インテルのマニュアルが示唆するアドレスまたはフォーマットは何ですか?
次のリンクはIntelのマニュアルです:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
c - 循環参照と低レベルアセンブリ
というファイルがあります。このファイルでは、アセンブリからidt.c
関数を呼び出す必要があります。idt_load
これで、アセンブリファイルから変数にアクセスする必要がidtp
あり、変数がidt.cで宣言されていることを除いて、これは問題なく機能します。
リンカはidt_loadが未定義であるか、idtpが未定義であると通知するため、これは機能しません。どうすればこれを機能させることができますか?
idt.cの関連部分
idt.asm
x86 - マルチコアのCPUID/NUMA
趣味のOSのCPU検出と一般環境検出コードに取り組んでいます。CPUIDを複数回呼び出す必要がある場合はありますか?つまり、システムに複数のコアがある場合、OSは各コアでCPUIDを呼び出す必要がありますか?NUMAについても同じです。
AMDとIntelのCPUIDマニュアルはどちらもこれについて不明確です。osdev wikiに、Detecting CPU Topologyと呼ばれるCPUIDの呼び出しについて言及している記事がありますが、私の読書では、CPUIDを呼び出す必要があるタイミングと回数が明確ではありませんでした。
c++ - 「gdt_flush」に指定されたストレージ クラス
いくつかの外部アセンブラ関数とのインターフェイスが必要なオペレーティング システムを作成しています。宣言をヘッダーに入れました:
コードが実行されると、生成されます
DescriptorTables.h:10:31: エラー: 'gdt_flush' に指定されたストレージ クラス
以前にこのエラーを見たことがありません。これを修正する方法についてのアイデアはありますか?
x86 - LDTは必要ですか?
32ビットx86プロセッサ用のOS開発の一環として、ページフォールトベクトルの割り込み記述子テーブルでタスクゲートを使用することを検討しています。目的は、ハンドラーのスタックがマップされることが保証されるようにタスクの切り替えを強制することです(そして、中断されたタスクのスタックの一部がマップされなかった場合を回避します)。
QEMUでカーネルを実行していますが、ページフォールトが発生すると、クラッシュすることがわかりました(コマンドプロンプトに戻ります)。私は正確な原因を理解するのに役立つかもしれないヒントを探して読んで掘り下げてきました。何かが足りない、または何かを誤解していると思います。ちなみに、割り込みゲートを使用するようにページフォールトvecotrを設定すると、期待どおりに動作させることができます。このためにタスクゲートを使おうとすると、問題が発生します(もちろん、タスクゲートを使い続けたいと思います)。
IDT部分は、ページフォールトベクトルのタスクゲートを登録するように正しく設定されています。そのセレクターは、GDTのTSSの記述子を参照します。GDTのTSSの記述子に関しては、私も適切に設定されていると確信しています。
ただし、TSSが適切に設定されていて、これまですべてのフィールドを正確に設定する方法を決定できなかったかどうかは、100%確実ではありません。esp、eip、cs、ds、es、fs、gs、ss、eflagsなどのいくつかは比較的単純です。ただし、LDTセグメントセレクターなどの他のものはあまり明確ではありません。LDTセグメントセレクターはゼロ以外であり、GDTのLDT記述子を指している必要がありますか?上記のシナリオでは、これらのフィールドのどれを設定する必要がありますか?私はこれを理解するのにかなりの時間を費やしています。
どんな助けでも大歓迎です。
user-interface - 自作OSでGUI環境を開発
「hello world」を出力するcのカーネルでデスクトップOSを作成しました。C で自分の OS 用の GUI (カスタム ウィンドウ マネージャー、ボタン) を作成しようとしていますが、問題が発生しています。私は1つのチュートリアルを見ました:
http://www.osdever.net/tutorials/view/gui-development
Cのデスクトップ オペレーティング システム用の GUI チュートリアルの種類はありますか?
ps Linux も DOS もありません。C標準のみ。
c++ - 'idt_entry_t (*)[256] を u8int* に変換できません
私はやろうとしています
生産する
エラー: 'idt_entry_t (*)[256] {aka idt_entry_struct ( )[256]}' を 'u8int {aka unsigned char*}' に変換できません (引数 '1' から 'void memset(u8int*, u8int, u32int)' へ)
それが役立つ場合、それは でラップされた C コードですextern "C" {...}
。
ありがとう!
operating-system - カーネル モードとメモリ保護
オペレーティング システム ユーザー モードでは、アプリケーションの仮想アドレス空間はプライベートであるため、あるアプリケーションが別のアプリケーションに属するデータを変更することはできません。各アプリケーションは分離して実行され、アプリケーションがクラッシュした場合、クラッシュはその 1 つのアプリケーションに限定されます。他のアプリケーションとオペレーティング システムは、クラッシュの影響を受けません。
なぜカーネル モード OS でメモリを保護せず、BOSD が発生するのですか??
assembly - この Intel 82340SX で、8086 チップのチュートリアルの知識を使用できますか?
最近、古い (非常に古い) ラップトップを見つけましたが、アセンブリと基本的な OS 開発を学ぶ絶好の機会かもしれません。
アセンブリ チュートリアルはほとんどの場合 8086 チップに特化しているため、私の質問は、この Intel 82340SX は何か違いがありますか? 言語の使用に関して何か変更はありますか?
paging - ページフォールト後の命令の再開
私はCでオペレーティングシステムを開発していて、ページングに苦労しています。メモリを割り当て、物理ページと仮想ページの割り当てを処理する低レベルのメモリ割り当て出力を出力することで、カーネルヒープをループでテストしています。
の場合PDE 0
、すべてがページに対して正常に機能します0-1023
が、割り当てがに移動するとすぐにPDE 1
、現在のフラグが設定された状態でページフォールトが発生しrw
、別の物理アドレスから割り当てを開始するとフラグも発生することがあります。
障害のあるアドレスを取得して、それが属するページにcr2
マップし直してから、アドレスを3に設定する必要がありますか?PDE
その後、命令を再開する必要がありますが、どうすればよいですか?助言がありますか?