OSをつくろうpart3

このエントリーをはてなブックマークに追加
932ひげぽん:02/11/09 00:41
>>928 :FreeDOS教徒さん
携帯からの入力thanx!!

ところで
>原因わかった。ディスク読み込みでブートコード破壊してた
これは、
最初の512byteだけですか、それとも???
ブートコードを破壊してる場所が明確で、修正が簡単に可能ならば
そちらを修正しようと思っています。

>start:
>xor ax,ax
>mov ds,ax
>mov si,0x7c00
>mov ax,0x9e00
>mov es,ax
>xor di,di
>mov cx,0x0200
>rep movsb

0x7c00:0000→0x9e00:0000へ1024byte分コピー
933ひげぽん:02/11/09 00:43
mp 0x9e00:next

>next:
>mov ds,ax
>mov ax,0x8e00
>mov ss,ax
>mov sp,0xfffe
上位アドレス0x9e00:nextにて実行を続行???

ちょっと今日は、特に頭が回らない・・・
明日考えます。
934 :02/11/09 06:54
show-mona...
935FreeDOS教徒:02/11/09 07:45
>>ひげぽん
54セクタ読もうとすると
0x1000+(0x200*0x36)=0x7c00
でブートコードを破壊するのは分かりますよね。

だからブートコードを上位の空きメモリに移してそこで実行を続けています。
こうすることで最大640KB程度のカーネルまで読み込めるはずです。
936FreeDOS教徒:02/11/09 08:04
ちょっとつっこみ。

×0x7c00:0000
○0x07c0:0000(0x0000:7c00)
×1024バイト読み込み
○512バイト読み込み
937929:02/11/09 22:34
はじめて読む486っていう本読みました?>ひげぽそ
>>937
まぁ、過去ログでも読めや
939ひげぽん:02/11/10 15:30
FreeDOS教徒さん

ひげぽんの遅い理解を以下にまとめて見ます。
間違い等ありましたら、突っ込みをお願いいたします。


512byteのブートコードは 0x07C0:0000(0000:0x7C00) に読み込まれます。

そのブートコード中では 0x0100:0000(0000:0x1000) をバッファの先頭として
後続のコードをFDより読み込みます。

ところが54セクタ読み込むと

読み込まれるサイズは 512byte * 54 = 0x6C00 となり
0x0100:0000(0000:0x1000) から読み込んだ場合
0x07C0:0000(0000:0x7C00) にあるブートコードを上書きしてしまいます。

これが問題となるのは
secondboot.bin + third.binのコードサイズが
54セクタ(512 * 54 = 27Kbyte)を超えたときです。

これを回避するためにFreeDOS教徒さんは

ブートコードが 0x07C0:0000(0000:0x7C00) が読み込まれて実行されている
途中でブートコードを
まるごと 0x9E00:0000(0000:0x9E000) へコピーしてそちらで実行を続けるという策を
とられています。

この方法を使えば理論上
(0x9E000 - 0x1000) = 628kbyte まで読み込むことが可能になります。
940ひげぽん:02/11/10 15:31
>>937
いぜんhigeposのブートコードを書くときに
エイッと読んでいたのですが、すっかり忘れていました。
もう一度読み返しているところです。
ブーに注意
942FreeDOS教徒:02/11/10 23:16
>>ひげぽんさん
それで正解です。ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
943デフォルトの名無しさん:02/11/10 23:29
>>942 FreeDOS教徒 さん

>それで正解です。
ありがとうございます。

>ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
                                 ~~~~~~~~~~~~~~~
                               ↑
                          この辺が重要なんでしょうね。
ちょっとうまくいっていないのですが、もう少しがんばってみます。
944ひげぽん:02/11/11 21:15
>>943の書き込みは私です。

ブートコード問題多分解決しますた。
今現在higepos PJメンバーに動作確認してもらっています。
Linux(not cross)で動作確認OKでした。
946ひげぽん:02/11/11 22:25
>>945
ありがとうございます。
原因は後ほど、報告いたします。
947ひげぽん:02/11/11 22:57
確認が取れましたので

■現象
最新版マルチセクタ読み込みfirstboot.asmで正しく
読み込まれているはずなのに、

int_trap_gate(): selector nullのエラーがでる。

■原因

idtrのアドレスがhigeIdt.hで0x6800に設定されていました。
これじゃあ上書きされてしまいます。

■対処

higeIdt.h:0x6800→0x0500(ここなら安全か??)
948LightCone ◆sSJBc30S5w :02/11/12 10:33
>>947
ひげぽんさん。お久しぶりです。

