2014年10月11日土曜日

[OS作成]30日でできる!OS自作入門 5日目 (1)

筆者の独自ツールをそのまま使えば良かったんじゃないかと思いつつも、 Linux(Ubuntu14.04)の標準ツールだけで、OSを作成中。

静的なデータ領域の参照アドレスが正しくなるように、こちらのリンカスクリプトを参考にして、 リンカスクリプトでbootpackのヘッダ部分を定義する方式に変更した。

tinyos_lnk.ls

OUTPUT_FORMAT("binary")

ENTRY("Main")

SECTIONS {
 .head 0x0 : {
  LONG(128 * 1024)      /* 0 : stack+.data+heap の大きさ(4KBの倍数) */
  LONG(0x54696e79)      /* 4 : シグネチャ "Tiny" */
  LONG(0)               /* 8 : mmarea の大きさ(4KBの倍数) */
  LONG(0x310000)        /* 12 : スタック初期値&.data転送先 */
  LONG(SIZEOF(.data))   /* 16 : .dataサイズ */
  LONG(LOADADDR(.data)) /* 20 : .dataの初期値列のファイル位置 */
  LONG(0xE9000000)      /* 24 : 0xE9000000 */
  LONG(Main - 0x20)     /* 28 : エントリアドレス - 0x20 */
  LONG(24 * 1024)       /* 32 : heap領域(malloc領域)開始アドレス */
 }

 .text : { *(.text) }
 .data 0x310000 : AT ( ADDR(.text) + SIZEOF(.text) ) {
       *(.data)
       *(.rodata*)
       *(.bss)
 }
 .eh_frame : { *(.eh_frame) }
}

静的変数が正しく参照できなかったので、きっとdataセクションを0x310000にすれば良いのだろうなと思っていたのだけど、 単純に .data 0x310000 と書くと、作成されるファイルのサイズが大きくなってしまい、FDイメージが作成できなかった。
ATでtextセクションの後ろにくるように指定でき、イメージを小さくできた。

このリンカスクリプトにより、次の静的変数は正しく参照できるようになった。
  • パレットの定義変数 static unsigned char table_rgb[16 * 3] 
  • フォントA static char font_A[16]

文字Aが表示できたので、今日はここまで。