[ :Yana: Index ]

:Yana:YanaKernel: YanaKernel0 Prototype (2010-03-11)

概要 (2009-07-11)

YanaKernel0の試作品を、ソフトウェアで実装しています。

とりあえず、MIPSに続いて、ARMについても、サンプルを実行できました。

ダウンロード (2010-03-11)

次のアーカイブ・ファイルは、責任や保証を求めずに、個人的に用いてください。

YanaKernel0AのARMの実行例 (2010-03-11)

次のような環境で、サンプルを実行できました。

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$ CC="arm-elf-gcc -O2" make
rm -f *.map *.o echo0 echo1 echo2 echo3
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs   -c -o start.o ../common/st
art.S
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs   -c -o tool.o ../common/too
l.c
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs   -c -o yk0a_core.o ../../..
/kernel/arm/yk0a_core.c
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs   -c -o yk0a_glue.o ../../..
/kernel/arm/yk0a_glue.S
../../../kernel/arm/yk0a_glue.S: Assembler messages:
../../../kernel/arm/yk0a_glue.S:32: Warning: writeback of base register is UNPRE
DICTABLE
../../../kernel/arm/yk0a_glue.S:49: Warning: writeback of base register is UNPRE
DICTABLE
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs   -c -o yk0a_internal.o ../.
./../kernel/arm/yk0a_internal.c
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs  -g -Wall -Wstrict-prototype
s -std=c89 -ffreestanding -I. -I../common -I../../../kernel/arm -march=armv4 -ma
bi=aapcs -Wl,-Map,echo0.map -Wl,--cref -Wl,-e,start  echo0.c start.o tool.o yk0a
_core.o yk0a_glue.o yk0a_internal.o  -nostdlib -lgcc -o echo0
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs  -g -Wall -Wstrict-prototype
s -std=c89 -ffreestanding -I. -I../common -I../../../kernel/arm -march=armv4 -ma
bi=aapcs -Wl,-Map,echo1.map -Wl,--cref -Wl,-e,start  echo1.c start.o tool.o yk0a
_core.o yk0a_glue.o yk0a_internal.o  -nostdlib -lgcc -o echo1
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs  -g -Wall -Wstrict-prototype
s -std=c89 -ffreestanding -I. -I../common -I../../../kernel/arm -march=armv4 -ma
bi=aapcs -Wl,-Map,echo2.map -Wl,--cref -Wl,-e,start  echo2.c start.o tool.o yk0a
_core.o yk0a_glue.o yk0a_internal.o  -nostdlib -lgcc -o echo2
arm-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../co
mmon -I../../../kernel/arm -march=armv4 -mabi=aapcs  -g -Wall -Wstrict-prototype
s -std=c89 -ffreestanding -I. -I../common -I../../../kernel/arm -march=armv4 -ma
bi=aapcs -Wl,-Map,echo3.map -Wl,--cref -Wl,-e,start  echo3.c start.o tool.o yk0a
_core.o yk0a_glue.o yk0a_internal.o  -nostdlib -lgcc -o echo3

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$ gxemul -q -E testarm echo0

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000001 200000d7}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$ gxemul -q -E testarm echo1

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000001 200000db}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$ gxemul -q -E testarm echo2

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000002 00000000}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$ gxemul -q -E testarm echo3

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000003 00000000}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/arm/echo
$

YanaKernel0AのMIPSの実行例 (2010-03-11)

次のような環境で、サンプルを実行できました。

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$ CC="mips-elf-gcc -O2" make
rm -f *.map *.o echo0 echo1 echo2 echo3
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32   -c -o start
.o ../common/start.S
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32   -c -o tool.
o ../common/tool.c
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32   -c -o yk0a_
core.o ../../../kernel/mips/yk0a_core.c
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32   -c -o yk0a_
glue.o ../../../kernel/mips/yk0a_glue.S
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32  -g -Wall -Ws
trict-prototypes -std=c89 -ffreestanding -I. -I../common -I../../../kernel/mips
-march=mips32 -mabi=eabi -DTESTMIPS32 -Wl,-Map,echo0.map -Wl,--cref -Wl,-e,start
 -Wl,-Ttext,0x80030000  echo0.c start.o tool.o yk0a_core.o yk0a_glue.o  -nostdli
b -lgcc -o echo0
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32  -g -Wall -Ws
trict-prototypes -std=c89 -ffreestanding -I. -I../common -I../../../kernel/mips
-march=mips32 -mabi=eabi -DTESTMIPS32 -Wl,-Map,echo1.map -Wl,--cref -Wl,-e,start
 -Wl,-Ttext,0x80030000  echo1.c start.o tool.o yk0a_core.o yk0a_glue.o  -nostdli
b -lgcc -o echo1
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32  -g -Wall -Ws
trict-prototypes -std=c89 -ffreestanding -I. -I../common -I../../../kernel/mips
-march=mips32 -mabi=eabi -DTESTMIPS32 -Wl,-Map,echo2.map -Wl,--cref -Wl,-e,start
 -Wl,-Ttext,0x80030000  echo2.c start.o tool.o yk0a_core.o yk0a_glue.o  -nostdli
b -lgcc -o echo2
mips-elf-gcc -O2 -g -Wall -Wstrict-prototypes -std=c89 -ffreestanding -I. -I../c
ommon -I../../../kernel/mips -march=mips32 -mabi=eabi -DTESTMIPS32  -g -Wall -Ws
trict-prototypes -std=c89 -ffreestanding -I. -I../common -I../../../kernel/mips
-march=mips32 -mabi=eabi -DTESTMIPS32 -Wl,-Map,echo3.map -Wl,--cref -Wl,-e,start
 -Wl,-Ttext,0x80030000  echo3.c start.o tool.o yk0a_core.o yk0a_glue.o  -nostdli
