Import backup from 2003-12-22

This commit is contained in:
Josh Holtrop 2003-12-22 22:00:00 -05:00
parent 282b856e24
commit 5048a93ff7
10 changed files with 186 additions and 109 deletions

98
Copy of kernel.c Normal file
View File

@ -0,0 +1,98 @@
//kernel.c
//08/13/03 Josh Holtrop
//Holtrop's Operating System
//Version: 0.12
//Modified: 11/12/03
#include "k_defines.h" //#DEFINE's for kernel
#include "lib/string.h" //library string functions
#include "lib/io.h" //library input/output functions
#include "functions.h" //general functions
#include "video.h" //video functions
#include "mm.h" //physical memory management functions
#include "vmm.h" //virtual memory management & paging functions
#include "keyboard.h" //generic keyboard driver & functions
#include "mouse.h" //generic ps/2 mouse driver & functions
#include "fdc.h" //Floppy Disk Controller functions
#include "stdfont.h" //Standard font bitmask array
void isr(dword num);
void k_init();
extern dword write_cr0(dword cr0);
extern dword read_cr0();
extern dword write_cr3(dword cr3);
extern dword read_cr3();
#include "fdc.c"
#include "mouse.c"
#include "keyboard.c"
#include "mm.c"
#include "vmm.c"
#include "functions.c"
#include "video.c"
dword timer = 0;
dword *videoMode;
//Main kernel initialization method
void k_init()
{
// ===== Initialization
fdc_sendDOR(0x0C); //turn off floppy motor!!
console_cls();
remap_pics(0x20, 0x28);
init_timer();
mm_init();
videoMode = (dword *)0x90002;
if (*videoMode)
video_init((ModeInfoBlock *) 0x90306);
vmm_init();
mouse_init();
vmm_enable_paging();
pic1_mask(0); //unmask IRQ's 0-7
pic2_mask(0); //unmask IRQ's 8-15
enable_ints();
kbd_resetLEDs(); //after enabling interrupts!!
printf("HOS 0.12 - Kernel Size: %d kb\n", kernel_size()/1024);
printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem);
printf("Free memory: %d bytes\n", mm_freemem());
dword key = 0;
for (;;)
{
key = kbdWaitKey();
if ((key & 0xFF) > 2) //key is not a control key
putc(key);
}
}
// main Interrupt Service Routine - handles all interrupts unless caught by kernel.asm
void isr(dword num)
{
switch(num)
{
case 0x20: // IRQ0 - timer interrupt
timer++;
(*(byte *)(0xb8000))++;
eoi();
break;
case 0x21: // IRQ1 - keyboard interrupt
isr_keyboard(); //isr_keybard() takes care of calling eoi()
break;
case 0x2C: // IRQ12 - PS/2 mouse
isr_mouse();
eoi2();
break;
default:
printf("Interrupt %d (0x%x) Unhandled!!\n", num, num);
break;
}
}

View File

@ -6,7 +6,7 @@
%define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR %define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR
%define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG %define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG
%define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at %define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at
%define BOOT_KERNEL_ADD 0x104000 ;final pmode kernel destination - physical %define BOOT_KERNEL_ADD 0x106000 ;final pmode kernel destination - physical
%define BOOT_RD_ADD 0x200000 ;2mb for ram disk %define BOOT_RD_ADD 0x200000 ;2mb for ram disk
%define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here %define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here

View File

@ -5,7 +5,7 @@
gdtr: gdtr:
dw gdt_end-gdt-1 dw gdt_end-gdt-1
dd GDT dd GDT_P
gdt: gdt:
dd 0 dd 0
dd 0 dd 0

View File

@ -5,7 +5,7 @@
idtr: idtr:
dw 50*8-1 ;size of idt dw 50*8-1 ;size of idt
dd IDT ;address of idt dd IDT_P ;address of idt
%macro isr_label 1 %macro isr_label 1

BIN
k.bin

Binary file not shown.

View File

