祝 60kg台!!

69.9kg

おぉぉぉ!!!

遂に、このオーダーへ!!目指せ、65kg!!だな。

 

さて、ここ最近は十分に時間も取れていない事もあるが、

本読んで理解に苦しむフェーズばかり。。

ハードに近い話が多いので、結構、色々調べながらで時間がかかってる。。

本の中にも色々書いてある内容に加えて、下記Web下記のページも参考に

読み進める。

softwaretechnique.jp

まだ、いまいちよく分かっていないが、重要なのは

1. GDT/IDT(Global Descriptor Table/Interrupt Descriptor Table)

2. GDTR

3. IDTR

4. セグメントレジスタ

辺りの様だ。。

 

で、初めて気づいたが、このGDTってのはどうやらasmhead.nasの中にも

記載がある。。。

 

後、この辺りが自分としては、かなり頭がごちゃごちゃになっていたのだが、

セグメントレジスタの役割。(分かればシンプルなんだろうけど。。)

 

リアルモード: CS, DS, FS, ES, SSを使ってメモリアクセス

プロテクテッドモード: セグメントレジスタとGDTを使ってメモリアクセス

 

っていう違いがある。しかも、このプロテクテッドモードの動きがよく分からないで時間が掛かっていた。。。

 

まぁ、私の浅い理解は進み、当たり前の理解に徐々に近づいていってる気がする。。。

要は、セグメントレジスタが、GDT内にテーブルとして用意された各セグメントへ

のインデックスの役割をしている様で、そのテーブル内に設定されたGDT:*は64bitで

構成されており、その各ディスクリプタに対象セグメントのスタートアドレス、サイズ、

アクセス制限関係の設定等が入っているという事みたい。。。

(ここは、書く必要もないのだが、文章化する事で自分の頭を整理する理解も含まれる。。

 まぁ、備忘録的な日記なんで。。)

 

                                   GDT                                 Memory

        +---------+                     +----------------+ 

Seg-reg                   GDT: 0 ----------->   |   Segment: 0     |

  (index)                                                      +---------------+

         |                       GDT: 1------------>   |   Segment: 1

         |                           ‥                               |                        

         |                           ‥                              +---------------+

         |                         ‥                  

         |                                                           +---------------+

         +---------->  GDT: n  ----------->  |   Segment: n         

                                                                     +---------------+ 

                                                                      

後は、実際のプログラム上のアドレスが、このセグメント内のオフセットとして使われる事

で、アドレス変換が行われているという事らしい。。(ふむ。中々整理が難しい。。)

このGDTの先頭情報を取得する為に、GDTRにこのGDTを配置したセグメントディスクリプタテーブルの先頭アドレスとそのサイズ(リミット値)をLGDTコマンドにて48bitの形で渡す。

 

ここは、asmhead.nasの下にある部分を、ちょっとだけ手を加えた部分が

個人的には分かりやすかったので、参考までに載せておく。

(dsctbl.cで行われているものと同じ内容だと思うが、アセンブラの方が

 より直接的で、個人的には理解するのに役立った。。)

 

        ALIGNB  16, DB 0                        ; NASMでは警告が出るので修正

GDT0:

        TIMES   8 DB 0                          ; NASMでは警告が出るので修正

        DW      0xffff,0x0000,0x9200,0x00cf     ; 読み書き可能セグメント32bit

        DW      0xffff,0x0000,0x9a28,0x0047     ; 実行可能セグメント32bit(bootpack用)

        DW      0

.gdt_end:

 

GDTR0:

        DW      GDT0.gdt_end - GDT0 - 1 ; 上のSegment DT のリミット値(要するにサイズ)

        DD      GDT0    ; ディスクリプタテーブルのアドレス

 

        ALIGNB  16, DB 0        ; NASMでは警告が出るので修正

 

上記コードとは別の場所で、LDGTコマンドを実行する事でGDTRに

セグメントディスクリプタテーブルのベースアドレスとリミット値が設定され、

後は、セグメントレジスタ経由で各セグメントへアクセス可能となる。

 

        LGDT    [GDTR0]         ; 暫定GDTを設定

 

 まぁ、詳細は上にあげた参考にさせて頂いている先人様のページにある通りだが、

やはり自分の理解力の低さが悲しい。。。(時間かかり過ぎ。。)

 

 同様に、IDTも同様の感じの様ですな。。。

 

一先ず、なんとなく、GDT/IDT周りのこのが理解できてきた。。。

 

しかし、一緒に参考にしている下記の本も参照しながらで随分助かっているのだが、

こちらはこちらで全編アセンブラで記述されているという優れもの。。。

両作者共に素晴らしいですな。

こんな私にも、OS理解へのチャンスを与えてくれる本。

本当に素晴らしいです。。。(感謝しかありません。後は、継続する自分の意思のみ)

ただ、常人ではありませんな。。。

 

作って理解するOS  x86系コンピュータを動かす理論と実装

作って理解するOS x86系コンピュータを動かす理論と実装

  • 作者:林 高勲
  • 発売日: 2019/09/26
  • メディア: 単行本(ソフトカバー)
 

 

皆様へ感謝しつつ、引き続き頑張っていこうと思う今日この頃。。

 

続く。。