>>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分コピー
mp 0x9e00:next
>next:
>mov ds,ax
>mov ax,0x8e00
>mov ss,ax
>mov sp,0xfffe
上位アドレス0x9e00:nextにて実行を続行???
ちょっと今日は、特に頭が回らない・・・
明日考えます。
show-mona...
>>ひげぽん
54セクタ読もうとすると
0x1000+(0x200*0x36)=0x7c00
でブートコードを破壊するのは分かりますよね。
だからブートコードを上位の空きメモリに移してそこで実行を続けています。
こうすることで最大640KB程度のカーネルまで読み込めるはずです。
ちょっとつっこみ。
×0x7c00:0000
○0x07c0:0000(0x0000:7c00)
×1024バイト読み込み
○512バイト読み込み
はじめて読む486っていう本読みました?>ひげぽそ
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 まで読み込むことが可能になります。
>>937 いぜんhigeposのブートコードを書くときに
エイッと読んでいたのですが、すっかり忘れていました。
もう一度読み返しているところです。
ブーに注意
>>ひげぽんさん
それで正解です。ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
943 :
デフォルトの名無しさん:02/11/10 23:29
>>942 FreeDOS教徒 さん
>それで正解です。
ありがとうございます。
>ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
~~~~~~~~~~~~~~~
↑
この辺が重要なんでしょうね。
ちょっとうまくいっていないのですが、もう少しがんばってみます。
>>943の書き込みは私です。
ブートコード問題多分解決しますた。
今現在higepos PJメンバーに動作確認してもらっています。
Linux(not cross)で動作確認OKでした。
>>945 ありがとうございます。
原因は後ほど、報告いたします。
確認が取れましたので
■現象
最新版マルチセクタ読み込みfirstboot.asmで正しく
読み込まれているはずなのに、
int_trap_gate(): selector nullのエラーがでる。
■原因
idtrのアドレスがhigeIdt.hで0x6800に設定されていました。
これじゃあ上書きされてしまいます。
■対処
higeIdt.h:0x6800→0x0500(ここなら安全か??)
>>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;
LightConeさん、超先生@OS板さんおひさしぶりです。
LightConeさんwrote
>お忙しいならご返答は適当でいいのですが、DISK BIOSでセクタを
>読むとき、複数回のBIOS呼び出しで、1セクタずつ読むより、
>連続セクタを一回のBIOS呼び出しで読んだ方がやはり速いんでしょうか?
超先生@OS板さん wrote
>PC/AT機のBIOSだと、readコール発行する毎に
>シリンダをシークしてるような機械的挙動ですね。
>1セクタ毎だと倍程度の読み込み時間がかかってしまう。
数値で具体的に示せないのが申し訳ないのですが
1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
1秒にも満たない時間ですが・・・
>>950 ありがとうございます。
なるほどそんな方法があるのですね。
ちょっと良く考えてみます。
そろそろ次スレ立てねぇ?>ひげぽん
>>951 お忙しい所、返答有難うございます。
>数値で具体的に示せないのが申し訳ないのですが
>1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
>1秒にも満たない時間ですが・・・
これは、60セクタ程度を、1セクタずつBIOSコールで読み込むのが、
トータル1秒未満で行える、ということですか。
間違っていたらすみません。
>>955 higeposのソースを見てみると、最大1トラック(18セクタ)をちゃんと
一度に読むようになってるみたいですね。
うめてよいよね?
だめ?
また〜りと うめたて
気づいてしまいました(笑)
まったり埋め立て作業中
うめ
本当にまったりだね。ひげぽんの人徳ですな。
だよねー。ひげぽんちゃんと頑張ってたし、適度に高度な話題だから、厨房が寄り付かなかったしね。
上げないでね
sageつつ、埋め!
本擦れ上げた方がいいんじゃない?とかいいつつ埋め!
ヽ(`ー´)ノ
|[Aqua+]|ー´>埋め立てるならイマノウチ
|[Aqua+]|ー´>埋め立てるならイマノウチ
( ゚д゚)
ひげぽんさんだ!がんばって!! 埋め埋め埋め
埋めまくり(・∀・)
ドキドキ・・・
ドッキンキン
うめまするぅ〜
┐(´∇`)┌本物
うめ
うっめ〜〜〜〜っ。