Skip to content

Commit

Permalink
Merge pull request #74 from bassaer/GUI
Browse files Browse the repository at this point in the history
[ver 2.0.0] add GUI
  • Loading branch information
bassaer committed Mar 15, 2020
2 parents 4caeb9f + 7afa264 commit 49f9cc3
Show file tree
Hide file tree
Showing 33 changed files with 5,797 additions and 146 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# CHANGELOG

## ver 2.0.0
- add GUI

## ver 1.15.1
- fix context switch

Expand Down
83 changes: 49 additions & 34 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,39 +1,51 @@
VER = $(shell ./scripts/changelog.sh -v)
IMG = myos-$(VER).img
CFLAGS = -c -m32 -Wall -Iinclude -Ibin/include -fno-pie -fno-builtin -nostdlib
KERN_OBJ = kernel/main.o \
kernel/func.o \
kernel/dsctbl.o \
kernel/console.o \
kernel/intr.o \
kernel/keyboard.o \
kernel/sched.o \
kernel/timer.o

LIB_OBJ = lib/queue.o \
lib/string.o

MM_OBJ = mm/memory.o \
mm/pgtable.o

BIN_OBJ = bin/echo.o \
bin/free.o \
bin/ls.o \
bin/sh.o \
bin/shutdown.o \
bin/sleep.o

ARCH = arch/x86/boot
VER = $(shell ./scripts/changelog.sh -v)
IMG = myos-$(VER).img
CFLAGS = -c -m32 -Wall -Iinclude -Ibin/include -fno-pie -fno-builtin -nostdlib
KERN_OBJ = kernel/main.o \
kernel/func.o \
kernel/dsctbl.o \
kernel/console.o \
kernel/intr.o \
kernel/keyboard.o \
kernel/sched.o \
kernel/timer.o

LIB_OBJ = lib/queue.o \
lib/string.o

MM_OBJ = mm/memory.o \
mm/pgtable.o

DRV_OBJ = drivers/cursor.o \
drivers/palette.o \
drivers/screen.o \
drivers/vram.o

BIN_OBJ = bin/echo.o \
bin/free.o \
bin/ls.o \
bin/sh.o \
bin/shutdown.o \
bin/sleep.o

ARCH_BOOT = arch/x86/boot

ifeq ($(UI), CUI)
ARCH_HEAD = arch/x86/cui
else
ARCH_HEAD = arch/x86/gui
endif

.PHONY: install img run package clean

all: package

install:
sudo apt install -y gcc mtools qemu-system-i386

img: $(ARCH)/ipl.bin $(ARCH)/head.bin kernel/kernel.bin
cat $(ARCH)/head.bin kernel/kernel.bin > sys.bin
mformat -f 1440 -C -B $(ARCH)/ipl.bin -i $(IMG)
img: $(ARCH_BOOT)/ipl.bin $(ARCH_HEAD)/head.bin kernel/kernel.bin
cat $(ARCH_HEAD)/head.bin kernel/kernel.bin > sys.bin
mformat -f 1440 -C -B $(ARCH_BOOT)/ipl.bin -i $(IMG)
mcopy sys.bin -i $(IMG) ::

%.o: %.c
Expand All @@ -45,14 +57,17 @@ img: $(ARCH)/ipl.bin $(ARCH)/head.bin kernel/kernel.bin
.s.o:
as --32 -o $@ $<

$(ARCH)/ipl.bin: $(ARCH)/ipl.o
ld $^ -T $(ARCH)/ipl.ld -Map ipl.map -o $@
font:
python scripts/font.py -f scripts/font.txt

$(ARCH_BOOT)/ipl.bin: $(ARCH_BOOT)/ipl.o
ld $^ -T $(ARCH_BOOT)/ipl.ld -Map ipl.map -o $@

$(ARCH)/head.bin: $(ARCH)/head.o
ld $^ -T $(ARCH)/head.ld -Map head.map -o $@
$(ARCH_HEAD)/head.bin: $(ARCH_HEAD)/head.o
ld $^ -T $(ARCH_HEAD)/head.ld -Map head.map -o $@

# TODO : ひとまずkernelにすべてリンクするが、あとでユーザ空間を分ける
kernel/kernel.bin: $(KERN_OBJ) $(LIB_OBJ) $(BIN_OBJ) $(MM_OBJ)
kernel/kernel.bin: $(KERN_OBJ) $(LIB_OBJ) $(BIN_OBJ) $(MM_OBJ) $(DRV_OBJ)
ld $^ -T kernel/kernel.ld -Map kernel.map -o $@

