.global ___main
- .code16
.text
.align 4
/************************************************
起動ハンドラ
************************************************/
-
_boot_handler:
- /* 画面のクリア */
- call bios_clr_disp
-
- /* メッセージ出力 */
- movw $boot_message, %si
- call bios_puts
-
-_boot_end:
- jmp _boot_end
-
- lgdt gdtr
- lidt idtr
-
- movl $0x11, %eax
- movl %eax, %cr0
- jmp _go_protect_mode
-
-_go_protect_mode:
- .byte 0x66, 0xea
- .long _start_32bit + 0x90000
- .word 0x0001
-
- .code32
-_start_32bit:
- jmp _start_32bit
-
-
-/************************************************
- BIOSサービス
-************************************************/
-
- /* 画面のクリア */
-bios_clr_disp:
- movb $0x3, %al
- movb $0, %ah
- int $0x10
- ret
-
-
- /* 1文字出力 */
-bios_putc:
- movb $0x0e, %ah
- movb $0, %bh
- int $0x10
- ret
-
- /* 文字列出力 */
-bios_puts:
- lodsb
- cmpb $0, %al
- jz bios_puts_end
- call bios_putc
- jmp bios_puts
-bios_puts_end:
- ret
-
-
-
- /* 起動メッセージ */
-boot_message:
- .ascii "Hyper Operation System V4 Advance\r\n\0"
-
-
-
-
-/************************************************
- グローバルディスクリプタテーブル
-************************************************/
-
-gdt_base:
-gdt_000: /* ヌルセグメント */
- .word 0x0000
- .word 0x0000
- .byte 0x00
- .byte 0x00
- .byte 0x00
- .byte 0x00
-
-gdt_001: /* コードセグメント用 */
- .word 0xffff /* リミット[15:0]:0xffff */
- .word 0x0000 /* ベース[15:0]:0x0000 */
- .byte 0x00 /* ベース[23:16] */
- .byte 0x9a /* P:1, DPL:0, S:1, TYPE:5, A:0 */
- .byte 0xcf /* G:1, D=1, リミット[19:15]:0xf */
- .byte 0x00 /* ベース[32:24]:0x00 */
-
-gdt_002: /* データセグメント用 */
- .word 0xffff /* リミット[15:0]:0xffff */
- .word 0x0000 /* ベース[15:0]:0x0000 */
- .byte 0x00 /* ベース[23:16] */
- .byte 0x92 /* P:1, DPL:0, S:1, TYPE:1, A:0 */
- .byte 0xcf /* G:1, D=1, リミット[19:15]:0xf */
- .byte 0x00 /* ベース[32:24]:0x00 */
-gdt_end:
-
-
- /* lgdt命令用領域 */
-gdtr: .word gdt_end - gdt_base - 1
- .long 0
-
-
-
-/************************************************
- 割込みディスクリプタテーブル
-************************************************/
-
-idt_base:
-idt_000: /* INT0 #DE 除算エラー */
- .word 0x0000 /* オフセット[15:0] */
- .word 0x0001 /* セグメントセレクタ */
- .byte 0x00 /* 予約 */
- .byte 0x8e /* P:1, DPL:0 */
- .word 0x00 /* オフセット[31:16] */
-
-idt_001: /* INT1 #DB 予約 */
- .word 0x0000 /* オフセット[15:0] */
- .word 0x0001 /* セグメントセレクタ */
- .byte 0x00 /* 予約 */
- .byte 0x8e /* P:1, DPL:0 */
- .word 0x00 /* オフセット[31:16] */
-
-idt_002: /* INT2 NMI */
- .word 0x0000 /* オフセット[15:0] */
- .word 0x0001 /* セグメントセレクタ */
- .byte 0x00 /* 予約 */
- .byte 0x8e /* P:1, DPL:0 */
- .word 0x00 /* オフセット[31:16] */
-
-idt_003: /* INT5 #BP ブレークポイント */
- .word 0x0000 /* オフセット[15:0] */
- .word 0x0001 /* セグメントセレクタ */
- .byte 0x00 /* 予約 */
- .byte 0x8e /* P:1, DPL:0 */
- .word 0x00 /* オフセット[31:16] */
-
-idt_004: /* INT4 #OF オーバーフロー */
- .word 0x0000 /* オフセット[15:0] */
- .word 0x0001 /* セグメントセレクタ */
- .byte 0x00 /* 予約 */
- .byte 0x8e /* P:1, DPL:0 */
- .word 0x00 /* オフセット[31:16] */
-
-
-idt_end:
-
-
- /* lidt命令用領域 */
-idtr: .word idt_end - idt_base - 1
- .long 0
+ movl $0x8000, %esp
+ jmp _main
+___main:
+ ret /* 何もしない */
+ .global __alloca
+__alloca:
+ pop %edx
+ sub %eax, %esp
+ jmp %edx
.end
open(IPL, $ARGV[1]) || die("$! : $ARGV[1]");
binmode IPL;
-open(SWITCH32, $ARGV[2]) || die("$! : $ARGV[2]");
-binmode SWITCH32;
+open(MODULE, $ARGV[2]) || die("$! : $ARGV[2]");
+binmode MODULE;
$size = -s $ARGV[1];
if ( $size > 512 ) { $size = 512; }
}
$size = -s $ARGV[2];
-read(SWITCH32, $buf, $size);
+read(MODULE, $buf, $size);
print OUT_IMG $buf;
for ($i = $i + $size; $i < 1474560; $i++)
{
# Hyper Operating System V4 Advance
# makefile for PC/AT
#
-# Copyright (C) 1998-2006 by Project HOS
+# Copyright (C) 1998-2008 by Project HOS
# http://sourceforge.jp/projects/hos/
# ----------------------------------------------------------------------------
-# %jp{ターゲット名}
+
+# --------------------------------------
+# %jp{各種設定}{setting}
+# --------------------------------------
+
+# %jp{ターゲット名}%en{target name}
TARGET ?= sample
-# %jp{ツール定義}
+# %jp{ツール定義}%en{tools}
GCC_ARCH ?= i386-elf-
CMD_CC ?= $(GCC_ARCH)gcc
CMD_ASM ?= $(GCC_ARCH)gcc
CMD_OBJCNV ?= $(GCC_ARCH)objcopy
+# %jp{アーキテクチャ定義}%en{architecture}
+ARCH_NAME ?= i386
+ARCH_CC ?= gcc
+
+
# %jp{ディレクトリ定義}
-OS_DIR = ../../../..
-KERNEL_DIR = $(OS_DIR)/kernel
-KERNEL_CFGRTR_DIR = $(OS_DIR)/cfgrtr/build/gcc
+TOP_DIR = ../../../..
+KERNEL_DIR = $(TOP_DIR)/kernel
+KERNEL_CFGRTR_DIR = $(TOP_DIR)/cfgrtr/build/gcc
KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake
KERNEL_BUILD_DIR = $(KERNEL_DIR)/build/ia32/i386/gcc
-OBJS_DIR = objs_$(TARGET)
-# %jp{共通定義読込み}
-include $(KERNEL_MAKINC_DIR)/common.inc
-# デバッグ版のターゲット名変更
-ifeq ($(DEBUG),Yes)
-TARGET := $(TARGET)dbg
-endif
+# %jp{コンフィギュレータ定義}
+KERNEL_CFGRTR = $(KERNEL_CFGRTR_DIR)/h4acfg-$(ARCH_NAME)
-# %jp{リンカスクリプト}
+# %jp{共通定義読込み}%jp{common setting}
+include $(KERNEL_MAKINC_DIR)/common.inc
+
+
+# %jp{リンカスクリプト}%en{linker script}
LINK_SCRIPT = link_fd.x
-# %jp{フラグ設定}
-CFLAGS = -march=i386
+# %jp{パス設定}%en{add source directories}
+INC_DIRS += . ..
+SRC_DIRS += . ..
+
+
+# %jp{オプションフラグ}%en{option flags}
AFLAGS = -march=i386
-LNFLAGS = -nostdlib -fno-exceptions -ffreestanding -fno-builtin -nostartfiles -Wl,-Map,$(TARGET).map,-T$(LINK_SCRIPT)
+CFLAGS = -march=i386
+LNFLAGS = -nostdlib -nostartfiles -lgcc -Wl,-Map,$(TARGET).map,-T$(LINK_SCRIPT)
+# LNFLAGS = -nostdlib -fno-exceptions -ffreestanding -fno-builtin -nostartfiles -Wl,-Map,$(TARGET).map,-T$(LINK_SCRIPT)
-# %jp{コンフィギュレータ定義}
-KERNEL_CFGRTR = $(KERNEL_CFGRTR_DIR)/h4acfg-i386
-# 出力ファイル名
+# %jp{コンパイラ依存の設定読込み}%en{compiler dependent definitions}
+include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_d.inc
+
+# %jp{実行ファイル生成用設定読込み}%en{definitions for exection file}
+include $(KERNEL_MAKINC_DIR)/makexe_d.inc
+
+
+# %jp{出力ファイル名}%en{output files}
TARGET_EXE = $(TARGET).$(EXT_EXE)
TARGET_MOT = $(TARGET).$(EXT_MOT)
TARGET_HEX = $(TARGET).$(EXT_HEX)
TARGET_BIN = $(TARGET).$(EXT_BIN)
TARGET_IMG = $(TARGET).img
-# %jp{gcc用の設定読込み}
-include $(KERNEL_MAKINC_DIR)/gcc_d.inc
-# ソースディレクトリ
-SRC_DIRS += . ..
+
+# --------------------------------------
+# %jp{ソースファイル}%en{source files}
+# --------------------------------------
# アセンブラファイルの追加
ASRCS += ./crt0.S
# %jp{C言語ファイルの追加}
-CSRCS +=
+CSRCS += ../main.c
-# ../kernel_cfg.c \
-# ../main.c \
+# CSRCS += ../kernel_cfg.c
# ../sample.c \
# ../ostimer.c \
# ../sci1.c
-# %jp{ライブラリの追加}
-LIBS +=
-
-# %jp{リンク制御対象制御}
-
# --------------------------------------
-# %jp{ルール}
+# %jp{ルール定義}%en{rules}
# --------------------------------------
-.PHONY : all
+# %jp{ALL}%en{all}
all: makeexe_all ipl.bin $(TARGET_BIN) $(TARGET_HEX) $(TARGET_MOT) $(TARGET).img
-.PHONY : clean
+# %jp{クリーン}%en{clean}
clean: makeexe_clean
rm -f $(TARGET_BIN) $(TARGET_HEX) $(TARGET_MOT) $(TARGET).img $(OBJS) ../kernel_cfg.c ../kernel_id.h
-.PHONY : depend
+# %jp{依存関係更新}%en{depend}
depend: makeexe_depend
+# %jp{ソース一括コピー}%en{source files copy}
+.PHONY : srccpy
+srccpy: makeexe_srccpy
+
+# %jp{カーネルごとクリーン}%en{mostlyclean}
.PHONY : mostlyclean
mostlyclean: clean kernel_clean
-# %jP{フロッピーディスクイメージ}%en{FD image}
-$(TARGET).img: ipl.bin switch32.bin
- ./fd_img.pl $(TARGET).img ipl.bin switch32.bin switch32.bin
-
-../kernel_cfg.c ../kernel_id.h: ../system.cfg
+# %jp{コンフィギュレータ実行}%en{configurator}
+../kernel_cfg.c ../kernel_id.h: ../system.cfg $(KERNEL_CFGRTR)
cpp -E ../system.cfg ../system.i
$(KERNEL_CFGRTR) ../system.i -c ../kernel_cfg.c -i ../kernel_id.h
-# %jp{ライブラリ生成用設定読込み}
-include $(KERNEL_MAKINC_DIR)/makeexe.inc
-
-# %jp{shc用のルール定義読込み}
-include $(KERNEL_MAKINC_DIR)/gcc_r.inc
-
-
-# %jp{BOOT部の生成}
-switch32.bin: $(OBJS_DIR)/switch32.o
- $(GCC_ARCH)ld -Ttext=0x0000 -nostdlib $(OBJS_DIR)/switch32.o -o switch32.out
- $(CMD_OBJCNV) -O binary switch32.out switch32.bin
-
-
# %jp{IPL部の生成}
ipl.bin: $(OBJS_DIR)/ipl.o
$(GCC_ARCH)ld -Ttext=0x0000 $(OBJS_DIR)/ipl.o -o ipl.out
$(CMD_OBJCNV) -O binary ipl.out ipl.bin
+# %jP{フロッピーディスクイメージ生成}%en{FD image}
+$(TARGET).img: ipl.bin $(TARGET_BIN)
+ ./fd_img.pl $(TARGET).img ipl.bin $(TARGET_BIN)
.PHONY : bochs
bochs: $(TARGET).img
bochs "floppya: 1_44=$(TARGET).img, status=inserted" "boot: a"
+# %jp{実行ファイル生成用設定読込み}%en{rules for exection file}
+include $(KERNEL_MAKINC_DIR)/makexe_r.inc
+
+# %jp{コンパイラ依存のルール定義読込み}%en{rules for compiler}
+include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_r.inc
+
+
+
+
# --------------------------------------
-# %jp{依存関係}
+# %jp{依存関係}%en{dependency}
# --------------------------------------
$(TARGET_EXE): $(LINK_SCRIPT)
*
* Sample program for PC/AT
*
- * Copyright (C) 1998-2007 by Project HOS
+ * Copyright (C) 1998-2008 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
IPL_SEG = 0x07c0 /* ロードされるセグメントアドレス */
-INIT_SEG = 0x8000 /* 初期化コード用セグメントアドレス */
-LOAD_SEG = 0x9000 /* 本体をロードするセグメントアドレス */
+LOAD_SEG = 0x0800 /* 本体をロードするセグメントアドレス */
+IPL_ADDR = (IPL_SEG << 4)
+LOAD_ADDR = (LOAD_SEG << 4)
.code16
cli
jmpl $IPL_SEG, $ipl_start /* CSの初期化 */
ipl_start:
- /* コードのコピー */
movw $IPL_SEG, %ax
- movw %ax, %ds
- movw $INIT_SEG, %ax
- movw %ax, %es
- xorw %si, %si
- xorw %di, %di
- movw $512, %cx
- cld
- rep movsw
-
- /* コピー先に移動 */
- movw %ax, %ds
- movw %ax, %ss
- xorw %sp, %sp
- jmpl $INIT_SEG, $init_start
-
+ movw %ax, %ds /* DSの初期化 */
+ movw %ax, %ss /* SSの初期化 */
+ movw $0x200, %ax
+ movw %ax, %sp /* SPの初期化 */
/***** 初期化部 *****/
init_start:
/* 画面のクリア */
- ; call bios_clr_disp
+ call bios_clr_disp
/* メッセージ出力 */
movw $boot_message, %si
movw $0x0002, %cx /* シリンダ・セクタ番号 */
movb $0x00, %dh /* ヘッド番号 */
movb $0x00, %dl /* ドライブ番号 */
- int $0x13
+ int $0x13
- /* ロード先に移動 */
- movw $LOAD_SEG, %ax
- movw %ax, %ds
- movw %ax, %ss
- xorw %sp, %sp
- jmpl $LOAD_SEG, $0x0000
+ jmp switch_32bit
-end_loop:
- jmp end_loop
/* 画面のクリア */
ret
+switch_32bit:
+ /* GDT設定 */
+ lgdt gdtr
+
+ /* プロテクトモードへ移行 */
+ movl %cr0, %eax
+ orl $0x00000001, %eax
+ movl %eax, %cr0
+ /* パイプラインフラッシュ */
+ .byte 0xe9, 0x00, 0x00
+
+ /* CS設定 */
+ .byte 0xea
+ .word _start_32bit + IPL_ADDR
+ .word 0x0008
+
+ .code32
+_start_32bit:
+ movw $0x0010, %ax
+ movw %ax, %ss
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+
+ movl $LOAD_ADDR, %eax
+ jmp %eax
+
+
+
/* 起動メッセージ */
boot_message:
- .ascii "HOS-Loader\r\nNow Loading...\r\n\0"
+ .ascii "HOS-Loader\r\nNow loading...\r\n\0"
+
+
+/************************************************
+ グローバルディスクリプタテーブル
+************************************************/
+
+gdt_base:
+gdt_000: /* ヌルセグメント */
+ .word 0x0000
+ .word 0x0000
+ .byte 0x00
+ .byte 0x00
+ .byte 0x00
+ .byte 0x00
+
+gdt_001: /* コードセグメント用 */
+ .word 0xffff /* リミット[15:0]:0xffff */
+ .word 0x0000 /* ベース[15:0]:0x0000 */
+ .byte 0x00 /* ベース[23:16] */
+ .byte 0x9a /* P:1, DPL:0, S:1, TYPE:5, A:0 */
+ .byte 0xcf /* G:1, D=1, リミット[19:15]:0xf */
+ .byte 0x00 /* ベース[32:24]:0x00 */
+
+gdt_002: /* データセグメント用 */
+ .word 0xffff /* リミット[15:0]:0xffff */
+ .word 0x0000 /* ベース[15:0]:0x0000 */
+ .byte 0x00 /* ベース[23:16] */
+ .byte 0x92 /* P:1, DPL:0, S:1, TYPE:1, A:0 */
+ .byte 0xcf /* G:1, D=1, リミット[19:15]:0xf */
+ .byte 0x00 /* ベース[32:24]:0x00 */
+gdt_end:
+
+
+ /* lgdt命令用領域 */
+gdtr: .word gdt_end - gdt_base - 1
+ .long gdt_base + IPL_ADDR
/* マジックナンバー */
ENTRY(_boot_handler)
+MEMORY
+{
+ ram : o = 0x00008000, l = 0x98000
+}
+
+
SECTIONS
{
.text :
*(.strings)
*(.rodata*)
___text_end = . ;
- }
+ } > ram
.tors :
{
. = ALIGN(4);
___dtors = . ;
*(.dtors)
___dtors_end = . ;
- }
+ } > ram
data :
{
___data = . ;
*(.data)
___data_end = . ;
- }
+ } > ram
.bss :
{
___bss = . ;
*(.bss)
*(COMMON)
___bss_end = . ;
- }
+ } > ram
}
*/
-LOAD_ADDR = 0x90000
+LOAD_ADDR = 0x8000
.code16
call bios_puts
/* メモリマップ取得 */
- movl 0xe820, %eax
- movl 0x0000, %ebx
- movw
+/* movl 0xe820, %eax
+ movl 0x0000, %ebx */
/* GDT設定 */
.byte 0x66, 0xea
.long _start_32bit + LOAD_ADDR
.word 0x0008
-
+
.code32
movw 0x0010, %ax
メモリマップテーブル
************************************************/
memory_map:
-
+
.end
#include "kernel.h"
+
/** %jp{メイン関数} */
int main()
{
+ volatile char *tvram = (volatile char *)0xb8000;
+ const char msg[] = "Hello Wold!";
+ int i;
+
+ for ( i = 0; msg[i] != '\0'; i++ )
+ {
+ tvram[i*2] = msg[i];
+ }
+
+ for ( ; ; )
+ {
+ }
+
/* %jp{カーネルの動作開始} */
- vsta_knl();
+/* vsta_knl(); */
return 0;
}