q_and_aの過去ログ(0007)

  • (by K, 2007.04.16)

ログ

  • 初版第6刷のP169とP53からの質問です。qa_log/0005でも質問が出ているのですが、なぜブートセクタが0x8000に存在するのが分かったのでしょうか?P53には「でも、0x8000〜0x81ffの512バイトには後でブートセクタの内容を入れようかなと思ったのです。」と書いてあります。そして、「0x7c00〜0x7dffはブートセクタが使っています。」と書いてあります。ブートセクタが0x7c00に読み込まれるのはipl10.nasに指示してあるのですが、0x8000に読み込まれるのはどこにも書いてないので分かりません。もうひとつは、P169のmemcopy(DSKCAC0+512,DSKCAC+512,cyls*512*18*2/4-512/4);のところで最後に512/4でブートセクタの分を引いていますが、0x8200に読み込まれている分はセクタ2から(MOV CL,2)で、ブートセクタはセクタ1に入っているから、ブートセクタの分を引く必要はないような気がするのですが・・・ -- 名無しさん 2006-10-22 (日) 08:14:19
  • すいません。p169の質問のほうは忘れてください!でもやっぱり、どうして0x8000にブートセクタがあるのが分かったのでしょうか? -- 名無しさん 2006-10-22 (日) 08:26:19
  • すいません、やっぱりp169の質問忘れないでください。何度も本当に申し訳ないです。でも、本当に不思議なんです。 -- 名無しさん 2006-10-22 (日) 08:50:05
  • 問題が混ざっているので整理します。(1)ブートセクタが0x7c00に読み込まれるのは、ipl10.nasに「ORG 0x7c00」と書いてあるからだ。→間違いです。もしこれが正しいのなら、これを「ORG 0x8000」にすればいいことになります。実際はそんなことをしたら正常動作しなくなるだけです(理解できなければ実験してみましょう。その上でp.31〜42をもう一度よく読みましょう。ipl10.nasに何を書いても、ブートセクタは0x7c00〜0x7dffに読み込まれます。これを変える方法はありません)。 -- K 2006-10-22 (日) 11:00:36
  • (2)ブートセクタは0x8000には存在するのか?→しません。本当は0x7c00〜0x7dffの内容を一度0x8000〜0x81ffにコピーしようと思ったのですが、とある理由により省略しています。だからとにかく一度たりともブートセクタの内容が0x8000に来ることはありません。本文中でも「ブートセクタの先頭がメモリの0x8000番地にくるような*感じで*」とか「0x8000〜0x81ffの512バイトには後でブートセクタの内容を*入れようかなと思った*のです。」などとあいまいな表現を使っています(実際に入れていないので、あとで入れますとは書けなかった)。 -- K 2006-10-22 (日) 11:14:49
  • 当初は、asmhead.nas内で0x7c00〜0x7dffの内容を一度0x8000〜0x81ffにコピーしようと計画していました。そしてそのようにプログラムしました。そしてその上で、 memcopy(DSKCAC0,DSKCAC,cyls*512*18*2/4); としていました。これならわかりますか?もしこれが分かって、しかもこの先の説明が理解できないのなら、このようにプログラムを改造していただいて構いません。起動にかかる時間がほんのわずかに増えるだけで、問題なく起動しますので。理解できないプログラムを使うよりは、少し遅くても理解できるプログラムを使うほうがずっといいです。 -- K 2006-10-22 (日) 11:30:08
  • (3) memcopy(DSKCAC0+512,DSKCAC+512,cyls*512*18*2/4-512/4); のコピーバイト数が分からない。→仮に上記が分かるとしたら、上記と比べてブートセクタ部分をよけてコピーしているので、その分バイト数が少なくなるのは当然なのです。もしこれを引かずにコピーしたら、コピーしすぎで時間のムダになってしまいます。・・・そしてそのブートセクタ部分に関しては、0x7c00〜0x7dffの内容を直接DSKCACへコピーすることにしました。これなら0x8000へコピーする時間を節約できるからです(これが上記の「とある理由」です)。 -- K 2006-10-22 (日) 11:42:26
  • k様、回答有難うございます。(2)までは理解できました!一つ教えて頂きたいのですが、フロッピーから読み込まれたデータが入っている0x8200〜0x34fffの範囲ににブートセクタの内容は入っていないのですよね? -- 名無しさん 2006-10-23 (月) 07:01:47
  • はい。入っていません。 -- K 2006-10-23 (月) 07:38:48
  • k様、回答有難うございます。(3)も分かりました!嬉しくてしょうがないです。本当に有り難うございました! -- 名無しさん 2006-10-23 (月) 11:08:26
  • 初版第6刷のp170からの質問です。もし違っていたらとても恥ずかしいのですが、p170の下のところにSUB:「substract」(引き算)が由来。とありますが引き算を英語の辞書でくったらsubtractになっていたのですが・・・ -- 名無しさん 2006-10-24 (火) 11:28:41
  • ご指摘ありがとうございます。この話題はmistakesのほうがふさわしいように思ったので、詳しいお返事はそちらに書きます。 -- K 2006-10-30 (月) 19:19:47
  • OS自作入門(初版第7刷)の2章の途中(p43)makeimgで引っ掛かってしまいました。edimgが強制終了させられるのです。原因の調査をお願いしたいのですが。他の方の質問にedimgが強制終了させられるというものが見当たらないので、私の使い方が悪いのかも知れません。しかし、強制終了という終わり方には問題があると思います。 使用機種: Pentium Processor メモリ : 639Mbytes システム: Microsoft Windows 98 IE  : 6.0 sp1 makeimg用バッチファイルの内容  ..\tolset\z_tools\edimg.exe imgin:../tolset/z_tools/fdimg0at.tek wbinimg src:ipl.com len:512 from:0 to:0 imgout:helloos.img  tolsetフォルダと作業用フォルダは並列の関係なのでこのように変更しました。 強制終了時のメッセージ : このプログラムは不正な処理を行ったので強制終了されます。終了しない場合は、プログラムの製造元に連絡していださい。EDIMGのページ違反です。モジュール  EDIMG.EXE、アドレス : 015f:0040397b Registers:EAX=0042007c CS=015f EIP=0040397b EFLGS=00010283 EBX=00018ba3 SS=0167 ESP=0213fdf4 EBP=0213fe00 ECX=0255020c DS=0167 ESI=00240000 FS=51ef EDX=0255020c ES=0167 EDI=000107c2 GS=0000 Bytes at CS:EIP: 8a 14 78 a1 f8 6c 40 00 88 14 03 8b 0d f8 6c 40 Stack dump: 004100cb 00406076 004100cb 0213fe20 00401325 004100cb 005100a0 00410078 00530000 81f85910 00000000 0213fe38 004055c3 00000008 005100c0 0213fe34 必ず再現します。これ以外に必要な資料があれば可能なかぎり採取します。よろしくお願いいたします。 -- ざんに 2006-11-03 (金) 15:43:08
  • 「しかし、強制終了という終わり方には問題があると思います。」まったく同感です。しかしとにかく原因の可能性が多すぎて何がなんだか分かりません。まず、完全に本の通りにやってみていただけないでしょうか(報告内容では作業フォルダの位置が本文ですすめられているものとは異なっていますよね?それに加えて、src:ipl.comというのも違っているように思います。まずはCD-ROMからすべてのファイルをコピーして実験してみてほしいです。自己解決できないトラブルが起きた場合は、自分の思い通りにするのは本文どおりのことができてからにしてください)。それと当分は「強制終了時のメッセージ」以降の記述は不要です。 -- K 2006-11-04 (土) 17:06:53
  • お忙しい中さっそくの御返答をありがとうございます。すぐに言われた通りやってみたところ、強制終了すること無くうまく終了しました。私の使用ミスでした。たいへんお手数をかけて申し訳ありませんでした。原因はipl.comにありました。ipl.nasを別ファイルに手書きで写したのですが、この時13行目FATがどこから始まるかの行でDWをDBに写し間違えてしまいました。このため、以降が全て1バイトづつ前にずれてしまいました。edimgで1バイト前にずれた制御表を見て処理したため強制終了させられたようです。重要な制御表が壊れていた時の対処は難しいと思いますが、初心者が多いことを考慮してedimgで厳重にチェックすることをお勧めいたします。対応誠にありがとうございました。 -- ざんに 2006-11-05 (日) 08:56:31
  • 初版第七刷の44pのMakefileを作り、batもコピーしてコンソールで実行してみたら、認識されていません、と出てしまいました。どうしてでしょうか? -- アクア 2006-11-07 (火) 00:38:41
  • 詳細は分かりませんが、まずは自分で作ったMakefileではなく、CD-ROMのMakefileをコピーして、それで試してみてもらえないでしょうか。自分ではきちんと入力したつもりになっていても、実はどこかが違うかもしれませんから(特にファイル名が)。 -- K 2006-11-08 (水) 14:00:34
  • 何とかできました。忙しいところありがとうございました。 -- アクア 2006-11-09 (木) 00:54:09
  • 初版第6刷のP201からの質問です。OS作成とは関係ないのですが、どうしても分からなかったのでお聞きします。struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize)という関数の定義についてなのですが、関数の名前になぜ、*がつくのでしょうか?調べたら関数ポインタと言うのが出てきましたが、どうも違うみたいです。return ctlで今までみたいに値ではなくて番地を返すからでしょうか?2つめは、if (ctl == 0)のところで、直前でctlに確保したメモリ領域の番地をキャストしていますが、このctlにはポインタと同じように確保したメモリ領域の先頭の番地が入っていると言う理解で良いのでしょうか? -- 名無しさん 2006-11-16 (木) 13:27:48
  • 2006-11-16 (木) 13:27:48の名無しさんへ。「return ctlで今までみたいに値ではなくて番地を返すからでしょうか?」その通りです。「このctlにはポインタと同じように確保したメモリ領域の先頭の番地が入っていると言う理解で良いのでしょうか?」ポインタと同じようにというか、ctlはポインタそのものです。多分名無しさんは、ポインタとはint *p;の「p」などを想像しているのでしょう。ctlは「int *」型ではなくて、「struct SHTCTL *」型と書いている訳です。 -- uchan 2006-11-16 (木) 20:24:47
  • uchan様、回答有り難うございます。もう一つお聞きしたいのですが、p202のctl->sheets[h]->height=hという文はstruct SHTCTL型の構造体shtctlへのポインタctlのメンバsheets[h](struct SHEET型の構造体sheets0へのポインタ)のメンバheight(結局ctl->sheets0[h].height)にhを代入しているという理解で良いんですよね? -- 名無しさん 2006-11-17 (金) 08:38:35
  • SHEET関連の名無しさんへ。sheets配列はsheets0配列全体をさしているわけではなく、sheets0配列の個々の要素へのポインタの集まりです。つまり、sheets[3]がsheets0[1]のポインタの場合もあるわけです。その理由はsheets配列は、シートの高さ(Z方向の順位)の並べ替えが発生するためです。説明になっているでしょうか。 -- rapper 2006-11-17 (金) 09:48:53
  • rapper様、お返事が遅くなってしまい大変申し訳ございません。回答有難うございます。*sheet_alloc関数で空いてるシートをもらってきて、sheet_updown関数でsheets配列に空いていたシートを順に登録しているわけですね。だから、sheets配列はsheets0配列の個々の要素へのポインタになると。今回は描画関係の総復習で大変でしたがご助言のおかげで理解することが出来ました。本当に有難うございました。 -- 名無しさん 2006-11-19 (日) 08:44:48
  • 初版第6刷のP208からの質問です。harib07cのsheet_slide関数のsht_mouseの移動についてなのですが、シートが出てくるまでは移動前のマウスカーソルの有った範囲を塗りつぶして、新しいマウスカーソルを書いていました。harib07cのsheet_slide関数では、どのタイミングで以前有ったマウスカーソルが塗り潰されるのでしょうか?sheet_refreshsub(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize)で1、sht_backの移動前のマウスカーソルがある場所だけを塗りつぶす。2、移動前のマウスカーソルを書く。sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize);で、3、sht_backの移動後のマウスカーソルのある範囲だけを塗りつぶす。4、移動後のマウスカーソルを書く。3の処理の前に移動前のマウスカーソルのあった範囲を塗りつぶす処理があれば理解できるのですが。 -- 名無しさん 2006-11-21 (火) 05:24:58
  • 申し訳ありません。寝ながら考えていたら理解できました。質問を訂正させてください。マウスカーソルの移動は、「結果的にVRAM上では背景にマウスカーソルを上書きしているけれども、sht_backのバッファはマウスカーソルのことなんて知らない。だから移動前のマウスカーソルを塗りつぶす作業はしなくても良い」と言う理解でよいでしょうか? -- 名無しさん 2006-11-21 (火) 08:14:24
  • harib07cの名無しさんへ。sheet_refreshsub関数は指定範囲について、一番下のシート(背景)から順に一番上のシート(マウス)までをVRAMに描き込んでいきます。sheet_slide関数では移動前の範囲と移動後の範囲の2回分sheet_refreshsub関数を呼び出しています。このとき移動対象のシート自体は移動後の位置でVRAMへの書き込みをします。結果として移動前のマウスの範囲は塗りつぶされていることになります。 -- rapper 2006-11-21 (火) 22:49:30
  • rapper様、回答有難うございます。理解できました。原因は、自分がsht->vx0 = vx0; sht->vy0 = vy0; という処理を頭に入れてソースプログラムを丁寧に読んでいなかったせいです。ご迷惑をおかけしました。本当に有難うございました。 -- 名無しさん 2006-11-22 (水) 06:55:24
  • あまり本筋に関係がないとは思うのですが、気になるので質問させてください。3日目のharib00iのディレクトリ内のMakefile内でgas2nask.exe -a との記述があるのですが、この-aオプションはどのような機能なのでしょうか?ソースも眺めてみたのですが、何かをスキップしているように見えるということしかわかりませんでした。。。お忙しいとは思いますがご教授いただけないでしょうか。 -- taichino 2006-11-26 (日) 22:53:16
  • taichinoさんへ。tools/gas2naskにて回答いたしました。 -- K 2006-11-26 (日) 23:12:07
  • Kさん。ご回答ありがとうございました。大体把握できました。gas形式およびnask形式をもう少し見直してつめようと思います。 -- taichino 2006-11-27 (月) 05:53:15

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2007-04-16 (月) 19:48:33 (4299d)