お忙しいならご返答は適当でいいのですが、DISK BIOSでセクタを
読むとき、複数回のBIOS呼び出しで、1セクタずつ読むより、
連続セクタを一回のBIOS呼び出しで読んだ方がやはり速いんでしょうか?
 ∧_∧
< `ー´>-~~~
PC/AT機のBIOSだと、readコール発行する毎に
シリンダをシークしてるような機械的挙動ですね。
1セクタ毎だと倍程度の読み込み時間がかかってしまう。
950デフォルトの名無しさん:02/11/12 15:37
>947 ひげぽんさん
>■原因
>
>idtrのアドレスがhigeIdt.hで0x6800に設定されていました。
>これじゃあ上書きされてしまいます。
>
>■対処
>
>higeIdt.h:0x6800→0x0500(ここなら安全か??)

配列を使えば,そんなもんだいは解決します。

ソースはこんな感じで
idt_st idt[HANDLER_NUM];

for (int i=0;i < HANDLER_NUM; i++)
{
void* p = handlers[i].handler;
idt[i].offsetL = (int)(p) & 0xFFFF;
idt[i].offsetH = ((int)(p) >> 16 & 0xFFFF ;
idt[i].selector = 0x08;
idt[i].type = 0x8E;
idt[i].unused = IDT_UNUSED;
}

idtr.limit = sizeof(idt_st) * HANDLER_NUM -1;
idtr.highbase = (int)(&idt) >> 16 & 0xffff;
idtr.lowbase = (int)(&idt) & 0xffff;
951ひげぽん:02/11/12 18:06
LightConeさん、超先生@OS板さんおひさしぶりです。

LightConeさんwrote
>お忙しいならご返答は適当でいいのですが、DISK BIOSでセクタを
>読むとき、複数回のBIOS呼び出しで、1セクタずつ読むより、
>連続セクタを一回のBIOS呼び出しで読んだ方がやはり速いんでしょうか?
超先生@OS板さん wrote
>PC/AT機のBIOSだと、readコール発行する毎に
>シリンダをシークしてるような機械的挙動ですね。
>1セクタ毎だと倍程度の読み込み時間がかかってしまう。

数値で具体的に示せないのが申し訳ないのですが
1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
1秒にも満たない時間ですが・・・
952ひげぽん:02/11/12 18:24
>>950
ありがとうございます。
なるほどそんな方法があるのですね。
ちょっと良く考えてみます。
953FreeDOS教徒:02/11/12 19:14
そろそろ次スレ立てねぇ?>ひげぽん
954ひげぽん:02/11/12 19:22
>>953
次スレたてますた。
こちらへ移行をお願いします。
http://pc3.2ch.net/test/read.cgi/tech/1037096449/
955LightCone ◆sSJBc30S5w :02/11/13 07:41
>>951
お忙しい所、返答有難うございます。

>数値で具体的に示せないのが申し訳ないのですが
>1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
>1秒にも満たない時間ですが・・・

これは、60セクタ程度を、1セクタずつBIOSコールで読み込むのが、
トータル1秒未満で行える、ということですか。

間違っていたらすみません。
956LightCone ◆sSJBc30S5w :02/11/13 07:50
>>955
higeposのソースを見てみると、最大1トラック(18セクタ)をちゃんと
一度に読むようになってるみたいですね。
うめてよいよね?



だめ?
>>958
協力しましょう。
>>958
いいと思うよ。
また〜りと うめたて
962ひげぽん:02/12/11 00:57
気づいてしまいました(笑)
まったり埋め立て作業中
964sage:02/12/11 14:24
うめ
本当にまったりだね。ひげぽんの人徳ですな。
だよねー。ひげぽんちゃんと頑張ってたし、適度に高度な話題だから、厨房が寄り付かなかったしね。
上げないでね
968sage:02/12/12 22:23
sageつつ、埋め!
本擦れ上げた方がいいんじゃない?とかいいつつ埋め!
970みとこ ◆AEqcy/sQU6 :02/12/13 21:14
ヽ(`ー´)ノ
|[Aqua+]|ー´>埋め立てるならイマノウチ
|[Aqua+]|ー´>埋め立てるならイマノウチ
973ひげぽん:02/12/13 21:24
( ゚д゚)
ひげぽんさんだ!がんばって!! 埋め埋め埋め
975偽ひげぽん:02/12/14 07:04
埋めまくり(・∀・)
976うふぅ:02/12/15 01:29
ドキドキ・・・
977うふぅ:02/12/15 01:30
ドッキンキン
978うめ:02/12/15 03:15
うめまするぅ〜
979ひげぽん:02/12/15 11:12
┐(´∇`)┌本物
うめ
うっめ〜〜〜〜っ。