q_and_aの過去ログ(0005)

  • (by K, 2006.09.08)

ログ

  • 初版P59の6節ブートセクタからOS本体を実行してみるから質問です。「ブートセクタの先頭がメモリの0x8000番地にくるような感じディスクをメモリに読み込み終わっていますので」とありますが、P42を見ますと、ブートセクタは7c00から読み込まれると書いてあります。この0x8000が読み込みスタートというのはどうやって決まったのですか? -- ichi_fuji 2006-07-01 (土) 15:04:54
  • 実は、0x8000番地に"くるような感じで"と有りますように、0x8000にはp59ページの段階ではデータは読み込まれていない(はず)です。FDの2セクタ目からのデータが0x8200番地から配置されてる状況です。「どうして0x8200からなのか?」という疑問は、p53を読んだら解決するかもしれません。 -- uchan 2006-07-01 (土) 16:47:46
  • ありがとうございます。なるほど・・・。p53を見ると「0x8000〜にはあとでブートセクタの内容を入れようかな〜」と書いてありますが、「あとで」と書いてあるように、もうちょっと先を読んだら、そこの説明が書いてあるのでしょうか・・・。すいません。もうちょっと読んでみます。 -- ichi_fuji 2006-07-02 (日) 00:59:10
  • やっぱりわかりませーん。上記の続き(p59)ですが、0x8000には何のデータも読み込まれていないんですよね?でもharibote.sysの中身を読み込みにいくとき、ブートセクタの先頭が0x8000に読み込まれるということを前提で、0x8000+0x4200と、haribote.sysのアドレスを計算してるじゃないですか・・・。ブートセクタが0x8000に読み込まれないと、この計算はおかしいと思うのですが・・・・。申し訳ありませんが、どなたかご回答よろしくお願いします。 -- ichi_fuji 2006-07-02 (日) 12:26:03
  • ディスク内容を0x8000から収納しています。ipl.binは、その先頭から512Byteの0x8000~0x81ffに入ります。ということは、haribote.imgの0x0000~0x05ffにあたると思います。ということで、ずーーとみていくと、0x4200にharibote.sysの内容がありますよね。それは、0xc200に書き込まれているのです。なぜなら、0x8000から書き込み始めているからです。長くなりましたが、わかりましたでしょうか?間違えていたらごめんなさい。図を置いておきます。
    メモリー上の番地IMG上の番地詳細
    0x8000〜0x81ff0x0000〜0x01ffIPL(512Byte分)
    .........
    0xc200〜0xc2030x4200〜0x4203Haribote.sys(3Byte分)
    わかりましたか? -- Clover 2006-07-02 (日) 12:59:55
  • 上の図が間違えていたら修正してもいいです。 -- Clover 2006-07-02 (日) 13:03:57
  • PCを起動するとシステムによりブートセクタの内容がメモリの0x7c00〜0x7dff番地に読み込まれます。そして、読み込んだブートセクタが実行されます。このブートセクタは48ページ〜57ページにかけて説明してあるとおり、ブートセクタの次のセクタである(C0-H0-S2)から10シリンダほど先のセクタ(C9-H1-S18)までを0x8200〜0x34fff番地に読み込むようにプログラムしたのです。ですから、ブートセクタ(C0-H0-S1)の内容を再び0x8000〜0x81ff番地に読み込む必要はないのです。 -- 名無しさん 2006-07-02 (日) 16:27:03
  • みなさん、本当にありがとうございます!計算の仕方はよくわかりました!ただ、ブートセクタはメモリ上のどこに読み込まれるのかわかりません。私は、Cloverさんの言われる「ipl.bin」 = ブートセクタの内容と理解しています。そうすると、ブートセクタは0x7c00と0x8000どちらに読み込まれるのですか?何度もすいませんがよろしくお願いしますm(_ _)m -- ichi_fuji 2006-07-03 (月) 09:43:21
  • ブートセクタは、PCの電源を入れると自動で「0x7c00」に読み込まれます。そして、なぜ「ブートセクタ=0x8000」という話が出てくるか。ブートセクタの中の何らかのプログラム(またはデータ)を、OSを作っていくうちに使いたくなるかもしれません。だから、512バイト分を0x7c00から0x8000に丸ごとコピーするのです。(0x7c00にずっと置いておいても良いではないかと言うと、それは確かにそうですが、0x8000からの方が計算が楽と言うことで。) -- uchan 2006-07-03 (月) 13:03:13
  • なるほどー!コピーしてたんですか!それなら、計算も納得です。・・・ということは、0x7c00から0x8000にコピーするような記述がソース(ipl.nas)に書いてあるのですか?ソースを確認する前に質問してすいません・・・m(_ _)m(今、ソース(ipl.nas)が手元にないので・・・) -- ichi_fuji 2006-07-03 (月) 14:29:25
  • ipl.nasを確認しました・・・・。すいません。私のスキルではコピーするような内容を見つけることはできませんでした。BIOSの方にコピーするような内容が書かれているのでしょうか? -- ichi_fuji 2006-07-04 (火) 18:28:32
  • 僕からのアドバイスとしては、まずは8日目まで読みきることをおすすめします(わからなくてもとりあえず先に進むというのがこの本のおすすめの読み方でもあります)。それで分からなければまた聞けばいいのではないかと思います。 -- K 2006-07-04 (火) 19:31:51
  • ありがとうございます。ちょっと先走りすぎてたかもしれませんね。ご回答とおり、もう少し読んでみます。 -- ichi_fuji 2006-07-05 (水) 08:46:10
  • tokiwa 2006-05-01 (月) 08:48:40 さんと同じ現象が発生します。その後、何かわかりましたでしょうか? -- kumi 2006-07-17 (月) 01:55:22
  • (ここでいいのかな?)はじめまして。ブートセクターに付いての質問です。make installして本体(画面真っ黒にするプログラム)を入れたものを実機(IBM Thinkpad560E)でブートしてもエラーだけが起こって読み込むことができません。文字は出力できます。どうしたらいいでしょうか。(MS-DOSは起動できる)私は中3ですが中3にもなって文章がまとまってなくてすいません。 -- Erail 2006-07-18 (火) 16:22:35
  • Erailさんへ。質問はわかりましたが、どこの章のサンプルでエラーが起こったのですか?文章がまとまんなくても、どこのサンプルなのかがわかれば、答えられます。また、改造しているのであれば、そのサンプルをCDからコピーしてでやってみては?たまにFDから読み取れない場合はありますよ。 -- I 2006-07-18 (火) 17:01:38
  • あ、ちゃんと動きました。すいませんでした。 ただ、ドライブが回りっぱなしでした。(笑) -- Erail 2006-07-18 (火) 19:07:55
  • どうやらCLが0になって読めないところをさしていたからのようでした。ここのミスに気が付きませんでした。 -- Erail 2006-07-18 (火) 19:15:13
  • 初版の第6刷のp.95周辺の、GUI画面(タスクバー??、デスクトップ??)などについて質問です。スタートメニューの場所、時計の場所の上に、画像とか文字を載せたいのですが、どのファイルのどの部分をいじれば良いでしょうか? -- Masanori 2006-08-02 (水) 09:00:13
  • 初版第六版の678Pで、CDRecordフロントエンドのページのアドレスが載っているのですが、アドレスバーに入力しても、ページがありません。Yahooで検索したところ、アドレスは「http://mouneru.web.fc2.com/cdrecord_fe/cdr_fe.htm」が正しいと思います。どうなんでしょうか? -- Mac 2006-08-02 (水) 11:54:31
  • Masanoriさんへ。文字は、とりあえず100P周辺の「とにかく文字を出したい(harib02d)」まで読み進めたらどうですか? -- Mac 2006-08-02 (水) 14:47:42
  • CDRecordフロントエンドのページの更新履歴に"バージョン情報で表示されるWEBサイトのリンク先変更"とあるので、移転したのだと思います。 -- M59 2006-08-02 (水) 16:05:11
  • Macさん、M59さん、ありがとうございます。次の増刷時には修正します。それと、これからその手の情報を扱うページを準備します。 -- K 2006-08-02 (水) 19:23:09
  • 初版第六版で、149Pに載っている「fifo.cのfifo8_put」の13行目くらいに"if (fifo->p == fifo->size) {"と書いてあります。しかし、CD-ROM内のharib04eのfifo.cを見ると、"if (fifo->p == size) {"と書いてあります。本の通りにすると動くのですが、CD-ROMのサンプルだとMakeでエラーが出ます。これは、CD-ROMのHarib04eの作成ミスなのですか? -- mac 2006-08-07 (月) 12:44:20
  • 僕が持ってるのは初版第1刷なのですが、CD-ROM内の該当箇所(fifo.cの29行目)を見てみると"if (fifo->p == fifo->size) {"となっています。ということは、(推測ですが)第1刷から第6刷にかけて、CD-ROMが変更されちゃったのかな? -- uchan 2006-08-07 (月) 17:21:38
  • ちなみにharib04eをCDからコピーしてそのままmake runで正常に起動します(QEMU上)。 -- uchan 2006-08-07 (月) 17:23:41
  • macさんへ。出版社に提出した初版第6刷のデータを確認しましたが、CD-ROM内のharib04eのfifo.cの29行目は、正しく "if (fifo->p == fifo->size) {" になっていました。macさんの誤解か、もしくは違うページの問題なのではないでしょうか?・・・それとも何か事故があってCD-ROMがおかしいものがあるのかもしれません。もし他にも同じ症状のかたがおられましたらご報告ください。 -- K 2006-08-07 (月) 20:11:00
  • すいません。自分のミスでした。自分は、CD-ROMからコピーして使っていて、自分で本を見ながら作っているOSの間違いを探しているときに、修正するファイルを間違えてしまいました。お騒がせしてすいません。 -- Mac 2006-08-07 (月) 21:57:55
  • Macさんへ、アドバイスありがとうございました。じっくりと読んでみます。 -- Masanori 2006-08-11 (金) 16:26:57
  • 初版第6版を読んでいます。まだ半分くらいしか読んでいないのですが、OSの終了の仕方がどこに書いてあるのかがわかりません。どなたか教えていただけませんか?電源ボタンを押して終了しなければならないのでしょうか? -- Kino 2006-08-15 (火) 20:10:20
  • すみません。上記質問の者です。他のスレッドに書いてあったのを発見いたしました。ご迷惑をおかけいたしました。 -- Kino 2006-08-15 (火) 22:03:12
  • P186のnaskfunc.nasのmemtest_subでstartとendの値を受け取るときに[ESP+12+4]と[ESP+12+8]となっていますが、P70をみると、startを受け取るときは[ESP+4]でendを受け取るときは[ESP+8]なんではないんでしょうか?[ESP+12+4]の+12は何なんでしょうか? -- Mogu 2006-08-20 (日) 19:52:51
  • Moguさんへ。簡単に言うと「startとendを受け取る前にPUSHを3回実行しているから」です。たとえば「PUSH EDI」とすると、ESPから4が引かれます。それが3回なので、3×4で合計「マイナス12」となります。これを相殺するため「+12」としています。 -- uchan 2006-08-20 (日) 19:59:51
  • お返事ありがとうございます。なるほど、そーゆーわけだったんですか、分かりやすい説明のおかげで理解することができました!ありがとうございます! それとは別にもう一つ質問があるのですが、IDTの設定で(int)asm_inthandler21とやっている場所がありますが、これはどうゆう意味なんでしょう?関数が置いてある番地をint型で返すってことなんでしょうか? -- Mogu 2006-08-24 (木) 22:43:23
  • 二版P18の!cons_nt.batを実行してみるところから質問です。 実行すると、{'cmd.exe' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。}とでて、コンソールが起動しません。何故でしょうか? OSはwindowsXP です。-- SYATIHOKO 2006-08-26 (土) 18:20:54
  • Moguさんへ。「関数が置いてある番地をint型で返すってことなんでしょうか?」はいそのとおりです。 -- K 2006-08-26 (土) 22:59:17
  • SYATIHOKOさんへ。それはおそらくWindowsXPを独自にカスタマイズしたせいではないかと思われます。残念ながらどうしたらよいかは分かりません。 -- K 2006-08-26 (土) 23:01:32
  • Kさん返答ありがとうございました!! -- Mogu 2006-08-27 (日) 14:16:06
  • PUSHをしてからCALLで関数を呼び出すプログラムで、PUSHでスタックに入れたものが引数になる仕組みが良くわかりません。PUSHをすると(ESP-4)にデータが入るわけですが、そこから((ESP-4)+4)つまり(ESP)の場所が引数ですよね?それならばスタックで入れた(ESP-4)は引数として扱われないのではないのでしょうか?度重なる質問ですいません。 -- Mogu 2006-08-30 (水) 06:53:05
  • Moguさんへ。質問そのものがよく分からないのですが、「CALL命令もEIPのPUSHを伴います」とアドバイスしたら何かヒントになりますでしょうか? -- K 2006-08-30 (水) 21:57:11
  • 返答ありがとうございます。そのアドバイスですべて解決することができました。度重なる質問に答えてもらいありがとうございました。 -- Mogu 2006-08-30 (水) 22:49:49
  • P439(第5版)のasm_hrb_apiで処理が終わりのときは、RETをしてcmd_appへ戻るって書いてありますが、どうしてRETをするだけでcmd_appへ戻るんでしょうか? -- Shiro 2006-08-30 (水) 23:32:51
  • Shiroさんへ。本文およびソースリストにあるように、ESPの値をcmd_app呼び出し時の値に修正してからRETしているので、RET命令でcmd_appへ戻ることになります。 -- K 2006-09-01 (金) 20:12:14
  • つまりこれは、cmd_appを呼び出したときに、CALLと同じでESPに元に戻る場所を記憶していて、RETでその値を参照して移動しているってことですか。わかりましたありがとうございます。 -- Shiro 2006-09-02 (土) 02:39:34
  • もう一つ質問があるのですが、P430(第5版)に、「めんどうなスタックの切り替えを、CPUが自動的にやってくれるおかげです。」って書いてあるのですが、これは具体的にどの時に、どのようなことをしているのでしょうか? -- Shiro 2006-09-02 (土) 03:28:21
  • Shiroさんへ。advance/CPUに書きましたので参考にしてください。 -- K 2006-09-02 (土) 12:06:49
  • advance/CPUの内容を元にソースを眺めていたところ、OSモード中のスタックは全アプリで共用している気がするのですが…。 -- killer_elf 2006-09-02 (土) 16:07:50
  • ↑こちらの勘違いでした。コンソールとOS用のスタックが同じでも、アプリごとに別々のコンソールを生成しているので、重複しないようになっているようです。 -- killer_elf 2006-09-02 (土) 16:35:39
  • P544(第5版)で、mmx2をsheet_slideのときに使用していますが、sht->vx0を使用しないのは、なぜなんでしょうか? -- Mogu 2006-09-02 (土) 21:15:04
  • Moguさんへ。それはあまりよい質問とは思えません。mmx2の代わりにsht->vx0を使えばうまくいくのでは?と思うのでしたら、こんなところで質問などせずに、実際に書き換えて make run してみたらいいと思います。もしそれでうまくいけば、mmx2を使う理由なんてなかったということです。テスト改造で学べることは多く、それは質問して答えをもらったときの何倍もためになります。僕としてはそういう機会を読者の皆さんから奪いたくはないので、この質問にはお答えしませんし、Moguさんも自分の研究の結果として答えが分かっても、明確な回答を書かないでいてくれれば幸いです。 -- K 2006-09-03 (日) 00:44:28
  • 人に頼るような質問をして、すいませんでした。質問をするまえに、実際にプログラムを書き換えて、試してみてはいたんですが、その差がいまいち分からず、容易に質問してしまい、大変ご迷惑をおかけしました。 これからもそういう問題にぶつかると思いますが、自分で出来る限りの努力はしたいと思います。ご迷惑をおかけしてすいませんでした。-- Mogu 2006-09-03 (日) 01:47:22
  • Moguさんへ。そうですか、違いに気づけませんでしたか・・・。では少しヒントを。マウスを非常にゆっくりと横に動かしていくと(たとえば1ドットずつの移動で、ウィンドウを画面の端から端まで移動させてみるとか)違いが体験できると思います。QEMU上よりも実機でやったほうが違いが分かりやすいかもしれません。 -- K 2006-09-03 (日) 10:14:23
  • 初めまして、私はハードを直接いじるようなプログラミングは、picやH8以外ではやったことなかったのですが、x86系の勉強になりました。質問なのですが、P.179のmemtest_subについてです。これって、pをvolatileで宣言するとうまく行くような気がするのですがダメなのでしょうか?自分でも試してみようかと思っているのですが、ちょっとトラブルがあって・・・・(^^; -- nye 2006-09-04 (月) 07:59:08
  • nyeさんへ。その質問は既出でしたが今までfaqに反映できていなかったので見つけられなかったのだと思います。どうもすみません。先ほど更新しましたので、faq/c08-15をごらんください。 -- K 2006-09-04 (月) 14:02:33
  • 返信送れてすいません。わざわざ詳細な説明をありがとうございます。まだ完全には仕組みを理解することができませんでしたが、徐々に理解していきたいと思います。 -- Shiro 2006-09-05 (火) 00:41:41
  • 初版第四刷のp.69から70についての質問です。write_mem8という関数をアセンブラで作っていますが、MOV ECX,[ESP+4] MOV AL,[ESP+8]というところが分かりません。なぜ[ESP+4]にアドレスが入っていることが分かったのでしょうか?そしてなぜ、[ESP+8]にデータが入っていることが分かったのでしょうか?また、p.70に「C言語でwrite_mem8が使われると・・・そして、その時に指定された数字はメモリにメモしてありまして、それぞれ1番目のもの:[ESP+4] 2番目のもの:[ESP+8] 3番目のもの:[ESP+12] 4番目のもの:[ESP+16]とありますが、コレは1番目にVRAMのアドレス、2番目に15、3番目にまたVRAMのアドレス、4番目に15ということでしょうか?そして値が4増えていっているのは32ビットモードだからでしょうか? -- hatena 2006-09-05 (火) 03:12:24
  • hatenaさんへ。どう答えたらいいのか悩ましい質問なのですが、簡潔に言えば、なぜ分かったのかというと、tolset内のコンパイラは自分で(=著者自身が)作ったコンパイラだからです。自分で作った以上、メモリのどこに格納されるような機械語になるかは当然分かっていたわけです(まあ他の人が作ったコンパイラもたいていは同じですが)。そして[ESP+4]と[ESP+8]についてはそのとおりですが、今回のwrite_mem8には3番目や4番目の数値はないので、[ESP+12]や[ESP+16]に書かれている値がどんなものかはわかりません。値が4ずつ増えるのは、そうなるようにコンパイラを作ってしまったからというだけの理由で、32bitモードかどうかは直接は関係ありません。 -- K 2006-09-05 (火) 19:35:53
  • 筆者の方から返答いただけるとは、感激です。なるほど、そういうものと理解して先に進めます。VRAMに値を書き込むという処理自体は理解できますので。 -- 名無しさん 2006-09-05 (火) 21:27:53
  • このたびは特別のご支援にあずかり厚くお礼申し上げます。時節がら、ますますご自愛のほどお祈り申し上げます。 -- hatena 2006-09-05 (火) 21:33:01

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-09-08 (金) 09:22:29 (4519d)