diff --git a/include/Makefile b/include/Makefile index 2df54d5..ea1dec0 100644 --- a/include/Makefile +++ b/include/Makefile @@ -1,4 +1,6 @@ INCS = coff.h elf.h +SYSINCS = sys/errno.h +INCSYSDIR = $(INCDIR)/sys .PHONY: all all: @@ -7,8 +9,10 @@ all: clean: .PHONY: install -install: $(INCS) +install: $(INCS) $(INCSYSDIR) @ mkdir -p $(DESTDIR)$(INCDIR) - install $< $(DESTDIR)$(INCDIR) + install $(INCS) $(DESTDIR)$(INCDIR) + @ mkdir -p $(DESTDIR)$(INCSYSDIR) + install $(SYSINCS) $(DESTDIR)$(INCSYSDIR) .PHONY: all clean install diff --git a/kernel/Makefile b/kernel/Makefile index f84be9e..723ad84 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -2,6 +2,15 @@ AS = fasm RM = rm -f INSTALL = install +ASMINCS = sys/bootinfo.inc \ + sys/coff.inc \ + sys/cpu.inc \ + sys/errno.inc \ + sys/macro.inc \ + sys/mmu.inc \ + sys/process.inc \ + sys/register.inc + KERNEL = vmstupid.sys SRCS = kernel.asm \ const.inc \ @@ -23,7 +32,9 @@ SRCS = kernel.asm \ fs/fat.inc \ fs/stpdfs.inc \ fs/xv6fs.inc \ - vfs.inc + vfs.inc \ + proc.inc \ + $(ASMINCS) .PHONY: all all: $(KERNEL) @@ -42,6 +53,8 @@ clean: .PHONY: install install: $(KERNEL) @ mkdir -p $(DESTDIR) - install $< $(DESTDIR) + install $(KERNEL) $(DESTDIR) + @ mkdir -p $(DESTDIR)$(ASMDIR)/sys + install $(ASMINCS) $(DESTDIR)$(ASMDIR)/sys .PHONY: all clean install diff --git a/kernel/dev/at/com.inc b/kernel/dev/at/com.inc index abb1616..b08913d 100644 --- a/kernel/dev/at/com.inc +++ b/kernel/dev/at/com.inc @@ -40,3 +40,7 @@ com_irq2: pusha popa iret + +com_device: + db 'com', 0, 0, 0, 0, 0 + dd com_init diff --git a/kernel/dev/at/ne2k.inc b/kernel/dev/at/ne2k.inc index e365e1f..7a81272 100644 --- a/kernel/dev/at/ne2k.inc +++ b/kernel/dev/at/ne2k.inc @@ -78,3 +78,7 @@ ne2k_probe: ne2k_irq: iret + +ne2k_device: + db 'ne2k', 0, 0, 0, 0 + dd ne2k_init diff --git a/kernel/dev/dev.inc b/kernel/dev/dev.inc index 344f3d5..8e33bc3 100644 --- a/kernel/dev/dev.inc +++ b/kernel/dev/dev.inc @@ -38,6 +38,8 @@ aDevices: dd floppy_device dd kbd_device dd console_device + dd com_device + dd ne2k_device .end: dev_init: diff --git a/kernel/fs/fat.inc b/kernel/fs/fat.inc index 0810121..2665cd6 100644 --- a/kernel/fs/fat.inc +++ b/kernel/fs/fat.inc @@ -60,6 +60,12 @@ struc FATFS_BootSector32 { } DEFN FATFS_BootSector32 + ;; Struc: FATFS_Dirent + ;; FAT Filesystem directory entry + ;; + ;; .name - Filename + ;; .ext - File extension + ;; .attr - See struc FATFS_Dirent { .name db 8 dup(?) .ext db 3 dup(?) @@ -77,6 +83,21 @@ struc FATFS_Dirent { } DEFN FATFS_Dirent + ;; Enum: FATFS file attributes + ;; + ;; FATFS_ATTR_READ_ONLY - Mark file as read-only + ;; FATFS_ATTR_HIDDEN - TODO + ;; FATFS_ATTR_SYSTEM - TODO + ;; FATFS_ATTR_VOLUME_ID - The corresponding entry contains the volume label. + ;; FATFS_ATTR_DIRECTORY - The corresponding entry represents a directory + ;; FATFS_ATTR_ARCHIVE - TODO +FATFS_ATTR_READ_ONLY = 0x01 +FATFS_ATTR_HIDDEN = 0x02 +FATFS_ATTR_SYSTEM = 0x04 +FATFS_ATTR_VOLUME_ID = 0x08 +FATFS_ATTR_DIRECTORY = 0x10 +FATFS_ATTR_ARCHIVE = 0x20 + ; ------------------------------------------------------------------------ ;; Section: Implementation diff --git a/kernel/heap.inc b/kernel/heap.inc index c2df053..0fbab53 100644 --- a/kernel/heap.inc +++ b/kernel/heap.inc @@ -1,4 +1,20 @@ ;; File: heap.inc + ;; Base on + +struc HeapNode { + .hole dd ? + .size dd ? + .next dd ? + .prev dd ? +} +DEFN HeapNode + +struc HeapInfo { + .start dd ? + .end dd ? + .bins dd 9 dup(?) +} +DEFN HeapInfo ;; Function: heap_init heap_init: @@ -13,8 +29,23 @@ heap_init: mov esi, szMsgHeapInit call klog - ; TODO + mov eax, [ebp-4] + mov ecx, KERNEL_VIRT_BASE + mov [ecx + HeapNode.hole], dword 1 + sub eax, sizeof.HeapNode + 4 + mov [ecx + HeapNode.size], eax + add eax, sizeof.HeapNode + add eax, ecx + mov [eax], ecx + + mov ecx, KERNEL_VIRT_BASE + mov [kheap + HeapInfo.start], ecx + mov eax, [ebp-4] + add ecx, eax + mov [kheap + HeapInfo.end], ecx + +.end: leave ret @@ -24,4 +55,36 @@ heap_alloc: heap_free: ret + ;; Function: heap_getbin + ;; + ;; In: + ;; EAX - size +heap_getbin: + push ebp + mov ebp, esp + sub esp, 4 + + mov [ebp-4], dword 0 + cmp eax, 4 + jge @f + mov eax, 4 +@@: + shr eax, 1 + cmp eax, 1 + or eax, eax + jz @f + inc dword [ebp-4] + jmp @b +@@: + mov eax, [ebp-4] + sub eax, 2 + cmp eax, 8 + jbe @f + mov eax, 8 +@@: + leave + ret + +kheap HeapInfo szMsgHeapInit db "HEAP: initialize %x - %x", 0 +szMsgErrorHeap db "ERROR: HEAP: not enough memory", 0 diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 66e99d2..2c31175 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -54,8 +54,8 @@ kmain: add ebx, KERNEL_VIRT_BASE call pmm_free_range - mov eax, [boot_structure.low_mem] - call heap_init + ;mov eax, [boot_structure.low_mem] + ;call heap_init call pic_init @@ -87,8 +87,6 @@ kmain: ;mov al, 'X' ;call cga_putc - - .halt: hlt jmp $ @@ -115,11 +113,12 @@ kmain: include 'isr.inc' include 'idt.inc' include 'pic.inc' - include 'heap.inc' + ;include 'heap.inc' include 'vfs.inc' include 'fs/fat.inc' include 'fs/stpdfs.inc' include 'fs/xv6fs.inc' + include 'proc.inc' szMsgKernelAlive db "Kernel (", VERSION_FULL , ") is alive", 0 @@ -129,6 +128,8 @@ boot_structure BootInfo kTSS TSS +aProcs rb 64*sizeof.Process + align 4096 stack_bottom: rb 0x4000 diff --git a/kernel/proc.inc b/kernel/proc.inc new file mode 100644 index 0000000..9c173f4 --- /dev/null +++ b/kernel/proc.inc @@ -0,0 +1,11 @@ +proc_init: + mov ecx, sizeof.Process * 64 + xor ax, ax + mov edi, aProcs + rep stosb + + ret + + +uProcLock dd 0 +pCurrentProc dd 0 diff --git a/kernel/sys/process.inc b/kernel/sys/process.inc index 4723a01..559fb28 100644 --- a/kernel/sys/process.inc +++ b/kernel/sys/process.inc @@ -1,18 +1,21 @@ - -struc ProcessGroup { -} - struc Context { - .flags dd ? - .regs dd ? + .edi dd ? + .esi dd ? + .ebx dd ? + .ebp dd ? + .eip dd ? } +DEFN Context struc Process { - .pagedir dd ? - .parent dd ? - .context Context - .next dd ? + .pagedir dd ? + .kstack dd ? + .parent dd ? + .trapframe dd ? + .context dd ? + .next dd ? } +DEFN Process PROCESS_STATE_IDL = 0 PROCESS_STATE_RUN = 1