OS自作入門 5日目、6日目

○5日目、6日目
 構造体と文字表示とGDT/IDT初期化
 →進みが悪いのでコード作成は行わず、サンプルコードを使用することにする。
  目的はOSの作成工程を理解すること。
  内容が6日目とかぶっているため統合する。

 ■ページングについて別途調査

 ▼GDT(global (segment) descriprot table)→大域セグメント記述表。
  セグメント番号とセグメント情報の対応付けを行うテーブル。
  ・セグメント情報(64ビット)
   ●セグメントアドレス(32ビット)
   ●リミット(20ビット)
    セグメントの大きさ。
    セグメント属性のGビットを1にするとページ単位で指定できる。
    ※1ページは4KB(PCのCPU)
   ●セグメント属性(12ビット)
    →上位4ビット(拡張アクセス権)は「GD00」
     Gビット 1だとリミットがページ単位。0だとリミットはバイト単位
     Dビット 1だとセグメントのモードが32ビット。0だと16ビット。
    →下位8ビット
     00000000(0x00) 未使用のdescriptor table
     10010010(0x92) システム専用、読み書き可能、実行不可。
     10011010(0x9a) システム専用、読み込み可能、書き込み不可、実行可。
     11110010(0xf2) アプリ専用、読み書き可能、実行不可。
     11111010(0xfa) アプリ専用、読み込み可能、書き込み不可、実行可。
  ・セグメント番号はセグメントレジスタに指定する。
   ※セグメントレジスタは16ビットであるが、下位3ビットが使えないので、0〜8191までのセグメント番号が指定可能。
    セグメント番号は上位13ビットに格納する。

  ※アプリケーションがシステム専用セグメンテーションにアクセスしたりLGDTを実行しようとするとOSへ通知される。

 ▼IDT(interrupt descriptor table)→割り込み記述子表
   0〜255までで指定した割り込みに対する処理を記述。
   構造はGDTと同。
    
 ▼レジスタ
  GDTR gloval (segment) descriptor table register GDTの先頭番地と有効設定個数(リミット)を設定する。
→48ビットレジスタなのでMOV命令で代入できない。
 GDTのアドレス(上位32ビット)+GDTのリミット(下位16ビット)。
 リミットはGTDの大きさ-1を指定する。
  IDTR interrupt descriptor table register IDTの先頭番地と有効設定個数を設定する。
 
 ▼アセンブラ
  LGDT 指定したメモリ番地から48ビット(6バイト)を読み込みGDTRレジスタに代入する。
  LIDT 指定したメモリ番地から48ビット(6バイト)を読み込みIDTRレジスタに代入する。
  IRETD 割り込み処理終了後の必須命令。
  PUSHAD PUSH EAX
   PUSH ECX
   PUSH EDX
   PUSH EBX
   PUSH ESP
   PUSH EBP
   PUSH ESI
   PUSH EDI
  POPAD POP EAX
   POP ECX
   POP EDX
   POP EBX
   POP ESP
   POP EBP
   POP ESI
   POP EDI
  CALL 関数コール命令。

 ▼C言語
  インクルードファイルの指定
  →""は同一フォルダ内にある場合の指定。
   <>はライブラリ等、コンパイラがあらかじめ持っているファイル。

 ▼スタックへのデータ積み上げ
  関数の第一引数は[ESP+4]
  スタックは大きいアドレスから小さいアドレスへと積まれる。
  C言語の関数コールでは右側の引数からスタックへ積まれる。
 
 ■スタックフレームを別途調査する。
  CALL命令、RET命令についても先に進まないので別途。
  →http://scientia.jpn.org/
  
 ▼PIC Programmable interrupt controller
  設定可能割り込み制御装置
  →CPUは単独では1つしか割り込みを扱えないため、割り込み信号を複数扱えるようにつけられた補助チップ。
   マスタPICとスレーブPICからなり、スレーブPICはマスターPICのIRQ2を通じてつながっている。
   ・IRQ12 マウス
   ・IRQ1 キーボード

 ▼PICのレジスタ
  IMR imterrupt mask register 割り込みマスク 8ビットがIRQ信号の8個に対応している。
   →ビットがたつとマスク状態で、割り込みが無視される。
    割り込み関連の設定中はマスクする。IRQに何も接続されていない状態でもマスクされる。
  ICW initial control word 初期化制御
   →1〜4が存在し合計で4バイトのデータとなる。
    ICW3:マスタースレーブ接続に関する設定を行う。
    ICW2:IRQをどの割り込み番号でCPUに通知するかを決める。
       →

 ▼IDTの登録
  インデックス、割り込み処理アドレス、セグメント番号、属性を設定する。
  ※セグメント番号は下位3ビットを0にしないといけないため、上位13ビットに設定する。