@ -2,10 +2,16 @@
;Author: Josh Holtrop ;Author: Josh Holtrop
;Modified: 10/30/03 ;Modified: 10/30/03
%include "bootdef.inc" %define GDT_P 0x100000; ;1mb physical - Global Descriptor Table space
%define GDT_V GDT_P+0xC0000000
%define GDT 0x100000 %define IDT_P 0x102000 ;1mb+8kb - Interrupt Descriptor Table space
%define IDT 0x102000 %define IDT_V IDT_P+0xC0000000
%define PDBR_P 0x104000 ;1mb+16kb - Page Directory Base Register (first PD)
%define PDBR_V PDBR_P+0xC0000000
%define LOPT_P 0x105000 ;1mb+20kb - LOw Page Table for mapping first 4mb
%define LOPT_V LOPT_P+0xC0000000
%define KERNEL_P 0x106000 ;1mb+24kb - the kernel's physical address
%define KERNEL_V KERNEL_P+0xC0000000 ;3gb+1mb+24kb, the virtual address of the kernel
[global start] [global start]
[extern _isr] [extern _isr]
@ -14,9 +20,36 @@
bits 32 bits 32
;This is where the kernel begins execution ;This is where the kernel begins execution
;At this point, the temporary gdt is set up to "map" 0xC000_0000 to 0x0.
;We must enable paging with the first 4mb mapped 1:1 virtual:physical
; and with the 4mb starting at 0xC000_0000 mapped to the first 4mb physical.
;Then we can start using our "real" gdt, then unmap the lower 4mb.
start: start:
cli ;if they weren't already off cli ;if they weren't already off
mov edi, GDT
xor eax, eax
mov edi, PDBR_V
mov ecx, 1024 ;clear the PDBR
rep stosd
mov [PDBR_V], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present)
mov [PDBR_V+0xC00], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present)
mov edi, LOPT_V
mov ecx, 1024
mov eax, 0x03 ;starting physical address = 0x0 (read/write, present flags)
fill_lopt_loop: ;fill the page table
stosd
add eax, 4096 ;increment next phsyical address by 4kb
loop fill_lopt_loop
mov eax, PDBR_P
mov cr3, eax ;store the Page Directory Base Address
mov eax, cr0
or eax, 0x80000000 ;set page enable bit
mov cr0, eax ;now paging is active!
mov edi, GDT_V
mov esi, gdt mov esi, gdt
mov ecx, gdt_end-gdt mov ecx, gdt_end-gdt
copy_gdt: copy_gdt:
@ -24,7 +57,7 @@ copy_gdt:
stosb stosb
loop copy_gdt loop copy_gdt
mov edi, IDT ;destination mov edi, IDT_V ;destination
mov esi, isr_0 ;address of isr0 mov esi, isr_0 ;address of isr0
mov edx, isr_1-isr_0 ;distance between isr labels mov edx, isr_1-isr_0 ;distance between isr labels
mov ecx, 50 ;number of isrlabels mov ecx, 50 ;number of isrlabels
@ -42,7 +75,7 @@ fill_idt:
mov esi, ebx mov esi, ebx
add esi, edx add esi, edx
loop fill_idt loop fill_idt
mov word [IDT+0x30*8+4], 0xEE00 ;interrupt 0x30 has user priviledges mov word [IDT_V+0x30*8+4], 0xEE00 ;interrupt 0x30 has user priviledges
lgdt [gdtr] ;load gdt lgdt [gdtr] ;load gdt
jmp KERNEL_CODE:newgdtcontinue jmp KERNEL_CODE:newgdtcontinue
@ -53,7 +86,7 @@ newgdtcontinue:
mov gs, ax mov gs, ax
mov fs, ax mov fs, ax
mov ss, ax mov ss, ax
mov esp, 0x1ffffc ;stack just under 2mb, moves downward mov esp, 0xc01ffffc ;stack just under 2mb, moves downward
lidt [idtr] ;load idt lidt [idtr] ;load idt
call _k_init call _k_init

View File

