質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

2617閲覧

【アセンブリ言語】プロテクトモードへの移行

退会済みユーザー

退会済みユーザー

総合スコア0

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

2クリップ

投稿2015/08/06 01:29

編集2015/08/07 03:49

プロテクトモードへの移行をしたいんですが、仮想OSが重大エラーが起きて、上手くできないんです。まだ初めてばかりですので、どうかよろしくお願いします。

追記****
A20以上有効とプロテクトモード有効をBIOSサービス割り込みのシステムサービスでやっても、重大エラーが起きたので、もしかしたらGDTの内容が間違っている部分があるかもしれません。よろしければGDTの解説もお願いします。

【変更したソースの一部】

Assembly

1 CALL Enable_A20;A20以上有効 2 3 MOV EAX, CR0; CR0レジスタの値を読み出します 4 OR EAX, 1; PEビットをOR命令でONします 5 MOV CR0, EAX; そのままCR0に書き込みます 6 JMP CODE_DESC:OS32 7------------------------------------------------------------------------------------------------- 8Enable_A20: 9 CLI; 割り込み禁止 10 11 CALL A20wait; ウェイト処理 12 MOV AL, 0xAD; キーボード無効化 13 OUT 0x64, AL 14 15 CALL A20wait; ウェイト処理 16 MOV AL, 0xD0; リードアウトプットポートコマンド送信 17 OUT 0x64, AL 18 19 CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト 20 IN AL, 0x60; リードバッファレジスタ読み込み 21 PUSH EAX; 読み込んだデータをスタックに保存 22 23 CALL A20wait; ウェイト処理 24 MOV AL, 0xD1; ライトアウトプットポートコマンド送信 25 OUT 0x64, AL 26 27 CALL A20wait; ウェイト処理 28 POP EAX; 読み込んだアウトプットポートの値を元に戻す 29 OR AL, 0x2; A20有効ビットを1にする 30 OUT 0x60, AL; A20有効にする出力データを送信 31 32 CALL A20wait; ウェイト処理 33 MOV AL, 0xAE; キーボード有効 34 OUT 0x64, AL 35 36 CALL A20wait; ウェイト処理 37 38 STI; 割り込み有効 39 RET 40A20wait:; ウェイト処理関数 41 IN AL, 0x64; ステータスレジスタ読み込み 42 TEST AL, 0x2; 送信したコマンド処理が完了をチェック 43 JNZ A20wait; 完了していない場合はループ 44 RET 45A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数 46 IN AL, 0x64; ステータスレジスタ読み込み 47 TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック 48 JZ A20wait2; 書き込まれていない場合はループ 49 RET 50

Assembly

1 MOV AX, 0x2401;A20以上有効 2 INT 0x15 3 4 MOV AH, 0x89;プロテクトモード有効 5 PUSH CODE_DESC 6 POP ES 7 MOV SI, OS32 8 INT 0x15

【仮想OSソフトウェア】
Oracle VM VirtualBox
VMware

【コンパイラ】
nasm

【現状】
初期化済み
カーネルロード済み
さらに初期化済み
VESAモード設定済み
GDT設定済み
A20以上有効済み
CR0でプロテクトモード有効・・・重大エラー発生
↓を追記して、コンパイルし、仮想OS起動すると重大エラーが起きました

Assembly

1 MOV EAX, CR0; CR0レジスタの値を読み出します 2 OR EAX, 1; PEビットをOR命令でONします 3 MOV CR0, EAX; そのままCR0に書き込みます 4 JMP CODE_DESC:OS32

【一部ソース】

Assembly

