問題タブ [real-mode]
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 - 割り込み 21 で dx の代わりに ax を使用する
次のコードでは
dx を ax に変更した場合
アウトプットになる1 'Sum is
けど、使えばlea ax,str
正解 >Sum is :
理由がわかりません!
dx を ax に変更すると間違った出力が発生するのはなぜですか?
x86 - 386 以上のプロセッサでベクトルをリセット
リセットベクターのウィキペディアページには次のように書かれています(386以上のプロセッサの場合):
リセット時の CS レジスタのセレクタ部分の値は F000h、CS レジスタのベース部分の値は FFFF0000h、リセット時の IP レジスタの値は FFF0h で、セグメント化されたアドレス FFFFF000h:FFF0h をリアル モードで形成します。 .
コンピューターの起動に関する私のすべての読書は、プロセッサがリアルモードで起動することを示しているため、「セレクター」は表示されません。では、なぜここで言及するのですか?また、ここで言及されている「ベース部分」とは何ですか。また、どのレジスタに格納されていますか? 基本的に、リセット ベクターが 386 プロセッサと以前のプロセッサでどのように異なって設定されているかがわかりません。
assembly - リアル モード 32 ビット レジスタ
私はいくつかのリアル モード コードを書いており、そのために 32 ビット レジスタを使用しています (0x66 プレフィックスを使用)。
Intel のマニュアルを調べましたが、探している情報が見つかりません。参照: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html (ボリューム 1 の第 1 章から第 7 章、およびボリューム 2 の具体的な説明をざっと読みました)
インテルは、リアル モード コードで次のコードの特定の動作を保証しますか? プロテクトモードコードと同じですか?
注: 私は、特定の実装がどのように動作するか (つまり、それをチェックするコード -- すべての実装が常に同じように動作する場合を除く) については知りません。Intel がこの動作を文書化した場所だけです。
関連: x86_64 レジスタ rax/eax/ax/al が完全なレジスタ内容を上書きする
違い: この質問は、特にリアル モードの操作と、リンクされた質問からの観察がリアル モードで有効かどうかに関連しています。
リアルモードコードについてこれが文書化されている場所を見つけるのを手伝ってくれる人はいますか?
ios - Realm データベースが非常に大きいのはなぜですか?
下の画像はすべての Realm クラスとデータを示していますが、300MB を超えています。
RLMObject ごとに save メソッドを実装していますが、問題は発生しますか?
assembly - CR0 で PE フラグを設定すると、保護モードがどのように有効になりますか?
マシンの電源を入れてからカーネルを実行するまでの過程を理解しようとしています。私が収集したことから、最終的にはページ ディレクトリとページ テーブルを使用し、セグメンテーションをオフにして従来型の仮想メモリ プランに切り替える場合でも、起動時に保護モードに切り替えると、より多くのアドレス指定可能なメモリにアクセスできるようになると便利です。 .
保護モードに切り替えるには、次の 3 つのことを行う必要があるようです。
- グローバル記述子テーブル (gdt) をセットアップし、次の
lgdt
命令を使用してロードします。 - 制御レジスタ CR0 の PE フラグ/ビットを有効 (値 1) に設定します。
- で走り幅跳びをする
ljmp
gdt で使用するために、セグメント レジスタと命令ポインタをインデックスとオフセットに変換するロジックについて疑問に思っています。このロジックはハードウェアによって達成されますか? もしそうなら、どのハードウェアのljmp
一部で、なぜプロセスの一部が実行されるのですか? CR0 に PE フラグを設定して、プロテクト モードを有効にしないのはなぜljmp
ですか?
c - BIOS からの Linux OS カーネルのロード
本から:電源投入後、 をCPU
ロードしBIOS
、割り込みベクタ テーブルを構築し、実アドレス モードで割り込みサービス ルーチンを開始します。によりBIOS
、 がCPU
受け取りINT 0x19
ます。のは、最初のセクタ (512B) をメモリISR
にロードします。INT 0x19
このセクタは、OS の他の部分をメモリにロードする Linux のブート部分です。
最初のセクターはbootsect.s
で、アセンブリで記述されています。これは、メモリにロードされる最初のシステム コードです。アセンブリ命令がロードされているのか、コンパイルされたマシン命令がメモリにロードされているのか疑問です。BIOS には、assembler
アセンブリをマシン命令に変換するためのネイティブ機能がありますか?
c - カーネル開発: リアル モードで ES:DI を設定する
私は楽しみと教育のためのおもちゃのカーネルに取り組んでいます (クラスのプロジェクトではありません)。INT 0x15, EAX=E820
メモリ マネージャの作業を開始しているので、リアル モードのまま呼び出しを使用して BIOS からメモリ マップを取得しようとしています。私はosdev wikiから自分の機能を適応させています(ここでは、「E820メモリマップの取得」セクションにあります)。ただし、これを C コードから呼び出すことができる関数にしたいので、少し変更しようとしています。マップ エントリを格納する場所へのポインタと、テーブル内のエントリの数だけインクリメントされる整数へのポインタです。
ウィキによると、ES:DI
はデータを保存する場所を指す必要があるため、最初の引数を 2 つ (セグメント セレクターpointer_to_map / 16
とオフセットpointer_to_map % 16
) に分割しました。C コードの一部を次に示します。
これが私の ASM コードの一部です。
プログラムがトリプル フォールトを起こし、そこで VM をシャットダウンするため、ここに貼り付けているのはそれだけです。コマンドを移動するret
と、最初の行で関数がクラッシュすることがわかりました。C で呼び出しをコメントアウトすると、すべてが期待どおりに機能します。
直接設定する理由はほとんどないことをGoogleで読んだことがありES:DI
ます。私が見つけたコードでは、それをリテラルに設定しています。どのように設定ES:DI
すればよいですか? また、直接設定しない場合は、C と ASM が正しく対話するようにするにはどうすればよいですか?
x86 - 保護モードで実行するように BIOS を作成できないのはなぜですか?
8088 ベースのコンピューターまたは 80286 より前のコンピューターがまだ使用されていますか? これらの古いプロセッサがもう使用されていないのに、「first-starting-in-real-mode」の下位互換性機能がまだ存在している必要があるのはなぜですか? プロセッサが保護モードで直接実行できず、すべての互換性ハックなどを回避できないのはなぜですか? プロテクト モードで直接実行するように BIOS を記述できないのはなぜですか?