@ -1,111 +1,21 @@
//kernel.c
//08/13/03 Josh Holtrop
//Holtrop's Operating System
//Version: 0.12
//Modified: 11/12/03
#include "k_defines.h" //#DEFINE's for kernel #include "k_defines.h"
#include "lib/string.h" //library string functions
#include "lib/io.h" //library input/output functions
#include "functions.h" //general functions
#include "video.h" //video functions
#include "mm.h" //physical memory management functions
#include "vmm.h" //virtual memory management & paging functions
#include "keyboard.h" //generic keyboard driver & functions
#include "mouse.h" //generic ps/2 mouse driver & functions
#include "fdc.h" //Floppy Disk Controller functions
#include "stdfont.h" //Standard font bitmask array
void isr(dword num); void isr(dword num);
void k_init(); void k_init();
extern dword write_cr0(dword cr0);
extern dword read_cr0();
extern dword write_cr3(dword cr3);
extern dword read_cr3();
#include "fdc.c"
#include "mouse.c"
#include "keyboard.c"
#include "mm.c"
#include "vmm.c"
#include "functions.c"
#include "video.c"
dword timer = 0;
dword *videoMode;
//Main kernel initialization method //Main kernel initialization method
void k_init() void k_init()
{ {
// ===== Initialization
fdc_sendDOR(0x0C); //turn off floppy motor!!
console_cls();
remap_pics(0x20, 0x28);
init_timer();
mm_init();
videoMode = (dword *)0x90002;
if (*videoMode)
video_init((ModeInfoBlock *) 0x90306);
vmm_init();
mouse_init();
vmm_enable_paging();
pic1_mask(0); //unmask IRQ's 0-7
pic2_mask(0); //unmask IRQ's 8-15
enable_ints();
kbd_resetLEDs(); //after enabling interrupts!!
char *bmpptr = (char *)0x108000+54;
int a = 0;
int x = 0;
int y = 479;
for (a=0; a < 640*480; a++)
{
video_pset(x, y, *(dword *)bmpptr);
bmpptr += 3;
x++;
if (x == 640)
{
x = 0;
y--;
}
}
printf("HOS 0.12 - Kernel Size: %d kb\n", kernel_size()/1024);
printf("Memory available to OS: %d MB (Bytes: %d)\n", mm_totalmem/0x100000, mm_totalmem);
printf("Free memory: %d bytes\n", mm_freemem());
dword key = 0;
for (;;) for (;;)
{ {
key = kbdWaitKey(); (*(byte *)0xc00b8000)++;
if ((key & 0xFF) > 2) //key is not a control key
putc(key);
} }
} }
// main Interrupt Service Routine - handles all interrupts unless caught by kernel.asm
void isr(dword num) void isr(dword num)
{ {
switch(num)
{
case 0x20: // IRQ0 - timer interrupt
timer++;
(*(byte *)(0xb8000))++;
eoi();
break;
case 0x21: // IRQ1 - keyboard interrupt
isr_keyboard(); //isr_keybard() takes care of calling eoi()
break;
case 0x2C: // IRQ12 - PS/2 mouse
isr_mouse();
eoi2();
break;
default:
printf("Interrupt %d (0x%x) Unhandled!!\n", num, num);
break;
}
} }

View File

@ -2,7 +2,7 @@ OUTPUT_FORMAT("binary")
ENTRY(start) ENTRY(start)
SECTIONS SECTIONS
{ {
.text 0x104000 : { .text 0xC0106000 : {
code = .; _code = .; __code = .; code = .; _code = .; __code = .;
*(.text) *(.text)
. = ALIGN(4096); . = ALIGN(4096);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 900 KiB

View File

@ -890,11 +890,43 @@ KERNEL_DATA equ $-gdt
db 0x00 db 0x00
db 0x00 db 0x00
db 0x92 db 0x92
db 0xcf ;cf db 0xcf
db 0x00 db 0x00
gdt_end: gdt_end:
;-------------------------------------------------------
gdtr32:
dw gdt_end32-gdt32-1
dd gdt32
gdt32:
dd 0
dd 0
;a base of 0x4000_0000, when added to 0xC000_0000 will produce 0x0000_0000 physical before paging in effect
KERNEL_CODE32 equ $-gdt32
db 0xff ;limit 7:0
db 0xff ;limit 15:8
db 0x00 ;base 7:0
db 0x00 ;base 15:8
db 0x00 ;base 23:16
db 0x9a ;access
db 0xcf ;flags / limit 19:16
db 0x40 ;base 31:24
KERNEL_DATA32 equ $-gdt32
db 0xff ;segment 16 = 4gb data
db 0xff
db 0x00
db 0x00
db 0x00
db 0x92
db 0xcf
db 0x40
gdt_end32:
;------------------------------------------------------ ;------------------------------------------------------
go_pm: go_pm:
xor ax, ax xor ax, ax
@ -909,12 +941,16 @@ go_pm:
bits 32 bits 32
pmode: pmode:
mov ax, KERNEL_DATA lgdt [gdtr32]
jmp KERNEL_CODE32:pmode_offsetted+0xC0000000
pmode_offsetted:
mov ax, KERNEL_DATA32
mov es, ax mov es, ax
mov ds, ax mov ds, ax
mov fs, ax mov fs, ax
mov gs, ax mov gs, ax
jmp KERNEL_CODE:BOOT_KERNEL_ADD jmp KERNEL_CODE:BOOT_KERNEL_ADD+0xC0000000
kernel: db "KERNEL BIN", 0 kernel: db "KERNEL BIN", 0