OSDN Git Service

(none)
authorryuz <ryuz>
Thu, 1 May 2008 15:35:48 +0000 (15:35 +0000)
committerryuz <ryuz>
Thu, 1 May 2008 15:35:48 +0000 (15:35 +0000)
sample/ia32/pcat/gcc/crt0.S
sample/ia32/pcat/gcc/fd_img.pl
sample/ia32/pcat/gcc/gmake.mak
sample/ia32/pcat/gcc/ipl.S
sample/ia32/pcat/gcc/link_fd.x
sample/ia32/pcat/gcc/switch32.S
sample/ia32/pcat/main.c

index 0131d94..2c85c87 100755 (executable)
                                .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
 
index 1e6ca2b..2247bbb 100755 (executable)
@@ -6,8 +6,8 @@ binmode OUT_IMG;
 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; }
@@ -19,7 +19,7 @@ for ($i = $size; $i < 512; $i++)
 }
 
 $size = -s $ARGV[2];
-read(SWITCH32, $buf, $size);
+read(MODULE, $buf, $size);
 print OUT_IMG $buf;
 for ($i = $i + $size; $i < 1474560; $i++)
 {
index d14c478..c1e2209 100755 (executable)
@@ -2,15 +2,20 @@
 # 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
@@ -18,122 +23,132 @@ CMD_LINK   ?= $(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)
index ddf8587..c83b0e9 100755 (executable)
@@ -3,15 +3,16 @@
  *
  *  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
@@ -25,28 +26,16 @@ ipl_top:
                                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
@@ -61,17 +50,10 @@ init_start:
                                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
                                
                                
                                /* 画面のクリア */
@@ -100,10 +82,76 @@ bios_puts_end:
                                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
 
 
                                /* マジックナンバー */
index 8b598f3..b5b0857 100755 (executable)
@@ -1,6 +1,12 @@
 ENTRY(_boot_handler)
 
 
+MEMORY
+{
+       ram    : o = 0x00008000, l = 0x98000
+}
+
+
 SECTIONS
 {
        .text :
@@ -11,7 +17,7 @@ SECTIONS
                *(.strings)
                *(.rodata*)
                 ___text_end = . ; 
-       }
+       } > ram
        .tors :
        {
                . = ALIGN(4);
@@ -21,20 +27,20 @@ SECTIONS
                ___dtors = . ;
                *(.dtors)
                ___dtors_end = . ;
-       }
+       } > ram
        data : 
        {
                ___data = . ;
                *(.data)
                ___data_end = . ;
-       }
+       } > ram
        .bss :
        {
                ___bss = . ;
                *(.bss)
                *(COMMON)
                ___bss_end = . ;  
-       }
+       } > ram
 }
 
 
index 9261b85..a36c4cb 100755 (executable)
@@ -8,7 +8,7 @@
  */
 
 
-LOAD_ADDR = 0x90000
+LOAD_ADDR = 0x8000
 
 
                                .code16
@@ -28,9 +28,8 @@ _switch32:
                                call    bios_puts
                                
                                /* メモリマップ取得 */
-                               movl    0xe820, %eax
-                               movl    0x0000, %ebx
-                               movw    
+/*                             movl    0xe820, %eax
+                               movl    0x0000, %ebx    */
                                
                                
                                /* GDT設定 */
@@ -50,7 +49,7 @@ _pipeline_flush:
                                .byte   0x66, 0xea
                                .long   _start_32bit + LOAD_ADDR
                                .word   0x0008
-                               
+
                                .code32
 
                                movw    0x0010, %ax
@@ -145,7 +144,7 @@ gdtr:                       .word   gdt_end - gdt_base - 1
   メモリマップテーブル
 ************************************************/
 memory_map:
-                               
+
 
 
                                .end
index d399e05..9f231c0 100755 (executable)
 #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;
 }