3日目 bootpack.cをアセンブル - HobbyOSs/opennask GitHub Wiki

概要

  • osaskは既存のリンカ(ld)を使わず、独自ツールで独自フォーマットの.bim, .hrbを作成する
  • 先人は、それに対抗するため(?)、ldのリンカスクリプトを用いてオブジェクトからそれぞれの形式に変換する道筋を提示している

image

右が正規なosaskツールで出力したバイナリ

差異のある箇所

image

bootpack.c

void HariMain(void)
{

fin:
	/* ここにHLTを入れたいのだが、C言語ではHLTが使えない! */
	goto fin;

}

変換過程(正規版osask)

bootpack.gas

	.file	"bootpack.c"
	.text
	.balign 2
.globl _HariMain
	.def	_HariMain;	.scl	2;	.type	32;	.endef
_HariMain:
	pushl	%ebp
	movl	%esp, %ebp
L2:
	jmp	L2

bootpack.nas

[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE "bootpack.c"]
[SECTION .text]
	GLOBAL	_HariMain   ; 
_HariMain:              ; 
	PUSH	EBP         ; 55 (→ 0x50+rd)
	MOV	EBP,ESP         ; 89e5
L2:                     ; 
	JMP	L2              ; ebfe
                        ; 残り 55 89e5 5de9 f2ff は?

bootpack.bim

  • 生データ
00000000: 0e00 0000 2400 0000 2400 0000 0000 0000  ....$...$.......
00000010: 3400 0000 0000 3100 2900 0000 0000 0000  4.....1.).......
00000020: 0000 0000 5589 e5eb fe55 89e5 5de9 f2ff  ....U....U..]...
00000030: ffff 0000                                ....
  • データ早見表
[ .bimファイルの構造(haribote.rulを使った場合) ]
+ 0 : .textサイズ
+ 4 : ファイル中の.textスタートアドレス(0x24 = 36)
+ 8 : メモリロード時の.textスタートアドレス(0x24 = 36)
+12 : .dataサイズ
+16 : ファイル中の.dataスタートアドレス
+20 : メモリロード時の.dataスタートアドレス
+24 : エントリポイント
+28 : bss領域のバイト数
+36 : コード
  • 表とバイナリを合わせてみる
オフセット データ 意味
+ 0 0e00 0000 .textサイズ
+ 4 2400 0000 .textスタートアドレス(file)
+ 8 2400 0000 .textスタートアドレス(mem)
+12 0000 0000 .dataサイズ
+16 3400 0000 .dataスタートアドレス(file)
+20 0000 3100 .dataスタートアドレス(mem)
+24 2900 0000 エントリポイント
+28 0000 0000 bss領域のバイト数
+36 0000 0000 コード

bootpack.hrb

  • 最初〜3100までが書き換わり、5589から後は明確なアセンブラ
[ .hrbファイルの構造 ]

+ 0 : stack+.data+heap の大きさ(4KBの倍数)
+ 4 : シグネチャ "Hari"
+ 8 : mmarea の大きさ(4KBの倍数)
+12 : スタック初期値&.data転送先
+16 : .dataのサイズ
+20 : .dataの初期値列がファイルのどこにあるか
+24 : 0xe9000000
+28 : エントリアドレス-0x20
+32 : heap領域(malloc領域)開始アドレス
+36 : コード

00000000: 0000 3100 4861 7269 0000 0000 0000 3100  ..1.Hari......1.
00000010: 0000 0000 3400 0000 0000 00e9 0900 0000  ....4...........
00000020: 0000 3100 5589 e5eb fe55 89e5 5de9 f2ff  ..1.U....U..]...
00000030: ffff 0000                                ....

変換過程(不正規版osask)

bootpack.nasm

global HariMain: function
SECTION .text   align=1 execute                         ; section number 1, code

HariMain:; Function begin
        push    ebp                                     ; 0000 _ 55
        mov     ebp, esp                                ; 0001 _ 89. E5
?_001:  jmp     ?_001                                   ; 0003 _ EB, FE
; HariMain End of function

SECTION .data   align=1 noexecute                       ; section number 2, data
SECTION .bss    align=1 noexecute                       ; section number 3, bss