Import backup from 2003-12-22_2
This commit is contained in:
parent
5048a93ff7
commit
9070a76b18
@ -1,98 +0,0 @@
|
|||||||
//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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
79
kernel.c
79
kernel.c
@ -1,21 +1,94 @@
|
|||||||
|
//kernel.c
|
||||||
|
//08/13/03 Josh Holtrop
|
||||||
|
//Holtrop's Operating System
|
||||||
|
//Version: 0.12
|
||||||
|
//Modified: 11/12/03
|
||||||
|
|
||||||
#include "k_defines.h"
|
#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 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!!
|
||||||
|
mm_init();
|
||||||
|
vmm_init();
|
||||||
|
console_cls();
|
||||||
|
remap_pics(0x20, 0x28);
|
||||||
|
init_timer();
|
||||||
|
videoMode = (dword *)0x90002;
|
||||||
|
if (*videoMode)
|
||||||
|
video_init((ModeInfoBlock *) 0x90306);
|
||||||
|
mouse_init();
|
||||||
|
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 (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
(*(byte *)0xc00b8000)++;
|
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)
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
26
vmm.c
26
vmm.c
@ -3,19 +3,12 @@
|
|||||||
// Author: Josh Holtrop
|
// Author: Josh Holtrop
|
||||||
// Date: 09/30/03
|
// Date: 09/30/03
|
||||||
|
|
||||||
PageDirectory *vmm_PDBR = 0;
|
PageDirectory *vmm_PDBR = (PageDirectory *)0x104000;
|
||||||
dword vmm_first_virtual_address = 0;
|
dword vmm_first_virtual_address = 0;
|
||||||
|
|
||||||
|
|
||||||
void vmm_init()
|
void vmm_init()
|
||||||
{
|
{
|
||||||
if (!(vmm_PDBR = mm_palloc(1, PID_KERNEL)))
|
|
||||||
{
|
|
||||||
printf("ERROR! COULD NOT ALLOCATE PAGE FOR INITIAL PAGE DIRECTORY!!\n");
|
|
||||||
halt();
|
|
||||||
}
|
|
||||||
vmm_init_pagetable((dword)vmm_PDBR);
|
|
||||||
|
|
||||||
if (mm_totalmem % 4096)
|
if (mm_totalmem % 4096)
|
||||||
vmm_first_virtual_address = mm_totalmem + (4096 - (mm_totalmem % 4096));
|
vmm_first_virtual_address = mm_totalmem + (4096 - (mm_totalmem % 4096));
|
||||||
else
|
else
|
||||||
@ -24,7 +17,7 @@ void vmm_init()
|
|||||||
if (vmm_mapn(0, 0, 0x03, mm_totalmem/4096+1))
|
if (vmm_mapn(0, 0, 0x03, mm_totalmem/4096+1))
|
||||||
{
|
{
|
||||||
printf("Could not page in all physical RAM!\n");
|
printf("Could not page in all physical RAM!\n");
|
||||||
halt();
|
//halt();
|
||||||
}
|
}
|
||||||
//we also need to map in the video framebuffer memory:
|
//we also need to map in the video framebuffer memory:
|
||||||
if (video_mode.PhysBasePtr > 0 && video_mode.BitsPerPixel > 0)
|
if (video_mode.PhysBasePtr > 0 && video_mode.BitsPerPixel > 0)
|
||||||
@ -38,13 +31,6 @@ void vmm_init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void vmm_enable_paging()
|
|
||||||
{
|
|
||||||
write_cr3((dword)vmm_PDBR);
|
|
||||||
write_cr0(0x80000000|read_cr0());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int vmm_map1(dword virtual, dword physical, dword flags)
|
int vmm_map1(dword virtual, dword physical, dword flags)
|
||||||
{
|
{
|
||||||
if (virtual & 0x00000FFF)
|
if (virtual & 0x00000FFF)
|
||||||
@ -72,17 +58,11 @@ int vmm_map1(dword virtual, dword physical, dword flags)
|
|||||||
int vmm_mapn(dword virtual, dword physical, dword flags, dword n)
|
int vmm_mapn(dword virtual, dword physical, dword flags, dword n)
|
||||||
{
|
{
|
||||||
int mapped;
|
int mapped;
|
||||||
int result = 0;
|
|
||||||
dword va = virtual;
|
dword va = virtual;
|
||||||
dword pa = physical;
|
dword pa = physical;
|
||||||
for (mapped = 0; mapped < n; mapped++)
|
for (mapped = 0; mapped < n; mapped++)
|
||||||
{
|
{
|
||||||
if (result = vmm_map1(va, pa, flags))
|
vmm_map1(va, pa, flags);
|
||||||
{
|
|
||||||
if (mapped > 0)
|
|
||||||
vmm_unmapn(virtual, mapped);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
va += 4096;
|
va += 4096;
|
||||||
pa += 4096;
|
pa += 4096;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user