diff --git a/student-distrib/paging.c b/student-distrib/paging.c index 876f419b084d5f50fe34786270bb873a1b8b5ff8..e984fa12260aa14d0bd40dd6ad91e3223e43ee00 100644 --- a/student-distrib/paging.c +++ b/student-distrib/paging.c @@ -1,6 +1,5 @@ #include "paging.h" - /* paging_initi(alization) * Inputs: void * Return Value: void @@ -17,13 +16,10 @@ void paging_initi(void){ page_directory[i] = READ_WRITE; /* 4KB page tables */ - page_table[i] = (i * 0x1000) | READ_WRITE; + page_table[i] = (i * _4_KB) | READ_WRITE; } - /* First page table entry need to be 0 */ - // page_table[0] = 0x0; - /* Set page table for video memory */ page_table[VIDEO_MEM + 0] |= USER | PRESENT; page_table[VIDEO_MEM + 1] |= USER | PRESENT; //for 1st terminal @@ -43,38 +39,36 @@ void paging_initi(void){ return; } - - - - - -//term_id = current +/* restore_vid_mem + * Inputs: none + * Return Value: void + * Function: restores video memory to actual memory address + */ void restore_vid_mem(void){ - page_table[0xB8] = (uint32_t)(0xB8000) | USER | READ_WRITE | PRESENT; + page_table[VIDEO_MEM] = (uint32_t)(VIDEO_ADDR) | USER | READ_WRITE | PRESENT; flush_tlb(); return; } - -//term_id = ther terminal we want to display +/* store_vid_mem + * Inputs: ID of terminal + * Return Value: void + * Function: sets video memory according to terminal ID + */ void store_vid_mem(int32_t term_id){ if(visible_terminal == running_terminal) - page_table[0xB8] = ((uint32_t)0xB8000) | USER | READ_WRITE | PRESENT; + page_table[VIDEO_MEM] = ((uint32_t)VIDEO_ADDR) | USER | READ_WRITE | PRESENT; else - page_table[0xB8] = ((uint32_t)(0xB8000 + (term_id+1)*0x1000 )) | USER | READ_WRITE | PRESENT; + page_table[VIDEO_MEM] = ((uint32_t)(VIDEO_ADDR + (term_id+1)*_4_KB )) | USER | READ_WRITE | PRESENT; flush_tlb(); return; } - - - - /* remap_vidmem * Inputs: PID number of process * Return Value: void @@ -82,17 +76,17 @@ void store_vid_mem(int32_t term_id){ */ void remap_vidmem() { - + // 33 = 132MB virtual page_directory[33] = (uint32_t)(uint32_t)page_table | USER | READ_WRITE | PRESENT; if(visible_terminal == running_terminal) - page_table[0] = ((uint32_t)0xB8000) | USER | READ_WRITE | PRESENT; + page_table[0] = ((uint32_t)VIDEO_ADDR) | USER | READ_WRITE | PRESENT; else - page_table[0] = ((uint32_t)(0xB8000 + (running_terminal+1)*0x1000 )) | USER | READ_WRITE | PRESENT; + page_table[0] = ((uint32_t)(VIDEO_ADDR + (running_terminal+1)*_4_KB )) | USER | READ_WRITE | PRESENT; // flush TLB - flush_tlb(); + flush_tlb(); return; } @@ -106,10 +100,11 @@ void remap_program(uint32_t pid){ uint32_t addr = _8_MB + pid * _4_MB; + // 32 = 128MB virtual page_directory[32] = addr | SIZE | USER | READ_WRITE | PRESENT; // flush TLB - flush_tlb(); + flush_tlb(); return; } @@ -125,12 +120,12 @@ void remap_term(int32_t term_id){ if ( visible_terminal == term_id) addr = TERM_VID; - //page_table[VIDEO_MEM] = addr | USER | READ_WRITE | PRESENT; + // 33 = 132MB virtual page_directory[33] = ((uint32_t)vid_table) | USER | READ_WRITE | PRESENT ; vid_table[VIDEO_MEM] = addr | USER | READ_WRITE | PRESENT; // flush TLB - flush_tlb(); + flush_tlb(); return; } @@ -142,23 +137,29 @@ void remap_term(int32_t term_id){ */ int32_t remap_proc(int32_t pid){ - if (pid < 0 || pid > MAX_PROCESS) + if (pid < 0 || pid > MAX_PROCESS) return -1; - page_directory[32] = (_8_MB + _4_MB * pid) | SIZE | USER | READ_WRITE | PRESENT; + // 32 = 128MB virtual + page_directory[32] = (_8_MB + _4_MB * pid) | SIZE | USER | READ_WRITE | PRESENT; // flush TLB - flush_tlb(); - return 0; + flush_tlb(); + return 0; } +/* flush_tlb + * Inputs: void + * Return Value: void + * Function: flushes the TLB (used when changing paging) + */ void flush_tlb(void){ asm volatile( - "movl %%cr3, %%eax \n" - "movl %%eax, %%cr3 \n" - : - : - : "memory", "cc" - ); + "movl %%cr3, %%eax \n" + "movl %%eax, %%cr3 \n" + : + : + : "memory", "cc" + ); return; } diff --git a/student-distrib/pit.c b/student-distrib/pit.c index 49316dbe7be1812a725421297b71665766ca4de7..cbdb07f6b1077a9d04fe41555825d175ea68a89b 100644 --- a/student-distrib/pit.c +++ b/student-distrib/pit.c @@ -1,21 +1,30 @@ #include "pit.h" -// referance from https://wiki.osdev.org/PIT -void i8253_init(void){ - int32_t freq = FREQUENCY / 100; - int32_t low = freq & 0xFF; - int32_t high = freq >> 8; +// reference from https://wiki.osdev.org/PIT - //sent command to the port - outb(0x34, CMD_REG); - outb(low, CHANNEL_0); - outb(high, CHANNEL_0); - enable_irq(0); +/* i8253_init + * Inputs: void + * Return Value: void + * Function: initializes pit + */ +void i8253_init(void){ + int32_t freq = FREQUENCY / 100; // interrupt every 10ms + int32_t low = freq & 0xFF; // 0xFF = mask (send lower 8 bits) + int32_t high = freq >> 8; // (send higher 8 bits) + + //send command to the port + outb(0x34, CMD_REG); // 0x34 is port in PIC for PIT + outb(low, CHANNEL_0); + outb(high, CHANNEL_0); + enable_irq(PIT_IRQ); return; } - - +/* pit_handler + * Inputs: void + * Return Value: void + * Function: pit interrupt handler + */ void pit_handler(void) { diff --git a/student-distrib/pit.h b/student-distrib/pit.h index 8ef28a9a7c13b9dfff89ef23f31686c6fa20d9fe..432c77739057d19a266b2f6e3ed66c1858d5e073 100644 --- a/student-distrib/pit.h +++ b/student-distrib/pit.h @@ -5,6 +5,7 @@ #define FREQUENCY 1193182 #define CHANNEL_0 0x40 #define CMD_REG 0x43 +#define PIT_IRQ 0x00 void i8253_init(void); void pit_handler(void); diff --git a/student-distrib/scheduler.c b/student-distrib/scheduler.c index 9208c60a016fbfe5944831c3d4e8574be7e1151d..a2cf7019df20a4dca2dd4ee84c021b813b0e0f98 100644 --- a/student-distrib/scheduler.c +++ b/student-distrib/scheduler.c @@ -32,7 +32,7 @@ void scheduler(void){ printf("terminal = %d\n", running_terminal); - send_eoi(0); + send_eoi(PIT_IRQ); execute((uint8_t *)"shell"); } @@ -50,7 +50,7 @@ void scheduler(void){ if(terminal[running_terminal].pcb == NULL) { - send_eoi(0); + send_eoi(PIT_IRQ); return; } @@ -65,7 +65,7 @@ void scheduler(void){ tss.ss0 = KERNEL_DS; tss.esp0 = _8_MB - _8_KB * (next_pcb->pid); - send_eoi(0); + send_eoi(PIT_IRQ); asm volatile( //change esp and ebp diff --git a/student-distrib/scheduler.h b/student-distrib/scheduler.h index f26885a5c58c66d979ec9bc2e5d318c52808df66..ae122f10e0da206de27143b6008447525c033eb2 100644 --- a/student-distrib/scheduler.h +++ b/student-distrib/scheduler.h @@ -1,7 +1,7 @@ #include "lib.h" #include "types.h" #include "x86_desc.h" - +#include "pit.h" extern void scheduler(void);