run: img
Expand Down
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@
[![Build Status](https://travis-ci.com/bassaer/myos.svg?branch=master)](https://travis-ci.com/bassaer/myos)

- x86 32bit OS
- debian/ubuntu上でビルド
- qemuで実行
- debian/ubuntu build
- run on qemu
- gas + C

## GUI
```
❯ make run
❯ make clean run UI=GUI
```

## CUI
```
❯ make clean run UI=CUI
```
##
![screenshot](https://github.com/bassaer/myos/blob/master/screen.gif)
File renamed without changes.
6 changes: 6 additions & 0 deletions arch/x86/boot/head.s → arch/x86/cui/head.s
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
.equ DSKCAC0, 0x00008000
.equ CYLS, 0x0ff0
.equ LEDS, 0x0ff1
.equ VMODE, 0x0ff2
.equ SCRNX, 0x0ff4
.equ SCRNY, 0x0ff6
.equ VRAM, 0x0ff8
.equ GUI, 0x0ffc

.text
.code16
Expand All @@ -11,6 +16,7 @@ keystatus:
movb $0x02, %ah
int $0x16
movb %al, (LEDS)
movb $0x03, (GUI) # 起動をCUIかGUIか選択

# PICが一切割り込みをしないようにする
movb $0xff, %al
Expand Down
8 changes: 8 additions & 0 deletions arch/x86/gui/head.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
OUTPUT_FORMAT(binary)

OUTPUT_ARCH(i386)

SECTIONS {
. = 0xc200;
.text : { *(.text) }
}
166 changes: 166 additions & 0 deletions arch/x86/gui/head.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
.equ KERNEL, 0x00280000
.equ DSKCAC, 0x00100000
.equ DSKCAC0, 0x00008000
.equ CYLS, 0x0ff0
.equ LEDS, 0x0ff1
.equ VMODE, 0x0ff2
.equ SCRNX, 0x0ff4
.equ SCRNY, 0x0ff6
.equ VRAM, 0x0ff8
.equ GUI, 0x0ffc

.text
.code16

movb $0x13, %al # VGAグラフィックス 320x200x8bit color
movb $0x00, %ah
int $0x10
movb $0x08, (VMODE)
movw $320, (SCRNX)
movw $200, (SCRNY)
movl $0x000a0000, (VRAM)
movb $0x01, (GUI) # 起動をCUIかGUIか選択

keystatus:
movb $0x02, %ah
int $0x16
movb %al, (LEDS)

# PICが一切割り込みをしないようにする
movb $0xff, %al
outb %al, $0x21 # マスタPICすべてで割り込み禁止
nop # 何もしない命令(1クロックだけ停止)
outb %al, $0xa1 # スレーブPICすべてで割り込み禁止
cli # CPUレベルで割り込み禁止

# CPUから1MB以上のメモリにアクセスできるようにA20GATEを設定
call waitkbout
movb $0xd1, %al
outb %al, $0x64
call waitkbout
movb $0xdf, %al # AT20をON
outb %al, $0x60
call waitkbout

# プロテクトモード移行
.arch i486 # 386以降のキーワードを使用するため
lgdtl (GDTR0) # 暫定GDTを設定
movl %cr0, %eax # CR0(control register 0)の先頭を0と末尾を1にする
andl $0x7fffffff, %eax # bit31を0にする(ページング禁止のため)
orl $0x00000001, %eax # bit0を1にする(プロテクトモード移行のため)
movl %eax, %cr0 # CR0に値を戻すとプロテクトモードに移行する
jmp pipelineflush

# プロテクトモードに入るとセグメントレジスタの意味が変わるので
# 値を0x0000から0x0008に変更
# 0x0008はgdt+1のセグメントに相当
pipelineflush:
movw $1*8, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %fs
movw %ax, %gs
movw %ax, %ss

# memcpyを使用し、メモリをコピー
# カーネルのアドレスから512KBを0x00280000にコピー
movl $kernel_entry, %esi # バイナリをcatでつなげるため、kernel_entryラベルはカーネルの先頭を表す
movl $KERNEL, %edi
movl $512*1024/4, %ecx
call memcpy

# 0x00007c00から512バイトを0x00100000にコピー
# ブートセクタを1MB以降のメモリにコピー
movl $0x7c00, %esi
movl $DSKCAC, %edi
movl $512/4, %ecx
call memcpy

# 0x00008200からディスクの内容を0x00100200にコピー
movl $DSKCAC0+512, %esi
movl $DSKCAC+512, %edi
movl $0x00, %ecx
movb (CYLS), %cl
imull $512*18*2/4, %ecx
subl $512/4, %ecx
call memcpy

# カーネルの0x10c8から0x11a8までを0x00310000へコピー(スタック)
movl $KERNEL, %ebx
movl $0x11a8, %ebx
addl $3, %ecx # ecx += 3;
shrl $2, %ecx # ecx /= 3;
jz skip
movl $0x10c8, %edi
addl %ebx, %esi
movl $0x00310000, %edi
call memcpy

# カーネルに移動
skip:
movl $0x00310000, %esp # スタック初期値
ljmpl $2*8, $KERNEL # セグメント2(カーネル)

# キーボード制御回路が制御命令を受付可能になるまで待つ
waitkbout:
inb $0x64, %al
andb $0x02, %al
jnz waitkbout
ret

# 転送元, 転送先のアドレスと転送サイズを指定し, コピーする
memcpy:
movl (%esi), %eax
addl $4, %esi
movl %eax, (%edi)
addl $4, %edi
subl $1, %ecx
jnz memcpy
ret

.align 8 # GDT0ラベルが8の倍数になるようにゼロ埋め

# 暫定GDT
# セグメンテーションの情報を64bitで表す
# cf. http://softwaretechnique.jp/OS_Development/kernel_loader2.html
GDT0:
.skip 8, 0x00 # ヌルセレクタ(全部0), Intelの仕様

# データディスクリプタ
# 読み書き可能な32bit

# セグメントのサイズ(下位16bit), 0xfffffx4KB=1GBがセグメントサイズ(55bit目でGビットを設定)
.word 0xffff
# コードセグメントの開始アドレス(ベースアドレス下位16bit), 4GB全体を1つのセグメントと扱う
.word 0x0000
# 32-39bitはコードセグメントの開始アドレス16-23bit目(00000000)
# 40-47bit(10010010)逆に見る
# 40-43bitはセグメントタイプでデータセグメントとアクセスビットにフラグ
# 44bitは1(コードoデータセグメント), 45-46bitは特権レベル00(最高リング0), 47bitは1(セグメントがメモリ内に有)
.word 0x9200
# 48-51bitはセグメントサイズ(上位4bit)
# 52bitは自由使用可, 53bitは予約領域0
# 54bitはデフォルトオペレーションサイズ(1:32bit用セグメント)
# 55bitはGビット(1:x4Kバイト単位)
# 48-55bitは(11001111)
# 56-63bitはセグメント開始アドレス(上位8bit)
.word 0x00cf

# コードセグメントディスクリプタ
# 実行可能なセグメント32bit, カーネル用
.word 0xffff
.word 0x0000
# 40-47bit(10011010)データディスクリプタとの違いは43bit目(1:コードセグメント)
.word 0x9a00
.word 0x00cf


# LGDT命令でGDT0にGDTが存在することを示す
GDTR0:
.word 8*3
.int GDT0

.align 8

# 2次ブートローダのあとにカーネルを配置
kernel_entry:
2 changes: 1 addition & 1 deletion bin/include/sh.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

void init_shell();
void init_entry();
void input_code(unsigned char code);
void input_code(int code);
void exec_cmd();
void start_shell();

Expand Down
5 changes: 2 additions & 3 deletions bin/sh.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ void copy_entry(entry_t *src, entry_t *dst) {
strcpy(src->buf, dst->buf);
}

void input_code(unsigned char code) {
void input_code(int code) {
if (code == BACKSPACE && entries[cur_line].index > 0) {
entries[cur_line].buf[--(entries[cur_line].index)] = '\0';
backspace();
Expand Down Expand Up @@ -181,7 +181,6 @@ void exec_cmd() {
}

void start_shell(queue_t *queue) {
unsigned char code;
dequeue(queue, &code);
int code = dequeue(queue);
input_code(code);
}

0 comments on commit 49f9cc3

Please sign in to comment.