1CODE_DESC EQU 0x08 2DATA_DESC EQU 0x10 3 4[BITS 16] 5 6ORG 0xC200 7 8JMP OS 9 10%include "SetVESAmode.inc" 11 12OS: 13 ;初期化 14 XOR AX, AX 15 XOR BX, BX 16 XOR CX, CX 17 XOR DX, DX 18 MOV DS, AX 19 MOV ES, AX 20 MOV AX, 0x9000 ; スタックポインタを0x0009FFFCに設定する 21 MOV SS, AX 22 MOV SP, 0xFFFC 23 24 ;ビデオモード自動設定 25 CALL SET_VIDEO_VESA 26 JNC .set_video_vesa_OK 27 JMP fin 28 29 .set_video_vesa_OK: 30 31 CALL _setup_gdt;GDT設定 32 CALL Enable_A20;A20以上有効 33 34 MOV EAX, CR0; CR0レジスタの値を読み出します 35 OR EAX, 1; PEビットをOR命令でONします 36 MOV CR0, EAX; そのままCR0に書き込みます 37 JMP CODE_DESC:OS32 38 39 JMP fin 40 41_setup_gdt: 42 CLI 43 PUSHA 44 LGDT [gdt_OS32] 45 STI 46 POPA 47 RET 48 49Enable_A20: 50 CLI; 割り込み禁止 51 52 CALL A20wait; ウェイト処理 53 MOV AL, 0xAD; キーボード無効化 54 OUT 0x64, AL 55 56 CALL A20wait; ウェイト処理 57 MOV AL, 0xD0; リードアウトプットポートコマンド送信 58 OUT 0x64, AL 59 60 CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト 61 IN AL, 0x60; リードバッファレジスタ読み込み 62 PUSH EAX; 読み込んだデータをスタックに保存 63 64 CALL A20wait; ウェイト処理 65 MOV AL, 0xD1; ライトアウトプットポートコマンド送信 66 OUT 0x64, AL 67 68 CALL A20wait; ウェイト処理 69 POP EAX; 読み込んだアウトプットポートの値を元に戻す 70 OR AL, 0x2; A20有効ビットを1にする 71 OUT 0x60, AL; A20有効にする出力データを送信 72 73 CALL A20wait; ウェイト処理 74 MOV AL, 0xAE; キーボード有効 75 OUT 0x64, AL 76 77 CALL A20wait; ウェイト処理 78 79 STI; 割り込み有効 80 RET 81A20wait:; ウェイト処理関数 82 IN AL, 0x64; ステータスレジスタ読み込み 83 TEST AL, 0x2; 送信したコマンド処理が完了をチェック 84 JNZ A20wait; 完了していない場合はループ 85 RET 86A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数 87 IN AL, 0x64; ステータスレジスタ読み込み 88 TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック 89 JZ A20wait2; 書き込まれていない場合はループ 90 RET 91 92gdt_OS32: 93 DW 8*3 94 DD _gdt 95_gdt: 96 ;NULL 97 DW 0x0000 98 DW 0x0000 99 DW 0x0000 100 DW 0x0000 101 ;コード 102 DB 0xFF 103 DB 0xFF 104 DW 0x0000 105 DB 0x00 106 DB 0x9A 107 DB 0xCF 108 DB 0x00 109 ;データ 110 DB 0xFF 111 DB 0xFF 112 DW 0x0000 113 DB 0x00 114 DB 0x92 115 DB 0xCF 116 DB 0x00 117 118fin: 119 HLT 120 JMP fin 121 122[BITS 32] 123 124OS32: 125 ;初期化 126 MOV AX, DATA_DESC; DATA_DESCには0x10が入っています 127 MOV SS, AX; 以下データセグメントセレクタを入れています 128 MOV ES, AX 129 MOV FS, AX 130 MOV GS, AX 131 MOV DS, AX 132 133 MOV ESP, 0x90000; スタックポインタも初期化します 134 135fin32: 136 HLT 137 JMP fin32

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/01/29 22:30

これってfar jmpをせずに movでセグメントレジスターを設定しているから cpuの先読みのところでおかしくなっているのでは? と思ったのですが 違うのでしょうか?
kazuyakazuya

2020/01/29 22:30

OS32: ;初期化 MOV AX, DATA_DESC; DATA_DESCには0x10が入っています MOV SS, AX; 以下データセグメントセレクタを入れています MOV ES, AX MOV FS, AX MOV GS, AX MOV DS, AX MOV ESP, 0x90000; スタックポインタも初期化します
guest

回答1

0

ベストアンサー

丸投げ感溢れる回答です。先に謝っておきます…ごめんなさい。

自分はOSを作るところまでの興味は持ち合わせていなかったのでブートローダの動作を読んだ程度ですが、もしPC向けOSの習作を考えているのであれば、この記事が足掛かりにできるのではないでしょうか。

ご存知なければ、一読してみては如何でしょう。

投稿2015/08/06 04:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/06 05:34

その記事と本(30日でできる!OS自作入門)を読みながら勉強していたので、参考にできなくて申し訳ありません。
退会済みユーザー

退会済みユーザー

2015/08/07 11:26 編集

GDT絡みで、他に以下のようなものを見つけたので貼っておきますね。 http://d.hatena.ne.jp/outland_karasu/20070522/1179828082 http://home.in.tum.de/~hauffa/slides.pdf gcc環境なので nasmと記述様式の違う部分がありますが、設定値の参考にはなるかと。 あと気になるのは、そもそもプログラムのメモリ配置。 最初のうちは意図通りロードされているか確認しておく必要があるように思います。 英語ですが nsam使って解説されてる方がいらっしゃったので、これも。 http://www.brokenthorn.com/Resources/OSDev8.html
退会済みユーザー

退会済みユーザー

2015/08/10 01:29

プロテクトモードへの移行できたかわかりませんが、紹介してもらったhttp://www.brokenthorn.com/Resources/OSDev8.htmlのGDT.incをインクルードし、CALLで処理させたら、BIOSサービス割り込みのプロテクトモード有効処理はエラーが起きましたが、前に設定してあったCR0のPE変更に元に戻すとエラー起きませんでした。解決できたと思うので何かまた問題など起きましたら、よろしくお願いします。
退会済みユーザー

退会済みユーザー

2015/08/10 12:05

プロテクトモードへの移行が問題なくできているので、助かりました。
退会済みユーザー

退会済みユーザー

2015/08/10 13:12 編集

後顧の憂はなくした方がいいので、GDTの設定内容は早めに把握した方がいいと思いますよw ともあれ役に立って良かったです。 頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問