Skip to content
Snippets Groups Projects
Commit f045a8f0 authored by abinade2's avatar abinade2
Browse files

added comments

parent 625f3b6e
No related branches found
No related tags found
No related merge requests found
#include "paging.h" #include "paging.h"
/* paging_initi(alization) /* paging_initi(alization)
* Inputs: void * Inputs: void
* Return Value: void * Return Value: void
...@@ -17,13 +16,10 @@ void paging_initi(void){ ...@@ -17,13 +16,10 @@ void paging_initi(void){
page_directory[i] = READ_WRITE; page_directory[i] = READ_WRITE;
/* 4KB page tables */ /* 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 */ /* Set page table for video memory */
page_table[VIDEO_MEM + 0] |= USER | PRESENT; page_table[VIDEO_MEM + 0] |= USER | PRESENT;
page_table[VIDEO_MEM + 1] |= USER | PRESENT; //for 1st terminal page_table[VIDEO_MEM + 1] |= USER | PRESENT; //for 1st terminal
...@@ -43,38 +39,36 @@ void paging_initi(void){ ...@@ -43,38 +39,36 @@ void paging_initi(void){
return; return;
} }
/* restore_vid_mem
* Inputs: none
* Return Value: void
* Function: restores video memory to actual memory address
*/
//term_id = current
void restore_vid_mem(void){ 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(); flush_tlb();
return; return;
} }
/* store_vid_mem
//term_id = ther terminal we want to display * Inputs: ID of terminal
* Return Value: void
* Function: sets video memory according to terminal ID
*/
void store_vid_mem(int32_t term_id){ void store_vid_mem(int32_t term_id){
if(visible_terminal == running_terminal) 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 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(); flush_tlb();
return; return;
} }
/* remap_vidmem /* remap_vidmem
* Inputs: PID number of process * Inputs: PID number of process
* Return Value: void * Return Value: void
...@@ -82,17 +76,17 @@ void store_vid_mem(int32_t term_id){ ...@@ -82,17 +76,17 @@ void store_vid_mem(int32_t term_id){
*/ */
void remap_vidmem() void remap_vidmem()
{ {
// 33 = 132MB virtual
page_directory[33] = (uint32_t)(uint32_t)page_table | USER | READ_WRITE | PRESENT; page_directory[33] = (uint32_t)(uint32_t)page_table | USER | READ_WRITE | PRESENT;
if(visible_terminal == running_terminal) 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 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(); flush_tlb();
return; return;
} }
...@@ -106,10 +100,11 @@ void remap_program(uint32_t pid){ ...@@ -106,10 +100,11 @@ void remap_program(uint32_t pid){
uint32_t addr = _8_MB + pid * _4_MB; uint32_t addr = _8_MB + pid * _4_MB;
// 32 = 128MB virtual
page_directory[32] = addr | SIZE | USER | READ_WRITE | PRESENT; page_directory[32] = addr | SIZE | USER | READ_WRITE | PRESENT;
// flush TLB // flush TLB
flush_tlb(); flush_tlb();
return; return;
} }
...@@ -125,12 +120,12 @@ void remap_term(int32_t term_id){ ...@@ -125,12 +120,12 @@ void remap_term(int32_t term_id){
if ( visible_terminal == term_id) if ( visible_terminal == term_id)
addr = TERM_VID; 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 ; page_directory[33] = ((uint32_t)vid_table) | USER | READ_WRITE | PRESENT ;
vid_table[VIDEO_MEM] = addr | USER | READ_WRITE | PRESENT; vid_table[VIDEO_MEM] = addr | USER | READ_WRITE | PRESENT;
// flush TLB // flush TLB
flush_tlb(); flush_tlb();
return; return;
} }
...@@ -142,23 +137,29 @@ void remap_term(int32_t term_id){ ...@@ -142,23 +137,29 @@ void remap_term(int32_t term_id){
*/ */
int32_t remap_proc(int32_t pid){ int32_t remap_proc(int32_t pid){
if (pid < 0 || pid > MAX_PROCESS) if (pid < 0 || pid > MAX_PROCESS)
return -1; 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
flush_tlb(); flush_tlb();
return 0; return 0;
} }
/* flush_tlb
* Inputs: void
* Return Value: void
* Function: flushes the TLB (used when changing paging)
*/
void flush_tlb(void){ void flush_tlb(void){
asm volatile( asm volatile(
"movl %%cr3, %%eax \n" "movl %%cr3, %%eax \n"
"movl %%eax, %%cr3 \n" "movl %%eax, %%cr3 \n"
: :
: :
: "memory", "cc" : "memory", "cc"
); );
return; return;
} }
#include "pit.h" #include "pit.h"
// referance from https://wiki.osdev.org/PIT // reference 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;
//sent command to the port /* i8253_init
outb(0x34, CMD_REG); * Inputs: void
outb(low, CHANNEL_0); * Return Value: void
outb(high, CHANNEL_0); * Function: initializes pit
enable_irq(0); */
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; return;
} }
/* pit_handler
* Inputs: void
* Return Value: void
* Function: pit interrupt handler
*/
void pit_handler(void) void pit_handler(void)
{ {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#define FREQUENCY 1193182 #define FREQUENCY 1193182
#define CHANNEL_0 0x40 #define CHANNEL_0 0x40
#define CMD_REG 0x43 #define CMD_REG 0x43
#define PIT_IRQ 0x00
void i8253_init(void); void i8253_init(void);
void pit_handler(void); void pit_handler(void);
......
...@@ -32,7 +32,7 @@ void scheduler(void){ ...@@ -32,7 +32,7 @@ void scheduler(void){
printf("terminal = %d\n", running_terminal); printf("terminal = %d\n", running_terminal);
send_eoi(0); send_eoi(PIT_IRQ);
execute((uint8_t *)"shell"); execute((uint8_t *)"shell");
} }
...@@ -50,7 +50,7 @@ void scheduler(void){ ...@@ -50,7 +50,7 @@ void scheduler(void){
if(terminal[running_terminal].pcb == NULL) if(terminal[running_terminal].pcb == NULL)
{ {
send_eoi(0); send_eoi(PIT_IRQ);
return; return;
} }
...@@ -65,7 +65,7 @@ void scheduler(void){ ...@@ -65,7 +65,7 @@ void scheduler(void){
tss.ss0 = KERNEL_DS; tss.ss0 = KERNEL_DS;
tss.esp0 = _8_MB - _8_KB * (next_pcb->pid); tss.esp0 = _8_MB - _8_KB * (next_pcb->pid);
send_eoi(0); send_eoi(PIT_IRQ);
asm volatile( asm volatile(
//change esp and ebp //change esp and ebp
......
#include "lib.h" #include "lib.h"
#include "types.h" #include "types.h"
#include "x86_desc.h" #include "x86_desc.h"
#include "pit.h"
extern void scheduler(void); extern void scheduler(void);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment