void main() { init_frame_database(); init_page_table(); startup_paging_mode(); VM_CONTEXT* vm = (VM_CONTEXT*)VM_CONTEXT_VIRTUAL_ADDR; UINT32 OS_entry_point = vm->os_entry_point; __asm jmp OS_entry_point }
/* sizes are in words, not bytes */ int pagemem_init(unsigned int pg_size, double history_weight) { if (pg_size > MEMSIZE) { fprintf(stderr, "pagemem_init: page size is larger than available memory\n"); return -1; } if (MEMSIZE % pg_size != 0) { fprintf(stderr, "pagemem_init: page size must evenly divide physical memory\n"); return -1; } page_faults = 0; sys_pager.pg_size = pg_size; sys_pager.pg_count = VADDR_SIZE/pg_size; /* setup the virtual address space */ freemem(0, VADDR_SIZE); page_mem = malloc(VADDR_SIZE*4); memset(page_mem, '0', VADDR_SIZE*4); if (page_mem == NULL) { fprintf(stderr, "pagemem_init: failed to allocate secondary storage\n"); goto ERR_RET; } if (init_page_table() == -1) goto ERR_PMEM; if (init_frequency_table(history_weight) == -1) goto ERR_PG_TABLE; if (init_free_frames() == -1) goto ERR_FREQ_TABLE; return 0; ERR_FREQ_TABLE: free(freq_table.pg_period); ERR_PG_TABLE: free(pg_table); ERR_PMEM: free(page_mem); ERR_RET: return -1; }