b -lgcc -o echo3

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$ gxemul -q -E oldtestmips -C 4kc echo0

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000001 0000000c}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$ gxemul -q -E oldtestmips -C 4kc echo1

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000001 00000014}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$ gxemul -q -E oldtestmips -C 4kc echo2

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000002 00000000}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$ gxemul -q -E oldtestmips -C 4kc echo3

NOTE: This is a LEGACY emulation mode.

console{c0000000 00000003 00000000}

yana@cygwin ~/yanakernel0prototype/yanakernel0a/sample/mips/echo
$

YanaKernel0Aの資源限定 (2010-03-11)

まず、この試作品では、次のような資源をカーネルの内部で使用しています。

次に、カーネルの内部から外部へのインターフェースは、プロセッサの外部のメモリではなく、プロセッサの内部のレジスタを使用しています。
カーネルの外部から内部へのインターフェースは、プロセッサの内部のレジスタと、ルーチン「yk0a_initialize」とルーチン「yk0a_exception_interrupt_procedure」を使用しています。

ここで、プロセッサについてですが、カーネルの内部と外部で1個のプロセッサを使用しています。
ルーチン「yk0a_initialize」を実行すると、カーネルの内部の処理の後で、カーネルの外部に戻ります。
ルーチン「yk0a_exception_interrupt_procedure」を実行すると、カーネルの内部の処理の後で、実行可能状態のTaskがなければ、割り込みを待ち、実行可能状態のTaskがあれば、カーネルの外部に戻ります。

カーネルの内部の処理時間ということでは、ルーチン「yk0a_initialize」には、マクロ「YK0A_SETUP_PORT_SIZE」に比例する部分と、マクロ「YK0A_SETUP_PRIORITY_SIZE」に比例する部分と、マクロ「YK0A_SETUP_TASK_SIZE」に比例する部分があります。
ルーチン「yk0a_exception_interrupt_procedure」には、マクロ「YK0A_SETUP_PRIORITY_SIZE」に比例する部分(関数「yk0a_schedule_update」)があります。
なお、関数「yk0a_schedule_update」については、マクロ「YK0A_SETUP_PRIORITY_SIZE」でループしていますが、ARMとMIPSの命令「CLZ」などのビット処理に変更できそうです。

また、メモリについてですが、カーネルの内部と外部で共有しているのは、ルーチン「yk0a_initialize」とルーチン「yk0a_exception_interrupt_procedure」を実行する部分だけです。
例えば、カーネルのスタックを、例外ハンドラや割り込みハンドラなどが読み書きすることはありませんし、Taskのスタックを、カーネルが読み書きすることもありません。

カーネルの内部のメモリ容量ということでは、コンパイラなどに依存しますが、使用例を整理しました。
なお、カーネルのスタックについては、再帰や再入などで使用するわけではありませんし、逆アセンブルして、上限を確認しました。

YanaKernel0AのARMの使用例「CC="arm-elf-gcc -O2" make」

.text
.bss - stack
stack
yk0a_exception_forward


case0: 8
yk0a_interrupt_bit_flag


case1: 16
yk0a_core_initialize


case2: 24
yk0a_core_exception_interrupt_procedure


case3: 32+max(case0, case1)
yk0a_core.c
2824
yk0a_port_control: 16 * YK0A_SETUP_PORT_SIZE
yk0a_schedule_link: 4
yk0a_schedule_queue: 8 * YK0A_SETUP_PRIORITY_SIZE
yk0a_task_control: 92 * YK0A_SETUP_TASK_SIZE
max(case2, case3)=48
yk0a_glue.S
128
0
0
yk0a_internal.c
0
yk0a_interrupt_mask: 4
0
YanaKernel0AのMIPSの使用例「CC="mips-elf-gcc -O2" make」

.text + .rodata
.sbss + .bss - stack
stack
yk0a_exception_forward


case0: 0
yk0a_interrupt_bit_flag


case1: 0
yk0a_core_initialize


case2: 0
yk0a_core_exception_interrupt_procedure


case3: 8+max(case0, case1)
yk0a_core.c
3080
yk0a_port_control: 16 * YK0A_SETUP_PORT_SIZE
yk0a_schedule_link: 4
yk0a_schedule_queue: 8 * YK0A_SETUP_PRIORITY_SIZE
yk0a_task_control: 156 * YK0A_SETUP_TASK_SIZE
max(case2, case3)=8
yk0a_glue.S
476
0
0

あと、割り込みコントローラについてですが、ARMの場合は、カーネルの内部と外部で1個の割り込みコントローラを使用しています。
MIPSの場合は、割り込みコントローラを使用していませんが、プロセッサのレジスタ「Status」のフィールド「IM」とレジスタ「Cause」のフィールド「IP」を読み書きしています。

割り込みが発生すると、ルーチン「yk0a_exception_interrupt_procedure」を実行して、カーネルの内部で、割り込みの要求ビットを取得してから、取得したビットで割り込みを無効にして、取得したビットでFlagを設定します。
なお、カーネルの内部で割り込みを無効にするのは、割り込みの発生が続かないようにするためですので、発生した割り込みを無効にするような割り込みコントローラでは、カーネルの内部で割り込みコントローラを読み書きしないように変更できそうです。

Credit

(C) 2009-2010 Yana

Direction: Yana
HTML: Yana
Program: Yana

ChangeLog

2010-03-11 release 3
2009-09-11 release 2
2009-07-11 release 1
2009-05-11 release 0

[ :Yana: Index ]
(C) 2009-2010 Yana
このサイトについて