From 3c7a1acf35bd7b5c71b03dff22f63b31ea9973e9 Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:41:04 +0700 Subject: [PATCH 1/9] os_assignment --- .DS_Store | Bin 0 -> 6148 bytes ossim_source_code/.DS_Store | Bin 0 -> 8196 bytes .../.vscode/c_cpp_properties.json | 18 + ossim_source_code/.vscode/launch.json | 13 + ossim_source_code/.vscode/settings.json | 66 ++ ossim_source_code/Makefile | 50 ++ ossim_source_code/include/bitops.h | 37 + ossim_source_code/include/common.h | 96 +++ ossim_source_code/include/cpu.h | 13 + ossim_source_code/include/loader.h | 9 + ossim_source_code/include/mem.h | 32 + ossim_source_code/include/mm.h | 163 +++++ ossim_source_code/include/os-cfg.h | 15 + ossim_source_code/include/os-mm.h | 88 +++ ossim_source_code/include/queue.h | 22 + ossim_source_code/include/sched.h | 28 + ossim_source_code/include/timer.h | 28 + ossim_source_code/input/os_0_mlq_paging | 4 + ossim_source_code/input/os_1_mlq_paging | 10 + .../input/os_1_mlq_paging_small_1K | 10 + .../input/os_1_mlq_paging_small_4K | 10 + ossim_source_code/input/os_1_singleCPU_mlq | 9 + .../input/os_1_singleCPU_mlq_paging | 10 + ossim_source_code/input/proc/m0s | 8 + ossim_source_code/input/proc/m1s | 8 + ossim_source_code/input/proc/p0s | 15 + ossim_source_code/input/proc/p1s | 12 + ossim_source_code/input/proc/p2s | 14 + ossim_source_code/input/proc/p3s | 18 + ossim_source_code/input/proc/s0 | 16 + ossim_source_code/input/proc/s1 | 8 + ossim_source_code/input/proc/s2 | 14 + ossim_source_code/input/proc/s3 | 18 + ossim_source_code/input/proc/s4 | 31 + ossim_source_code/input/sched | 4 + ossim_source_code/input/sched_0 | 3 + ossim_source_code/input/sched_1 | 5 + ossim_source_code/obj/cpu.o | Bin 0 -> 6704 bytes ossim_source_code/obj/loader.o | Bin 0 -> 9176 bytes ossim_source_code/obj/mem.o | Bin 0 -> 10144 bytes ossim_source_code/obj/mm-memphy.o | Bin 0 -> 7368 bytes ossim_source_code/obj/mm-vm.o | Bin 0 -> 18048 bytes ossim_source_code/obj/mm.o | Bin 0 -> 15672 bytes ossim_source_code/obj/os.o | Bin 0 -> 15984 bytes ossim_source_code/obj/queue.o | Bin 0 -> 5624 bytes ossim_source_code/obj/sched.o | Bin 0 -> 9032 bytes ossim_source_code/obj/timer.o | Bin 0 -> 8360 bytes ossim_source_code/os | Bin 0 -> 81039 bytes .../output/os_0_mlq_paging.output | 78 +++ .../output/os_1_mlq_paging.output | 173 +++++ .../output/os_1_mlq_paging_small_1K.output | 171 +++++ .../output/os_1_mlq_paging_small_4K.output | 172 +++++ .../output/os_1_singleCPU_mlq.output | 185 +++++ .../output/os_1_singleCPU_mlq_paging.output | 185 +++++ ossim_source_code/output/sched.output | 42 ++ ossim_source_code/output/sched_0.output | 68 ++ ossim_source_code/output/sched_1.output | 132 ++++ ossim_source_code/src/cpu.c | 102 +++ ossim_source_code/src/loader.c | 108 +++ ossim_source_code/src/mem.c | 173 +++++ ossim_source_code/src/mm-memphy.c | 199 ++++++ ossim_source_code/src/mm-vm.c | 649 ++++++++++++++++++ ossim_source_code/src/mm.c | 458 ++++++++++++ ossim_source_code/src/os.c | 292 ++++++++ ossim_source_code/src/paging.c | 18 + ossim_source_code/src/queue.c | 49 ++ ossim_source_code/src/sched.c | 140 ++++ ossim_source_code/src/timer.c | 136 ++++ 68 files changed, 4435 insertions(+) create mode 100644 .DS_Store create mode 100644 ossim_source_code/.DS_Store create mode 100644 ossim_source_code/.vscode/c_cpp_properties.json create mode 100644 ossim_source_code/.vscode/launch.json create mode 100644 ossim_source_code/.vscode/settings.json create mode 100644 ossim_source_code/Makefile create mode 100644 ossim_source_code/include/bitops.h create mode 100644 ossim_source_code/include/common.h create mode 100644 ossim_source_code/include/cpu.h create mode 100644 ossim_source_code/include/loader.h create mode 100644 ossim_source_code/include/mem.h create mode 100644 ossim_source_code/include/mm.h create mode 100644 ossim_source_code/include/os-cfg.h create mode 100644 ossim_source_code/include/os-mm.h create mode 100644 ossim_source_code/include/queue.h create mode 100644 ossim_source_code/include/sched.h create mode 100644 ossim_source_code/include/timer.h create mode 100644 ossim_source_code/input/os_0_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_1K create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_4K create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq_paging create mode 100644 ossim_source_code/input/proc/m0s create mode 100644 ossim_source_code/input/proc/m1s create mode 100644 ossim_source_code/input/proc/p0s create mode 100644 ossim_source_code/input/proc/p1s create mode 100644 ossim_source_code/input/proc/p2s create mode 100644 ossim_source_code/input/proc/p3s create mode 100644 ossim_source_code/input/proc/s0 create mode 100644 ossim_source_code/input/proc/s1 create mode 100644 ossim_source_code/input/proc/s2 create mode 100644 ossim_source_code/input/proc/s3 create mode 100644 ossim_source_code/input/proc/s4 create mode 100644 ossim_source_code/input/sched create mode 100644 ossim_source_code/input/sched_0 create mode 100644 ossim_source_code/input/sched_1 create mode 100644 ossim_source_code/obj/cpu.o create mode 100644 ossim_source_code/obj/loader.o create mode 100644 ossim_source_code/obj/mem.o create mode 100644 ossim_source_code/obj/mm-memphy.o create mode 100644 ossim_source_code/obj/mm-vm.o create mode 100644 ossim_source_code/obj/mm.o create mode 100644 ossim_source_code/obj/os.o create mode 100644 ossim_source_code/obj/queue.o create mode 100644 ossim_source_code/obj/sched.o create mode 100644 ossim_source_code/obj/timer.o create mode 100755 ossim_source_code/os create mode 100644 ossim_source_code/output/os_0_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_1K.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_4K.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq_paging.output create mode 100644 ossim_source_code/output/sched.output create mode 100644 ossim_source_code/output/sched_0.output create mode 100644 ossim_source_code/output/sched_1.output create mode 100644 ossim_source_code/src/cpu.c create mode 100644 ossim_source_code/src/loader.c create mode 100644 ossim_source_code/src/mem.c create mode 100644 ossim_source_code/src/mm-memphy.c create mode 100644 ossim_source_code/src/mm-vm.c create mode 100644 ossim_source_code/src/mm.c create mode 100644 ossim_source_code/src/os.c create mode 100644 ossim_source_code/src/paging.c create mode 100644 ossim_source_code/src/queue.c create mode 100644 ossim_source_code/src/sched.c create mode 100644 ossim_source_code/src/timer.c diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4ebe3adfd5d0d6c9082c55d2bb2cb5e333597333 GIT binary patch literal 6148 zcmeHKUrPc(5T8}c6A26od|c>N$o^nSFNfI|=%OAf%=3;qI&a0(d=TND>kIWs`aI3- zu8~;KLqy1o%>HI)XLi}&%FZnSh}JmR1E>IigG!hyVe^I1IO&q)tcOtOIr`9n6cmhM zxD?Hf|HuHH-6oz`ioXaxpI;9`Jk1`C1rYj^bl}Iz$LLpo5J%~#UVjt0d|_?9=oFo@ zbL%~*i8tzw#%ZfNyr$lTQn5d`yZ&VqPCAvXQzM(kU4T|bX=1MjpnQ-r_KF(O&%UJX0wvBy|a6A-g%7siF!8l3j8N(*|0c= z7c_pb(I+o6k$>kO{%a@3}MpIFKwJ_F*9h=LFkon9=o!zFBG9y zN59nJAY6moG6T%OA_IBTtx)|x`~LmEn8ZD1fEidR21KFlwOhC)TU(blN3~X>-l39E oTxRei1r1$_F_ubk6;%uRB^ijW#mpdjQ20YY)4&Zg@TUyC1K(3pTNij@7u4Fq18{J`3wD<4EuKP~2ZjN|fMLKeU>GnAoCXGP&8B2!tozby za>IaO;9N35?*|(%vK3{=(u!9HW?~C~Hjj@*!h75Yh!|Vhin3#AMJSdjcMnX3GPT8E zG93Lj!O>Qf9ZM_2fyr=Ss%EBkC`{CjakhX1t4M2d!+>ER%>eD)3$O(H(1TWd|K9FM zu=O^LX!Bal3AlqE>%+INZ!UVD?;VA5{{hw6rPG3_wlY;(03SkZO#lNrPuL82OVvh` zn`&D6BNBm=XlK~#DD+3C6ZpM;x%{2Y4qTTkn|d|2-{`-5J!*?mI49&sKx z(S6f-?0dt;!lex!_M3j_bwz;hdI;Ix@SMp3HV(HFC8WGn7 zz2$e?N)wICHlJ#ejnXywguo=r`}J-Z@Nfq`)Qef6SO@j$C)9e6-nd#ZJIM}30iOk!6P+T?KlJMcp51$#|LgUS={ z!R9aT$Cb7iV-xRmY^A+=%MY$$#c9ZCyQUC{r~;!^Z(;*gel!HU>G=223WpUuT`-L(FbX=HMG~Z z@p^_ACBluR6(N`rgr1A-INHe{hInr)Uq#umwCKU~-wy)ld;fHN<7?}(zS@}e{{;75 I=VJZ;3#dblSpWb4 literal 0 HcmV?d00001 diff --git a/ossim_source_code/.vscode/c_cpp_properties.json b/ossim_source_code/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f6526a0 --- /dev/null +++ b/ossim_source_code/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "macos-clang-arm64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "${default}", + "cppStandard": "c++20", + "intelliSenseMode": "macos-clang-arm64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/launch.json b/ossim_source_code/.vscode/launch.json new file mode 100644 index 0000000..5de968d --- /dev/null +++ b/ossim_source_code/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/admin/Downloads/ossim_source_code/src", + "program": "/Users/admin/Downloads/ossim_source_code/src/build/Debug/outDebug" + } + ] +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/settings.json b/ossim_source_code/.vscode/settings.json new file mode 100644 index 0000000..7a3b5b2 --- /dev/null +++ b/ossim_source_code/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "C_Cpp_Runner.cCompilerPath": "clang", + "C_Cpp_Runner.cppCompilerPath": "clang++", + "C_Cpp_Runner.debuggerPath": "lldb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "c++20", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "git.ignoreLimitWarning": true, + "files.associations": { + "cstdlib": "cpp", + "locale": "cpp", + "ostream": "cpp", + "new": "cpp" + } +} \ No newline at end of file diff --git a/ossim_source_code/Makefile b/ossim_source_code/Makefile new file mode 100644 index 0000000..f7ed868 --- /dev/null +++ b/ossim_source_code/Makefile @@ -0,0 +1,50 @@ + +INC = -Iinclude +LIB = -lpthread + +SRC = src +OBJ = obj +INCLUDE = include + +CC = gcc +DEBUG = -g +CFLAGS = -Wall -c $(DEBUG) +LFLAGS = -Wall $(DEBUG) + +vpath %.c $(SRC) +vpath %.h $(INCLUDE) + +MAKE = $(CC) $(INC) + +# Object files needed by modules +MEM_OBJ = $(addprefix $(OBJ)/, paging.o mem.o cpu.o loader.o) +OS_OBJ = $(addprefix $(OBJ)/, cpu.o mem.o loader.o queue.o os.o sched.o timer.o mm-vm.o mm.o mm-memphy.o) +SCHED_OBJ = $(addprefix $(OBJ)/, cpu.o loader.o) +HEADER = $(wildcard $(INCLUDE)/*.h) + +all: os +#mem sched os + +# Just compile memory management modules +mem: $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(MEM_OBJ) -o mem $(LIB) + +# Just compile scheduler +sched: $(SCHED_OBJ) $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(SCHED_OBJ) $(MEM_OBJ) -o sched $(LIB) + +# Compile the whole OS simulation +os: $(OS_OBJ) + $(MAKE) $(LFLAGS) $(OS_OBJ) -o os $(LIB) + +$(OBJ)/%.o: %.c ${HEADER} $(OBJ) + $(MAKE) $(CFLAGS) $< -o $@ + +# Prepare objectives container +$(OBJ): + mkdir -p $(OBJ) + +clean: + rm -f $(OBJ)/*.o os sched mem + rm -r $(OBJ) + diff --git a/ossim_source_code/include/bitops.h b/ossim_source_code/include/bitops.h new file mode 100644 index 0000000..0cc9413 --- /dev/null +++ b/ossim_source_code/include/bitops.h @@ -0,0 +1,37 @@ +#ifdef CONFIG_64BIT +#define BITS_PER_LONG 64 +#else +#define BITS_PER_LONG 32 +#endif /* CONFIG_64BIT */ + +#define BITS_PER_BYTE 8 +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define BIT(nr) (1U << (nr)) +#define BIT_ULL(nr) (1ULL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +/* + * Create a contiguous bitmask starting at bit position @l and ending at + * position @h. For example + * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. + */ +#define GENMASK(h, l) \ + (((~0U) << (l)) & (~0U >> (BITS_PER_LONG - (h) - 1))) + +#define NBITS2(n) ((n&2)?1:0) +#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n))) +#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n))) +#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n))) +#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n))) +#define NBITS(n) (n==0?0:NBITS32(n)) + +#define EXTRACT_NBITS(nr, h, l) ((nr&GENMASK(h,l)) >> l) diff --git a/ossim_source_code/include/common.h b/ossim_source_code/include/common.h new file mode 100644 index 0000000..c1d5a17 --- /dev/null +++ b/ossim_source_code/include/common.h @@ -0,0 +1,96 @@ +#ifndef COMMON_H +#define COMMON_H + +/* Define structs and routine could be used by every source files */ + +#include + +#ifndef OSCFG_H +#include "os-cfg.h" +#endif + +#ifndef OSMM_H +#include "os-mm.h" +#endif + +#define ADDRESS_SIZE 20 +#define OFFSET_LEN 10 +#define FIRST_LV_LEN 5 +#define SECOND_LV_LEN 5 +#define SEGMENT_LEN FIRST_LV_LEN +#define PAGE_LEN SECOND_LV_LEN + +#define NUM_PAGES (1 << (ADDRESS_SIZE - OFFSET_LEN)) +#define PAGE_SIZE (1 << OFFSET_LEN) + +enum ins_opcode_t { + CALC, // Just perform calculation, only use CPU + ALLOC, // Allocate memory +#ifdef MM_PAGING + MALLOC, // Allocate dynamic memory +#endif + FREE, // Deallocated a memory block + READ, // Write data to a byte on memory + WRITE // Read data from a byte on memory +}; + +/* instructions executed by the CPU */ +struct inst_t { + enum ins_opcode_t opcode; + uint32_t arg_0; // Argument lists for instructions + uint32_t arg_1; + uint32_t arg_2; +}; + +struct code_seg_t { + struct inst_t * text; + uint32_t size; +}; + +struct trans_table_t { + /* A row in the page table of the second layer */ + struct { + addr_t v_index; // The index of virtual address + addr_t p_index; // The index of physical address + } table[1 << SECOND_LV_LEN]; + int size; +}; + +/* Mapping virtual addresses and physical ones */ +struct page_table_t { + /* Translation table for the first layer */ + struct { + addr_t v_index; // Virtual index + struct trans_table_t * next_lv; + } table[1 << FIRST_LV_LEN]; + int size; // Number of row in the first layer +}; + +/* PCB, describe information about a process */ +struct pcb_t { + uint32_t pid; // PID + uint32_t priority; // Default priority, this legacy (FIXED) value depend on process itself + struct code_seg_t * code; // Code segment + addr_t regs[10]; // Registers, store address of allocated regions + uint32_t pc; // Program pointer, point to the next instruction +#ifdef MLQ_SCHED + // Priority on execution (if supported), on-fly aka. changeable + // and this vale overwrites the default priority when it existed + uint32_t prio; +#endif +#ifdef MM_PAGING + struct mm_struct *mm; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; +#ifdef MM_PAGING_HEAP_GODOWN + uint32_t vmemsz; +#endif +#endif + struct page_table_t * page_table; // Page table + uint32_t bp; // Break pointer + +}; + +#endif + diff --git a/ossim_source_code/include/cpu.h b/ossim_source_code/include/cpu.h new file mode 100644 index 0000000..0b95b07 --- /dev/null +++ b/ossim_source_code/include/cpu.h @@ -0,0 +1,13 @@ + +#ifndef CPU_H +#define CPU_H + +#include "common.h" + +/* Execute an instruction of a process. Return 0 + * if the instruction is executed successfully. + * Otherwise, return 1. */ +int run(struct pcb_t * proc); + +#endif + diff --git a/ossim_source_code/include/loader.h b/ossim_source_code/include/loader.h new file mode 100644 index 0000000..8fedc07 --- /dev/null +++ b/ossim_source_code/include/loader.h @@ -0,0 +1,9 @@ +#ifndef LOADER_H +#define LOADER_H + +#include "common.h" + +struct pcb_t * load(const char * path); + +#endif + diff --git a/ossim_source_code/include/mem.h b/ossim_source_code/include/mem.h new file mode 100644 index 0000000..3c2f5a3 --- /dev/null +++ b/ossim_source_code/include/mem.h @@ -0,0 +1,32 @@ +#ifndef MEM_H +#define MEM_H + +#include "common.h" + +#define RAM_SIZE (1 << ADDRESS_SIZE) + +/* Init related parameters, must be called before being used */ +void init_mem(void); + +/* Allocate [size] bytes for process [proc] and return its virtual address. + * If we cannot allocate new memory region for this process, return 0 */ +addr_t alloc_mem(uint32_t size, struct pcb_t * proc); + +/* Free a memory block having the first byte at [address] used by + * process [proc]. Return 0 if [address] is valid. Otherwise, return 1 */ +int free_mem(addr_t address, struct pcb_t * proc); + +/* Read 1 byte memory pointed by [address] used by process [proc] and + * save it to [data]. + * If the given [address] is valid, return 0. Otherwise, return 1 */ +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data); + +/* Write [data] to 1 byte on the memory pointed by [address] of process + * [proc]. If given [address] is valid, return 0. Otherwise, return 1 */ +int write_mem(addr_t address, struct pcb_t * proc, BYTE data); + +void dump(void); + +#endif + + diff --git a/ossim_source_code/include/mm.h b/ossim_source_code/include/mm.h new file mode 100644 index 0000000..e7d9094 --- /dev/null +++ b/ossim_source_code/include/mm.h @@ -0,0 +1,163 @@ +#ifndef MM_H + +#include "bitops.h" +#include "common.h" + +/* CPU Bus definition */ +#define PAGING_CPU_BUS_WIDTH 22 /* 22bit bus - MAX SPACE 4MB */ +#define PAGING_PAGESZ 256 /* 256B or 8-bits PAGE NUMBER */ +#define PAGING_MEMRAMSZ BIT(10) /* 1MB */ +#define PAGING_PAGE_ALIGNSZ(sz) (DIV_ROUND_UP(sz,PAGING_PAGESZ) *PAGING_PAGESZ) + +#define PAGING_MEMSWPSZ BIT(14) /* 16MB */ +#define PAGING_SWPFPN_OFFSET 5 +#define PAGING_MAX_PGN (DIV_ROUND_UP(BIT(PAGING_CPU_BUS_WIDTH),PAGING_PAGESZ)) + +#define PAGING_SBRK_INIT_SZ PAGING_PAGESZ +/* PTE BIT */ +#define PAGING_PTE_PRESENT_MASK BIT(31) +#define PAGING_PTE_SWAPPED_MASK BIT(30) +#define PAGING_PTE_RESERVE_MASK BIT(29) +#define PAGING_PTE_DIRTY_MASK BIT(28) +#define PAGING_PTE_EMPTY01_MASK BIT(14) +#define PAGING_PTE_EMPTY02_MASK BIT(13) + +/* PTE BIT PRESENT */ +#define PAGING_PTE_SET_PRESENT(pte) (pte=pte|PAGING_PTE_PRESENT_MASK) +#define PAGING_PTE_PAGE_PRESENT(pte) (pte&PAGING_PTE_PRESENT_MASK) + +/* USRNUM */ +#define PAGING_PTE_USRNUM_LOBIT 15 +#define PAGING_PTE_USRNUM_HIBIT 27 +/* FPN */ +#define PAGING_PTE_FPN_LOBIT 0 +#define PAGING_PTE_FPN_HIBIT 12 +/* SWPTYP */ +#define PAGING_PTE_SWPTYP_LOBIT 0 +#define PAGING_PTE_SWPTYP_HIBIT 4 +/* SWPOFF */ +#define PAGING_PTE_SWPOFF_LOBIT 5 +#define PAGING_PTE_SWPOFF_HIBIT 25 + +/* PTE masks */ +#define PAGING_PTE_USRNUM_MASK GENMASK(PAGING_PTE_USRNUM_HIBIT,PAGING_PTE_USRNUM_LOBIT) +#define PAGING_PTE_FPN_MASK GENMASK(PAGING_PTE_FPN_HIBIT,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWPTYP_MASK GENMASK(PAGING_PTE_SWPTYP_HIBIT,PAGING_PTE_SWPTYP_LOBIT) +#define PAGING_PTE_SWPOFF_MASK GENMASK(PAGING_PTE_SWPOFF_HIBIT,PAGING_PTE_SWPOFF_LOBIT) + +/* Extract PTE */ +#define PAGING_PTE_OFFST(pte) GETVAL(pte,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PTE_PGN(pte) GETVAL(pte,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +#define PAGING_PTE_FPN(pte) GETVAL(pte,PAGING_PTE_FPN_MASK,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWP(pte) GETVAL(pte,PAGING_PTE_SWPOFF_MASK,PAGING_SWPFPN_OFFSET) + +/* OFFSET */ +#define PAGING_ADDR_OFFST_LOBIT 0 +#define PAGING_ADDR_OFFST_HIBIT (NBITS(PAGING_PAGESZ) - 1) + +/* PAGE Num */ +#define PAGING_ADDR_PGN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_PGN_HIBIT (PAGING_CPU_BUS_WIDTH - 1) + +/* Frame PHY Num */ +#define PAGING_ADDR_FPN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_FPN_HIBIT (NBITS(PAGING_MEMRAMSZ) - 1) + +/* SWAPFPN */ +#define PAGING_SWP_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_SWP_HIBIT (NBITS(PAGING_MEMSWPSZ) - 1) + +/* Value operators */ +#define SETBIT(v,mask) (v=v|mask) +#define CLRBIT(v,mask) (v=v&~mask) + +#define SETVAL(v,value,mask,offst) (v=(v&~mask)|((value<>offst) + +/* Other masks */ +#define PAGING_OFFST_MASK GENMASK(PAGING_ADDR_OFFST_HIBIT,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PGN_MASK GENMASK(PAGING_ADDR_PGN_HIBIT,PAGING_ADDR_PGN_LOBIT) +#define PAGING_FPN_MASK GENMASK(PAGING_ADDR_FPN_HIBIT,PAGING_ADDR_FPN_LOBIT) +#define PAGING_SWP_MASK GENMASK(PAGING_SWP_HIBIT,PAGING_SWP_LOBIT) + +/* Extract OFFSET */ +//#define PAGING_OFFST(x) ((x&PAGING_OFFST_MASK) >> PAGING_ADDR_OFFST_LOBIT) +#define PAGING_OFFST(x) GETVAL(x,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +/* Extract Page Number*/ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract FramePHY Number*/ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) +/* Extract SWAPFPN */ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract SWAPTYPE */ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) + +/* Memory range operator */ +/* TODO implement the INCLUDE checking mechanism - currently dummy op only */ +#define INCLUDE(x1,x2,y1,y2) (0) +/* TODO implement the OVERLAP checking mechanism - currently dummy op only */ +#define OVERLAP(x1,x2,y1,y2) (1) + +/* VM region prototypes */ +struct vm_rg_struct * init_vm_rg(int rg_start, int rg_endi, int vmaid); +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode); +int enlist_pgn_node(struct pgn_t **pgnlist, int pgn); +int vmap_page_range(struct pcb_t *caller, int addr, int pgnum, + struct framephy_struct *frames, struct vm_rg_struct *ret_rg); +int vm_map_ram(struct pcb_t *caller, int astart, int send, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg); +int alloc_pages_range(struct pcb_t *caller, int incpgnum, struct framephy_struct **frm_lst); +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) ; +int pte_set_fpn(uint32_t *pte, int fpn); +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff); +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff); //swap offset +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr); +int __free(struct pcb_t *caller, int rgid); +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data); +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value); +int init_mm(struct mm_struct *mm, struct pcb_t *caller); + +/* VM prototypes */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgfree_data(struct pcb_t *proc, uint32_t reg_index); +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination); +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset); +/* Local VM prototypes */ +struct vm_rg_struct * get_symrg_byid(struct mm_struct* mm, int rgid); +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend); +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg); +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret); +int find_victim_page(struct mm_struct* mm, int *pgn); +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid); + +/* MEM/PHY protypes */ +int MEMPHY_get_freefp(struct memphy_struct *mp, int *fpn); +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn); +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value); +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data); +int MEMPHY_dump(struct memphy_struct * mp); +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg); +/* DEBUG */ +int print_list_fp(struct framephy_struct *fp); +int print_list_rg(struct vm_rg_struct *rg); +int print_list_vma(struct vm_area_struct *rg); + + +int print_list_pgn(struct pgn_t *ip); +int print_pgtbl(struct pcb_t *ip, uint32_t start, uint32_t end); +#endif diff --git a/ossim_source_code/include/os-cfg.h b/ossim_source_code/include/os-cfg.h new file mode 100644 index 0000000..d5034e0 --- /dev/null +++ b/ossim_source_code/include/os-cfg.h @@ -0,0 +1,15 @@ +#ifndef OSCFG_H +#define OSCFG_H + +#define MLQ_SCHED 1 +#define MAX_PRIO 140 + +#define MM_PAGING +#define MM_PAGING_HEAP_GODOWN +// #define MM_FIXED_MEMSZ +#define VMDBG 1 +#define MMDBG 1 +#define IODUMP 1 +#define PAGETBL_DUMP 1 + +#endif diff --git a/ossim_source_code/include/os-mm.h b/ossim_source_code/include/os-mm.h new file mode 100644 index 0000000..beef90e --- /dev/null +++ b/ossim_source_code/include/os-mm.h @@ -0,0 +1,88 @@ +#ifndef OSMM_H +#define OSMM_H + +#define MM_PAGING +#define PAGING_MAX_MMSWP 4 /* max number of supported swapped space */ +#define PAGING_MAX_SYMTBL_SZ 30 + +typedef char BYTE; +typedef uint32_t addr_t; +//typedef unsigned int uint32_t; + +struct pgn_t{ + int pgn; + struct pgn_t *pg_next; +}; + +/* + * Memory region struct + */ +struct vm_rg_struct { + int vmaid; + + unsigned long rg_start; + unsigned long rg_end; + + struct vm_rg_struct *rg_next; +}; + +/* + * Memory area struct + */ +struct vm_area_struct { + unsigned long vm_id; + unsigned long vm_start; + unsigned long vm_end; + + unsigned long sbrk; +/* + * Derived field + * unsigned long vm_limit = vm_end - vm_start + */ + struct mm_struct *vm_mm; + + struct vm_rg_struct *vm_freerg_list; + struct vm_area_struct *vm_next; +}; + +/* + * Memory management struct + */ +struct mm_struct { + uint32_t *pgd; + + struct vm_area_struct *mmap; + + /* Currently we support a fixed number of symbol */ + struct vm_rg_struct symrgtbl[PAGING_MAX_SYMTBL_SZ]; + + /* list of free page */ + struct pgn_t *fifo_pgn; +}; + +/* + * FRAME/MEM PHY struct + */ +struct framephy_struct { + int fpn; + struct framephy_struct *fp_next; + + /* Resereed for tracking allocated framed */ + struct mm_struct* owner; +}; + +struct memphy_struct { + /* Basic field of data and size */ + BYTE *storage; + int maxsz; + + /* Sequential device fields */ + int rdmflg; + int cursor; + + /* Management structure */ + struct framephy_struct *free_fp_list; + struct framephy_struct *used_fp_list; +}; + +#endif diff --git a/ossim_source_code/include/queue.h b/ossim_source_code/include/queue.h new file mode 100644 index 0000000..d26881c --- /dev/null +++ b/ossim_source_code/include/queue.h @@ -0,0 +1,22 @@ + +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#define MAX_QUEUE_SIZE 10 + +struct queue_t { + int count_slot; + struct pcb_t * proc[MAX_QUEUE_SIZE]; + int size; +}; + +void enqueue(struct queue_t * q, struct pcb_t * proc); + +struct pcb_t * dequeue(struct queue_t * q); + +int empty(struct queue_t * q); + +#endif + diff --git a/ossim_source_code/include/sched.h b/ossim_source_code/include/sched.h new file mode 100644 index 0000000..d252c72 --- /dev/null +++ b/ossim_source_code/include/sched.h @@ -0,0 +1,28 @@ +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#ifndef MLQ_SCHED +#define MLQ_SCHED +#endif + +//#define MAX_PRIO 139 + +int queue_empty(void); + +void init_scheduler(void); +void finish_scheduler(void); + +/* Get the next process from ready queue */ +struct pcb_t * get_proc(void); + +/* Put a process back to run queue */ +void put_proc(struct pcb_t * proc); + +/* Add a new process to ready queue */ +void add_proc(struct pcb_t * proc); + +#endif + + diff --git a/ossim_source_code/include/timer.h b/ossim_source_code/include/timer.h new file mode 100644 index 0000000..e480b66 --- /dev/null +++ b/ossim_source_code/include/timer.h @@ -0,0 +1,28 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +#include + +struct timer_id_t { + int done; + int fsh; + pthread_cond_t event_cond; + pthread_mutex_t event_lock; + pthread_cond_t timer_cond; + pthread_mutex_t timer_lock; +}; + +void start_timer(); + +void stop_timer(); + +struct timer_id_t * attach_event(); + +void detach_event(struct timer_id_t * event); + +void next_slot(struct timer_id_t* timer_id); + +uint64_t current_time(); + +#endif diff --git a/ossim_source_code/input/os_0_mlq_paging b/ossim_source_code/input/os_0_mlq_paging new file mode 100644 index 0000000..6872297 --- /dev/null +++ b/ossim_source_code/input/os_0_mlq_paging @@ -0,0 +1,4 @@ +6 2 4 +1048576 16777216 0 0 0 3145728 +0 p0s 0 +2 p1s 15 diff --git a/ossim_source_code/input/os_1_mlq_paging b/ossim_source_code/input/os_1_mlq_paging new file mode 100644 index 0000000..0068caf --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging @@ -0,0 +1,10 @@ +2 4 8 +1048576 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_1K b/ossim_source_code/input/os_1_mlq_paging_small_1K new file mode 100644 index 0000000..a5788e4 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_1K @@ -0,0 +1,10 @@ +2 4 8 +2048 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_4K b/ossim_source_code/input/os_1_mlq_paging_small_4K new file mode 100644 index 0000000..bd6af03 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_4K @@ -0,0 +1,10 @@ +2 4 8 +4096 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq b/ossim_source_code/input/os_1_singleCPU_mlq new file mode 100644 index 0000000..98efc7e --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq @@ -0,0 +1,9 @@ +2 1 8 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq_paging b/ossim_source_code/input/os_1_singleCPU_mlq_paging new file mode 100644 index 0000000..99e0a04 --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq_paging @@ -0,0 +1,10 @@ +2 1 8 +1048576 16777216 0 0 0 3145728 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/proc/m0s b/ossim_source_code/input/proc/m0s new file mode 100644 index 0000000..3466b3a --- /dev/null +++ b/ossim_source_code/input/proc/m0s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 3 +write 102 1 20 +write 1 2 1000 diff --git a/ossim_source_code/input/proc/m1s b/ossim_source_code/input/proc/m1s new file mode 100644 index 0000000..b3b24a6 --- /dev/null +++ b/ossim_source_code/input/proc/m1s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 2 +free 2 +free 1 diff --git a/ossim_source_code/input/proc/p0s b/ossim_source_code/input/proc/p0s new file mode 100644 index 0000000..7c443f9 --- /dev/null +++ b/ossim_source_code/input/proc/p0s @@ -0,0 +1,15 @@ +1 14 +calc +alloc 300 0 +malloc 300 4 +free 0 +alloc 100 1 +write 100 1 20 +read 1 20 20 +write 102 2 20 +read 2 20 20 +write 103 3 20 +read 3 20 20 +calc +free 4 +calc diff --git a/ossim_source_code/input/proc/p1s b/ossim_source_code/input/proc/p1s new file mode 100644 index 0000000..79c5fba --- /dev/null +++ b/ossim_source_code/input/proc/p1s @@ -0,0 +1,12 @@ +1 10 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p2s b/ossim_source_code/input/proc/p2s new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/p2s @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p3s b/ossim_source_code/input/proc/p3s new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/p3s @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s0 b/ossim_source_code/input/proc/s0 new file mode 100644 index 0000000..6186100 --- /dev/null +++ b/ossim_source_code/input/proc/s0 @@ -0,0 +1,16 @@ +12 15 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s1 b/ossim_source_code/input/proc/s1 new file mode 100644 index 0000000..8614b76 --- /dev/null +++ b/ossim_source_code/input/proc/s1 @@ -0,0 +1,8 @@ +20 7 +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s2 b/ossim_source_code/input/proc/s2 new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/s2 @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s3 b/ossim_source_code/input/proc/s3 new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/s3 @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s4 b/ossim_source_code/input/proc/s4 new file mode 100644 index 0000000..79dfde8 --- /dev/null +++ b/ossim_source_code/input/proc/s4 @@ -0,0 +1,31 @@ +20 30 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/sched b/ossim_source_code/input/sched new file mode 100644 index 0000000..33c50ef --- /dev/null +++ b/ossim_source_code/input/sched @@ -0,0 +1,4 @@ +4 2 3 +0 p1s +1 p2s +2 p3s diff --git a/ossim_source_code/input/sched_0 b/ossim_source_code/input/sched_0 new file mode 100644 index 0000000..ae979fd --- /dev/null +++ b/ossim_source_code/input/sched_0 @@ -0,0 +1,3 @@ +2 1 2 +0 s0 137 +4 s1 138 diff --git a/ossim_source_code/input/sched_1 b/ossim_source_code/input/sched_1 new file mode 100644 index 0000000..c7fac37 --- /dev/null +++ b/ossim_source_code/input/sched_1 @@ -0,0 +1,5 @@ +2 1 4 +0 s0 +4 s1 +6 s2 +7 s3 diff --git a/ossim_source_code/obj/cpu.o b/ossim_source_code/obj/cpu.o new file mode 100644 index 0000000000000000000000000000000000000000..4a5586b973b826c9dfde1f75b31550dadaf2ee7e GIT binary patch literal 6704 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 literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mem.o b/ossim_source_code/obj/mem.o new file mode 100644 index 0000000000000000000000000000000000000000..f258d187737468b32ed6fc56d256396ffd09ba10 GIT binary patch literal 10144 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 V-&)~#Tm=N=T$cm_vc}EV{{qDeHkAMX literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm-memphy.o b/ossim_source_code/obj/mm-memphy.o new file mode 100644 index 0000000000000000000000000000000000000000..f63706c64e7fbc56bc446fef39a60f5ee9f8eca3 GIT binary patch literal 7368 zcmbVRdvH|M89#ULp3U9dWOwrbLV{!!#K4$rKq|y44UZ@+p(0=v(Ox&Zo3Li@?y`^Y zP$3i0p_P#`*0$4!P^AO0YE}A3v@KB_#z(87j0~+@c820kXMPVmMi^Z9}bLM4}zJE+f>@k&gBdzvPyM ztFF(R*f__fjoFm$J2JJSul;_eS%{Sb6YB{XjLv2Dw(=Itbm@3Uzo@ zs*gi=0`Va?-xqdD>&Pi@FOA^=O=)d8r6L}MwHyW(`R+Sn42<5rs2?$0bSzj(`B;`J zY_7-$#dd){v2W(%JBc_b#(jtbOR4&z;t8;p@p6M#B_Ge&++h9W`xdzgAQy;rCSpB} z{9yhcxahoGAdbR00;ZLh3-ni%lfY2RSIUX1V7;jQqnNXOYWu3h@!PMTjsK4VSSZgI%?|nxA@Ztzm&HX<&`mSmJ#E_G!Ei#q+&O;khvp&+#r$d>Gepx&Dg#EqD(WW8Xku;yqn_ z{=2bnJMzA`e&FDC)>KzK)!1tpMs_wpx=J@Pz;1!^zLD=8ogWTA4PxE z_X*?%`vClV2ia)r+hW~fZm^kJxdz?fW`oDkD*oP8q(?t;KVus-zPDE7zML>b&hmQ( z@%BDw#j&v8-j9?D<#JCIS3Q0Ac>b}?H2WnWazBs=hH9*Cx&!QbdN@+#=R(`Hgidtx{Bvu3Nq7 z<>+l$6*2SCW0}x#OIKc?!(GdxDAbAfQUo;*wmu3}*B5|f@8YgwU3WArMLJt%m%^{2233^(cq++5csjfu>}Ms8JvGY!?(j~qxax;+ zdRaQnvB&pg;ws3JxyhHxE>y*Q0Z+#?3uCuWU`(?xc9%U$Ubc=M5L_F%x|_v782g^U zI7S%riZJFCVc0qgW1fXEBr$dhjQ0s6ScDNQ!mxF^h$BepVD6=eiHbFrPe3`0A`GJl z!`A6f(pU@&;~k0d5xf=iOTtK57<*D8A1MoCPyAW(5<1PXyJnEM3|WHn9VRZ@ZE@Ps zLeBXraXGSN?jd@jY(iB`H_h3uqKJ3Nh_yG!Yu7tiIlyP{689kCGuM2`s9@vADySoj zM`XmBi1-o0VD5HlcPH7ISCHKSX}3w(9gri-K9tv?FHQ8-FUP|EN5Kw8Z7AKD&EG<`4VpONNh`w6WzllzMg25{-zVdF+PZ53Xn=0ejF`4=?9*1DA z);oWXro_odASrzv^nAsyzmN7?pKovHZ*XSdJ|{?I7!pz*>sIhUjSMF*48i& zd3z7wF_rmlfkG?chX^nW+NYH1ThI!?a;9$uEynH97$+fHNZ(Taa6FXg^7lm3nOHL6 zpFOv!xvAOTAf%16=Qe|Dn$yxWyLrw`mPv;LrrBsl&D8qMO<@*jk9DL&>CJ&9(Vl2L znTnoudJTjkW-Jj{lH8bx zCqt1;AeqU;Oe2%brNdDpoQy=-qP1($FfmdS;TZE(`G1ZtGc3Dqca_icBX7eBxmO7R4%WLC1P2_$^wfevJ6HRXW&CO z7tXRwHkl4}MVT4el-a`45wkPi#lpFCCYff`gVC8X;;~E?48CNMOxv+Dm0-{%=vM+H zB${R>QelCnx*{xx?yj0+WLYkeiFGBS5x?l)45e6)X@oFx+Zt>P_O@9(ndl;uOg5Cx z5)n;ASf(T0O|)s!lLAY3S#f~{DLd{lLx2)IIfEc)G$KrxiZ-*^Om}5F;`j($xN6nH zwZ`gYx3w8-)~;+b4AvRzOd6@K1Vcsi7G?S6GSNsrAIZ+nOf<_9IWv=urdTKvNwc0% zJQrn=P&UL;NGcKvHRdQ0-PlPfM8*83Svs1v(np#EtsA7@$i%ipSsF_+DJEg*>V-@3 z=83OF`%4ilE=g3a6B;jy`0B-*#LlANNN4mb4$+!yXH`~i*?-F`XGVwWm%n`P+M^#X zT2Ry7_}H$)naBU|=H|&;wtoKMx-;tSyM6?Fd|imI)tAw}hdPXU29@p;HK+}!bPV8+ zt)$LTXuBtVljP}OBmNP3pwQ+`Bppsv=l~{uqSVvTL?rD$ROoOep0;W#bm$XFS9&UR z86iGM49W|r#6L(3ik&x-Q7N+;VMBSN++2(e{ZK=d4nZok9}y0=WZbss-evVqxTK?& z=EI%~`XP(vkK|-c@w6Q6yXU&<>ApWdbnUZu46m-(KmW;>B6H>+4gdO?mz#Tc>i2!n z_Ql{^uMLF#58tycv+M8a-@ZBW68!#xdKz^U)rSF2L#5AkI%IE0rK774^h>mM1q6;aB=#DBK>F6L4og`93#}kR@2$CXjcG*va z|NNg=gd8fm(4oM$xD;MI$I}l{mnb`}<~;wx3nNU<(-&R_$I};H-^SAyUd@>A{P7iD z$;R_9ykL!|e-YE*w65KX@};MoDJU>RRbq*7JcmsShwT4zum*CObU;8ErMcB2XjMg71gV7t@L^BZ0BBAkUL$=c`4fJAg}A=Q$OVmL4IYB z&j_mVPq|ZtxZ1UY*TABlqR;0UiM)fVsx&|QM5Kx{!* zdppAY&bH?Oq@H0&@=o-myVNf!bQt;&A4dx$3YADi=ylzfpV1)aLA4hMl`geUAstL$ zs-eZyY9MK9CrQx+V1c9@bF^2en~8YNrMiP6i=XpLOSS9x<vr8psg!g3Ip?K^IlI3IZU!tu(3XOG?mDhF6xc zkFfLLt!exdTAX5yDcMdzi<77^0wu})vV9t_7EY|jYP2}P8h;854K3XQh<^=oh+Lax zdy{O-WlNttq+ci7NwR$#{v_Wm+vT#w?{z}%mv+RE-Ek=&lI=d(_R987*|y5oFIzOi zf3IwxLF)maU4BVC25A5P;7agb=qMJ zaH4Q?<;5nto$j?O;2<+W<7{_|7iHMJ+8SK8U! zc7ID-v*RpVlx@)w?XP`W-o|>ROf;xpsMIL8VUGWFJh!yP$Gpo<_n9jMN6&VbUiVO}EsKFY4WN=y#xRLk%0i{+$*NUL(EbBR1-HSX{ zq5Pe%W8AOwm#D#klE`3>Qs2pL6GEFaHe`VpHjXS%M(2XC1!#3H7$}Ggo&mk4$nAR& zV^71_HKWwv_aL8g_8oP4&u?!$2wnFcF`YLr996INm#e{()v9lx9D1QW_4Mky_4pSm z)nFz1Uno(1l!Nj6&QwSGV8?xbZ@6}F{OtDdue1wVs&oMT$PbQj<$rkLLM8D5$fdmg z%E%yeadqm3PSD{b`(T_`)VaCdn89so(-*bhpvxfgcZJAZsP>*I>Ff)R%6kN3xiaC4 z3*A~~qYrZvJb2#p?d7~Yd2~YW{_Y9A2O1~zKGl8Mxt^o<^qxAU_6}UD`u4$ZPXgcH zcuz0qqSI7Y%lMNbgW}VPm_v;BO!wox(?;b#Qe(kiQ!l~G1Mk{MUv9tXne9KWX}Pj@ zfHJ%9K38L?KF-l2uqS(b>O>u|zs-CyCtf(av}4B7LV0=y8oLy1)phorLEjqm4H~eS zF*X%;aV#URV8G0KCir0F%WN|(k8SeapB8lE!m}rLoP1lyO%wcXszJ`D(((VU85v{@ z3_v%r1vW?wO@$tan;Q64Abk(K8v1aYlZY4kLF&-&UErq>2dB}7bcq$jcT)GI@!1<>ngB`x)j0)%m3w=)gK-UF<^pJk`1KjIH_*yN5hl z&_GNe7MT|YDxVlT0KV{S5} z{490)tXkKxW@HSV%lo^(KmVku_V$~d3;Mf{&hNK77tqe3y5D&4!ck9m1>JqnUG3f1 zjlHe0y7%33%tyC#?%nc8-+@L4dw=K3)3e{=tyPTA9_*Lg^G?EsOU-|bbAfg;7m$5sHqHi+&3$j+%aM7(2h}R^Ic3#C){7Tq z{juNOm!$tR%oAcC=N~tZRbri#s!dT-?_G%7GnFFy9CL`+uVr-_?zutqy#ixgh5ZQr zIfXrqdNYT}-e0Q*1JIYbVSw^^Ucz`kLr%!kb|~GSvV73jlfgbBpEh7k2p?@vVJwc3 z&GYbVpQyaNN4PI@j&u2(5Avz^NId#e&s78cdC{2?*24#oXYtQ{*wH0X5k?B z{{igzxqDC%eF8f76`p%}P7>VGx#Em5*bhGS8@fKSVtj;s5$j{{6y{ad^3_#{t>7y9 z9JttmH7oh-B<6$Xhj;bb*{9ST+J-$*&g^)@sKA-K4{N$FI1%Td0_cbKGG7IlZ{+mh zx@G0=tak=4@9ckZLc^(o9Nmy#GrD06@2qnQdkbulbuglCSc~wntD6bk&|Y*iBYpc{ z{At5*-Ll>dM(`WY%>V6qg1L--)VYlQ;~2~j^b6+qkifQr5?=v4h+357{H=W)CYt(C$vk&M09{8aL{2uV$$2d5H_3}LX z4CrS}wf8DRxn}?~|CyRR#rb>;#q~L4GPn8=50uvfoc?uX--CCpOX!yU4w9PC;Mtuy z$0Ihy2mg=$+@Jbs!>9T)J3i^pRCR;rPw4FW3;Ut?D|O=k<}c0+;@d@nJ$ou+Ta-)&;E;&!?BI|kT&0&{Tzbn4TOJY;M#ZdAX7PAjPx&XKa$P|IXjX|@io4Z7 zxpA?bT?F>ha&~G!lOQj&@8K;W<$K70wiX@p}-F!R!B-_~i+E6Hz=nTp+(arI>;y zRG&ui8)MDyk!&8rk752jetqU^B$#jF*KfX!UrYJF4Pg5%UV{ft;wS8@uzvxFEl>GI zDVuxPbF5be?Gk7q^{S9P8ufcgA6upTzedIK`wh_SU@(tLOhDbNMsjkWLjXo%Dv174 ziZ1Z&O}>JgO@HaDXd}0uKM|CQ6#4d4y-KW{BLEA%L9Bw9DyAqtUqLb27f@t<3xq&q zSVY!SB(U+c!(Y$gihO%RCn;kVTLLS5kJw!DRPhqX;IkUVXkSK&QH})}A(0r>5(__I zuc-9O{|nvgG-yWRF7~?9Gwqjbcjr>fCuFpW9v*L_$ndb{2;P@7{cf+tbo=i-gn5V6 z4GqNZ)*h+9o>#{5fLVh?P)0pW`TWYn-fIZ^PkqYl7Gp zXezM6G_l?6hQ-hcgb#D8k!YfI%YEdPV&=rWnAf=w=L4BMOf76rB7hM;#}U!3}?f=y(sUdV=U>UgMBhGr_Z_@F{Y`(pcrcj5N>Z zWfUW^lL~*G9z;mE9{jo&AQBS7!#vc;wD;&~4}X&)57B!ne`}CHsre{I;t@(brX_BD zk?oFYiD{XGW8X!)0yw!>c*Ho*-zWA1_EY(XhDiJ}CB8O9;%h@BzBWXnU>S)&b|rqO zB~FKUBf&-DKjBK;6BHd!xDxmHMXM8(sPf0-^^uQX7E=#@j{->)@qh06>6mOQ`FCOHta zP#Eg-VP_-pB3&_8$N3&N9nJO88Kqbu7ub2O7s)Ds1>~RSn?wnruW31dA##pUPDE7T z3YN4MFMV zhbmDiCa4M>*DARi)LT?3DXdJMOUfwBbFxe`+>K$XDzp`jWLFJufCKYUwI6tR% zm89bgTCt3Sx+p>=C>zjwp2w8L#(?Xh^3!_IV;r>oG7hSAHrN{$Ta>r!x#yh>x9Sf# zN(QZPE}}3zxSps_b}nVLAr1rAKzM^MY%d0U4#W8-D*I-yetFPd?bRoR?7O`B6;<|H z)R{drq|daopuA=JX4^?r_&(s9qwKWT?3$px4fPP| z^FpKk6m@1Y-~8jIvKa8AxhGbR2W^6?>H<4xTQ$G}Pq3S>&}JH7lJylS`=HmoIH;^! z*y>pBJ;{}mb zI!8@I;D(G^dmP{xN}Zu>hLE(XgFO>K41}fC6niS*EZQ?w*)zOWHGX@JSDzNNKjYP} zEL5YL&|BP?ukt7oSH#MfXQe3g9@J}mQM(n8`QNup*`G&U+`2qy@AT>`3hhU{`fVZm zOQ`c$>04c8|BYAwY*<;$*m-Z@Ck?7E=-&nqFsy!10#Be`<-5V=s*?d4mHi^>B4|<2 zehGDnteZlJQS`7X;j@Zgf*kZ2^X*SiSwk-_RAWNMb+#X#q;bae$}VJ`yhu=uqVqU_ zaRdIwV)S&7#eS%_kpe5w7JK(B5!k~{bJdujG3TPdtCfAZC;S?JmcRyOsL>B*3FI(p zA^&_Q+|(Lt+YsIo??~YVK0I^IjQSb%;ToaV&YV*ZY{sm4GiKJ$nx;}6O?8Px?Uuxh zCRMkrWnD+CV_V&#_?CEUdotcp*Vvv&#M+vd;qOmYx3{;Z>Q*hfIaRkj)^zKt+h?Sj z?^9XTy3eLCVqL5`(b878sQv!7*7jI)s;)hiYDqY$_RSqlai^)hIj&mTQcio4RVS@B zx20M(w8fjlEp2JlxNupcTDWZ4t&M8A3vOJwc(Gc!c;O(Np5I^!fo)rTXUxb z!l}JC1wdt{Fi2bce$ifSq~&N3Z%v>tCP?O;a}F(=;M;hIqVZsYknCt_$JNv}C7~uk zmWpoxQ~q)hp_fM8jXo8F)Oz`yDZjH+s^x*W!o^og#hRNtD6&Z;szgT&cGJDvJlj+0 z_6|NNeR3f%D^?>SVPONX;pqe&!q}n@_%+30w8)54qC7vZ>eX>n~CnjUT zz>v+Uc(da*Po(ZoD*QEB%a*t!^)1i>b0D0b)5xXiKzFjs(;;u4T9viwZ8+dWky8bX;LcFi_wEdI^{Y^~;9J0SWIP@ViyH^IRBY6wPcXGagu^qCu{P`Te zhkWa6w``kt^3lsnUvIzthu2Si=B?8`6@UFtdmj3;)3Gk4}A3t?|rpr%W5YS{q7h4{42Zu=*=(QRcpuAe6+Q?E&0KRkP9WS zmE&Fwr5+`MvI1o-N)n|L&F6 z@_403{QD?;c-kgDSHI@++JpFCV+ZELdmG|K8s}{r@eTaJ!%GcTLwYd#SdwGa^vR$p8rW34pX5E<A2TSoJimPlsJl&JTqrN8bkWLcM?339>DW26y;=x_F;(3lF9_}>hBv6ug;@2d; zo{+?M6;0wLGf6ze>OcABeKtu=D0)Pm`$^(UfbPfxA4xp@X%Y{45`SMS_}LdiBk{BE zZbsr~->Zzo&%PiTiJyJbF%m!fQevd|>Ow^O)z{F~FpU2!E+Sy4pcpuYv~I>3=YR2* zQ@1(QQK$RYIqp9ez>5=>3to@f+h%O!0PU&TM8d5)-iroMtO4)+3JVH1t|~9HEX-2F znwTHF&blHHwXTX`D-rp#>e z)TmX5&bj0%=mv5Cts#L{kKL6Sp(|=W_RwJ~Vt%Ni*6hG8>smCsK59*tu|gQd4g}M% z@)m0xICj(;6}Z*93{|wS(Yp)17n+}-_vpY*8M~Yl@-o^*Emot}c+8blDnSl|T;q2A z-RBQmQv&8LqsyA!ZB2sh<1pUkfY9@5sX`~Q5p!7tLNz*11iTUumRF-%gDTow8?_b- z?K7Y)a@nIXbd*D*X+sqB8-~-bVN|#RA!R|-nkmgM!!Ksbx6`UyZu!s+vjwFf&KI?6 zDXRfQbgl)ZYX}!1TM2J53W^yFI>=ry&swwdgU=3ia5dPp0P$c4mLY_n-QEQ!ns4~w z=!eB8h&i~?gh)nZpON(`%Tx zN~+D7gZrllWfbhflHe+VW#~Cc@Mdf3EmkdBWAzjTma`j1<+@=P zif7=Wj@IK~*(4Vm6GdPz!%)=nW^4R%uNg)x0AUR5{(@`w?_f#sa;pMO3u(0ZIk>}w z!iAt%QSJWtTi{*gW!Y|gN`LEj#bAq0NqU8_En!p4hG|JG60x&f&>&mEA zFTd1d0?2Tr9asuO-*o$bll{Blzo>PE_#Gllv^91jA^mp8Su2zuyrG+mHIqNg<5({k z`UL~?`>?Em8L&(QrB%p#1`?3PLc&&>xMFxGEUbBqD?=BHPSH>!fu4gVc5SM>l`72bg}#M zNZ^C8plqjThDbuJBDF%rGAParSdI2m-S&vKmyrr2+l&UA*_LY)>l6&G!I@m);EW1% zp%ub$I*7BP)@PztBb)-y3sd5lE-G4P%`xw1{2qpqCezb$31Li`+wCTiUxi%AT!jUW zC_rL>G^~Sh(2Ze@*#%Y!OS!rxNt(e9gB+6A1;dxiq{Ff)a6{CZF0D&2d?i|A*FqGQ z$S{Ri*8$iJJuI+g`oHQsYmKI>8Bdr+n@i0+h80q7z6`$?!Ah=KR51}{&|x$%%pQCg z1cuauUs)W#d+@AP#0j!tE;Fdj?20j&oe`>Vn%VcDq?}iLGAXmbfN@wiB@jY&F|PX?{$IYuCGza=ilG!=Dmknxbo zOV)(>>m9-QNVAWcUE&lIzNB;LLwG$Ov(0ReKBf^%Y>KRTNM3r_S{=1+!cy;ovfYx%FqN2fq!&pi%VZ0H5WO%AER4*759^Cr z9!nD@ns5wL7E~+5f$L(7PCIPPkchK66fFRW_0mK`0Z6P50D?s-D5JdL>0FY`7xNyPq zfVk|a3g8OB zBY;x?_W{zb#{jDVlNwIfun=$@+vA3XFbxP&Z6P4;k!pE4hWn!0r!?f{7Fe}uC_5D} z42Zutto;Cusqb5WFtzq;fb=VcP_G`m7n8pauNXCey8*+1O90uf1`tzGdjw7;>;z={ z+W}!}EiYXNm*5SB?fp;^q`)31L)f6H_#yNrzC*)C4Ic-Q^o<(w(uw#{_Z=`WMMK(8 z`dSSm8iqAg8ush{M>O20VW);`HH>H&)=+8Kug5#0;XVyJHC(G$!KdORrY(Bh96+Xt`^9Bm>wFojkKh=Ei{${<#z5Ae-(1z{3_x~Ll_wJLbH16H+ z)a(A9aGe>@V4j#+FAI-t5 zbL1<0z!~WaD!$=le+g}MX7K+^;VfUge8rMGoMwCl${@+j?q}5X7fIfiRg&_p`8kx=lfeHhdAJdP$*p1b2M-1_m)S%4u?2C}-FQV6@;@ zL)X&mFVLCKzwXyyPY?H-aOOKRydfW|p}4MipRPfX&yn(R%(>*}U~!Q&y!eT`6`$B< SDgMq>?zGN81!z4&Mg12x`YFEv literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm.o b/ossim_source_code/obj/mm.o new file mode 100644 index 0000000000000000000000000000000000000000..75aaf47eff60a6b3230770472559f5ba3df912a2 GIT binary patch literal 15672 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

RUv ztX`R$yBurQ%DGOKy>^53ILh8g``5Qv|7F|1Atk(jp{E-m@jIql?Z8pgnjx&aZLLbg zeH?_Io21r7)~&$H5NXH7!n)nos&HC&*z{zNb-<>l6bok)O3NsDg^vzBh)j>=-3)Qb z_enb(^R1tOc#3r|5TpH$%d8i{v!LU0VZ8?W$E0gLVlW+JPdXN2&)m5iVre@dygvn9 z@+PvKhGUjAH~=rTj=5sA$5GvHaJI1iWE-F3%rjUc4B>pE-=KIF1A-TyBVK%lc%@MM zLf15X#?zy*SL0fYoeNzHc+wMy#&HxC*c?k|T9b*u%<36cGpYg=QaXKRbrrZ7v*yj1 zSv702$fTo{$;^zXs0_6>q$BBVm36Vrv3N2SOII#RwzWkPjUlY>RwtA3OyxCo%QKZ% zMxraOSvw=sxJl%Zm1{Dnt}@ct)|#lSOKwTTu^i06bf&c}oJqE)qp@%_*%%Xv_O@^| z)tg}bxi}mao0)r)EUDL)IM>Ox zw#CAkcrwdXXulXtB;A}5TnUS4OC&8a*+@DYrn+cPWLldOSP#aNIPFZOTa%(OnTWxa zOgNdMd*N)q5*=K$Ahbv<2!&QG5?3m?V%6fsV%6dWb>iAp%T_NIsccI+7HLF5oGV7s zI3Nn=iIS-Z)~WfDFkBF_ew@3;W06FADhwB+oBq0d3xXeyrNil16q$OZ4GIm!J;6iZ zF#Ki>0wGlmXG7EB)q+^XTzZ%Qgfi-5$-N3zKQ=afpT2A>eJ1tr!gH#=spdw}j*h-$7Tm{ZPhqej zj4|YC8f)9|uDP`;CSXk1iJR#)R zM1Zj!l($_Yhl@R+Fr1(%5?3q>EygI!C`|P~ zJ@VNLr$u;+2sgzeFq&yeA_!qwEZoqzWrUhW7{zdvyw8;P zSqL85myRJ0k;cX}O-2z+%u~&nbRrE1Wj{%qQnWdYeY)6I!Eq9fZx(0+rYf073p%$U zrDnr;tSKv&Ub6rjns@`rOZ=sv%n)vI4wud2ms9fmQQ;2?-aRBw9sFp?lj84veDC$2 z>>9Xn^P}H<<@sN@2VI=>P1rrs{qW;c&u(3{eDKZ}1A8u+`of*tH}1T9`|`-hZI7Yc zzabq*>One%#LE3h0i-IVTBMao8<0+_Z1Fwn;gaw0z^MMElS>EiXY?;5w_;FC{2YlF z*I(p!lflJJ9r6c}cyZf^{8eOd$v1T1@3s90Kr??95-)Bwke|#OF1aWJj@R{b$B9`{ zBwlvBwYrQu<>c*n|6g>5qTDp3G9+H?Bib>s#p6Ve*!@R2`wVYe^2;DU5Ib|S+z=o( zW|VG&^S)x1mML;laXAP?wM~~*VXpLcNTxrbL{FXe|*o#@MGV4?8_^E^zqqm zUlFXGeJ=IiZ`}6FYk&3Dj++jC`}w}~Q^)(B`_lNEfAhxtm#@BV%&)3CZZ9gn@6P)h zXVv`Vx=*+N)1b)NF_S88{7U!B&mVbb+5JbOPd{l7eQz5f?qoBzbem%r+Ku;$Tc z=l!H}`$JFc+J4Qc)O$S$@P|lltVV_-O+&gIX%$ioX)DrhB<}b;j`S?jYe*-N&La5{ zzzIlmkd`5>L*h0}C(@lrhmf8|`gf$akUl~hfVZ^~NYjyOk*+~%LfVG32kAZ}?jt;h z#AWawkv>H##n|Ci6UPMoVISk-1|mh=S!CDY;&u&1yMS86Z9IzP>YX}jJC7pn@@ZS# zj-ZH(FI|vJ5{kG|(OP_!rHJpfTI;0N;vzTvJlSWu_K!p+yl_EE9pa zxSdH6H(s=edxjJp$4wWUqeXnMeW2d%|jUy7C>XYdDq9!iRv|^)W7Gw?Jx0+}{aV}tq=-9% zT8o>!6mfyB&2uM}B5t{A5toM)an+~`{s=5ZyO6XNw-zblZlm^#>m7=?oY4ijQp6Re7I7PlB93J(;(D4QZWd_2xZg|>H~h4S3p$Fp zy3+-@IY&`Tzb)=hQk3m?m0K4SaW6xA&!sy>T=r{Q;PNhRF=5t&+WA-h))R96DnEbE z=tBAVJ31H2{|y{+3Y_@i0XF_p;v>*eBm>JStR|xIcC2*%A1kWL_Ds4`m#@rh%T(Gc zhtF&*tiFc(j6Qv4HzMh_&ujy6!Jy-s6%og$d2PwWj25iig&i!_R>&~E`ellj%Zvhb zwXiAB*Gm*7O=hOIwdqp!ase!c7GCumTa%zM@^kg#)gnh@K&ve?B7V+aG7Oj7>zG#N zuE&|pBRh_|Ot<+5s^N3;e}y^G)Pd zp=_YuRnqC2;|{s1-JPx>^{z7aGMBZ|H2`@fG<`Sp2bq5`V5QzQ)crK-sdstmT_#lP zU4HlSJOK(gAQ-&_aMU%M^bhuZzDzBnbAKY@($l(mm zd$5nVe+`8lA-mm{J1=~_(#&1Tj2~v$VSa>9xjA|%JUQwb=)Mxz>Ao`LGIqJm-`(P< zFw6%~i2m*Pz-_*V4lZ+h&957dX$GYy5rq=4ovz|~7fe>UyJSZQ^8~uzG{0eVx-k}d zp=PqX1QNe6xg?Q-*9p$$vI{F(HYtnOd9%UCe)r_yk@G~7=Qgd+&R zbIA0VPa|`@`*wIH?Um6p*@@=&kzZmy3(p6!3&C?ln$JOi(oZAT4@M4ow1ne$h-%$P zv=JPXy7^R@KQ%tUF#V!y2D0a2NY=Zqu6KRD-c=`KAabDQ7TdDQhebm1Sx2d;&%g<9vMo<$%rmKK6srldiTbs&eLV=*G( z$Q?Ur(fm+!E=PE1a}Ojw^CN*yQ|wXKR6JOM1EHQ>2a|(3U851J@epvp$>-UGzzab| zr|S|tKT3?gaYAOgm$}U^!EgzlE?DA&E*sDV*&w%hPRn4d2xdx=jRy*L{d(--@wev# zki*annt+Zl&mi8Vu#SLpN^oKj$+>4%r)zG#Ym%&-E&XK22Z-fuP%B0ivN(+MfmKtE z6GnY%4nja$VcIQYQRX(kf}Z8LDMJA@em+2@1Kj3bSR1&UGUN#JAX-!H{SbX2Lp%l+ zCxJvR+61-bt^pzNMd)(I+T&i1`$Z@^3Myz)$mN58GXZ8X>ASDq<#PW3+NcL@!x)5D zKR|ao&1cX<77R1KMJP>+CA5NOxa(Ptwd9w3N|yUM%J~Y)VN|-!C*VEW^b+#b)c@U` znBu@gjKPU#*C}VdMAzuWvRtd^jx ztoZ>|^IK4mBZHQ5J+T^7xH&_1fV<1#wpu1H9&k6GM#4uv{RulSO&xwHF3Yf^-dt`$7TU{0Ycm{0S398 zW4R*=gZBc*LXRgc0hHgRaD5AK9OUbO)W>Yioq_2~fp`HA)hP^mfYdvK*PlU<^Z$#0 z!S{eH_l8EEZII_#2QbL954P`s#ttCuZwKOEY(iTV22)xd2M&asD+ge31Ca4rr!Y7l z$nrHnKjb_w2L>ks5rR-aVekxI1F3f!NPAq#)82bPG$qulF!(C45_-pg^!r(b!6RCJ z5J)@s0!xs8m%`v4AgT)8t}xgE||2+!Vzl&F3_UmyV%e|m*{gc3Xkn<>hHgKQD6p(($ z6$Y0AFF}4C(1N^HVX#c)hx`hIeATAj8AI+EhVaoncMgNSKztiD{Z%0QiA#Q9@F0+J z-36Qq+zMp>WEBQ$wVWSevOl;(2nL`yMW_>DUFRlG%2(}VXzL!eyRnc>d<_JK|D($fVg6e5!e3#jX=J;QR7)S zO@4w#?sK3%_iNB6{#fIqK=fM){iB?I5O2_Uxkii`X>WtZT8#mX0GU4<&a>XjfZTVm zul*oOAmf*Hyr@V1LCt%iOMQF2yb(GjaK!%b4$r*g?T_tfn)&v3b{MOYx4);u{~<_w z_WC-gd3!zGrSm-OgR%`^5&z~vC|3*Q6Z9)F$3-Y;R zo^OxONk0D{1$<*c`LPB3R|Kay{e{li7 zuAux+3iz%9{T~(N^Ld6!?s}+z7vcU>ZhfRpi8=tsQBG@?EDkP(Jo8hB+w$OAlaVaW ziCgrc9R4XbpRBhU{o90aLh)V(M{oK%cgKsq&2Q2>1YHe&@DLW&Oeoe zLpZv_Ibc&J8c6`{rbMB|<2!jo&u<3$kHFCk`}8u5Bj7ZTwz;zdBRGpazy9X-NE&B{ z{2l?e+p{tNBHSFaDV)b?Sz9EI18AY*GGm@i)Y!yao0wx0GiTdWj+j|(i$G-CQkU55 d%p3&*8MAU3ISK?aX67>bDVb4~%c#QG`XBfv92Ecn literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/queue.o b/ossim_source_code/obj/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..47a4309fce16cefca819f7cfdbc4a024032f2a2f GIT binary patch literal 5624 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 OJmampKlNWS^Zx=KIrByU literal 0 HcmV?d00001 diff --git a/ossim_source_code/output/os_0_mlq_paging.output b/ossim_source_code/output/os_0_mlq_paging.output new file mode 100644 index 0000000..87d78bc --- /dev/null +++ b/ossim_source_code/output/os_0_mlq_paging.output @@ -0,0 +1,78 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p0s, PID: 1 PRIO: 0 + CPU 0: Dispatched process 1 +Time slot 1 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 15 +Time slot 3 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 4 + CPU 1: Dispatched process 2 + Loaded a process at input/proc/p1s, PID: 4 PRIO: 0 +Time slot 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 6 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 7 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 8 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 3 +Time slot 11 +Time slot 12 +Time slot 13 +Time slot 14 +Time slot 15 +Time slot 16 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 17 +Time slot 18 +Time slot 19 +Time slot 20 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 4 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 21 +Time slot 22 +Time slot 23 +Time slot 24 + CPU 0: Processed 4 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging.output b/ossim_source_code/output/os_1_mlq_paging.output new file mode 100644 index 0000000..2f675f0 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging.output @@ -0,0 +1,173 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 +Time slot 2 + CPU 1: Dispatched process 1 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 0: Dispatched process 2 +Time slot 4 + CPU 1: Put process 1 to run queue + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 + CPU 3: Dispatched process 1 +Time slot 5 + CPU 2: Dispatched process 3 + CPU 0: Put process 2 to run queue +Time slot 6 + CPU 0: Dispatched process 2 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 + CPU 3: Put process 1 to run queue +Time slot 7 + CPU 1: Dispatched process 4 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 6 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 1 to run queue + CPU 3: Dispatched process 4 +Time slot 12 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 5 +Time slot 13 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 + CPU 3: Put process 4 to run queue + CPU 3: Dispatched process 3 +Time slot 14 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 2 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 + CPU 3: Processed 3 has finished + CPU 3: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 16 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 17 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 7 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 8 +Time slot 18 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 2 +Time slot 19 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 6 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 7 + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 4 +Time slot 20 + CPU 2: Processed 5 has finished + CPU 2: Dispatched process 8 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1 stopped + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 7 +Time slot 22 + CPU 2: Put process 8 to run queue + CPU 2 stopped +Time slot 23 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3 stopped +Time slot 24 +Time slot 25 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 26 +Time slot 27 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 28 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 +Time slot 32 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 33 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_1K.output b/ossim_source_code/output/os_1_mlq_paging_small_1K.output new file mode 100644 index 0000000..cb2fb07 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_1K.output @@ -0,0 +1,171 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 6 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 3 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 2 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 +Time slot 15 + CPU 1: Processed 3 has finished + CPU 1: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 7 +Time slot 16 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 4 + CPU 1: Put process 5 to run queue + CPU 1: Dispatched process 8 + CPU 2: Processed 2 has finished + CPU 2: Dispatched process 6 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 2: Put process 6 to run queue + CPU 2 stopped + CPU 1: Put process 8 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 8 +Time slot 20 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 4 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 7 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 6 +Time slot 22 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 8 +Time slot 23 + CPU 1: Put process 7 to run queue + CPU 1 stopped + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 24 + CPU 3: Put process 8 to run queue + CPU 3 stopped +Time slot 25 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 26 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 27 +Time slot 28 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_4K.output b/ossim_source_code/output/os_1_mlq_paging_small_4K.output new file mode 100644 index 0000000..25afa10 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_4K.output @@ -0,0 +1,172 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 3 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 7 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 2 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 16 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 7 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 4 + CPU 3: Put process 6 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 8 + CPU 1: Processed 2 has finished + CPU 1: Dispatched process 6 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0 stopped +Time slot 20 + CPU 2: Put process 8 to run queue + CPU 2: Dispatched process 4 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 21 +Time slot 22 + CPU 2: Processed 4 has finished + CPU 2: Dispatched process 7 + CPU 1: Put process 8 to run queue + CPU 1 stopped + CPU 3: Processed 6 has finished + CPU 3: Dispatched process 8 +Time slot 23 +Time slot 24 + CPU 2: Put process 7 to run queue + CPU 2 stopped + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 7 +Time slot 25 +Time slot 26 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 8 +Time slot 27 + CPU 3: Processed 8 has finished + CPU 3: Dispatched process 7 +Time slot 28 +Time slot 29 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 30 +Time slot 31 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 32 + CPU 3: Processed 7 has finished + CPU 3 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq.output b/ossim_source_code/output/os_1_singleCPU_mlq.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched.output b/ossim_source_code/output/sched.output new file mode 100644 index 0000000..edfe4cf --- /dev/null +++ b/ossim_source_code/output/sched.output @@ -0,0 +1,42 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p1s, PID: 1 PRIO: 1 + CPU 1: Dispatched process 1 +Time slot 1 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Dispatched process 3 +Time slot 4 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 2 +Time slot 5 +Time slot 6 +Time slot 7 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 1 +Time slot 8 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 2 +Time slot 9 +Time slot 10 +Time slot 11 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 +Time slot 12 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 1 +Time slot 13 +Time slot 14 + CPU 1: Processed 1 has finished + CPU 1: Dispatched process 2 +Time slot 15 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 16 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 17 + CPU 0: Processed 3 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_0.output b/ossim_source_code/output/sched_0.output new file mode 100644 index 0000000..0676714 --- /dev/null +++ b/ossim_source_code/output/sched_0.output @@ -0,0 +1,68 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 14 +Time slot 15 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 16 +Time slot 17 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 18 +Time slot 19 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 20 +Time slot 21 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 22 +Time slot 23 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 24 +Time slot 25 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 28 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 29 +Time slot 30 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 31 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_1.output b/ossim_source_code/output/sched_1.output new file mode 100644 index 0000000..9c338f7 --- /dev/null +++ b/ossim_source_code/output/sched_1.output @@ -0,0 +1,132 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/s0, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 4 PRIO: 0 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 4 +Time slot 6 +Time slot 7 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 8 +Time slot 9 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 10 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 3 +Time slot 21 +Time slot 22 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 23 +Time slot 24 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 25 +Time slot 26 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 27 +Time slot 28 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 29 +Time slot 30 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 31 +Time slot 32 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 33 +Time slot 34 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 35 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 2 +Time slot 36 +Time slot 37 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 38 +Time slot 39 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 40 +Time slot 41 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 42 +Time slot 43 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 44 +Time slot 45 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 46 +Time slot 47 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 48 +Time slot 49 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 50 +Time slot 51 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 52 +Time slot 53 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 54 +Time slot 55 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 56 +Time slot 57 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 58 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 59 +Time slot 60 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 61 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/src/cpu.c b/ossim_source_code/src/cpu.c new file mode 100644 index 0000000..b8deb25 --- /dev/null +++ b/ossim_source_code/src/cpu.c @@ -0,0 +1,102 @@ + +#include "cpu.h" +#include "mem.h" +#include "mm.h" + +int calc(struct pcb_t * proc) { + return ((unsigned long)proc & 0UL); +} + +int alloc(struct pcb_t * proc, uint32_t size, uint32_t reg_index) { + addr_t addr = alloc_mem(size, proc); + if (addr == 0) { + return 1; + }else{ + proc->regs[reg_index] = addr; + return 0; + } +} + +int free_data(struct pcb_t * proc, uint32_t reg_index) { + return free_mem(proc->regs[reg_index], proc); +} + +int read( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) { // Index of destination register + + BYTE data; + if (read_mem(proc->regs[source] + offset, proc, &data)) { + proc->regs[destination] = data; + return 0; + }else{ + return 1; + } +} + +int write( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) { // Destination address = + // [destination] + [offset] + return write_mem(proc->regs[destination] + offset, proc, data); +} + +int run(struct pcb_t * proc) { + /* Check if Program Counter point to the proper instruction */ + if (proc->pc >= proc->code->size) { + return 1; + } + + struct inst_t ins = proc->code->text[proc->pc]; + proc->pc++; + int stat = 1; + switch (ins.opcode) { + case CALC: + stat = calc(proc); + break; + case ALLOC: +#ifdef MM_PAGING + stat = pgalloc(proc, ins.arg_0, ins.arg_1); + +#else + stat = alloc(proc, ins.arg_0, ins.arg_1); +#endif + break; +#ifdef MM_PAGING + case MALLOC: + stat = pgmalloc(proc, ins.arg_0, ins.arg_1); + break; +#endif + case FREE: +#ifdef MM_PAGING + stat = pgfree_data(proc, ins.arg_0); +#else + stat = free_data(proc, ins.arg_0); +#endif + break; + case READ: +#ifdef MM_PAGING + stat = pgread(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = read(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + case WRITE: +#ifdef MM_PAGING + stat = pgwrite(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = write(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + default: + stat = 1; + } + return stat; + +} + + diff --git a/ossim_source_code/src/loader.c b/ossim_source_code/src/loader.c new file mode 100644 index 0000000..5f8e56a --- /dev/null +++ b/ossim_source_code/src/loader.c @@ -0,0 +1,108 @@ + +#include "loader.h" +#include +#include +#include + +static uint32_t avail_pid = 1; + +#define OPT_CALC "calc" +#define OPT_ALLOC "alloc" +#define OPT_FREE "free" +#define OPT_READ "read" +#define OPT_WRITE "write" +#ifdef MM_PAGING +#define OPT_MALLOC "malloc" +#endif + +static enum ins_opcode_t get_opcode(char * opt) { + if (!strcmp(opt, OPT_CALC)) { + return CALC; + }else if (!strcmp(opt, OPT_ALLOC)) { + return ALLOC; +#ifdef MM_PAGING + }else if (!strcmp(opt, OPT_MALLOC)) { + return MALLOC; +#endif + }else if (!strcmp(opt, OPT_FREE)) { + return FREE; + }else if (!strcmp(opt, OPT_READ)) { + return READ; + }else if (!strcmp(opt, OPT_WRITE)) { + return WRITE; + }else{ + printf("Opcode: %s\n", opt); + exit(1); + } +} + +struct pcb_t * load(const char * path) { + /* Create new PCB for the new process */ + struct pcb_t * proc = (struct pcb_t * )malloc(sizeof(struct pcb_t)); + proc->pid = avail_pid; + avail_pid++; + proc->page_table = + (struct page_table_t*)malloc(sizeof(struct page_table_t)); + proc->bp = PAGE_SIZE; + proc->pc = 0; + + /* Read process code from file */ + FILE * file; + // printf(path); + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find process description at '%s'\n", path); + exit(1); + } + char opcode[10]; + proc->code = (struct code_seg_t*)malloc(sizeof(struct code_seg_t)); + fscanf(file, "%u %u", &proc->priority, &proc->code->size); + proc->code->text = (struct inst_t*)malloc( + sizeof(struct inst_t) * proc->code->size + ); + uint32_t i = 0; + for (i = 0; i < proc->code->size; i++) { + fscanf(file, "%s", opcode); + proc->code->text[i].opcode = get_opcode(opcode); + switch(proc->code->text[i].opcode) { + case CALC: + break; + case ALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); + break; +#ifdef MM_PAGING + case MALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); +#endif + case FREE: + fscanf(file, "%u\n", &proc->code->text[i].arg_0); + break; + case READ: + case WRITE: + fscanf( + file, + "%u %u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1, + &proc->code->text[i].arg_2 + ); + break; + default: + printf("Opcode: %s\n", opcode); + exit(1); + } + } + return proc; +} + + + diff --git a/ossim_source_code/src/mem.c b/ossim_source_code/src/mem.c new file mode 100644 index 0000000..187108f --- /dev/null +++ b/ossim_source_code/src/mem.c @@ -0,0 +1,173 @@ + +#include "mem.h" +#include "stdlib.h" +#include "string.h" +#include +#include + +static BYTE _ram[RAM_SIZE]; + +static struct { + uint32_t proc; // ID of process currently uses this page + int index; // Index of the page in the list of pages allocated + // to the process. + int next; // The next page in the list. -1 if it is the last + // page. +} _mem_stat [NUM_PAGES]; + +static pthread_mutex_t mem_lock; + +void init_mem(void) { + memset(_mem_stat, 0, sizeof(*_mem_stat) * NUM_PAGES); + memset(_ram, 0, sizeof(BYTE) * RAM_SIZE); + pthread_mutex_init(&mem_lock, NULL); +} + +/* get offset of the virtual address */ +static addr_t get_offset(addr_t addr) { + return addr & ~((~0U) << OFFSET_LEN); +} + +/* get the first layer index */ +static addr_t get_first_lv(addr_t addr) { + return addr >> (OFFSET_LEN + PAGE_LEN); +} + +/* get the second layer index */ +static addr_t get_second_lv(addr_t addr) { + return (addr >> OFFSET_LEN) - (get_first_lv(addr) << PAGE_LEN); +} + +/* Search for page table table from the a segment table */ +static struct trans_table_t * get_trans_table( + addr_t index, // Segment level index + struct page_table_t * page_table) { // first level table + + /* DO NOTHING HERE. This mem is obsoleted */ + + int i; + for (i = 0; i < page_table->size; i++) { + // Enter your code here + } + return NULL; + +} + +/* Translate virtual address to physical address. If [virtual_addr] is valid, + * return 1 and write its physical counterpart to [physical_addr]. + * Otherwise, return 0 */ +static int translate( + addr_t virtual_addr, // Given virtual address + addr_t * physical_addr, // Physical address to be returned + struct pcb_t * proc) { // Process uses given virtual address + + /* Offset of the virtual address */ + addr_t offset = get_offset(virtual_addr); + offset++; offset--; + /* The first layer index */ + addr_t first_lv = get_first_lv(virtual_addr); + /* The second layer index */ + addr_t second_lv = get_second_lv(virtual_addr); + + /* Search in the first level */ + struct trans_table_t * trans_table = NULL; + trans_table = get_trans_table(first_lv, proc->page_table); + if (trans_table == NULL) { + return 0; + } + + int i; + for (i = 0; i < trans_table->size; i++) { + if (trans_table->table[i].v_index == second_lv) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 1; + } + } + return 0; +} + +addr_t alloc_mem(uint32_t size, struct pcb_t * proc) { + pthread_mutex_lock(&mem_lock); + addr_t ret_mem = 0; + /* DO NOTHING HERE. This mem is obsoleted */ + + uint32_t num_pages = (size % PAGE_SIZE) ? size / PAGE_SIZE : + size / PAGE_SIZE + 1; // Number of pages we will use + int mem_avail = 0; // We could allocate new memory region or not? + + /* First we must check if the amount of free memory in + * virtual address space and physical address space is + * large enough to represent the amount of required + * memory. If so, set 1 to [mem_avail]. + * Hint: check [proc] bit in each page of _mem_stat + * to know whether this page has been used by a process. + * For virtual memory space, check bp (break pointer). + * */ + + if (mem_avail) { + /* We could allocate new memory region to the process */ + ret_mem = proc->bp; + proc->bp += num_pages * PAGE_SIZE; + /* Update status of physical pages which will be allocated + * to [proc] in _mem_stat. Tasks to do: + * - Update [proc], [index], and [next] field + * - Add entries to segment table page tables of [proc] + * to ensure accesses to allocated memory slot is + * valid. */ + } + pthread_mutex_unlock(&mem_lock); + return ret_mem; +} + +int free_mem(addr_t address, struct pcb_t * proc) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 0; +} + +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + *data = _ram[physical_addr]; + return 0; + }else{ + return 1; + } +} + +int write_mem(addr_t address, struct pcb_t * proc, BYTE data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + _ram[physical_addr] = data; + return 0; + }else{ + return 1; + } +} + +void dump(void) { + int i; + for (i = 0; i < NUM_PAGES; i++) { + if (_mem_stat[i].proc != 0) { + printf("%03d: ", i); + printf("%05x-%05x - PID: %02d (idx %03d, nxt: %03d)\n", + i << OFFSET_LEN, + ((i + 1) << OFFSET_LEN) - 1, + _mem_stat[i].proc, + _mem_stat[i].index, + _mem_stat[i].next + ); + int j; + for ( j = i << OFFSET_LEN; + j < ((i+1) << OFFSET_LEN) - 1; + j++) { + + if (_ram[j] != 0) { + printf("\t%05x: %02x\n", j, _ram[j]); + } + + } + } + } +} + + diff --git a/ossim_source_code/src/mm-memphy.c b/ossim_source_code/src/mm-memphy.c new file mode 100644 index 0000000..880a858 --- /dev/null +++ b/ossim_source_code/src/mm-memphy.c @@ -0,0 +1,199 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory physical module mm/mm-memphy.c + */ + +#include "mm.h" +#include + +/* + * MEMPHY_mv_csr - move MEMPHY cursor + * @mp: memphy struct + * @offset: offset + */ +int MEMPHY_mv_csr(struct memphy_struct *mp, int offset) +{ + int numstep = 0; + + mp->cursor = 0; + while(numstep < offset && numstep < mp->maxsz){ + /* Traverse sequentially */ + mp->cursor = (mp->cursor + 1) % mp->maxsz; + numstep++; + } + + return 0; +} + +/* + * MEMPHY_seq_read - read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_seq_read(struct memphy_struct *mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + *value = (BYTE) mp->storage[addr]; + + return 0; +} + +/* + * MEMPHY_read read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + *value = mp->storage[addr]; + else /* Sequential access device */ + return MEMPHY_seq_read(mp, addr, value); + + return 0; +} + +/* + * MEMPHY_seq_write - write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_seq_write(struct memphy_struct * mp, int addr, BYTE value) +{ + + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + mp->storage[addr] = value; + + return 0; +} + +/* + * MEMPHY_write-write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + mp->storage[addr] = data; + else /* Sequential access device */ + return MEMPHY_seq_write(mp, addr, data); + + return 0; +} + +/* + * MEMPHY_format-format MEMPHY device + * @mp: memphy struct + */ +int MEMPHY_format(struct memphy_struct *mp, int pagesz) +{ + /* This setting come with fixed constant PAGESZ */ + int numfp = mp->maxsz / pagesz; + struct framephy_struct *newfst, *fst; + int iter = 0; + + if (numfp <= 0) + return -1; + + /* Init head of free framephy list */ + fst = malloc(sizeof(struct framephy_struct)); + fst->fpn = iter; + mp->free_fp_list = fst; + + /* We have list with first element, fill in the rest num-1 element member*/ + for (iter = 1; iter < numfp ; iter++) + { + newfst = malloc(sizeof(struct framephy_struct)); + newfst->fpn = iter; + newfst->fp_next = NULL; + fst->fp_next = newfst; + fst = newfst; + } + + return 0; +} + +int MEMPHY_get_freefp(struct memphy_struct *mp, int *retfpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + + if (fp == NULL) + return -1; + + *retfpn = fp->fpn; + mp->free_fp_list = fp->fp_next; + + /* MEMPHY is iteratively used up until its exhausted + * No garbage collector acting then it not been released + */ + free(fp); + + return 0; +} + +int MEMPHY_dump(struct memphy_struct * mp) +{ + /*TODO dump memphy contnt mp->storage + * for tracing the memory content + */ + + return 0; +} + +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + struct framephy_struct *newnode = malloc(sizeof(struct framephy_struct)); + + /* Create new node with value fpn */ + newnode->fpn = fpn; + newnode->fp_next = fp; + mp->free_fp_list = newnode; + + return 0; +} + + +/* + * Init MEMPHY struct + */ +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg) +{ + mp->storage = (BYTE *)malloc(max_size*sizeof(BYTE)); + mp->maxsz = max_size; + + MEMPHY_format(mp,PAGING_PAGESZ); + + mp->rdmflg = (randomflg != 0)?1:0; + + if (!mp->rdmflg ) /* Not Ramdom acess device, then it serial device*/ + mp->cursor = 0; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm-vm.c b/ossim_source_code/src/mm-vm.c new file mode 100644 index 0000000..c262322 --- /dev/null +++ b/ossim_source_code/src/mm-vm.c @@ -0,0 +1,649 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Virtual memory module mm/mm-vm.c + */ + +#include "string.h" +#include "mm.h" +#include +#include + +/*enlist_vm_freerg_list - add new rg to freerg_list + *@mm: memory region + *@rg_elmt: new region + * + */ +int enlist_vm_freerg_list(struct mm_struct *mm, struct vm_rg_struct rg_elmt) +{ + struct vm_rg_struct *new_node; + struct vm_rg_struct *head = mm->mmap->vm_freerg_list; + + // Check for invalid region + if (rg_elmt.rg_start >= rg_elmt.rg_end) + return -1; + + // Dynamically allocate memory for the new region + new_node = (struct vm_rg_struct *)malloc(sizeof(struct vm_rg_struct)); + if (!new_node) + return -1; // Allocation failed + + // Copy the data into the new node + *new_node = rg_elmt; + new_node->rg_next = head; + + // Update the list head + mm->mmap->vm_freerg_list = new_node; + + return 0; +} + + +/*get_vma_by_num - get vm area by numID + *@mm: memory region + *@vmaid: ID vm area to alloc memory region + * + */ +//get địa chỉ ô vma +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid) +{ + struct vm_area_struct *pvma= mm->mmap; + + if(mm->mmap == NULL) + return NULL; + + int vmait = 0; + + while (vmait < vmaid) + { + if(pvma == NULL) + return NULL; + + vmait++; + pvma = pvma->vm_next; + } + + return pvma; +} + +/*get_symrg_byid - get mem region by region ID + *@mm: memory region + *@rgid: region ID act as symbol index of variable + * + */ +struct vm_rg_struct *get_symrg_byid(struct mm_struct *mm, int rgid) +{ + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return NULL; + + return &mm->symrgtbl[rgid]; +} + +/*__alloc - allocate a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + *@alloc_addr: address of allocated memory region + * + */ +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr) +{ + /*Allocate at the toproof */ + struct vm_rg_struct rgnode; + + /* TODO: commit the vmaid */ + rgnode.vmaid = vmaid; + + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0) + { + //symrgtbl là vm_rg_struct + caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start; + caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end; + + caller->mm->symrgtbl[rgid].vmaid = rgnode.vmaid; + + *alloc_addr = rgnode.rg_start; + + return 0; + } + + /* TODO: get_free_vmrg_area FAILED handle the region management (Fig.6)*/ + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == -1 ){return -1;} + /* TODO retrive current vma if needed, current comment out due to compiler redundant warning*/ + /*Attempt to increate limit to get space */ + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + int inc_sz = PAGING_PAGE_ALIGNSZ(size); + int inc_limit_ret; + + /* TODO retrive old_sbrk if needed, current comment out due to compiler redundant warning*/ + int old_sbrk = cur_vma->sbrk; + + /* TODO INCREASE THE LIMIT + * inc_vma_limit(caller, vmaid, inc_sz) + */ + if (inc_vma_limit(caller, vmaid, inc_sz, &inc_limit_ret) < 0) return -1; + + cur_vma->sbrk += inc_sz; + /* TODO: commit the limit increment */ + if ( old_sbrk + size > cur_vma -> vm_end ) + { + if ( inc_vma_limit ( caller , vmaid , inc_sz, &inc_limit_ret ) < 0) + { + struct framephy_struct * frm_lst = NULL ; + struct vm_rg_struct * ret_rg = malloc ( sizeof ( struct vm_rg_struct ) ); + int pages = ( inc_sz / PAGING_PAGESZ ); + ret_rg -> rg_start = ret_rg -> rg_end = old_sbrk ; + ret_rg -> rg_next = NULL ; + alloc_pages_range ( caller , pages , & frm_lst ); + vmap_page_range ( caller , old_sbrk , pages , frm_lst , ret_rg ); + caller ->mm -> symrgtbl [ rgid ]. rg_start = ret_rg -> rg_start ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = ret_rg -> rg_end ; + cur_vma -> sbrk += ret_rg -> rg_end - ret_rg -> rg_start ; + return 0; + } + } + + /* Successful increase limit */ + caller ->mm -> symrgtbl [ rgid ]. rg_start = old_sbrk ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = old_sbrk + size ; + /* TODO: commit the allocation address + // *alloc_addr = ... + */ + *alloc_addr = rgnode.rg_start; + + return 0; +} + +/*__free - remove a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __free(struct pcb_t *caller, int rgid) +{ + struct vm_rg_struct rgnode; + + // Dummy initialization for avoding compiler dummay warning + // in incompleted TODO code rgnode will overwrite through implementing + // the manipulation of rgid later + rgnode.vmaid = 0; //dummy initialization + rgnode.vmaid = 1; //dummy initialization + + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return -1; + + /* TODO: Manage the collect freed region to freerg_list */ + struct vm_rg_struct *sym_rg = &caller->mm->symrgtbl[rgid]; + rgnode.rg_start = sym_rg->rg_start; + rgnode.rg_end = sym_rg->rg_end; + rgnode.vmaid = sym_rg->vmaid; + + /*enlist the obsoleted memory region */ + enlist_vm_freerg_list(caller->mm, rgnode); + + return 0; +} + +/*pgalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 0 */ + return __alloc(proc, 0, reg_index, size, &addr); +} + +/*pgmalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify vaiable in symbole table) + */ +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 1 */ + return __alloc(proc, 1, reg_index, size, &addr); +} + +/*pgfree - PAGING-based free a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ + +int pgfree_data(struct pcb_t *proc, uint32_t reg_index) +{ + return __free(proc, reg_index); +} + +/*pg_getpage - get the page in ram + *@mm: memory region + *@pagenum: PGN + *@framenum: return FPN + *@caller: caller + * + */ +int pg_getpage(struct mm_struct *mm, int pgn, int *fpn, struct pcb_t *caller) +{ + uint32_t pte = mm->pgd[pgn]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + // Page không tồn tại, cần đưa vào bộ nhớ + int vicpgn, swpfpn, vicfpn; + uint32_t vicpte; + + int tgtfpn = PAGING_PTE_SWP(pte); // Frame mục tiêu trong swap + + // Tìm victim page + if (find_victim_page(caller->mm, &vicpgn) < 0) + return -1; + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + // Lấy free frame từ MEMSWP + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) < 0) + { + struct memphy_struct **mswpit = caller->mswp; + for (int i = 0; i < PAGING_MAX_MMSWP; i++) + { + struct memphy_struct *tmp_swp = mswpit[i]; + if (MEMPHY_get_freefp(tmp_swp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, tmp_swp, swpfpn); + caller->active_mswp = tmp_swp; + break; + } + } + } + else + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + } + + // Swap frame từ MEMRAM sang MEMSWP và ngược lại + __swap_cp_page(caller->active_mswp, tgtfpn, caller->mram, vicfpn); + + // Cập nhật page table + MEMPHY_put_freefp(caller->active_mswp, tgtfpn); + // swptype = 1 + pte_set_swap(&caller->mm->pgd[vicpgn], 1, swpfpn); + + // Đánh dấu trạng thái online của page mục tiêu + pte_set_fpn(&caller->mm->pgd[pgn], vicfpn); + pte = caller->mm->pgd[pgn]; + + + + *fpn = PAGING_OFFST(pte); + return 0; +} +} + + /* Do swap frame from MEMRAM to MEMSWP and vice versa*/ + /* Copy victim frame to swap */ + //__swap_cp_page(); + /* Copy target frame from swap to mem */ + //__swap_cp_page(); + + /* Update page table */ + //pte_set_swap() &mm->pgd; + + /* Update its online status of the target page */ + //pte_set_fpn() & mm->pgd[pgn]; + // pte_set_fpn(&pte, tgtfpn); + + // enlist_pgn_node(&caller->mm->fifo_pgn,pgn); + // } + + // *fpn = PAGING_PTE_FPN(pte); + + // return 0; + + +/*pg_getval - read value at given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_getval(struct mm_struct *mm, int addr, BYTE *data, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_read(caller->mram,phyaddr, data); + + return 0; +} + +/*pg_setval - write value to given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_setval(struct mm_struct *mm, int addr, BYTE value, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_write(caller->mram,phyaddr, value); + + return 0; +} + +/*__read - read value in region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_getval(caller->mm, currg->rg_start + offset, data, caller); + + return 0; +} + + +/*pgwrite - PAGING-based read a region memory */ +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) +{ + BYTE data; + int val = __read(proc, source, offset, &data); + + destination = (uint32_t) data; +#ifdef IODUMP + printf("read region=%d offset=%d value=%d\n", source, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return val; +} + +/*__write - write a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_setval(caller->mm, currg->rg_start + offset, value, caller); + + return 0; +} + +/*pgwrite - PAGING-based write a region memory */ +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) +{ +#ifdef IODUMP + printf("write region=%d offset=%d value=%d\n", destination, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return __write(proc, destination, offset, data); +} + + +/*free_pcb_memphy - collect all memphy of pcb + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + */ +int free_pcb_memph(struct pcb_t *caller) +{ + int pagenum, fpn; + uint32_t pte; + + + for(pagenum = 0; pagenum < PAGING_MAX_PGN; pagenum++) + { + pte= caller->mm->pgd[pagenum]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + fpn = PAGING_PTE_FPN(pte); + MEMPHY_put_freefp(caller->mram, fpn); + } else { + fpn = PAGING_PTE_SWP(pte); + MEMPHY_put_freefp(caller->active_mswp, fpn); + } + } + + return 0; +} + +/*get_vm_area_node - get vm area for a number of pages + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + *@vmastart: vma end + *@vmaend: vma end + * + */ +struct vm_rg_struct* get_vm_area_node_at_brk(struct pcb_t *caller, int vmaid, int size, int alignedsz) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct));; + /* TODO retrive current vma to obtain newrg, current comment out due to compiler redundant warning*/ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + /* TODO: update the newrg boundary + // newrg->rg_start = ... + // newrg->rg_end = ... + */ + + newrg->rg_start = cur_vma -> sbrk; + + if ( (cur_vma ->sbrk + alignedsz) > cur_vma -> vm_end ) return newrg = cur_vma -> sbrk; +cur_vma ->sbrk = cur_vma->sbrk + alignedsz; + + newrg->rg_end = cur_vma -> sbrk; + +return newrg; +} + +/*validate_overlap_vm_area + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@vmastart: vma end + *@vmaend: vma end + * + */ +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend) +{ + struct vm_area_struct *vma = caller->mm->mmap; + + /* TODO validate the planned memory area is not overlapped */ + while(vma != NULL) + { + + if ((vmastart >= vma->vm_start && vmastart < vma->vm_end) || (vmastart <= vma->vm_start && vmaend >= vma->vm_end)) + { + return -1; + } + vma = vma->vm_next; + } + return 0; +} + +/*inc_vma_limit - increase vm area limits to reserve space for new variable + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@inc_sz: increment size + *@inc_limit_ret: increment limit return + * + */ +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct)); + int inc_amt = PAGING_PAGE_ALIGNSZ(inc_sz); + int incnumpage = inc_amt / PAGING_PAGESZ; + struct vm_rg_struct *area = get_vm_area_node_at_brk(caller, vmaid, inc_sz, inc_amt); + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + int old_end = cur_vma->vm_end; + + /*Validate overlap of obtained region */ + if (validate_overlap_vm_area(caller, vmaid, area->rg_start, area->rg_end) < 0) + return -1; /*Overlap and failed allocation */ + + /* TODO: Obtain the new vm area based on vmaid */ + cur_vma->sbrk = area -> rg_start; + + + if (vm_map_ram(caller, area->rg_start, area->rg_end, + old_end, incnumpage , newrg) < 0) + return -1; /* Map the memory to MEMRAM */ + inc_limit_ret = cur_vma->vm_end + inc_sz; + return 0; + +} + +/*find_victim_page - find victim page + *@caller: caller + *@pgn: return page number + * + */ +int find_victim_page(struct mm_struct *mm, int *retpgn) +{ + struct pgn_t *pg = mm->fifo_pgn; + + /* TODO: Implement the theorical mechanism to find the victim page */ + if (pg == NULL) return -1; + + *retpgn = pg->pgn; + + mm->fifo_pgn = pg->pg_next; + + free(pg); + + return 0; +} + +/*get_free_vmrg_area - get a free vm region + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@size: allocated size + * + */ +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg) +{ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + struct vm_rg_struct *rgit = cur_vma->vm_freerg_list; + + if (rgit == NULL) + return -1; + + /* Probe unintialized newrg */ + newrg->rg_start = newrg->rg_end = -1; + + /* Traverse on list of free vm region to find a fit space */ + //check điều kiện bịp + while (rgit != NULL && rgit->vmaid == vmaid) + { + if (rgit->rg_start + size <= rgit->rg_end) + { /* Current region has enough space */ + newrg->rg_start = rgit->rg_start; + newrg->rg_end = rgit->rg_start + size; + + /* Update left space in chosen region */ + if (rgit->rg_start + size < rgit->rg_end) + { + rgit->rg_start = rgit->rg_start + size; + } + else + { /*Use up all space, remove current node */ + /*Clone next rg node */ + struct vm_rg_struct *nextrg = rgit->rg_next; + + /*Cloning */ + if (nextrg != NULL) + { + rgit->rg_start = nextrg->rg_start; + rgit->rg_end = nextrg->rg_end; + + rgit->rg_next = nextrg->rg_next; + + free(nextrg); + } + else + { /*End of free list */ + rgit->rg_start = rgit->rg_end; //dummy, size 0 region + rgit->rg_next = NULL; + } + } + } + else + { + rgit = rgit->rg_next; // Traverse next rg + } + } + + if(newrg->rg_start == -1) // new region not found + return -1; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm.c b/ossim_source_code/src/mm.c new file mode 100644 index 0000000..5071151 --- /dev/null +++ b/ossim_source_code/src/mm.c @@ -0,0 +1,458 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory management unit mm/mm.c + */ + +#include "mm.h" +#include +#include + +/* + * init_pte - Initialize PTE entry + */ +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff) //swap offset +{ + if (pre != 0) { + if (swp == 0) { // Non swap ~ page online + if (fpn == 0) + return -1; // Invalid setting + + /* Valid setting with FPN */ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + } else { // page swapped + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + } + } + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for swapped page + * @pte : target page table entry (PTE) + * @swptyp : swap type + * @swpoff : swap offset + */ +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for on-line page + * @pte : target page table entry (PTE) + * @fpn : frame page number (FPN) + */ +int pte_set_fpn(uint32_t *pte, int fpn) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + + return 0; +} + + +/* + * vmap_page_range - map a range of page at aligned address + */ +int vmap_page_range(struct pcb_t *caller, // process call + int addr, // start address which is aligned to pagesz + int pgnum, // num of mapping page + struct framephy_struct *frames,// list of the mapped frames + struct vm_rg_struct *ret_rg)// return mapped region, the real mapped fp +{ // no guarantee all given pages are mapped + //uint32_t * pte = malloc(sizeof(uint32_t)); + struct framephy_struct *fpit = malloc(sizeof(struct framephy_struct)); + //int fpn; + int pgit = 0; + int pgn = PAGING_PGN(addr); + + /* TODO: update the rg_end and rg_start of ret_rg + //ret_rg->rg_end = .... + //ret_rg->rg_start = ... + //ret_rg->vmaid = ... + */ + ret_rg -> rg_end = ret_rg -> rg_start = addr ; + + fpit->fp_next = frames; + + /* TODO map range of frame to address space + * in page table pgd in caller->mm + */ + + /* Tracking for later page replacement activities (if needed) + * Enqueue new usage page */ + while ( pgit < pgnum ) + { + if ( fpit == NULL ) + { + break ; + } + pgn = PAGING_PGN ( addr + pgnum * PAGING_PAGESZ ); + pte_set_fpn (&( caller ->mm -> pgd [ pgn ]) , fpit -> fpn ) ; + enlist_pgn_node (& caller -> mm -> fifo_pgn , pgn + pgit ) ; + fpit = fpit -> fp_next ; + } + ret_rg -> rg_end += pgit * PAGING_PAGESZ ; + return 0; + +} + +/* + * alloc_pages_range - allocate req_pgnum of frame in ram + * @caller : caller + * @req_pgnum : request page num + * @frm_lst : frame list + */ + +int alloc_pages_range(struct pcb_t *caller, int req_pgnum, struct framephy_struct** frm_lst) +{ + int pgit, fpn; + struct framephy_struct *newfp_str; + + for (pgit = 0; pgit < req_pgnum; pgit++) + { + if (MEMPHY_get_freefp(caller->mram, &fpn) == 0) + { + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = fpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + struct framephy_struct *temp = malloc(sizeof(struct framephy_struct)); + *temp = *newfp_str; + temp->fp_next = caller->mram->used_fp_list; + caller->mram->used_fp_list = temp; + } + else + { + // ERROR CODE of obtaining some but not enough frames + int vicfpn, vicpgn, swpfpn; + uint32_t vicpte; + + if (find_victim_page(caller->mm, &vicpgn) < 0) + { + return -1; + } + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = vicfpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + int i; + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + struct memphy_struct *mswp = *caller->mswp; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (mswp + i == caller->active_mswp) break; + } + } + else + { + struct memphy_struct *mswp = *caller->mswp; + swpfpn = -1; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (MEMPHY_get_freefp(mswp + i, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, mswp + i, swpfpn); + break; + } + } + } + + if (swpfpn == -1) + return -3000; + + pte_set_swap(&caller->mm->pgd[vicpgn], i, swpfpn); + } + } + + return 0; +} + + + +/* + * vm_map_ram - do the mapping all vm are to ram storage device + * @caller : caller + * @astart : vm area start + * @aend : vm area end + * @mapstart : start mapping point + * @incpgnum : number of mapped page + * @ret_rg : returned region + */ +int vm_map_ram(struct pcb_t *caller, int astart, int aend, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg) +{ + struct framephy_struct *frm_lst = NULL; + int ret_alloc; + + /*@bksysnet: author provides a feasible solution of getting frames + *FATAL logic in here, wrong behaviour if we have not enough page + *i.e. we request 1000 frames meanwhile our RAM has size of 3 frames + *Don't try to perform that case in this simple work, it will result + *in endless procedure of swap-off to get frame and we have not provide + *duplicate control mechanism, keep it simple + */ + ret_alloc = alloc_pages_range(caller, incpgnum, &frm_lst); + + if (ret_alloc < 0 && ret_alloc != -3000) + return -1; + + /* Out of memory */ + if (ret_alloc == -3000) + { +#ifdef MMDBG + printf("OOM: vm_map_ram out of memory \n"); +#endif + return -1; + } + + /* it leaves the case of memory is enough but half in ram, half in swap + * do the swaping all to swapper to get the all in ram */ + vmap_page_range(caller, mapstart, incpgnum, frm_lst, ret_rg); + + return 0; +} + +/* Swap copy content page from source frame to destination frame + * @mpsrc : source memphy + * @srcfpn : source physical page number (FPN) + * @mpdst : destination memphy + * @dstfpn : destination physical page number (FPN) + **/ +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) +{ + int cellidx; + int addrsrc,addrdst; + for(cellidx = 0; cellidx < PAGING_PAGESZ; cellidx++) + { + addrsrc = srcfpn * PAGING_PAGESZ + cellidx; + addrdst = dstfpn * PAGING_PAGESZ + cellidx; + + BYTE data; + MEMPHY_read(mpsrc, addrsrc, &data); + MEMPHY_write(mpdst, addrdst, data); + } + + return 0; +} + +/* + *Initialize a empty Memory Management instance + * @mm: self mm + * @caller: mm owner + */ +int init_mm(struct mm_struct *mm, struct pcb_t *caller) +{ + struct vm_area_struct *vma0 = malloc(sizeof(struct vm_area_struct)); + struct vm_area_struct *vma1 = malloc(sizeof(struct vm_area_struct)); + + mm->pgd = malloc(PAGING_MAX_PGN * sizeof(uint32_t)); + + /* By default the owner comes with at least one vma for DATA */ + vma0->vm_id = 0; + vma0->vm_start = 0; + vma0->vm_end = vma0->vm_start; + vma0->sbrk = vma0->vm_start; + + struct vm_rg_struct *first_rg = init_vm_rg(vma0->vm_start, vma0->vm_end, 0); + enlist_vm_rg_node(&vma0->vm_freerg_list, first_rg); + + /* Update vma0 next */ + vma0->vm_next = vma1; // Assuming vma1 is the next VM area + + /* Update one vma for HEAP */ + vma1->vm_id = 1; // Assuming ID for heap + // vma1->vm_start = HEAP_START; // Define an appropriate start address for the heap + //vma1->vm_end = HEAP_END; // Define the end address for the heap + vma1->sbrk = vma1->vm_start; + + struct vm_rg_struct *first_rg_heap = init_vm_rg(vma1->vm_start, vma1->vm_end, 0); + enlist_vm_rg_node(&vma1->vm_freerg_list, first_rg_heap); + + /* Set next for vma1 */ + vma1->vm_next = NULL; // Assuming it's the last one in the list for now + + /* Point vma owner backward */ + vma0->vm_mm = mm; + vma1->vm_mm = mm; + + /* Update mmap */ + mm->mmap = vma0; // Start the mmap list with vma0 + + return 0; +} + + +struct vm_rg_struct* init_vm_rg(int rg_start, int rg_end, int vmaid) +{ + struct vm_rg_struct *rgnode = malloc(sizeof(struct vm_rg_struct)); + + rgnode->rg_start = rg_start; + rgnode->rg_end = rg_end; + rgnode->vmaid = vmaid; + rgnode->rg_next = NULL; + + return rgnode; +} + +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode) +{ + rgnode->rg_next = *rglist; + *rglist = rgnode; + + return 0; +} + +int enlist_pgn_node(struct pgn_t **plist, int pgn) +{ + struct pgn_t* pnode = malloc(sizeof(struct pgn_t)); + + pnode->pgn = pgn; + pnode->pg_next = *plist; + *plist = pnode; + + return 0; +} + +int print_list_fp(struct framephy_struct *ifp) +{ + struct framephy_struct *fp = ifp; + + printf("print_list_fp: "); + if (fp == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (fp != NULL ) + { + printf("fp[%d]\n",fp->fpn); + fp = fp->fp_next; + } + printf("\n"); + return 0; +} + +int print_list_rg(struct vm_rg_struct *irg) +{ + struct vm_rg_struct *rg = irg; + + printf("print_list_rg: "); + if (rg == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (rg != NULL) + { + printf("rg[%ld->%ldvma=%d]\n",rg->rg_start, rg->rg_end, rg->vmaid); + rg = rg->rg_next; + } + printf("\n"); + return 0; +} + +int print_list_vma(struct vm_area_struct *ivma) +{ + struct vm_area_struct *vma = ivma; + + printf("print_list_vma: "); + if (vma == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (vma != NULL ) + { + printf("va[%ld->%ld]\n",vma->vm_start, vma->vm_end); + vma = vma->vm_next; + } + printf("\n"); + return 0; +} + +int print_list_pgn(struct pgn_t *ip) +{ + printf("print_list_pgn: "); + if (ip == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (ip != NULL ) + { + printf("va[%d]-\n",ip->pgn); + ip = ip->pg_next; + } + printf("n"); + return 0; +} + +int print_pgtbl(struct pcb_t *caller, uint32_t start, uint32_t end) +{ + int pgn_start,pgn_end; + int pgit; + + if(end == -1){ + pgn_start = 0; + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, 0); + end = cur_vma->vm_end; + } + pgn_start = PAGING_PGN(start); + pgn_end = PAGING_PGN(end); + + printf("print_pgtbl: %d - %d", start, end); + if (caller == NULL) {printf("NULL caller\n"); return -1;} + printf("\n"); + + + for(pgit = pgn_start; pgit < pgn_end; pgit++) + { + printf("%08ld: %08x\n", pgit * sizeof(uint32_t), caller->mm->pgd[pgit]); + } + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/os.c b/ossim_source_code/src/os.c new file mode 100644 index 0000000..288a3c1 --- /dev/null +++ b/ossim_source_code/src/os.c @@ -0,0 +1,292 @@ + +#include "cpu.h" +#include "timer.h" +#include "sched.h" +#include "loader.h" +#include "mm.h" + +#include +#include +#include +#include + +static int time_slot; +static int num_cpus; +static int done = 0; + +#ifdef MM_PAGING +static int memramsz; +static int memswpsz[PAGING_MAX_MMSWP]; +#ifdef MM_PAGING_HEAP_GODOWN +static int vmemsz; +#endif + +struct mmpaging_ld_args { + /* A dispatched argument struct to compact many-fields passing to loader */ + int vmemsz; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; + struct timer_id_t *timer_id; +}; +#endif + +static struct ld_args{ + char ** path; + unsigned long * start_time; +#ifdef MLQ_SCHED + unsigned long * prio; +#endif +} ld_processes; +int num_processes; + +struct cpu_args { + struct timer_id_t * timer_id; + int id; +}; + + +static void * cpu_routine(void * args) { + struct timer_id_t * timer_id = ((struct cpu_args*)args)->timer_id; + int id = ((struct cpu_args*)args)->id; + /* Check for new process in ready queue */ + int time_left = 0; + struct pcb_t * proc = NULL; + while (1) { + /* Check the status of current process */ + if (proc == NULL) { + /* No process is running, the we load new process from + * ready queue */ + proc = get_proc(); + if (proc == NULL) { + next_slot(timer_id); + continue; /* First load failed. skip dummy load */ + } + }else if (proc->pc == proc->code->size) { + /* The porcess has finish it job */ + printf("\tCPU %d: Processed %2d has finished\n", + id ,proc->pid); + free(proc); + proc = get_proc(); + time_left = 0; + }else if (time_left == 0) { + /* The process has done its job in current time slot */ + printf("\tCPU %d: Put process %2d to run queue\n", + id, proc->pid); + put_proc(proc); + proc = get_proc(); + } + + /* Recheck process status after loading new process */ + if (proc == NULL && done) { + /* No process to run, exit */ + printf("\tCPU %d stopped\n", id); + break; + }else if (proc == NULL) { + /* There may be new processes to run in + * next time slots, just skip current slot */ + next_slot(timer_id); + continue; + }else if (time_left == 0) { + printf("\tCPU %d: Dispatched process %2d\n", + id, proc->pid); + time_left = time_slot; + } + + /* Run current process */ + run(proc); + time_left--; + next_slot(timer_id); + } + detach_event(timer_id); + pthread_exit(NULL); +} + +static void * ld_routine(void * args) { +#ifdef MM_PAGING + struct memphy_struct* mram = ((struct mmpaging_ld_args *)args)->mram; + struct memphy_struct** mswp = ((struct mmpaging_ld_args *)args)->mswp; + struct memphy_struct* active_mswp = ((struct mmpaging_ld_args *)args)->active_mswp; + struct timer_id_t * timer_id = ((struct mmpaging_ld_args *)args)->timer_id; +#else + struct timer_id_t * timer_id = (struct timer_id_t*)args; +#endif + int i = 0; + printf("ld_routine\n"); + while (i < num_processes) { + struct pcb_t * proc = load(ld_processes.path[i]); +#ifdef MLQ_SCHED + proc->prio = ld_processes.prio[i]; +#endif + while (current_time() < ld_processes.start_time[i]) { + next_slot(timer_id); + } +#ifdef MM_PAGING + proc->mm = malloc(sizeof(struct mm_struct)); +#ifdef MM_PAGING_HEAP_GODOWN + proc->vmemsz = vmemsz; +#endif + init_mm(proc->mm, proc); + proc->mram = mram; + proc->mswp = mswp; + proc->active_mswp = active_mswp; +#endif + printf("\tLoaded a process at %s, PID: %d PRIO: %ld\n", + ld_processes.path[i], proc->pid, ld_processes.prio[i]); + add_proc(proc); + free(ld_processes.path[i]); + i++; + next_slot(timer_id); + } + free(ld_processes.path); + free(ld_processes.start_time); + done = 1; + detach_event(timer_id); + pthread_exit(NULL); +} + +static void read_config(const char * path) { + FILE * file; + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find configure file at %s\n", path); + exit(1); + } + fscanf(file, "%d %d %d\n", &time_slot, &num_cpus, &num_processes); + + ld_processes.path = (char**)malloc(sizeof(char*) * num_processes); + ld_processes.start_time = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#ifdef MM_PAGING + int sit; +#ifdef MM_FIXED_MEMSZ + /* We provide here a back compatible with legacy OS simulatiom config file + * In which, it have no addition config line for Mema, keep only one line + * for legacy info + * [time slice] [N = Number of CPU] [M = Number of Processes to be run] + */ + memramsz = 0x100000; + memswpsz[0] = 0x1000000; + for(sit = 1; sit < PAGING_MAX_MMSWP; sit++) + memswpsz[sit] = 0; + +#ifdef MM_PAGING_HEAP_GODOWN + vmemsz = 0x300000; +#endif +#else + /* Read input config of memory size: MEMRAM and upto 4 MEMSWP (mem swap) + * Format: (size=0 result non-used memswap, must have RAM and at least 1 SWAP) + * MEM_RAM_SZ MEM_SWP0_SZ MEM_SWP1_SZ MEM_SWP2_SZ MEM_SWP3_SZ + */ + fscanf(file, "%d\n", &memramsz); + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + fscanf(file, "%d", &(memswpsz[sit])); +#ifdef MM_PAGING_HEAP_GODOWN + fscanf(file, "%d\n", &vmemsz); +#endif + fscanf(file, "\n"); /* Final character */ +#endif +#endif + +#ifdef MLQ_SCHED + ld_processes.prio = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#endif + int i; + for (i = 0; i < num_processes; i++) { + ld_processes.path[i] = (char*)malloc(sizeof(char) * 100); + ld_processes.path[i][0] = '\0'; + strcat(ld_processes.path[i], "input/proc/"); + char proc[100]; +#ifdef MLQ_SCHED + fscanf(file, "%lu %s %lu\n", &ld_processes.start_time[i], proc, &ld_processes.prio[i]); +#else + fscanf(file, "%lu %s\n", &ld_processes.start_time[i], proc); +#endif + strcat(ld_processes.path[i], proc); + } +} + +int main(int argc, char * argv[]) { + /* Read config */ + if (argc != 2) { + printf("Usage: os [path to configure file]\n"); + return 1; + } + char path[100]; + path[0] = '\0'; + strcat(path, "input/"); + strcat(path, argv[1]); + + read_config(path); + + pthread_t * cpu = (pthread_t*)malloc(num_cpus * sizeof(pthread_t)); + struct cpu_args * args = + (struct cpu_args*)malloc(sizeof(struct cpu_args) * num_cpus); + pthread_t ld; + + /* Init timer */ + int i; + for (i = 0; i < num_cpus; i++) { + args[i].timer_id = attach_event(); + args[i].id = i; + } + struct timer_id_t * ld_event = attach_event(); + start_timer(); + +#ifdef MM_PAGING + /* Init all MEMPHY include 1 MEMRAM and n of MEMSWP */ + int rdmflag = 1; /* By default memphy is RANDOM ACCESS MEMORY */ + + struct memphy_struct mram; + struct memphy_struct mswp[PAGING_MAX_MMSWP]; + + /* Create MEM RAM */ + init_memphy(&mram, memramsz, rdmflag); + + /* Create all MEM SWAP */ + int sit; + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + init_memphy(&mswp[sit], memswpsz[sit], rdmflag); + + /* In Paging mode, it needs passing the system mem to each PCB through loader*/ + struct mmpaging_ld_args *mm_ld_args = malloc(sizeof(struct mmpaging_ld_args)); + + mm_ld_args->timer_id = ld_event; + mm_ld_args->mram = (struct memphy_struct *) &mram; + mm_ld_args->mswp = (struct memphy_struct**) &mswp; +#ifdef MM_PAGING_HEAP_GODOWN + mm_ld_args->vmemsz = vmemsz; +#endif + mm_ld_args->active_mswp = (struct memphy_struct *) &mswp[0]; +#endif + + + /* Init scheduler */ + init_scheduler(); + + /* Run CPU and loader */ +#ifdef MM_PAGING + pthread_create(&ld, NULL, ld_routine, (void*)mm_ld_args); +#else + pthread_create(&ld, NULL, ld_routine, (void*)ld_event); +#endif + for (i = 0; i < num_cpus; i++) { + pthread_create(&cpu[i], NULL, + cpu_routine, (void*)&args[i]); + } + + /* Wait for CPU and loader finishing */ + for (i = 0; i < num_cpus; i++) { + pthread_join(cpu[i], NULL); + } + pthread_join(ld, NULL); + + /* Stop timer */ + stop_timer(); + + return 0; + +} + + + diff --git a/ossim_source_code/src/paging.c b/ossim_source_code/src/paging.c new file mode 100644 index 0000000..b061019 --- /dev/null +++ b/ossim_source_code/src/paging.c @@ -0,0 +1,18 @@ + +#include "mem.h" +#include "cpu.h" +#include "loader.h" +#include + +int main() { + struct pcb_t * ld = load("input/p0"); + struct pcb_t * proc = load("input/p0"); + unsigned int i; + for (i = 0; i < proc->code->size; i++) { + run(proc); + run(ld); + } + dump(); + return 0; +} + diff --git a/ossim_source_code/src/queue.c b/ossim_source_code/src/queue.c new file mode 100644 index 0000000..6273086 --- /dev/null +++ b/ossim_source_code/src/queue.c @@ -0,0 +1,49 @@ +#include +#include +#include "queue.h" + +int empty(struct queue_t * q) { + if (q == NULL) return 1; + return (q->size == 0); +} + +void enqueue(struct queue_t * q, struct pcb_t * proc) { + /* TODO: put a new process to queue [q] */ + if (q->size > MAX_QUEUE_SIZE){ + return; + } + else if (!q->size){ + q->proc[0] = proc; + q->size++; + } + else { + int index = q->size; + while (index > 0 && q->proc[index - 1]->priority > proc->priority){ + q->proc[index] = q->proc[index - 1]; + index--; + } + + q->proc[index] = proc; + q->size++; + } + +} + +struct pcb_t * dequeue(struct queue_t * q) { + /* TODO: return a pcb whose prioprity is the highest + * in the queue [q] and remember to remove it from q + * */ + struct pcb_t * result = NULL; + if (q->proc[0] != NULL){ + result = q->proc[0]; + + for (int i = 0; i < q->size - 1; i++){ + q->proc[i] = q->proc[i + 1]; + } + q->proc[q->size - 1] = NULL; + q->size--; + + } + return result; +} + diff --git a/ossim_source_code/src/sched.c b/ossim_source_code/src/sched.c new file mode 100644 index 0000000..c4d5ce2 --- /dev/null +++ b/ossim_source_code/src/sched.c @@ -0,0 +1,140 @@ + +#include "queue.h" +#include "sched.h" +#include + +#include +#include +static struct queue_t ready_queue; +static struct queue_t run_queue; +static pthread_mutex_t queue_lock; + +#ifdef MLQ_SCHED +static struct queue_t mlq_ready_queue[MAX_PRIO]; +#endif + +int queue_empty(void) { +#ifdef MLQ_SCHED + unsigned long prio; + for (prio = 0; prio < MAX_PRIO; prio++) + if(!empty(&mlq_ready_queue[prio])) + return -1; +#endif + return (empty(&ready_queue) && empty(&run_queue)); +} + +void init_scheduler(void) { +#ifdef MLQ_SCHED + int i ; + + for (i = 0; i < MAX_PRIO; i ++) + mlq_ready_queue[i].size = 0; +#endif + ready_queue.size = 0; + run_queue.size = 0; + pthread_mutex_init(&queue_lock, NULL); +} + +#ifdef MLQ_SCHED +/* + * Stateful design for routine calling + * based on the priority and our MLQ policy + * We implement stateful here using transition technique + * State representation prio = 0 .. MAX_PRIO, curr_slot = 0..(MAX_PRIO - prio) + */ +struct pcb_t * get_mlq_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from PRIORITY [ready_queue]. + * Remember to use lock to protect the queue. + * */ + //int curr_slot = 0; + pthread_mutex_lock(&queue_lock); + int prio; + + for (prio = 0; prio < MAX_PRIO; prio++){ + if (mlq_ready_queue[prio].size != 0 && mlq_ready_queue[prio].count_slot < MAX_PRIO - prio){ + proc = dequeue(&mlq_ready_queue[prio]); + mlq_ready_queue[prio].count_slot++; + break; + } + } + + if (prio == MAX_PRIO) { + for (int i = 0; i < MAX_PRIO; i++){ + mlq_ready_queue[i].count_slot = 0; + } + + for (int i = 0; i < MAX_PRIO; i++){ + if (mlq_ready_queue[i].size != 0 && mlq_ready_queue[i].count_slot < MAX_PRIO - i){ + proc = dequeue(&mlq_ready_queue[i]); + mlq_ready_queue[i].count_slot++; + break; + } + } + } + + // while (prio < MAX_PRIO){ + // curr_slot = MAX_PRIO - prio; + // if (!empty(&mlq_ready_queue[prio]) && mlq_ready_queue[prio].count_slot < curr_slot){ + // proc = dequeue(&mlq_ready_queue[prio]); + // curr_slot--; + // break; + // } + // else{ + // prio = (prio + 1) % MAX_PRIO; + // curr_slot = 0; + // } + // } + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +struct pcb_t * get_proc(void) { + return get_mlq_proc(); +} + +void put_proc(struct pcb_t * proc) { + return put_mlq_proc(proc); +} + +void add_proc(struct pcb_t * proc) { + return add_mlq_proc(proc); +} +#else +struct pcb_t * get_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from [ready_queue]. + * Remember to use lock to protect the queue. + * */ + pthread_mutex_lock(&queue_lock); + dequeue(&ready_queue); + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&run_queue, proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&ready_queue, proc); + pthread_mutex_unlock(&queue_lock); +} +#endif + + diff --git a/ossim_source_code/src/timer.c b/ossim_source_code/src/timer.c new file mode 100644 index 0000000..02c4111 --- /dev/null +++ b/ossim_source_code/src/timer.c @@ -0,0 +1,136 @@ + +#include "timer.h" +#include +#include + +static pthread_t _timer; + +struct timer_id_container_t { + struct timer_id_t id; + struct timer_id_container_t * next; +}; + +static struct timer_id_container_t * dev_list = NULL; + +static uint64_t _time; + +static int timer_started = 0; +static int timer_stop = 0; + + +static void * timer_routine(void * args) { + while (!timer_stop) { + printf("Time slot %3lu\n", current_time()); + int fsh = 0; + int event = 0; + /* Wait for all devices have done the job in current + * time slot */ + struct timer_id_container_t * temp; + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.event_lock); + while (!temp->id.done && !temp->id.fsh) { + pthread_cond_wait( + &temp->id.event_cond, + &temp->id.event_lock + ); + } + if (temp->id.fsh) { + fsh++; + } + event++; + pthread_mutex_unlock(&temp->id.event_lock); + } + + /* Increase the time slot */ + _time++; + + /* Let devices continue their job */ + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.timer_lock); + temp->id.done = 0; + pthread_cond_signal(&temp->id.timer_cond); + pthread_mutex_unlock(&temp->id.timer_lock); + } + if (fsh == event) { + break; + } + } + pthread_exit(args); +} + +void next_slot(struct timer_id_t * timer_id) { + /* Tell to timer that we have done our job in current slot */ + pthread_mutex_lock(&timer_id->event_lock); + timer_id->done = 1; + pthread_cond_signal(&timer_id->event_cond); + pthread_mutex_unlock(&timer_id->event_lock); + + /* Wait for going to next slot */ + pthread_mutex_lock(&timer_id->timer_lock); + while (timer_id->done) { + pthread_cond_wait( + &timer_id->timer_cond, + &timer_id->timer_lock + ); + } + pthread_mutex_unlock(&timer_id->timer_lock); +} + +uint64_t current_time() { + return _time; +} + +void start_timer() { + timer_started = 1; + pthread_create(&_timer, NULL, timer_routine, NULL); +} + +void detach_event(struct timer_id_t * event) { + pthread_mutex_lock(&event->event_lock); + event->fsh = 1; + pthread_cond_signal(&event->event_cond); + pthread_mutex_unlock(&event->event_lock); +} + +struct timer_id_t * attach_event() { + if (timer_started) { + return NULL; + }else{ + struct timer_id_container_t * container = + (struct timer_id_container_t*)malloc( + sizeof(struct timer_id_container_t) + ); + container->id.done = 0; + container->id.fsh = 0; + pthread_cond_init(&container->id.event_cond, NULL); + pthread_mutex_init(&container->id.event_lock, NULL); + pthread_cond_init(&container->id.timer_cond, NULL); + pthread_mutex_init(&container->id.timer_lock, NULL); + if (dev_list == NULL) { + dev_list = container; + dev_list->next = NULL; + }else{ + container->next = dev_list; + dev_list = container; + } + return &(container->id); + } +} + +void stop_timer() { + timer_stop = 1; + pthread_join(_timer, NULL); + while (dev_list != NULL) { + struct timer_id_container_t * temp = dev_list; + dev_list = dev_list->next; + pthread_cond_destroy(&temp->id.event_cond); + pthread_mutex_destroy(&temp->id.event_lock); + pthread_cond_destroy(&temp->id.timer_cond); + pthread_mutex_destroy(&temp->id.timer_lock); + free(temp); + } +} + + + + From 2f03de76fbc05b9d1c4a235498d97a4fd8ed1b58 Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:51:16 +0700 Subject: [PATCH 2/9] source code --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 4ebe3adfd5d0d6c9082c55d2bb2cb5e333597333..738a00003a32cfb30f4e54d01c49605913353202 100644 GIT binary patch delta 120 zcmZoMXfc@J&&aYdU^gQp%VZuVH5t#G{N$vZ{3Hej1_2;;1Y*7aV8FltRIrT0)Wk?f u!O*~B@-C)AT~3A|23MdW7Y1J-t;dkdkb-8wdV~R+4ViOUHnVg5 Date: Wed, 4 Dec 2024 20:52:23 +0700 Subject: [PATCH 3/9] btl --- ossim_source_code/.DS_Store | Bin 8196 -> 0 bytes .../.vscode/c_cpp_properties.json | 18 - ossim_source_code/.vscode/launch.json | 13 - ossim_source_code/.vscode/settings.json | 66 -- ossim_source_code/Makefile | 50 -- ossim_source_code/include/bitops.h | 37 - ossim_source_code/include/common.h | 96 --- ossim_source_code/include/cpu.h | 13 - ossim_source_code/include/loader.h | 9 - ossim_source_code/include/mem.h | 32 - ossim_source_code/include/mm.h | 163 ----- ossim_source_code/include/os-cfg.h | 15 - ossim_source_code/include/os-mm.h | 88 --- ossim_source_code/include/queue.h | 22 - ossim_source_code/include/sched.h | 28 - ossim_source_code/include/timer.h | 28 - ossim_source_code/input/os_0_mlq_paging | 4 - ossim_source_code/input/os_1_mlq_paging | 10 - .../input/os_1_mlq_paging_small_1K | 10 - .../input/os_1_mlq_paging_small_4K | 10 - ossim_source_code/input/os_1_singleCPU_mlq | 9 - .../input/os_1_singleCPU_mlq_paging | 10 - ossim_source_code/input/proc/m0s | 8 - ossim_source_code/input/proc/m1s | 8 - ossim_source_code/input/proc/p0s | 15 - ossim_source_code/input/proc/p1s | 12 - ossim_source_code/input/proc/p2s | 14 - ossim_source_code/input/proc/p3s | 18 - ossim_source_code/input/proc/s0 | 16 - ossim_source_code/input/proc/s1 | 8 - ossim_source_code/input/proc/s2 | 14 - ossim_source_code/input/proc/s3 | 18 - ossim_source_code/input/proc/s4 | 31 - ossim_source_code/input/sched | 4 - ossim_source_code/input/sched_0 | 3 - ossim_source_code/input/sched_1 | 5 - ossim_source_code/obj/cpu.o | Bin 6704 -> 0 bytes ossim_source_code/obj/loader.o | Bin 9176 -> 0 bytes ossim_source_code/obj/mem.o | Bin 10144 -> 0 bytes ossim_source_code/obj/mm-memphy.o | Bin 7368 -> 0 bytes ossim_source_code/obj/mm-vm.o | Bin 18048 -> 0 bytes ossim_source_code/obj/mm.o | Bin 15672 -> 0 bytes ossim_source_code/obj/os.o | Bin 15984 -> 0 bytes ossim_source_code/obj/queue.o | Bin 5624 -> 0 bytes ossim_source_code/obj/sched.o | Bin 9032 -> 0 bytes ossim_source_code/obj/timer.o | Bin 8360 -> 0 bytes ossim_source_code/os | Bin 81039 -> 0 bytes .../output/os_0_mlq_paging.output | 78 --- .../output/os_1_mlq_paging.output | 173 ----- .../output/os_1_mlq_paging_small_1K.output | 171 ----- .../output/os_1_mlq_paging_small_4K.output | 172 ----- .../output/os_1_singleCPU_mlq.output | 185 ----- .../output/os_1_singleCPU_mlq_paging.output | 185 ----- ossim_source_code/output/sched.output | 42 -- ossim_source_code/output/sched_0.output | 68 -- ossim_source_code/output/sched_1.output | 132 ---- ossim_source_code/src/cpu.c | 102 --- ossim_source_code/src/loader.c | 108 --- ossim_source_code/src/mem.c | 173 ----- ossim_source_code/src/mm-memphy.c | 199 ------ ossim_source_code/src/mm-vm.c | 649 ------------------ ossim_source_code/src/mm.c | 458 ------------ ossim_source_code/src/os.c | 292 -------- ossim_source_code/src/paging.c | 18 - ossim_source_code/src/queue.c | 49 -- ossim_source_code/src/sched.c | 140 ---- ossim_source_code/src/timer.c | 136 ---- 67 files changed, 4435 deletions(-) delete mode 100644 ossim_source_code/.DS_Store delete mode 100644 ossim_source_code/.vscode/c_cpp_properties.json delete mode 100644 ossim_source_code/.vscode/launch.json delete mode 100644 ossim_source_code/.vscode/settings.json delete mode 100644 ossim_source_code/Makefile delete mode 100644 ossim_source_code/include/bitops.h delete mode 100644 ossim_source_code/include/common.h delete mode 100644 ossim_source_code/include/cpu.h delete mode 100644 ossim_source_code/include/loader.h delete mode 100644 ossim_source_code/include/mem.h delete mode 100644 ossim_source_code/include/mm.h delete mode 100644 ossim_source_code/include/os-cfg.h delete mode 100644 ossim_source_code/include/os-mm.h delete mode 100644 ossim_source_code/include/queue.h delete mode 100644 ossim_source_code/include/sched.h delete mode 100644 ossim_source_code/include/timer.h delete mode 100644 ossim_source_code/input/os_0_mlq_paging delete mode 100644 ossim_source_code/input/os_1_mlq_paging delete mode 100644 ossim_source_code/input/os_1_mlq_paging_small_1K delete mode 100644 ossim_source_code/input/os_1_mlq_paging_small_4K delete mode 100644 ossim_source_code/input/os_1_singleCPU_mlq delete mode 100644 ossim_source_code/input/os_1_singleCPU_mlq_paging delete mode 100644 ossim_source_code/input/proc/m0s delete mode 100644 ossim_source_code/input/proc/m1s delete mode 100644 ossim_source_code/input/proc/p0s delete mode 100644 ossim_source_code/input/proc/p1s delete mode 100644 ossim_source_code/input/proc/p2s delete mode 100644 ossim_source_code/input/proc/p3s delete mode 100644 ossim_source_code/input/proc/s0 delete mode 100644 ossim_source_code/input/proc/s1 delete mode 100644 ossim_source_code/input/proc/s2 delete mode 100644 ossim_source_code/input/proc/s3 delete mode 100644 ossim_source_code/input/proc/s4 delete mode 100644 ossim_source_code/input/sched delete mode 100644 ossim_source_code/input/sched_0 delete mode 100644 ossim_source_code/input/sched_1 delete mode 100644 ossim_source_code/obj/cpu.o delete mode 100644 ossim_source_code/obj/loader.o delete mode 100644 ossim_source_code/obj/mem.o delete mode 100644 ossim_source_code/obj/mm-memphy.o delete mode 100644 ossim_source_code/obj/mm-vm.o delete mode 100644 ossim_source_code/obj/mm.o delete mode 100644 ossim_source_code/obj/os.o delete mode 100644 ossim_source_code/obj/queue.o delete mode 100644 ossim_source_code/obj/sched.o delete mode 100644 ossim_source_code/obj/timer.o delete mode 100755 ossim_source_code/os delete mode 100644 ossim_source_code/output/os_0_mlq_paging.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging_small_1K.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging_small_4K.output delete mode 100644 ossim_source_code/output/os_1_singleCPU_mlq.output delete mode 100644 ossim_source_code/output/os_1_singleCPU_mlq_paging.output delete mode 100644 ossim_source_code/output/sched.output delete mode 100644 ossim_source_code/output/sched_0.output delete mode 100644 ossim_source_code/output/sched_1.output delete mode 100644 ossim_source_code/src/cpu.c delete mode 100644 ossim_source_code/src/loader.c delete mode 100644 ossim_source_code/src/mem.c delete mode 100644 ossim_source_code/src/mm-memphy.c delete mode 100644 ossim_source_code/src/mm-vm.c delete mode 100644 ossim_source_code/src/mm.c delete mode 100644 ossim_source_code/src/os.c delete mode 100644 ossim_source_code/src/paging.c delete mode 100644 ossim_source_code/src/queue.c delete mode 100644 ossim_source_code/src/sched.c delete mode 100644 ossim_source_code/src/timer.c diff --git a/ossim_source_code/.DS_Store b/ossim_source_code/.DS_Store deleted file mode 100644 index 6b57edf22290270271faf7b59de119eb25d10e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMzi-n(6n@vFjiU;wNPxN^Swd`4NoiFmEFld;2Nr_pKv9Te)0#TIC_kE^ij)}` z;15AeNQ_KOY#>(3pTNij@7u4Fq18{J`3wD<4EuKP~2ZjN|fMLKeU>GnAoCXGP&8B2!tozby za>IaO;9N35?*|(%vK3{=(u!9HW?~C~Hjj@*!h75Yh!|Vhin3#AMJSdjcMnX3GPT8E zG93Lj!O>Qf9ZM_2fyr=Ss%EBkC`{CjakhX1t4M2d!+>ER%>eD)3$O(H(1TWd|K9FM zu=O^LX!Bal3AlqE>%+INZ!UVD?;VA5{{hw6rPG3_wlY;(03SkZO#lNrPuL82OVvh` zn`&D6BNBm=XlK~#DD+3C6ZpM;x%{2Y4qTTkn|d|2-{`-5J!*?mI49&sKx z(S6f-?0dt;!lex!_M3j_bwz;hdI;Ix@SMp3HV(HFC8WGn7 zz2$e?N)wICHlJ#ejnXywguo=r`}J-Z@Nfq`)Qef6SO@j$C)9e6-nd#ZJIM}30iOk!6P+T?KlJMcp51$#|LgUS={ z!R9aT$Cb7iV-xRmY^A+=%MY$$#c9ZCyQUC{r~;!^Z(;*gel!HU>G=223WpUuT`-L(FbX=HMG~Z z@p^_ACBluR6(N`rgr1A-INHe{hInr)Uq#umwCKU~-wy)ld;fHN<7?}(zS@}e{{;75 I=VJZ;3#dblSpWb4 diff --git a/ossim_source_code/.vscode/c_cpp_properties.json b/ossim_source_code/.vscode/c_cpp_properties.json deleted file mode 100644 index f6526a0..0000000 --- a/ossim_source_code/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "configurations": [ - { - "name": "macos-clang-arm64", - "includePath": [ - "${workspaceFolder}/**" - ], - "compilerPath": "/usr/bin/clang", - "cStandard": "${default}", - "cppStandard": "c++20", - "intelliSenseMode": "macos-clang-arm64", - "compilerArgs": [ - "" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/ossim_source_code/.vscode/launch.json b/ossim_source_code/.vscode/launch.json deleted file mode 100644 index 5de968d..0000000 --- a/ossim_source_code/.vscode/launch.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "C/C++ Runner: Debug Session", - "type": "lldb", - "request": "launch", - "args": [], - "cwd": "/Users/admin/Downloads/ossim_source_code/src", - "program": "/Users/admin/Downloads/ossim_source_code/src/build/Debug/outDebug" - } - ] -} \ No newline at end of file diff --git a/ossim_source_code/.vscode/settings.json b/ossim_source_code/.vscode/settings.json deleted file mode 100644 index 7a3b5b2..0000000 --- a/ossim_source_code/.vscode/settings.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "C_Cpp_Runner.cCompilerPath": "clang", - "C_Cpp_Runner.cppCompilerPath": "clang++", - "C_Cpp_Runner.debuggerPath": "lldb", - "C_Cpp_Runner.cStandard": "", - "C_Cpp_Runner.cppStandard": "c++20", - "C_Cpp_Runner.msvcBatchPath": "", - "C_Cpp_Runner.useMsvc": false, - "C_Cpp_Runner.warnings": [ - "-Wall", - "-Wextra", - "-Wpedantic", - "-Wshadow", - "-Wformat=2", - "-Wcast-align", - "-Wconversion", - "-Wsign-conversion", - "-Wnull-dereference" - ], - "C_Cpp_Runner.msvcWarnings": [ - "/W4", - "/permissive-", - "/w14242", - "/w14287", - "/w14296", - "/w14311", - "/w14826", - "/w44062", - "/w44242", - "/w14905", - "/w14906", - "/w14263", - "/w44265", - "/w14928" - ], - "C_Cpp_Runner.enableWarnings": true, - "C_Cpp_Runner.warningsAsError": false, - "C_Cpp_Runner.compilerArgs": [], - "C_Cpp_Runner.linkerArgs": [], - "C_Cpp_Runner.includePaths": [], - "C_Cpp_Runner.includeSearch": [ - "*", - "**/*" - ], - "C_Cpp_Runner.excludeSearch": [ - "**/build", - "**/build/**", - "**/.*", - "**/.*/**", - "**/.vscode", - "**/.vscode/**" - ], - "C_Cpp_Runner.useAddressSanitizer": false, - "C_Cpp_Runner.useUndefinedSanitizer": false, - "C_Cpp_Runner.useLeakSanitizer": false, - "C_Cpp_Runner.showCompilationTime": false, - "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false, - "git.ignoreLimitWarning": true, - "files.associations": { - "cstdlib": "cpp", - "locale": "cpp", - "ostream": "cpp", - "new": "cpp" - } -} \ No newline at end of file diff --git a/ossim_source_code/Makefile b/ossim_source_code/Makefile deleted file mode 100644 index f7ed868..0000000 --- a/ossim_source_code/Makefile +++ /dev/null @@ -1,50 +0,0 @@ - -INC = -Iinclude -LIB = -lpthread - -SRC = src -OBJ = obj -INCLUDE = include - -CC = gcc -DEBUG = -g -CFLAGS = -Wall -c $(DEBUG) -LFLAGS = -Wall $(DEBUG) - -vpath %.c $(SRC) -vpath %.h $(INCLUDE) - -MAKE = $(CC) $(INC) - -# Object files needed by modules -MEM_OBJ = $(addprefix $(OBJ)/, paging.o mem.o cpu.o loader.o) -OS_OBJ = $(addprefix $(OBJ)/, cpu.o mem.o loader.o queue.o os.o sched.o timer.o mm-vm.o mm.o mm-memphy.o) -SCHED_OBJ = $(addprefix $(OBJ)/, cpu.o loader.o) -HEADER = $(wildcard $(INCLUDE)/*.h) - -all: os -#mem sched os - -# Just compile memory management modules -mem: $(MEM_OBJ) - $(MAKE) $(LFLAGS) $(MEM_OBJ) -o mem $(LIB) - -# Just compile scheduler -sched: $(SCHED_OBJ) $(MEM_OBJ) - $(MAKE) $(LFLAGS) $(SCHED_OBJ) $(MEM_OBJ) -o sched $(LIB) - -# Compile the whole OS simulation -os: $(OS_OBJ) - $(MAKE) $(LFLAGS) $(OS_OBJ) -o os $(LIB) - -$(OBJ)/%.o: %.c ${HEADER} $(OBJ) - $(MAKE) $(CFLAGS) $< -o $@ - -# Prepare objectives container -$(OBJ): - mkdir -p $(OBJ) - -clean: - rm -f $(OBJ)/*.o os sched mem - rm -r $(OBJ) - diff --git a/ossim_source_code/include/bitops.h b/ossim_source_code/include/bitops.h deleted file mode 100644 index 0cc9413..0000000 --- a/ossim_source_code/include/bitops.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifdef CONFIG_64BIT -#define BITS_PER_LONG 64 -#else -#define BITS_PER_LONG 32 -#endif /* CONFIG_64BIT */ - -#define BITS_PER_BYTE 8 -#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) - -#define BIT(nr) (1U << (nr)) -#define BIT_ULL(nr) (1ULL << (nr)) -#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) -#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) -#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) -#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) - -#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) - -#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) -#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) - -/* - * Create a contiguous bitmask starting at bit position @l and ending at - * position @h. For example - * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. - */ -#define GENMASK(h, l) \ - (((~0U) << (l)) & (~0U >> (BITS_PER_LONG - (h) - 1))) - -#define NBITS2(n) ((n&2)?1:0) -#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n))) -#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n))) -#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n))) -#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n))) -#define NBITS(n) (n==0?0:NBITS32(n)) - -#define EXTRACT_NBITS(nr, h, l) ((nr&GENMASK(h,l)) >> l) diff --git a/ossim_source_code/include/common.h b/ossim_source_code/include/common.h deleted file mode 100644 index c1d5a17..0000000 --- a/ossim_source_code/include/common.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef COMMON_H -#define COMMON_H - -/* Define structs and routine could be used by every source files */ - -#include - -#ifndef OSCFG_H -#include "os-cfg.h" -#endif - -#ifndef OSMM_H -#include "os-mm.h" -#endif - -#define ADDRESS_SIZE 20 -#define OFFSET_LEN 10 -#define FIRST_LV_LEN 5 -#define SECOND_LV_LEN 5 -#define SEGMENT_LEN FIRST_LV_LEN -#define PAGE_LEN SECOND_LV_LEN - -#define NUM_PAGES (1 << (ADDRESS_SIZE - OFFSET_LEN)) -#define PAGE_SIZE (1 << OFFSET_LEN) - -enum ins_opcode_t { - CALC, // Just perform calculation, only use CPU - ALLOC, // Allocate memory -#ifdef MM_PAGING - MALLOC, // Allocate dynamic memory -#endif - FREE, // Deallocated a memory block - READ, // Write data to a byte on memory - WRITE // Read data from a byte on memory -}; - -/* instructions executed by the CPU */ -struct inst_t { - enum ins_opcode_t opcode; - uint32_t arg_0; // Argument lists for instructions - uint32_t arg_1; - uint32_t arg_2; -}; - -struct code_seg_t { - struct inst_t * text; - uint32_t size; -}; - -struct trans_table_t { - /* A row in the page table of the second layer */ - struct { - addr_t v_index; // The index of virtual address - addr_t p_index; // The index of physical address - } table[1 << SECOND_LV_LEN]; - int size; -}; - -/* Mapping virtual addresses and physical ones */ -struct page_table_t { - /* Translation table for the first layer */ - struct { - addr_t v_index; // Virtual index - struct trans_table_t * next_lv; - } table[1 << FIRST_LV_LEN]; - int size; // Number of row in the first layer -}; - -/* PCB, describe information about a process */ -struct pcb_t { - uint32_t pid; // PID - uint32_t priority; // Default priority, this legacy (FIXED) value depend on process itself - struct code_seg_t * code; // Code segment - addr_t regs[10]; // Registers, store address of allocated regions - uint32_t pc; // Program pointer, point to the next instruction -#ifdef MLQ_SCHED - // Priority on execution (if supported), on-fly aka. changeable - // and this vale overwrites the default priority when it existed - uint32_t prio; -#endif -#ifdef MM_PAGING - struct mm_struct *mm; - struct memphy_struct *mram; - struct memphy_struct **mswp; - struct memphy_struct *active_mswp; -#ifdef MM_PAGING_HEAP_GODOWN - uint32_t vmemsz; -#endif -#endif - struct page_table_t * page_table; // Page table - uint32_t bp; // Break pointer - -}; - -#endif - diff --git a/ossim_source_code/include/cpu.h b/ossim_source_code/include/cpu.h deleted file mode 100644 index 0b95b07..0000000 --- a/ossim_source_code/include/cpu.h +++ /dev/null @@ -1,13 +0,0 @@ - -#ifndef CPU_H -#define CPU_H - -#include "common.h" - -/* Execute an instruction of a process. Return 0 - * if the instruction is executed successfully. - * Otherwise, return 1. */ -int run(struct pcb_t * proc); - -#endif - diff --git a/ossim_source_code/include/loader.h b/ossim_source_code/include/loader.h deleted file mode 100644 index 8fedc07..0000000 --- a/ossim_source_code/include/loader.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef LOADER_H -#define LOADER_H - -#include "common.h" - -struct pcb_t * load(const char * path); - -#endif - diff --git a/ossim_source_code/include/mem.h b/ossim_source_code/include/mem.h deleted file mode 100644 index 3c2f5a3..0000000 --- a/ossim_source_code/include/mem.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MEM_H -#define MEM_H - -#include "common.h" - -#define RAM_SIZE (1 << ADDRESS_SIZE) - -/* Init related parameters, must be called before being used */ -void init_mem(void); - -/* Allocate [size] bytes for process [proc] and return its virtual address. - * If we cannot allocate new memory region for this process, return 0 */ -addr_t alloc_mem(uint32_t size, struct pcb_t * proc); - -/* Free a memory block having the first byte at [address] used by - * process [proc]. Return 0 if [address] is valid. Otherwise, return 1 */ -int free_mem(addr_t address, struct pcb_t * proc); - -/* Read 1 byte memory pointed by [address] used by process [proc] and - * save it to [data]. - * If the given [address] is valid, return 0. Otherwise, return 1 */ -int read_mem(addr_t address, struct pcb_t * proc, BYTE * data); - -/* Write [data] to 1 byte on the memory pointed by [address] of process - * [proc]. If given [address] is valid, return 0. Otherwise, return 1 */ -int write_mem(addr_t address, struct pcb_t * proc, BYTE data); - -void dump(void); - -#endif - - diff --git a/ossim_source_code/include/mm.h b/ossim_source_code/include/mm.h deleted file mode 100644 index e7d9094..0000000 --- a/ossim_source_code/include/mm.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef MM_H - -#include "bitops.h" -#include "common.h" - -/* CPU Bus definition */ -#define PAGING_CPU_BUS_WIDTH 22 /* 22bit bus - MAX SPACE 4MB */ -#define PAGING_PAGESZ 256 /* 256B or 8-bits PAGE NUMBER */ -#define PAGING_MEMRAMSZ BIT(10) /* 1MB */ -#define PAGING_PAGE_ALIGNSZ(sz) (DIV_ROUND_UP(sz,PAGING_PAGESZ) *PAGING_PAGESZ) - -#define PAGING_MEMSWPSZ BIT(14) /* 16MB */ -#define PAGING_SWPFPN_OFFSET 5 -#define PAGING_MAX_PGN (DIV_ROUND_UP(BIT(PAGING_CPU_BUS_WIDTH),PAGING_PAGESZ)) - -#define PAGING_SBRK_INIT_SZ PAGING_PAGESZ -/* PTE BIT */ -#define PAGING_PTE_PRESENT_MASK BIT(31) -#define PAGING_PTE_SWAPPED_MASK BIT(30) -#define PAGING_PTE_RESERVE_MASK BIT(29) -#define PAGING_PTE_DIRTY_MASK BIT(28) -#define PAGING_PTE_EMPTY01_MASK BIT(14) -#define PAGING_PTE_EMPTY02_MASK BIT(13) - -/* PTE BIT PRESENT */ -#define PAGING_PTE_SET_PRESENT(pte) (pte=pte|PAGING_PTE_PRESENT_MASK) -#define PAGING_PTE_PAGE_PRESENT(pte) (pte&PAGING_PTE_PRESENT_MASK) - -/* USRNUM */ -#define PAGING_PTE_USRNUM_LOBIT 15 -#define PAGING_PTE_USRNUM_HIBIT 27 -/* FPN */ -#define PAGING_PTE_FPN_LOBIT 0 -#define PAGING_PTE_FPN_HIBIT 12 -/* SWPTYP */ -#define PAGING_PTE_SWPTYP_LOBIT 0 -#define PAGING_PTE_SWPTYP_HIBIT 4 -/* SWPOFF */ -#define PAGING_PTE_SWPOFF_LOBIT 5 -#define PAGING_PTE_SWPOFF_HIBIT 25 - -/* PTE masks */ -#define PAGING_PTE_USRNUM_MASK GENMASK(PAGING_PTE_USRNUM_HIBIT,PAGING_PTE_USRNUM_LOBIT) -#define PAGING_PTE_FPN_MASK GENMASK(PAGING_PTE_FPN_HIBIT,PAGING_PTE_FPN_LOBIT) -#define PAGING_PTE_SWPTYP_MASK GENMASK(PAGING_PTE_SWPTYP_HIBIT,PAGING_PTE_SWPTYP_LOBIT) -#define PAGING_PTE_SWPOFF_MASK GENMASK(PAGING_PTE_SWPOFF_HIBIT,PAGING_PTE_SWPOFF_LOBIT) - -/* Extract PTE */ -#define PAGING_PTE_OFFST(pte) GETVAL(pte,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) -#define PAGING_PTE_PGN(pte) GETVAL(pte,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -#define PAGING_PTE_FPN(pte) GETVAL(pte,PAGING_PTE_FPN_MASK,PAGING_PTE_FPN_LOBIT) -#define PAGING_PTE_SWP(pte) GETVAL(pte,PAGING_PTE_SWPOFF_MASK,PAGING_SWPFPN_OFFSET) - -/* OFFSET */ -#define PAGING_ADDR_OFFST_LOBIT 0 -#define PAGING_ADDR_OFFST_HIBIT (NBITS(PAGING_PAGESZ) - 1) - -/* PAGE Num */ -#define PAGING_ADDR_PGN_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_ADDR_PGN_HIBIT (PAGING_CPU_BUS_WIDTH - 1) - -/* Frame PHY Num */ -#define PAGING_ADDR_FPN_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_ADDR_FPN_HIBIT (NBITS(PAGING_MEMRAMSZ) - 1) - -/* SWAPFPN */ -#define PAGING_SWP_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_SWP_HIBIT (NBITS(PAGING_MEMSWPSZ) - 1) - -/* Value operators */ -#define SETBIT(v,mask) (v=v|mask) -#define CLRBIT(v,mask) (v=v&~mask) - -#define SETVAL(v,value,mask,offst) (v=(v&~mask)|((value<>offst) - -/* Other masks */ -#define PAGING_OFFST_MASK GENMASK(PAGING_ADDR_OFFST_HIBIT,PAGING_ADDR_OFFST_LOBIT) -#define PAGING_PGN_MASK GENMASK(PAGING_ADDR_PGN_HIBIT,PAGING_ADDR_PGN_LOBIT) -#define PAGING_FPN_MASK GENMASK(PAGING_ADDR_FPN_HIBIT,PAGING_ADDR_FPN_LOBIT) -#define PAGING_SWP_MASK GENMASK(PAGING_SWP_HIBIT,PAGING_SWP_LOBIT) - -/* Extract OFFSET */ -//#define PAGING_OFFST(x) ((x&PAGING_OFFST_MASK) >> PAGING_ADDR_OFFST_LOBIT) -#define PAGING_OFFST(x) GETVAL(x,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) -/* Extract Page Number*/ -#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -/* Extract FramePHY Number*/ -#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) -/* Extract SWAPFPN */ -#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -/* Extract SWAPTYPE */ -#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) - -/* Memory range operator */ -/* TODO implement the INCLUDE checking mechanism - currently dummy op only */ -#define INCLUDE(x1,x2,y1,y2) (0) -/* TODO implement the OVERLAP checking mechanism - currently dummy op only */ -#define OVERLAP(x1,x2,y1,y2) (1) - -/* VM region prototypes */ -struct vm_rg_struct * init_vm_rg(int rg_start, int rg_endi, int vmaid); -int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode); -int enlist_pgn_node(struct pgn_t **pgnlist, int pgn); -int vmap_page_range(struct pcb_t *caller, int addr, int pgnum, - struct framephy_struct *frames, struct vm_rg_struct *ret_rg); -int vm_map_ram(struct pcb_t *caller, int astart, int send, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg); -int alloc_pages_range(struct pcb_t *caller, int incpgnum, struct framephy_struct **frm_lst); -int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, - struct memphy_struct *mpdst, int dstfpn) ; -int pte_set_fpn(uint32_t *pte, int fpn); -int pte_set_swap(uint32_t *pte, int swptyp, int swpoff); -int init_pte(uint32_t *pte, - int pre, // present - int fpn, // FPN - int drt, // dirty - int swp, // swap - int swptyp, // swap type - int swpoff); //swap offset -int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr); -int __free(struct pcb_t *caller, int rgid); -int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data); -int __write(struct pcb_t *caller, int rgid, int offset, BYTE value); -int init_mm(struct mm_struct *mm, struct pcb_t *caller); - -/* VM prototypes */ -int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); -int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); -int pgfree_data(struct pcb_t *proc, uint32_t reg_index); -int pgread( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination); -int pgwrite( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset); -/* Local VM prototypes */ -struct vm_rg_struct * get_symrg_byid(struct mm_struct* mm, int rgid); -int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend); -int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg); -int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret); -int find_victim_page(struct mm_struct* mm, int *pgn); -struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid); - -/* MEM/PHY protypes */ -int MEMPHY_get_freefp(struct memphy_struct *mp, int *fpn); -int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn); -int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value); -int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data); -int MEMPHY_dump(struct memphy_struct * mp); -int init_memphy(struct memphy_struct *mp, int max_size, int randomflg); -/* DEBUG */ -int print_list_fp(struct framephy_struct *fp); -int print_list_rg(struct vm_rg_struct *rg); -int print_list_vma(struct vm_area_struct *rg); - - -int print_list_pgn(struct pgn_t *ip); -int print_pgtbl(struct pcb_t *ip, uint32_t start, uint32_t end); -#endif diff --git a/ossim_source_code/include/os-cfg.h b/ossim_source_code/include/os-cfg.h deleted file mode 100644 index d5034e0..0000000 --- a/ossim_source_code/include/os-cfg.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef OSCFG_H -#define OSCFG_H - -#define MLQ_SCHED 1 -#define MAX_PRIO 140 - -#define MM_PAGING -#define MM_PAGING_HEAP_GODOWN -// #define MM_FIXED_MEMSZ -#define VMDBG 1 -#define MMDBG 1 -#define IODUMP 1 -#define PAGETBL_DUMP 1 - -#endif diff --git a/ossim_source_code/include/os-mm.h b/ossim_source_code/include/os-mm.h deleted file mode 100644 index beef90e..0000000 --- a/ossim_source_code/include/os-mm.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef OSMM_H -#define OSMM_H - -#define MM_PAGING -#define PAGING_MAX_MMSWP 4 /* max number of supported swapped space */ -#define PAGING_MAX_SYMTBL_SZ 30 - -typedef char BYTE; -typedef uint32_t addr_t; -//typedef unsigned int uint32_t; - -struct pgn_t{ - int pgn; - struct pgn_t *pg_next; -}; - -/* - * Memory region struct - */ -struct vm_rg_struct { - int vmaid; - - unsigned long rg_start; - unsigned long rg_end; - - struct vm_rg_struct *rg_next; -}; - -/* - * Memory area struct - */ -struct vm_area_struct { - unsigned long vm_id; - unsigned long vm_start; - unsigned long vm_end; - - unsigned long sbrk; -/* - * Derived field - * unsigned long vm_limit = vm_end - vm_start - */ - struct mm_struct *vm_mm; - - struct vm_rg_struct *vm_freerg_list; - struct vm_area_struct *vm_next; -}; - -/* - * Memory management struct - */ -struct mm_struct { - uint32_t *pgd; - - struct vm_area_struct *mmap; - - /* Currently we support a fixed number of symbol */ - struct vm_rg_struct symrgtbl[PAGING_MAX_SYMTBL_SZ]; - - /* list of free page */ - struct pgn_t *fifo_pgn; -}; - -/* - * FRAME/MEM PHY struct - */ -struct framephy_struct { - int fpn; - struct framephy_struct *fp_next; - - /* Resereed for tracking allocated framed */ - struct mm_struct* owner; -}; - -struct memphy_struct { - /* Basic field of data and size */ - BYTE *storage; - int maxsz; - - /* Sequential device fields */ - int rdmflg; - int cursor; - - /* Management structure */ - struct framephy_struct *free_fp_list; - struct framephy_struct *used_fp_list; -}; - -#endif diff --git a/ossim_source_code/include/queue.h b/ossim_source_code/include/queue.h deleted file mode 100644 index d26881c..0000000 --- a/ossim_source_code/include/queue.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef QUEUE_H -#define QUEUE_H - -#include "common.h" - -#define MAX_QUEUE_SIZE 10 - -struct queue_t { - int count_slot; - struct pcb_t * proc[MAX_QUEUE_SIZE]; - int size; -}; - -void enqueue(struct queue_t * q, struct pcb_t * proc); - -struct pcb_t * dequeue(struct queue_t * q); - -int empty(struct queue_t * q); - -#endif - diff --git a/ossim_source_code/include/sched.h b/ossim_source_code/include/sched.h deleted file mode 100644 index d252c72..0000000 --- a/ossim_source_code/include/sched.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef QUEUE_H -#define QUEUE_H - -#include "common.h" - -#ifndef MLQ_SCHED -#define MLQ_SCHED -#endif - -//#define MAX_PRIO 139 - -int queue_empty(void); - -void init_scheduler(void); -void finish_scheduler(void); - -/* Get the next process from ready queue */ -struct pcb_t * get_proc(void); - -/* Put a process back to run queue */ -void put_proc(struct pcb_t * proc); - -/* Add a new process to ready queue */ -void add_proc(struct pcb_t * proc); - -#endif - - diff --git a/ossim_source_code/include/timer.h b/ossim_source_code/include/timer.h deleted file mode 100644 index e480b66..0000000 --- a/ossim_source_code/include/timer.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -#include -#include - -struct timer_id_t { - int done; - int fsh; - pthread_cond_t event_cond; - pthread_mutex_t event_lock; - pthread_cond_t timer_cond; - pthread_mutex_t timer_lock; -}; - -void start_timer(); - -void stop_timer(); - -struct timer_id_t * attach_event(); - -void detach_event(struct timer_id_t * event); - -void next_slot(struct timer_id_t* timer_id); - -uint64_t current_time(); - -#endif diff --git a/ossim_source_code/input/os_0_mlq_paging b/ossim_source_code/input/os_0_mlq_paging deleted file mode 100644 index 6872297..0000000 --- a/ossim_source_code/input/os_0_mlq_paging +++ /dev/null @@ -1,4 +0,0 @@ -6 2 4 -1048576 16777216 0 0 0 3145728 -0 p0s 0 -2 p1s 15 diff --git a/ossim_source_code/input/os_1_mlq_paging b/ossim_source_code/input/os_1_mlq_paging deleted file mode 100644 index 0068caf..0000000 --- a/ossim_source_code/input/os_1_mlq_paging +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -1048576 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_1K b/ossim_source_code/input/os_1_mlq_paging_small_1K deleted file mode 100644 index a5788e4..0000000 --- a/ossim_source_code/input/os_1_mlq_paging_small_1K +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -2048 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_4K b/ossim_source_code/input/os_1_mlq_paging_small_4K deleted file mode 100644 index bd6af03..0000000 --- a/ossim_source_code/input/os_1_mlq_paging_small_4K +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -4096 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq b/ossim_source_code/input/os_1_singleCPU_mlq deleted file mode 100644 index 98efc7e..0000000 --- a/ossim_source_code/input/os_1_singleCPU_mlq +++ /dev/null @@ -1,9 +0,0 @@ -2 1 8 -1 s4 4 -2 s3 3 -4 m1s 2 -6 s2 3 -7 m0s 3 -9 p1s 2 -11 s0 1 -16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq_paging b/ossim_source_code/input/os_1_singleCPU_mlq_paging deleted file mode 100644 index 99e0a04..0000000 --- a/ossim_source_code/input/os_1_singleCPU_mlq_paging +++ /dev/null @@ -1,10 +0,0 @@ -2 1 8 -1048576 16777216 0 0 0 3145728 -1 s4 4 -2 s3 3 -4 m1s 2 -6 s2 3 -7 m0s 3 -9 p1s 2 -11 s0 1 -16 s1 0 diff --git a/ossim_source_code/input/proc/m0s b/ossim_source_code/input/proc/m0s deleted file mode 100644 index 3466b3a..0000000 --- a/ossim_source_code/input/proc/m0s +++ /dev/null @@ -1,8 +0,0 @@ -1 7 -alloc 300 0 -alloc 100 1 -free 0 -alloc 100 2 -malloc 100 3 -write 102 1 20 -write 1 2 1000 diff --git a/ossim_source_code/input/proc/m1s b/ossim_source_code/input/proc/m1s deleted file mode 100644 index b3b24a6..0000000 --- a/ossim_source_code/input/proc/m1s +++ /dev/null @@ -1,8 +0,0 @@ -1 7 -alloc 300 0 -alloc 100 1 -free 0 -alloc 100 2 -malloc 100 2 -free 2 -free 1 diff --git a/ossim_source_code/input/proc/p0s b/ossim_source_code/input/proc/p0s deleted file mode 100644 index 7c443f9..0000000 --- a/ossim_source_code/input/proc/p0s +++ /dev/null @@ -1,15 +0,0 @@ -1 14 -calc -alloc 300 0 -malloc 300 4 -free 0 -alloc 100 1 -write 100 1 20 -read 1 20 20 -write 102 2 20 -read 2 20 20 -write 103 3 20 -read 3 20 20 -calc -free 4 -calc diff --git a/ossim_source_code/input/proc/p1s b/ossim_source_code/input/proc/p1s deleted file mode 100644 index 79c5fba..0000000 --- a/ossim_source_code/input/proc/p1s +++ /dev/null @@ -1,12 +0,0 @@ -1 10 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/p2s b/ossim_source_code/input/proc/p2s deleted file mode 100644 index 2d9336d..0000000 --- a/ossim_source_code/input/proc/p2s +++ /dev/null @@ -1,14 +0,0 @@ -20 13 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/p3s b/ossim_source_code/input/proc/p3s deleted file mode 100644 index 08a2128..0000000 --- a/ossim_source_code/input/proc/p3s +++ /dev/null @@ -1,18 +0,0 @@ -7 17 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s0 b/ossim_source_code/input/proc/s0 deleted file mode 100644 index 6186100..0000000 --- a/ossim_source_code/input/proc/s0 +++ /dev/null @@ -1,16 +0,0 @@ -12 15 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s1 b/ossim_source_code/input/proc/s1 deleted file mode 100644 index 8614b76..0000000 --- a/ossim_source_code/input/proc/s1 +++ /dev/null @@ -1,8 +0,0 @@ -20 7 -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s2 b/ossim_source_code/input/proc/s2 deleted file mode 100644 index 2d9336d..0000000 --- a/ossim_source_code/input/proc/s2 +++ /dev/null @@ -1,14 +0,0 @@ -20 13 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s3 b/ossim_source_code/input/proc/s3 deleted file mode 100644 index 08a2128..0000000 --- a/ossim_source_code/input/proc/s3 +++ /dev/null @@ -1,18 +0,0 @@ -7 17 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s4 b/ossim_source_code/input/proc/s4 deleted file mode 100644 index 79dfde8..0000000 --- a/ossim_source_code/input/proc/s4 +++ /dev/null @@ -1,31 +0,0 @@ -20 30 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/sched b/ossim_source_code/input/sched deleted file mode 100644 index 33c50ef..0000000 --- a/ossim_source_code/input/sched +++ /dev/null @@ -1,4 +0,0 @@ -4 2 3 -0 p1s -1 p2s -2 p3s diff --git a/ossim_source_code/input/sched_0 b/ossim_source_code/input/sched_0 deleted file mode 100644 index ae979fd..0000000 --- a/ossim_source_code/input/sched_0 +++ /dev/null @@ -1,3 +0,0 @@ -2 1 2 -0 s0 137 -4 s1 138 diff --git a/ossim_source_code/input/sched_1 b/ossim_source_code/input/sched_1 deleted file mode 100644 index c7fac37..0000000 --- a/ossim_source_code/input/sched_1 +++ /dev/null @@ -1,5 +0,0 @@ -2 1 4 -0 s0 -4 s1 -6 s2 -7 s3 diff --git a/ossim_source_code/obj/cpu.o b/ossim_source_code/obj/cpu.o deleted file mode 100644 index 4a5586b973b826c9dfde1f75b31550dadaf2ee7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6704 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 diff --git a/ossim_source_code/obj/mem.o b/ossim_source_code/obj/mem.o deleted file mode 100644 index f258d187737468b32ed6fc56d256396ffd09ba10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10144 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 V-&)~#Tm=N=T$cm_vc}EV{{qDeHkAMX diff --git a/ossim_source_code/obj/mm-memphy.o b/ossim_source_code/obj/mm-memphy.o deleted file mode 100644 index f63706c64e7fbc56bc446fef39a60f5ee9f8eca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7368 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 SDgMq>?zGN81!z4&Mg12x`YFEv diff --git a/ossim_source_code/obj/mm.o b/ossim_source_code/obj/mm.o deleted file mode 100644 index 75aaf47eff60a6b3230770472559f5ba3df912a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15672 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

RUv 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 diff --git a/ossim_source_code/obj/queue.o b/ossim_source_code/obj/queue.o deleted file mode 100644 index 47a4309fce16cefca819f7cfdbc4a024032f2a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5624 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 OJmampKlNWS^Zx=KIrByU diff --git a/ossim_source_code/output/os_0_mlq_paging.output b/ossim_source_code/output/os_0_mlq_paging.output deleted file mode 100644 index 87d78bc..0000000 --- a/ossim_source_code/output/os_0_mlq_paging.output +++ /dev/null @@ -1,78 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/p0s, PID: 1 PRIO: 0 - CPU 0: Dispatched process 1 -Time slot 1 -Time slot 2 - Loaded a process at input/proc/p1s, PID: 2 PRIO: 15 -Time slot 3 - Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 -Time slot 4 - CPU 1: Dispatched process 2 - Loaded a process at input/proc/p1s, PID: 4 PRIO: 0 -Time slot 5 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 6 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 7 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 8 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 9 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 10 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 3 -Time slot 11 -Time slot 12 -Time slot 13 -Time slot 14 -Time slot 15 -Time slot 16 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 17 -Time slot 18 -Time slot 19 -Time slot 20 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 4 - CPU 1: Processed 2 has finished - CPU 1 stopped -Time slot 21 -Time slot 22 -Time slot 23 -Time slot 24 - CPU 0: Processed 4 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging.output b/ossim_source_code/output/os_1_mlq_paging.output deleted file mode 100644 index 2f675f0..0000000 --- a/ossim_source_code/output/os_1_mlq_paging.output +++ /dev/null @@ -1,173 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 -Time slot 2 - CPU 1: Dispatched process 1 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 0: Dispatched process 2 -Time slot 4 - CPU 1: Put process 1 to run queue - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 - CPU 3: Dispatched process 1 -Time slot 5 - CPU 2: Dispatched process 3 - CPU 0: Put process 2 to run queue -Time slot 6 - CPU 0: Dispatched process 2 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 - CPU 3: Put process 1 to run queue -Time slot 7 - CPU 1: Dispatched process 4 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 10 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 6 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 2 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 1 to run queue - CPU 3: Dispatched process 4 -Time slot 12 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 5 -Time slot 13 - CPU 2: Put process 2 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 6 - CPU 3: Put process 4 to run queue - CPU 3: Dispatched process 3 -Time slot 14 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 7 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 15 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 2 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 4 - CPU 3: Processed 3 has finished - CPU 3: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 -Time slot 16 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 -Time slot 17 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 7 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 8 -Time slot 18 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 2 -Time slot 19 - CPU 2: Put process 7 to run queue - CPU 2: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 6 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 7 - CPU 3: Put process 8 to run queue - CPU 3: Dispatched process 4 -Time slot 20 - CPU 2: Processed 5 has finished - CPU 2: Dispatched process 8 -Time slot 21 - CPU 1: Put process 6 to run queue - CPU 1 stopped - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - CPU 3: Processed 4 has finished - CPU 3: Dispatched process 7 -Time slot 22 - CPU 2: Put process 8 to run queue - CPU 2 stopped -Time slot 23 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 8 - CPU 3: Put process 7 to run queue - CPU 3 stopped -Time slot 24 -Time slot 25 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 26 -Time slot 27 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 8 -Time slot 28 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 29 -Time slot 30 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 31 -Time slot 32 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 33 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_1K.output b/ossim_source_code/output/os_1_mlq_paging_small_1K.output deleted file mode 100644 index cb2fb07..0000000 --- a/ossim_source_code/output/os_1_mlq_paging_small_1K.output +++ /dev/null @@ -1,171 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 - CPU 1: Dispatched process 1 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 2: Dispatched process 2 - CPU 1: Put process 1 to run queue - CPU 3: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 -Time slot 5 - CPU 2: Put process 2 to run queue - CPU 0: Dispatched process 3 - CPU 1: Dispatched process 2 - CPU 3: Put process 1 to run queue -Time slot 6 - CPU 2: Dispatched process 1 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 -Time slot 7 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 2 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 5 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 2 -Time slot 10 - CPU 2: Put process 5 to run queue - CPU 2: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 6 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 5 -Time slot 12 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 13 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 3 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 2 -Time slot 14 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 4 -Time slot 15 - CPU 1: Processed 3 has finished - CPU 1: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 7 -Time slot 16 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 2 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 4 - CPU 1: Put process 5 to run queue - CPU 1: Dispatched process 8 - CPU 2: Processed 2 has finished - CPU 2: Dispatched process 6 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 -Time slot 18 - CPU 3: Processed 5 has finished - CPU 3: Dispatched process 7 -Time slot 19 - CPU 2: Put process 6 to run queue - CPU 2 stopped - CPU 1: Put process 8 to run queue - CPU 1: Dispatched process 6 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 8 -Time slot 20 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 4 -Time slot 21 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 7 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 6 -Time slot 22 - CPU 3: Processed 4 has finished - CPU 3: Dispatched process 8 -Time slot 23 - CPU 1: Put process 7 to run queue - CPU 1 stopped - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 24 - CPU 3: Put process 8 to run queue - CPU 3 stopped -Time slot 25 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 8 -Time slot 26 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 27 -Time slot 28 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 29 -Time slot 30 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 31 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_4K.output b/ossim_source_code/output/os_1_mlq_paging_small_4K.output deleted file mode 100644 index 25afa10..0000000 --- a/ossim_source_code/output/os_1_mlq_paging_small_4K.output +++ /dev/null @@ -1,172 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 - CPU 1: Dispatched process 1 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 2: Dispatched process 2 - CPU 1: Put process 1 to run queue - CPU 3: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 -Time slot 5 - CPU 2: Put process 2 to run queue - CPU 0: Dispatched process 3 - CPU 1: Dispatched process 2 - CPU 3: Put process 1 to run queue -Time slot 6 - CPU 2: Dispatched process 1 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 -Time slot 7 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 2 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 5 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 2 -Time slot 10 - CPU 2: Put process 5 to run queue - CPU 2: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 6 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 5 -Time slot 12 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 13 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 6 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 3 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 7 -Time slot 14 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 2 -Time slot 15 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 4 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 6 -Time slot 16 - CPU 2: Put process 2 to run queue - CPU 2: Dispatched process 7 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 4 - CPU 3: Put process 6 to run queue - CPU 3: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 -Time slot 18 - CPU 2: Put process 7 to run queue - CPU 2: Dispatched process 8 - CPU 1: Processed 2 has finished - CPU 1: Dispatched process 6 - CPU 3: Processed 5 has finished - CPU 3: Dispatched process 7 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0 stopped -Time slot 20 - CPU 2: Put process 8 to run queue - CPU 2: Dispatched process 4 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 8 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 6 -Time slot 21 -Time slot 22 - CPU 2: Processed 4 has finished - CPU 2: Dispatched process 7 - CPU 1: Put process 8 to run queue - CPU 1 stopped - CPU 3: Processed 6 has finished - CPU 3: Dispatched process 8 -Time slot 23 -Time slot 24 - CPU 2: Put process 7 to run queue - CPU 2 stopped - CPU 3: Put process 8 to run queue - CPU 3: Dispatched process 7 -Time slot 25 -Time slot 26 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 8 -Time slot 27 - CPU 3: Processed 8 has finished - CPU 3: Dispatched process 7 -Time slot 28 -Time slot 29 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 7 -Time slot 30 -Time slot 31 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 7 -Time slot 32 - CPU 3: Processed 7 has finished - CPU 3 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq.output b/ossim_source_code/output/os_1_singleCPU_mlq.output deleted file mode 100644 index 65a13db..0000000 --- a/ossim_source_code/output/os_1_singleCPU_mlq.output +++ /dev/null @@ -1,185 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/s4, PID: 1 PRIO: 4 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 3 -Time slot 3 - CPU 0: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 - Loaded a process at input/proc/s2, PID: 4 PRIO: 3 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 -Time slot 21 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 22 -Time slot 23 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 2 -Time slot 24 -Time slot 25 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 28 -Time slot 29 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 30 -Time slot 31 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 32 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 5 -Time slot 33 -Time slot 34 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 35 -Time slot 36 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 8 -Time slot 37 -Time slot 38 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 39 -Time slot 40 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 3 -Time slot 41 -Time slot 42 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 43 -Time slot 44 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 45 -Time slot 46 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 6 -Time slot 47 -Time slot 48 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -Time slot 49 -Time slot 50 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 51 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 8 -Time slot 52 -Time slot 53 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 54 -Time slot 55 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 56 -Time slot 57 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 58 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 59 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 8 -Time slot 60 -Time slot 61 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 62 -Time slot 63 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 64 -Time slot 65 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: c0000000 -Time slot 66 - CPU 0: Processed 5 has finished - CPU 0: Dispatched process 8 -Time slot 67 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 68 -Time slot 69 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 70 -Time slot 71 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -Time slot 72 -Time slot 73 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 74 -Time slot 75 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 76 -Time slot 77 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 78 -Time slot 79 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 80 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output deleted file mode 100644 index 65a13db..0000000 --- a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output +++ /dev/null @@ -1,185 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/s4, PID: 1 PRIO: 4 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 3 -Time slot 3 - CPU 0: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 - Loaded a process at input/proc/s2, PID: 4 PRIO: 3 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 -Time slot 21 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 22 -Time slot 23 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 2 -Time slot 24 -Time slot 25 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 28 -Time slot 29 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 30 -Time slot 31 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 32 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 5 -Time slot 33 -Time slot 34 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 35 -Time slot 36 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 8 -Time slot 37 -Time slot 38 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 39 -Time slot 40 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 3 -Time slot 41 -Time slot 42 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 43 -Time slot 44 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 45 -Time slot 46 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 6 -Time slot 47 -Time slot 48 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -Time slot 49 -Time slot 50 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 51 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 8 -Time slot 52 -Time slot 53 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 54 -Time slot 55 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 56 -Time slot 57 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 58 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 59 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 8 -Time slot 60 -Time slot 61 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 62 -Time slot 63 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 64 -Time slot 65 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: c0000000 -Time slot 66 - CPU 0: Processed 5 has finished - CPU 0: Dispatched process 8 -Time slot 67 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 68 -Time slot 69 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 70 -Time slot 71 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -Time slot 72 -Time slot 73 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 74 -Time slot 75 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 76 -Time slot 77 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 78 -Time slot 79 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 80 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched.output b/ossim_source_code/output/sched.output deleted file mode 100644 index edfe4cf..0000000 --- a/ossim_source_code/output/sched.output +++ /dev/null @@ -1,42 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/p1s, PID: 1 PRIO: 1 - CPU 1: Dispatched process 1 -Time slot 1 - Loaded a process at input/proc/p1s, PID: 2 PRIO: 0 -Time slot 2 - Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 -Time slot 3 - CPU 0: Dispatched process 3 -Time slot 4 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 2 -Time slot 5 -Time slot 6 -Time slot 7 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 1 -Time slot 8 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 2 -Time slot 9 -Time slot 10 -Time slot 11 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 -Time slot 12 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 1 -Time slot 13 -Time slot 14 - CPU 1: Processed 1 has finished - CPU 1: Dispatched process 2 -Time slot 15 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 16 - CPU 1: Processed 2 has finished - CPU 1 stopped -Time slot 17 - CPU 0: Processed 3 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched_0.output b/ossim_source_code/output/sched_0.output deleted file mode 100644 index 0676714..0000000 --- a/ossim_source_code/output/sched_0.output +++ /dev/null @@ -1,68 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/s0, PID: 1 PRIO: 4 -Time slot 1 - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 2 PRIO: 0 -Time slot 2 -Time slot 3 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 -Time slot 4 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 14 -Time slot 15 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 16 -Time slot 17 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 18 -Time slot 19 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 20 -Time slot 21 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 22 -Time slot 23 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 24 -Time slot 25 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 28 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 2 -Time slot 29 -Time slot 30 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 31 - CPU 0: Processed 2 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched_1.output b/ossim_source_code/output/sched_1.output deleted file mode 100644 index 9c338f7..0000000 --- a/ossim_source_code/output/sched_1.output +++ /dev/null @@ -1,132 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/s0, PID: 1 PRIO: 4 -Time slot 1 - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 2 PRIO: 0 -Time slot 2 - Loaded a process at input/proc/s0, PID: 3 PRIO: 0 -Time slot 3 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 4 PRIO: 0 -Time slot 4 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 4 -Time slot 6 -Time slot 7 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 8 -Time slot 9 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 10 -Time slot 11 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 3 -Time slot 21 -Time slot 22 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 23 -Time slot 24 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 25 -Time slot 26 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 27 -Time slot 28 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 29 -Time slot 30 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 31 -Time slot 32 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 33 -Time slot 34 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 35 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 2 -Time slot 36 -Time slot 37 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 38 -Time slot 39 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 40 -Time slot 41 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 42 -Time slot 43 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 44 -Time slot 45 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 46 -Time slot 47 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 48 -Time slot 49 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 50 -Time slot 51 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 52 -Time slot 53 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 54 -Time slot 55 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 56 -Time slot 57 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 58 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 2 -Time slot 59 -Time slot 60 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 61 - CPU 0: Processed 2 has finished - CPU 0 stopped diff --git a/ossim_source_code/src/cpu.c b/ossim_source_code/src/cpu.c deleted file mode 100644 index b8deb25..0000000 --- a/ossim_source_code/src/cpu.c +++ /dev/null @@ -1,102 +0,0 @@ - -#include "cpu.h" -#include "mem.h" -#include "mm.h" - -int calc(struct pcb_t * proc) { - return ((unsigned long)proc & 0UL); -} - -int alloc(struct pcb_t * proc, uint32_t size, uint32_t reg_index) { - addr_t addr = alloc_mem(size, proc); - if (addr == 0) { - return 1; - }else{ - proc->regs[reg_index] = addr; - return 0; - } -} - -int free_data(struct pcb_t * proc, uint32_t reg_index) { - return free_mem(proc->regs[reg_index], proc); -} - -int read( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination) { // Index of destination register - - BYTE data; - if (read_mem(proc->regs[source] + offset, proc, &data)) { - proc->regs[destination] = data; - return 0; - }else{ - return 1; - } -} - -int write( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset) { // Destination address = - // [destination] + [offset] - return write_mem(proc->regs[destination] + offset, proc, data); -} - -int run(struct pcb_t * proc) { - /* Check if Program Counter point to the proper instruction */ - if (proc->pc >= proc->code->size) { - return 1; - } - - struct inst_t ins = proc->code->text[proc->pc]; - proc->pc++; - int stat = 1; - switch (ins.opcode) { - case CALC: - stat = calc(proc); - break; - case ALLOC: -#ifdef MM_PAGING - stat = pgalloc(proc, ins.arg_0, ins.arg_1); - -#else - stat = alloc(proc, ins.arg_0, ins.arg_1); -#endif - break; -#ifdef MM_PAGING - case MALLOC: - stat = pgmalloc(proc, ins.arg_0, ins.arg_1); - break; -#endif - case FREE: -#ifdef MM_PAGING - stat = pgfree_data(proc, ins.arg_0); -#else - stat = free_data(proc, ins.arg_0); -#endif - break; - case READ: -#ifdef MM_PAGING - stat = pgread(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#else - stat = read(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#endif - break; - case WRITE: -#ifdef MM_PAGING - stat = pgwrite(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#else - stat = write(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#endif - break; - default: - stat = 1; - } - return stat; - -} - - diff --git a/ossim_source_code/src/loader.c b/ossim_source_code/src/loader.c deleted file mode 100644 index 5f8e56a..0000000 --- a/ossim_source_code/src/loader.c +++ /dev/null @@ -1,108 +0,0 @@ - -#include "loader.h" -#include -#include -#include - -static uint32_t avail_pid = 1; - -#define OPT_CALC "calc" -#define OPT_ALLOC "alloc" -#define OPT_FREE "free" -#define OPT_READ "read" -#define OPT_WRITE "write" -#ifdef MM_PAGING -#define OPT_MALLOC "malloc" -#endif - -static enum ins_opcode_t get_opcode(char * opt) { - if (!strcmp(opt, OPT_CALC)) { - return CALC; - }else if (!strcmp(opt, OPT_ALLOC)) { - return ALLOC; -#ifdef MM_PAGING - }else if (!strcmp(opt, OPT_MALLOC)) { - return MALLOC; -#endif - }else if (!strcmp(opt, OPT_FREE)) { - return FREE; - }else if (!strcmp(opt, OPT_READ)) { - return READ; - }else if (!strcmp(opt, OPT_WRITE)) { - return WRITE; - }else{ - printf("Opcode: %s\n", opt); - exit(1); - } -} - -struct pcb_t * load(const char * path) { - /* Create new PCB for the new process */ - struct pcb_t * proc = (struct pcb_t * )malloc(sizeof(struct pcb_t)); - proc->pid = avail_pid; - avail_pid++; - proc->page_table = - (struct page_table_t*)malloc(sizeof(struct page_table_t)); - proc->bp = PAGE_SIZE; - proc->pc = 0; - - /* Read process code from file */ - FILE * file; - // printf(path); - if ((file = fopen(path, "r")) == NULL) { - printf("Cannot find process description at '%s'\n", path); - exit(1); - } - char opcode[10]; - proc->code = (struct code_seg_t*)malloc(sizeof(struct code_seg_t)); - fscanf(file, "%u %u", &proc->priority, &proc->code->size); - proc->code->text = (struct inst_t*)malloc( - sizeof(struct inst_t) * proc->code->size - ); - uint32_t i = 0; - for (i = 0; i < proc->code->size; i++) { - fscanf(file, "%s", opcode); - proc->code->text[i].opcode = get_opcode(opcode); - switch(proc->code->text[i].opcode) { - case CALC: - break; - case ALLOC: - fscanf( - file, - "%u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1 - ); - break; -#ifdef MM_PAGING - case MALLOC: - fscanf( - file, - "%u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1 - ); -#endif - case FREE: - fscanf(file, "%u\n", &proc->code->text[i].arg_0); - break; - case READ: - case WRITE: - fscanf( - file, - "%u %u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1, - &proc->code->text[i].arg_2 - ); - break; - default: - printf("Opcode: %s\n", opcode); - exit(1); - } - } - return proc; -} - - - diff --git a/ossim_source_code/src/mem.c b/ossim_source_code/src/mem.c deleted file mode 100644 index 187108f..0000000 --- a/ossim_source_code/src/mem.c +++ /dev/null @@ -1,173 +0,0 @@ - -#include "mem.h" -#include "stdlib.h" -#include "string.h" -#include -#include - -static BYTE _ram[RAM_SIZE]; - -static struct { - uint32_t proc; // ID of process currently uses this page - int index; // Index of the page in the list of pages allocated - // to the process. - int next; // The next page in the list. -1 if it is the last - // page. -} _mem_stat [NUM_PAGES]; - -static pthread_mutex_t mem_lock; - -void init_mem(void) { - memset(_mem_stat, 0, sizeof(*_mem_stat) * NUM_PAGES); - memset(_ram, 0, sizeof(BYTE) * RAM_SIZE); - pthread_mutex_init(&mem_lock, NULL); -} - -/* get offset of the virtual address */ -static addr_t get_offset(addr_t addr) { - return addr & ~((~0U) << OFFSET_LEN); -} - -/* get the first layer index */ -static addr_t get_first_lv(addr_t addr) { - return addr >> (OFFSET_LEN + PAGE_LEN); -} - -/* get the second layer index */ -static addr_t get_second_lv(addr_t addr) { - return (addr >> OFFSET_LEN) - (get_first_lv(addr) << PAGE_LEN); -} - -/* Search for page table table from the a segment table */ -static struct trans_table_t * get_trans_table( - addr_t index, // Segment level index - struct page_table_t * page_table) { // first level table - - /* DO NOTHING HERE. This mem is obsoleted */ - - int i; - for (i = 0; i < page_table->size; i++) { - // Enter your code here - } - return NULL; - -} - -/* Translate virtual address to physical address. If [virtual_addr] is valid, - * return 1 and write its physical counterpart to [physical_addr]. - * Otherwise, return 0 */ -static int translate( - addr_t virtual_addr, // Given virtual address - addr_t * physical_addr, // Physical address to be returned - struct pcb_t * proc) { // Process uses given virtual address - - /* Offset of the virtual address */ - addr_t offset = get_offset(virtual_addr); - offset++; offset--; - /* The first layer index */ - addr_t first_lv = get_first_lv(virtual_addr); - /* The second layer index */ - addr_t second_lv = get_second_lv(virtual_addr); - - /* Search in the first level */ - struct trans_table_t * trans_table = NULL; - trans_table = get_trans_table(first_lv, proc->page_table); - if (trans_table == NULL) { - return 0; - } - - int i; - for (i = 0; i < trans_table->size; i++) { - if (trans_table->table[i].v_index == second_lv) { - /* DO NOTHING HERE. This mem is obsoleted */ - return 1; - } - } - return 0; -} - -addr_t alloc_mem(uint32_t size, struct pcb_t * proc) { - pthread_mutex_lock(&mem_lock); - addr_t ret_mem = 0; - /* DO NOTHING HERE. This mem is obsoleted */ - - uint32_t num_pages = (size % PAGE_SIZE) ? size / PAGE_SIZE : - size / PAGE_SIZE + 1; // Number of pages we will use - int mem_avail = 0; // We could allocate new memory region or not? - - /* First we must check if the amount of free memory in - * virtual address space and physical address space is - * large enough to represent the amount of required - * memory. If so, set 1 to [mem_avail]. - * Hint: check [proc] bit in each page of _mem_stat - * to know whether this page has been used by a process. - * For virtual memory space, check bp (break pointer). - * */ - - if (mem_avail) { - /* We could allocate new memory region to the process */ - ret_mem = proc->bp; - proc->bp += num_pages * PAGE_SIZE; - /* Update status of physical pages which will be allocated - * to [proc] in _mem_stat. Tasks to do: - * - Update [proc], [index], and [next] field - * - Add entries to segment table page tables of [proc] - * to ensure accesses to allocated memory slot is - * valid. */ - } - pthread_mutex_unlock(&mem_lock); - return ret_mem; -} - -int free_mem(addr_t address, struct pcb_t * proc) { - /* DO NOTHING HERE. This mem is obsoleted */ - return 0; -} - -int read_mem(addr_t address, struct pcb_t * proc, BYTE * data) { - addr_t physical_addr; - if (translate(address, &physical_addr, proc)) { - *data = _ram[physical_addr]; - return 0; - }else{ - return 1; - } -} - -int write_mem(addr_t address, struct pcb_t * proc, BYTE data) { - addr_t physical_addr; - if (translate(address, &physical_addr, proc)) { - _ram[physical_addr] = data; - return 0; - }else{ - return 1; - } -} - -void dump(void) { - int i; - for (i = 0; i < NUM_PAGES; i++) { - if (_mem_stat[i].proc != 0) { - printf("%03d: ", i); - printf("%05x-%05x - PID: %02d (idx %03d, nxt: %03d)\n", - i << OFFSET_LEN, - ((i + 1) << OFFSET_LEN) - 1, - _mem_stat[i].proc, - _mem_stat[i].index, - _mem_stat[i].next - ); - int j; - for ( j = i << OFFSET_LEN; - j < ((i+1) << OFFSET_LEN) - 1; - j++) { - - if (_ram[j] != 0) { - printf("\t%05x: %02x\n", j, _ram[j]); - } - - } - } - } -} - - diff --git a/ossim_source_code/src/mm-memphy.c b/ossim_source_code/src/mm-memphy.c deleted file mode 100644 index 880a858..0000000 --- a/ossim_source_code/src/mm-memphy.c +++ /dev/null @@ -1,199 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Memory physical module mm/mm-memphy.c - */ - -#include "mm.h" -#include - -/* - * MEMPHY_mv_csr - move MEMPHY cursor - * @mp: memphy struct - * @offset: offset - */ -int MEMPHY_mv_csr(struct memphy_struct *mp, int offset) -{ - int numstep = 0; - - mp->cursor = 0; - while(numstep < offset && numstep < mp->maxsz){ - /* Traverse sequentially */ - mp->cursor = (mp->cursor + 1) % mp->maxsz; - numstep++; - } - - return 0; -} - -/* - * MEMPHY_seq_read - read MEMPHY device - * @mp: memphy struct - * @addr: address - * @value: obtained value - */ -int MEMPHY_seq_read(struct memphy_struct *mp, int addr, BYTE *value) -{ - if (mp == NULL) - return -1; - - if (!mp->rdmflg) - return -1; /* Not compatible mode for sequential read */ - - MEMPHY_mv_csr(mp, addr); - *value = (BYTE) mp->storage[addr]; - - return 0; -} - -/* - * MEMPHY_read read MEMPHY device - * @mp: memphy struct - * @addr: address - * @value: obtained value - */ -int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value) -{ - if (mp == NULL) - return -1; - - if (mp->rdmflg) - *value = mp->storage[addr]; - else /* Sequential access device */ - return MEMPHY_seq_read(mp, addr, value); - - return 0; -} - -/* - * MEMPHY_seq_write - write MEMPHY device - * @mp: memphy struct - * @addr: address - * @data: written data - */ -int MEMPHY_seq_write(struct memphy_struct * mp, int addr, BYTE value) -{ - - if (mp == NULL) - return -1; - - if (!mp->rdmflg) - return -1; /* Not compatible mode for sequential read */ - - MEMPHY_mv_csr(mp, addr); - mp->storage[addr] = value; - - return 0; -} - -/* - * MEMPHY_write-write MEMPHY device - * @mp: memphy struct - * @addr: address - * @data: written data - */ -int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data) -{ - if (mp == NULL) - return -1; - - if (mp->rdmflg) - mp->storage[addr] = data; - else /* Sequential access device */ - return MEMPHY_seq_write(mp, addr, data); - - return 0; -} - -/* - * MEMPHY_format-format MEMPHY device - * @mp: memphy struct - */ -int MEMPHY_format(struct memphy_struct *mp, int pagesz) -{ - /* This setting come with fixed constant PAGESZ */ - int numfp = mp->maxsz / pagesz; - struct framephy_struct *newfst, *fst; - int iter = 0; - - if (numfp <= 0) - return -1; - - /* Init head of free framephy list */ - fst = malloc(sizeof(struct framephy_struct)); - fst->fpn = iter; - mp->free_fp_list = fst; - - /* We have list with first element, fill in the rest num-1 element member*/ - for (iter = 1; iter < numfp ; iter++) - { - newfst = malloc(sizeof(struct framephy_struct)); - newfst->fpn = iter; - newfst->fp_next = NULL; - fst->fp_next = newfst; - fst = newfst; - } - - return 0; -} - -int MEMPHY_get_freefp(struct memphy_struct *mp, int *retfpn) -{ - struct framephy_struct *fp = mp->free_fp_list; - - if (fp == NULL) - return -1; - - *retfpn = fp->fpn; - mp->free_fp_list = fp->fp_next; - - /* MEMPHY is iteratively used up until its exhausted - * No garbage collector acting then it not been released - */ - free(fp); - - return 0; -} - -int MEMPHY_dump(struct memphy_struct * mp) -{ - /*TODO dump memphy contnt mp->storage - * for tracing the memory content - */ - - return 0; -} - -int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn) -{ - struct framephy_struct *fp = mp->free_fp_list; - struct framephy_struct *newnode = malloc(sizeof(struct framephy_struct)); - - /* Create new node with value fpn */ - newnode->fpn = fpn; - newnode->fp_next = fp; - mp->free_fp_list = newnode; - - return 0; -} - - -/* - * Init MEMPHY struct - */ -int init_memphy(struct memphy_struct *mp, int max_size, int randomflg) -{ - mp->storage = (BYTE *)malloc(max_size*sizeof(BYTE)); - mp->maxsz = max_size; - - MEMPHY_format(mp,PAGING_PAGESZ); - - mp->rdmflg = (randomflg != 0)?1:0; - - if (!mp->rdmflg ) /* Not Ramdom acess device, then it serial device*/ - mp->cursor = 0; - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/mm-vm.c b/ossim_source_code/src/mm-vm.c deleted file mode 100644 index c262322..0000000 --- a/ossim_source_code/src/mm-vm.c +++ /dev/null @@ -1,649 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Virtual memory module mm/mm-vm.c - */ - -#include "string.h" -#include "mm.h" -#include -#include - -/*enlist_vm_freerg_list - add new rg to freerg_list - *@mm: memory region - *@rg_elmt: new region - * - */ -int enlist_vm_freerg_list(struct mm_struct *mm, struct vm_rg_struct rg_elmt) -{ - struct vm_rg_struct *new_node; - struct vm_rg_struct *head = mm->mmap->vm_freerg_list; - - // Check for invalid region - if (rg_elmt.rg_start >= rg_elmt.rg_end) - return -1; - - // Dynamically allocate memory for the new region - new_node = (struct vm_rg_struct *)malloc(sizeof(struct vm_rg_struct)); - if (!new_node) - return -1; // Allocation failed - - // Copy the data into the new node - *new_node = rg_elmt; - new_node->rg_next = head; - - // Update the list head - mm->mmap->vm_freerg_list = new_node; - - return 0; -} - - -/*get_vma_by_num - get vm area by numID - *@mm: memory region - *@vmaid: ID vm area to alloc memory region - * - */ -//get địa chỉ ô vma -struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid) -{ - struct vm_area_struct *pvma= mm->mmap; - - if(mm->mmap == NULL) - return NULL; - - int vmait = 0; - - while (vmait < vmaid) - { - if(pvma == NULL) - return NULL; - - vmait++; - pvma = pvma->vm_next; - } - - return pvma; -} - -/*get_symrg_byid - get mem region by region ID - *@mm: memory region - *@rgid: region ID act as symbol index of variable - * - */ -struct vm_rg_struct *get_symrg_byid(struct mm_struct *mm, int rgid) -{ - if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) - return NULL; - - return &mm->symrgtbl[rgid]; -} - -/*__alloc - allocate a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - *@alloc_addr: address of allocated memory region - * - */ -int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr) -{ - /*Allocate at the toproof */ - struct vm_rg_struct rgnode; - - /* TODO: commit the vmaid */ - rgnode.vmaid = vmaid; - - if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0) - { - //symrgtbl là vm_rg_struct - caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start; - caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end; - - caller->mm->symrgtbl[rgid].vmaid = rgnode.vmaid; - - *alloc_addr = rgnode.rg_start; - - return 0; - } - - /* TODO: get_free_vmrg_area FAILED handle the region management (Fig.6)*/ - if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == -1 ){return -1;} - /* TODO retrive current vma if needed, current comment out due to compiler redundant warning*/ - /*Attempt to increate limit to get space */ - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - int inc_sz = PAGING_PAGE_ALIGNSZ(size); - int inc_limit_ret; - - /* TODO retrive old_sbrk if needed, current comment out due to compiler redundant warning*/ - int old_sbrk = cur_vma->sbrk; - - /* TODO INCREASE THE LIMIT - * inc_vma_limit(caller, vmaid, inc_sz) - */ - if (inc_vma_limit(caller, vmaid, inc_sz, &inc_limit_ret) < 0) return -1; - - cur_vma->sbrk += inc_sz; - /* TODO: commit the limit increment */ - if ( old_sbrk + size > cur_vma -> vm_end ) - { - if ( inc_vma_limit ( caller , vmaid , inc_sz, &inc_limit_ret ) < 0) - { - struct framephy_struct * frm_lst = NULL ; - struct vm_rg_struct * ret_rg = malloc ( sizeof ( struct vm_rg_struct ) ); - int pages = ( inc_sz / PAGING_PAGESZ ); - ret_rg -> rg_start = ret_rg -> rg_end = old_sbrk ; - ret_rg -> rg_next = NULL ; - alloc_pages_range ( caller , pages , & frm_lst ); - vmap_page_range ( caller , old_sbrk , pages , frm_lst , ret_rg ); - caller ->mm -> symrgtbl [ rgid ]. rg_start = ret_rg -> rg_start ; - caller ->mm -> symrgtbl [ rgid ]. rg_end = ret_rg -> rg_end ; - cur_vma -> sbrk += ret_rg -> rg_end - ret_rg -> rg_start ; - return 0; - } - } - - /* Successful increase limit */ - caller ->mm -> symrgtbl [ rgid ]. rg_start = old_sbrk ; - caller ->mm -> symrgtbl [ rgid ]. rg_end = old_sbrk + size ; - /* TODO: commit the allocation address - // *alloc_addr = ... - */ - *alloc_addr = rgnode.rg_start; - - return 0; -} - -/*__free - remove a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __free(struct pcb_t *caller, int rgid) -{ - struct vm_rg_struct rgnode; - - // Dummy initialization for avoding compiler dummay warning - // in incompleted TODO code rgnode will overwrite through implementing - // the manipulation of rgid later - rgnode.vmaid = 0; //dummy initialization - rgnode.vmaid = 1; //dummy initialization - - if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) - return -1; - - /* TODO: Manage the collect freed region to freerg_list */ - struct vm_rg_struct *sym_rg = &caller->mm->symrgtbl[rgid]; - rgnode.rg_start = sym_rg->rg_start; - rgnode.rg_end = sym_rg->rg_end; - rgnode.vmaid = sym_rg->vmaid; - - /*enlist the obsoleted memory region */ - enlist_vm_freerg_list(caller->mm, rgnode); - - return 0; -} - -/*pgalloc - PAGING-based allocate a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify variable in symbole table) - */ -int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) -{ - int addr; - - /* By default using vmaid = 0 */ - return __alloc(proc, 0, reg_index, size, &addr); -} - -/*pgmalloc - PAGING-based allocate a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify vaiable in symbole table) - */ -int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) -{ - int addr; - - /* By default using vmaid = 1 */ - return __alloc(proc, 1, reg_index, size, &addr); -} - -/*pgfree - PAGING-based free a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify variable in symbole table) - */ - -int pgfree_data(struct pcb_t *proc, uint32_t reg_index) -{ - return __free(proc, reg_index); -} - -/*pg_getpage - get the page in ram - *@mm: memory region - *@pagenum: PGN - *@framenum: return FPN - *@caller: caller - * - */ -int pg_getpage(struct mm_struct *mm, int pgn, int *fpn, struct pcb_t *caller) -{ - uint32_t pte = mm->pgd[pgn]; - - if (!PAGING_PTE_PAGE_PRESENT(pte)) - { - // Page không tồn tại, cần đưa vào bộ nhớ - int vicpgn, swpfpn, vicfpn; - uint32_t vicpte; - - int tgtfpn = PAGING_PTE_SWP(pte); // Frame mục tiêu trong swap - - // Tìm victim page - if (find_victim_page(caller->mm, &vicpgn) < 0) - return -1; - - vicpte = caller->mm->pgd[vicpgn]; - vicfpn = PAGING_OFFST(vicpte); - - // Lấy free frame từ MEMSWP - if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) < 0) - { - struct memphy_struct **mswpit = caller->mswp; - for (int i = 0; i < PAGING_MAX_MMSWP; i++) - { - struct memphy_struct *tmp_swp = mswpit[i]; - if (MEMPHY_get_freefp(tmp_swp, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, tmp_swp, swpfpn); - caller->active_mswp = tmp_swp; - break; - } - } - } - else - { - __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); - } - - // Swap frame từ MEMRAM sang MEMSWP và ngược lại - __swap_cp_page(caller->active_mswp, tgtfpn, caller->mram, vicfpn); - - // Cập nhật page table - MEMPHY_put_freefp(caller->active_mswp, tgtfpn); - // swptype = 1 - pte_set_swap(&caller->mm->pgd[vicpgn], 1, swpfpn); - - // Đánh dấu trạng thái online của page mục tiêu - pte_set_fpn(&caller->mm->pgd[pgn], vicfpn); - pte = caller->mm->pgd[pgn]; - - - - *fpn = PAGING_OFFST(pte); - return 0; -} -} - - /* Do swap frame from MEMRAM to MEMSWP and vice versa*/ - /* Copy victim frame to swap */ - //__swap_cp_page(); - /* Copy target frame from swap to mem */ - //__swap_cp_page(); - - /* Update page table */ - //pte_set_swap() &mm->pgd; - - /* Update its online status of the target page */ - //pte_set_fpn() & mm->pgd[pgn]; - // pte_set_fpn(&pte, tgtfpn); - - // enlist_pgn_node(&caller->mm->fifo_pgn,pgn); - // } - - // *fpn = PAGING_PTE_FPN(pte); - - // return 0; - - -/*pg_getval - read value at given offset - *@mm: memory region - *@addr: virtual address to acess - *@value: value - * - */ -int pg_getval(struct mm_struct *mm, int addr, BYTE *data, struct pcb_t *caller) -{ - int pgn = PAGING_PGN(addr); - int off = PAGING_OFFST(addr); - int fpn; - - /* Get the page to MEMRAM, swap from MEMSWAP if needed */ - if(pg_getpage(mm, pgn, &fpn, caller) != 0) - return -1; /* invalid page access */ - - int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; - - MEMPHY_read(caller->mram,phyaddr, data); - - return 0; -} - -/*pg_setval - write value to given offset - *@mm: memory region - *@addr: virtual address to acess - *@value: value - * - */ -int pg_setval(struct mm_struct *mm, int addr, BYTE value, struct pcb_t *caller) -{ - int pgn = PAGING_PGN(addr); - int off = PAGING_OFFST(addr); - int fpn; - - /* Get the page to MEMRAM, swap from MEMSWAP if needed */ - if(pg_getpage(mm, pgn, &fpn, caller) != 0) - return -1; /* invalid page access */ - - int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; - - MEMPHY_write(caller->mram,phyaddr, value); - - return 0; -} - -/*__read - read value in region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@offset: offset to acess in memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data) -{ - struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); - int vmaid = currg->vmaid; - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ - return -1; - - pg_getval(caller->mm, currg->rg_start + offset, data, caller); - - return 0; -} - - -/*pgwrite - PAGING-based read a region memory */ -int pgread( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination) -{ - BYTE data; - int val = __read(proc, source, offset, &data); - - destination = (uint32_t) data; -#ifdef IODUMP - printf("read region=%d offset=%d value=%d\n", source, offset, data); -#ifdef PAGETBL_DUMP - print_pgtbl(proc, 0, -1); //print max TBL -#endif - MEMPHY_dump(proc->mram); -#endif - - return val; -} - -/*__write - write a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@offset: offset to acess in memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __write(struct pcb_t *caller, int rgid, int offset, BYTE value) -{ - struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); - int vmaid = currg->vmaid; - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ - return -1; - - pg_setval(caller->mm, currg->rg_start + offset, value, caller); - - return 0; -} - -/*pgwrite - PAGING-based write a region memory */ -int pgwrite( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset) -{ -#ifdef IODUMP - printf("write region=%d offset=%d value=%d\n", destination, offset, data); -#ifdef PAGETBL_DUMP - print_pgtbl(proc, 0, -1); //print max TBL -#endif - MEMPHY_dump(proc->mram); -#endif - - return __write(proc, destination, offset, data); -} - - -/*free_pcb_memphy - collect all memphy of pcb - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@incpgnum: number of page - */ -int free_pcb_memph(struct pcb_t *caller) -{ - int pagenum, fpn; - uint32_t pte; - - - for(pagenum = 0; pagenum < PAGING_MAX_PGN; pagenum++) - { - pte= caller->mm->pgd[pagenum]; - - if (!PAGING_PTE_PAGE_PRESENT(pte)) - { - fpn = PAGING_PTE_FPN(pte); - MEMPHY_put_freefp(caller->mram, fpn); - } else { - fpn = PAGING_PTE_SWP(pte); - MEMPHY_put_freefp(caller->active_mswp, fpn); - } - } - - return 0; -} - -/*get_vm_area_node - get vm area for a number of pages - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@incpgnum: number of page - *@vmastart: vma end - *@vmaend: vma end - * - */ -struct vm_rg_struct* get_vm_area_node_at_brk(struct pcb_t *caller, int vmaid, int size, int alignedsz) -{ - struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct));; - /* TODO retrive current vma to obtain newrg, current comment out due to compiler redundant warning*/ - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - /* TODO: update the newrg boundary - // newrg->rg_start = ... - // newrg->rg_end = ... - */ - - newrg->rg_start = cur_vma -> sbrk; - - if ( (cur_vma ->sbrk + alignedsz) > cur_vma -> vm_end ) return newrg = cur_vma -> sbrk; -cur_vma ->sbrk = cur_vma->sbrk + alignedsz; - - newrg->rg_end = cur_vma -> sbrk; - -return newrg; -} - -/*validate_overlap_vm_area - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@vmastart: vma end - *@vmaend: vma end - * - */ -int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend) -{ - struct vm_area_struct *vma = caller->mm->mmap; - - /* TODO validate the planned memory area is not overlapped */ - while(vma != NULL) - { - - if ((vmastart >= vma->vm_start && vmastart < vma->vm_end) || (vmastart <= vma->vm_start && vmaend >= vma->vm_end)) - { - return -1; - } - vma = vma->vm_next; - } - return 0; -} - -/*inc_vma_limit - increase vm area limits to reserve space for new variable - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@inc_sz: increment size - *@inc_limit_ret: increment limit return - * - */ -int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret) -{ - struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct)); - int inc_amt = PAGING_PAGE_ALIGNSZ(inc_sz); - int incnumpage = inc_amt / PAGING_PAGESZ; - struct vm_rg_struct *area = get_vm_area_node_at_brk(caller, vmaid, inc_sz, inc_amt); - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - int old_end = cur_vma->vm_end; - - /*Validate overlap of obtained region */ - if (validate_overlap_vm_area(caller, vmaid, area->rg_start, area->rg_end) < 0) - return -1; /*Overlap and failed allocation */ - - /* TODO: Obtain the new vm area based on vmaid */ - cur_vma->sbrk = area -> rg_start; - - - if (vm_map_ram(caller, area->rg_start, area->rg_end, - old_end, incnumpage , newrg) < 0) - return -1; /* Map the memory to MEMRAM */ - inc_limit_ret = cur_vma->vm_end + inc_sz; - return 0; - -} - -/*find_victim_page - find victim page - *@caller: caller - *@pgn: return page number - * - */ -int find_victim_page(struct mm_struct *mm, int *retpgn) -{ - struct pgn_t *pg = mm->fifo_pgn; - - /* TODO: Implement the theorical mechanism to find the victim page */ - if (pg == NULL) return -1; - - *retpgn = pg->pgn; - - mm->fifo_pgn = pg->pg_next; - - free(pg); - - return 0; -} - -/*get_free_vmrg_area - get a free vm region - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@size: allocated size - * - */ -int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg) -{ - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - struct vm_rg_struct *rgit = cur_vma->vm_freerg_list; - - if (rgit == NULL) - return -1; - - /* Probe unintialized newrg */ - newrg->rg_start = newrg->rg_end = -1; - - /* Traverse on list of free vm region to find a fit space */ - //check điều kiện bịp - while (rgit != NULL && rgit->vmaid == vmaid) - { - if (rgit->rg_start + size <= rgit->rg_end) - { /* Current region has enough space */ - newrg->rg_start = rgit->rg_start; - newrg->rg_end = rgit->rg_start + size; - - /* Update left space in chosen region */ - if (rgit->rg_start + size < rgit->rg_end) - { - rgit->rg_start = rgit->rg_start + size; - } - else - { /*Use up all space, remove current node */ - /*Clone next rg node */ - struct vm_rg_struct *nextrg = rgit->rg_next; - - /*Cloning */ - if (nextrg != NULL) - { - rgit->rg_start = nextrg->rg_start; - rgit->rg_end = nextrg->rg_end; - - rgit->rg_next = nextrg->rg_next; - - free(nextrg); - } - else - { /*End of free list */ - rgit->rg_start = rgit->rg_end; //dummy, size 0 region - rgit->rg_next = NULL; - } - } - } - else - { - rgit = rgit->rg_next; // Traverse next rg - } - } - - if(newrg->rg_start == -1) // new region not found - return -1; - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/mm.c b/ossim_source_code/src/mm.c deleted file mode 100644 index 5071151..0000000 --- a/ossim_source_code/src/mm.c +++ /dev/null @@ -1,458 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Memory management unit mm/mm.c - */ - -#include "mm.h" -#include -#include - -/* - * init_pte - Initialize PTE entry - */ -int init_pte(uint32_t *pte, - int pre, // present - int fpn, // FPN - int drt, // dirty - int swp, // swap - int swptyp, // swap type - int swpoff) //swap offset -{ - if (pre != 0) { - if (swp == 0) { // Non swap ~ page online - if (fpn == 0) - return -1; // Invalid setting - - /* Valid setting with FPN */ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); - CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); - - SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); - } else { // page swapped - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); - CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); - - SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); - SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); - } - } - - return 0; -} - -/* - * pte_set_swap - Set PTE entry for swapped page - * @pte : target page table entry (PTE) - * @swptyp : swap type - * @swpoff : swap offset - */ -int pte_set_swap(uint32_t *pte, int swptyp, int swpoff) -{ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); - - SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); - SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); - - return 0; -} - -/* - * pte_set_swap - Set PTE entry for on-line page - * @pte : target page table entry (PTE) - * @fpn : frame page number (FPN) - */ -int pte_set_fpn(uint32_t *pte, int fpn) -{ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); - - SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); - - return 0; -} - - -/* - * vmap_page_range - map a range of page at aligned address - */ -int vmap_page_range(struct pcb_t *caller, // process call - int addr, // start address which is aligned to pagesz - int pgnum, // num of mapping page - struct framephy_struct *frames,// list of the mapped frames - struct vm_rg_struct *ret_rg)// return mapped region, the real mapped fp -{ // no guarantee all given pages are mapped - //uint32_t * pte = malloc(sizeof(uint32_t)); - struct framephy_struct *fpit = malloc(sizeof(struct framephy_struct)); - //int fpn; - int pgit = 0; - int pgn = PAGING_PGN(addr); - - /* TODO: update the rg_end and rg_start of ret_rg - //ret_rg->rg_end = .... - //ret_rg->rg_start = ... - //ret_rg->vmaid = ... - */ - ret_rg -> rg_end = ret_rg -> rg_start = addr ; - - fpit->fp_next = frames; - - /* TODO map range of frame to address space - * in page table pgd in caller->mm - */ - - /* Tracking for later page replacement activities (if needed) - * Enqueue new usage page */ - while ( pgit < pgnum ) - { - if ( fpit == NULL ) - { - break ; - } - pgn = PAGING_PGN ( addr + pgnum * PAGING_PAGESZ ); - pte_set_fpn (&( caller ->mm -> pgd [ pgn ]) , fpit -> fpn ) ; - enlist_pgn_node (& caller -> mm -> fifo_pgn , pgn + pgit ) ; - fpit = fpit -> fp_next ; - } - ret_rg -> rg_end += pgit * PAGING_PAGESZ ; - return 0; - -} - -/* - * alloc_pages_range - allocate req_pgnum of frame in ram - * @caller : caller - * @req_pgnum : request page num - * @frm_lst : frame list - */ - -int alloc_pages_range(struct pcb_t *caller, int req_pgnum, struct framephy_struct** frm_lst) -{ - int pgit, fpn; - struct framephy_struct *newfp_str; - - for (pgit = 0; pgit < req_pgnum; pgit++) - { - if (MEMPHY_get_freefp(caller->mram, &fpn) == 0) - { - newfp_str = malloc(sizeof(struct framephy_struct)); - newfp_str->fpn = fpn; - newfp_str->owner = caller->mm; - newfp_str->fp_next = NULL; - - if (!*frm_lst) - { - *frm_lst = newfp_str; - } - else - { - newfp_str->fp_next = *frm_lst; - *frm_lst = newfp_str; - } - - struct framephy_struct *temp = malloc(sizeof(struct framephy_struct)); - *temp = *newfp_str; - temp->fp_next = caller->mram->used_fp_list; - caller->mram->used_fp_list = temp; - } - else - { - // ERROR CODE of obtaining some but not enough frames - int vicfpn, vicpgn, swpfpn; - uint32_t vicpte; - - if (find_victim_page(caller->mm, &vicpgn) < 0) - { - return -1; - } - - vicpte = caller->mm->pgd[vicpgn]; - vicfpn = PAGING_OFFST(vicpte); - - newfp_str = malloc(sizeof(struct framephy_struct)); - newfp_str->fpn = vicfpn; - newfp_str->owner = caller->mm; - newfp_str->fp_next = NULL; - - if (!*frm_lst) - { - *frm_lst = newfp_str; - } - else - { - newfp_str->fp_next = *frm_lst; - *frm_lst = newfp_str; - } - - int i; - if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); - struct memphy_struct *mswp = *caller->mswp; - for (i = 0; i < PAGING_MAX_MMSWP; i++) - { - if (mswp + i == caller->active_mswp) break; - } - } - else - { - struct memphy_struct *mswp = *caller->mswp; - swpfpn = -1; - for (i = 0; i < PAGING_MAX_MMSWP; i++) - { - if (MEMPHY_get_freefp(mswp + i, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, mswp + i, swpfpn); - break; - } - } - } - - if (swpfpn == -1) - return -3000; - - pte_set_swap(&caller->mm->pgd[vicpgn], i, swpfpn); - } - } - - return 0; -} - - - -/* - * vm_map_ram - do the mapping all vm are to ram storage device - * @caller : caller - * @astart : vm area start - * @aend : vm area end - * @mapstart : start mapping point - * @incpgnum : number of mapped page - * @ret_rg : returned region - */ -int vm_map_ram(struct pcb_t *caller, int astart, int aend, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg) -{ - struct framephy_struct *frm_lst = NULL; - int ret_alloc; - - /*@bksysnet: author provides a feasible solution of getting frames - *FATAL logic in here, wrong behaviour if we have not enough page - *i.e. we request 1000 frames meanwhile our RAM has size of 3 frames - *Don't try to perform that case in this simple work, it will result - *in endless procedure of swap-off to get frame and we have not provide - *duplicate control mechanism, keep it simple - */ - ret_alloc = alloc_pages_range(caller, incpgnum, &frm_lst); - - if (ret_alloc < 0 && ret_alloc != -3000) - return -1; - - /* Out of memory */ - if (ret_alloc == -3000) - { -#ifdef MMDBG - printf("OOM: vm_map_ram out of memory \n"); -#endif - return -1; - } - - /* it leaves the case of memory is enough but half in ram, half in swap - * do the swaping all to swapper to get the all in ram */ - vmap_page_range(caller, mapstart, incpgnum, frm_lst, ret_rg); - - return 0; -} - -/* Swap copy content page from source frame to destination frame - * @mpsrc : source memphy - * @srcfpn : source physical page number (FPN) - * @mpdst : destination memphy - * @dstfpn : destination physical page number (FPN) - **/ -int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, - struct memphy_struct *mpdst, int dstfpn) -{ - int cellidx; - int addrsrc,addrdst; - for(cellidx = 0; cellidx < PAGING_PAGESZ; cellidx++) - { - addrsrc = srcfpn * PAGING_PAGESZ + cellidx; - addrdst = dstfpn * PAGING_PAGESZ + cellidx; - - BYTE data; - MEMPHY_read(mpsrc, addrsrc, &data); - MEMPHY_write(mpdst, addrdst, data); - } - - return 0; -} - -/* - *Initialize a empty Memory Management instance - * @mm: self mm - * @caller: mm owner - */ -int init_mm(struct mm_struct *mm, struct pcb_t *caller) -{ - struct vm_area_struct *vma0 = malloc(sizeof(struct vm_area_struct)); - struct vm_area_struct *vma1 = malloc(sizeof(struct vm_area_struct)); - - mm->pgd = malloc(PAGING_MAX_PGN * sizeof(uint32_t)); - - /* By default the owner comes with at least one vma for DATA */ - vma0->vm_id = 0; - vma0->vm_start = 0; - vma0->vm_end = vma0->vm_start; - vma0->sbrk = vma0->vm_start; - - struct vm_rg_struct *first_rg = init_vm_rg(vma0->vm_start, vma0->vm_end, 0); - enlist_vm_rg_node(&vma0->vm_freerg_list, first_rg); - - /* Update vma0 next */ - vma0->vm_next = vma1; // Assuming vma1 is the next VM area - - /* Update one vma for HEAP */ - vma1->vm_id = 1; // Assuming ID for heap - // vma1->vm_start = HEAP_START; // Define an appropriate start address for the heap - //vma1->vm_end = HEAP_END; // Define the end address for the heap - vma1->sbrk = vma1->vm_start; - - struct vm_rg_struct *first_rg_heap = init_vm_rg(vma1->vm_start, vma1->vm_end, 0); - enlist_vm_rg_node(&vma1->vm_freerg_list, first_rg_heap); - - /* Set next for vma1 */ - vma1->vm_next = NULL; // Assuming it's the last one in the list for now - - /* Point vma owner backward */ - vma0->vm_mm = mm; - vma1->vm_mm = mm; - - /* Update mmap */ - mm->mmap = vma0; // Start the mmap list with vma0 - - return 0; -} - - -struct vm_rg_struct* init_vm_rg(int rg_start, int rg_end, int vmaid) -{ - struct vm_rg_struct *rgnode = malloc(sizeof(struct vm_rg_struct)); - - rgnode->rg_start = rg_start; - rgnode->rg_end = rg_end; - rgnode->vmaid = vmaid; - rgnode->rg_next = NULL; - - return rgnode; -} - -int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode) -{ - rgnode->rg_next = *rglist; - *rglist = rgnode; - - return 0; -} - -int enlist_pgn_node(struct pgn_t **plist, int pgn) -{ - struct pgn_t* pnode = malloc(sizeof(struct pgn_t)); - - pnode->pgn = pgn; - pnode->pg_next = *plist; - *plist = pnode; - - return 0; -} - -int print_list_fp(struct framephy_struct *ifp) -{ - struct framephy_struct *fp = ifp; - - printf("print_list_fp: "); - if (fp == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (fp != NULL ) - { - printf("fp[%d]\n",fp->fpn); - fp = fp->fp_next; - } - printf("\n"); - return 0; -} - -int print_list_rg(struct vm_rg_struct *irg) -{ - struct vm_rg_struct *rg = irg; - - printf("print_list_rg: "); - if (rg == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (rg != NULL) - { - printf("rg[%ld->%ldvma=%d]\n",rg->rg_start, rg->rg_end, rg->vmaid); - rg = rg->rg_next; - } - printf("\n"); - return 0; -} - -int print_list_vma(struct vm_area_struct *ivma) -{ - struct vm_area_struct *vma = ivma; - - printf("print_list_vma: "); - if (vma == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (vma != NULL ) - { - printf("va[%ld->%ld]\n",vma->vm_start, vma->vm_end); - vma = vma->vm_next; - } - printf("\n"); - return 0; -} - -int print_list_pgn(struct pgn_t *ip) -{ - printf("print_list_pgn: "); - if (ip == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (ip != NULL ) - { - printf("va[%d]-\n",ip->pgn); - ip = ip->pg_next; - } - printf("n"); - return 0; -} - -int print_pgtbl(struct pcb_t *caller, uint32_t start, uint32_t end) -{ - int pgn_start,pgn_end; - int pgit; - - if(end == -1){ - pgn_start = 0; - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, 0); - end = cur_vma->vm_end; - } - pgn_start = PAGING_PGN(start); - pgn_end = PAGING_PGN(end); - - printf("print_pgtbl: %d - %d", start, end); - if (caller == NULL) {printf("NULL caller\n"); return -1;} - printf("\n"); - - - for(pgit = pgn_start; pgit < pgn_end; pgit++) - { - printf("%08ld: %08x\n", pgit * sizeof(uint32_t), caller->mm->pgd[pgit]); - } - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/os.c b/ossim_source_code/src/os.c deleted file mode 100644 index 288a3c1..0000000 --- a/ossim_source_code/src/os.c +++ /dev/null @@ -1,292 +0,0 @@ - -#include "cpu.h" -#include "timer.h" -#include "sched.h" -#include "loader.h" -#include "mm.h" - -#include -#include -#include -#include - -static int time_slot; -static int num_cpus; -static int done = 0; - -#ifdef MM_PAGING -static int memramsz; -static int memswpsz[PAGING_MAX_MMSWP]; -#ifdef MM_PAGING_HEAP_GODOWN -static int vmemsz; -#endif - -struct mmpaging_ld_args { - /* A dispatched argument struct to compact many-fields passing to loader */ - int vmemsz; - struct memphy_struct *mram; - struct memphy_struct **mswp; - struct memphy_struct *active_mswp; - struct timer_id_t *timer_id; -}; -#endif - -static struct ld_args{ - char ** path; - unsigned long * start_time; -#ifdef MLQ_SCHED - unsigned long * prio; -#endif -} ld_processes; -int num_processes; - -struct cpu_args { - struct timer_id_t * timer_id; - int id; -}; - - -static void * cpu_routine(void * args) { - struct timer_id_t * timer_id = ((struct cpu_args*)args)->timer_id; - int id = ((struct cpu_args*)args)->id; - /* Check for new process in ready queue */ - int time_left = 0; - struct pcb_t * proc = NULL; - while (1) { - /* Check the status of current process */ - if (proc == NULL) { - /* No process is running, the we load new process from - * ready queue */ - proc = get_proc(); - if (proc == NULL) { - next_slot(timer_id); - continue; /* First load failed. skip dummy load */ - } - }else if (proc->pc == proc->code->size) { - /* The porcess has finish it job */ - printf("\tCPU %d: Processed %2d has finished\n", - id ,proc->pid); - free(proc); - proc = get_proc(); - time_left = 0; - }else if (time_left == 0) { - /* The process has done its job in current time slot */ - printf("\tCPU %d: Put process %2d to run queue\n", - id, proc->pid); - put_proc(proc); - proc = get_proc(); - } - - /* Recheck process status after loading new process */ - if (proc == NULL && done) { - /* No process to run, exit */ - printf("\tCPU %d stopped\n", id); - break; - }else if (proc == NULL) { - /* There may be new processes to run in - * next time slots, just skip current slot */ - next_slot(timer_id); - continue; - }else if (time_left == 0) { - printf("\tCPU %d: Dispatched process %2d\n", - id, proc->pid); - time_left = time_slot; - } - - /* Run current process */ - run(proc); - time_left--; - next_slot(timer_id); - } - detach_event(timer_id); - pthread_exit(NULL); -} - -static void * ld_routine(void * args) { -#ifdef MM_PAGING - struct memphy_struct* mram = ((struct mmpaging_ld_args *)args)->mram; - struct memphy_struct** mswp = ((struct mmpaging_ld_args *)args)->mswp; - struct memphy_struct* active_mswp = ((struct mmpaging_ld_args *)args)->active_mswp; - struct timer_id_t * timer_id = ((struct mmpaging_ld_args *)args)->timer_id; -#else - struct timer_id_t * timer_id = (struct timer_id_t*)args; -#endif - int i = 0; - printf("ld_routine\n"); - while (i < num_processes) { - struct pcb_t * proc = load(ld_processes.path[i]); -#ifdef MLQ_SCHED - proc->prio = ld_processes.prio[i]; -#endif - while (current_time() < ld_processes.start_time[i]) { - next_slot(timer_id); - } -#ifdef MM_PAGING - proc->mm = malloc(sizeof(struct mm_struct)); -#ifdef MM_PAGING_HEAP_GODOWN - proc->vmemsz = vmemsz; -#endif - init_mm(proc->mm, proc); - proc->mram = mram; - proc->mswp = mswp; - proc->active_mswp = active_mswp; -#endif - printf("\tLoaded a process at %s, PID: %d PRIO: %ld\n", - ld_processes.path[i], proc->pid, ld_processes.prio[i]); - add_proc(proc); - free(ld_processes.path[i]); - i++; - next_slot(timer_id); - } - free(ld_processes.path); - free(ld_processes.start_time); - done = 1; - detach_event(timer_id); - pthread_exit(NULL); -} - -static void read_config(const char * path) { - FILE * file; - if ((file = fopen(path, "r")) == NULL) { - printf("Cannot find configure file at %s\n", path); - exit(1); - } - fscanf(file, "%d %d %d\n", &time_slot, &num_cpus, &num_processes); - - ld_processes.path = (char**)malloc(sizeof(char*) * num_processes); - ld_processes.start_time = (unsigned long*) - malloc(sizeof(unsigned long) * num_processes); -#ifdef MM_PAGING - int sit; -#ifdef MM_FIXED_MEMSZ - /* We provide here a back compatible with legacy OS simulatiom config file - * In which, it have no addition config line for Mema, keep only one line - * for legacy info - * [time slice] [N = Number of CPU] [M = Number of Processes to be run] - */ - memramsz = 0x100000; - memswpsz[0] = 0x1000000; - for(sit = 1; sit < PAGING_MAX_MMSWP; sit++) - memswpsz[sit] = 0; - -#ifdef MM_PAGING_HEAP_GODOWN - vmemsz = 0x300000; -#endif -#else - /* Read input config of memory size: MEMRAM and upto 4 MEMSWP (mem swap) - * Format: (size=0 result non-used memswap, must have RAM and at least 1 SWAP) - * MEM_RAM_SZ MEM_SWP0_SZ MEM_SWP1_SZ MEM_SWP2_SZ MEM_SWP3_SZ - */ - fscanf(file, "%d\n", &memramsz); - for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) - fscanf(file, "%d", &(memswpsz[sit])); -#ifdef MM_PAGING_HEAP_GODOWN - fscanf(file, "%d\n", &vmemsz); -#endif - fscanf(file, "\n"); /* Final character */ -#endif -#endif - -#ifdef MLQ_SCHED - ld_processes.prio = (unsigned long*) - malloc(sizeof(unsigned long) * num_processes); -#endif - int i; - for (i = 0; i < num_processes; i++) { - ld_processes.path[i] = (char*)malloc(sizeof(char) * 100); - ld_processes.path[i][0] = '\0'; - strcat(ld_processes.path[i], "input/proc/"); - char proc[100]; -#ifdef MLQ_SCHED - fscanf(file, "%lu %s %lu\n", &ld_processes.start_time[i], proc, &ld_processes.prio[i]); -#else - fscanf(file, "%lu %s\n", &ld_processes.start_time[i], proc); -#endif - strcat(ld_processes.path[i], proc); - } -} - -int main(int argc, char * argv[]) { - /* Read config */ - if (argc != 2) { - printf("Usage: os [path to configure file]\n"); - return 1; - } - char path[100]; - path[0] = '\0'; - strcat(path, "input/"); - strcat(path, argv[1]); - - read_config(path); - - pthread_t * cpu = (pthread_t*)malloc(num_cpus * sizeof(pthread_t)); - struct cpu_args * args = - (struct cpu_args*)malloc(sizeof(struct cpu_args) * num_cpus); - pthread_t ld; - - /* Init timer */ - int i; - for (i = 0; i < num_cpus; i++) { - args[i].timer_id = attach_event(); - args[i].id = i; - } - struct timer_id_t * ld_event = attach_event(); - start_timer(); - -#ifdef MM_PAGING - /* Init all MEMPHY include 1 MEMRAM and n of MEMSWP */ - int rdmflag = 1; /* By default memphy is RANDOM ACCESS MEMORY */ - - struct memphy_struct mram; - struct memphy_struct mswp[PAGING_MAX_MMSWP]; - - /* Create MEM RAM */ - init_memphy(&mram, memramsz, rdmflag); - - /* Create all MEM SWAP */ - int sit; - for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) - init_memphy(&mswp[sit], memswpsz[sit], rdmflag); - - /* In Paging mode, it needs passing the system mem to each PCB through loader*/ - struct mmpaging_ld_args *mm_ld_args = malloc(sizeof(struct mmpaging_ld_args)); - - mm_ld_args->timer_id = ld_event; - mm_ld_args->mram = (struct memphy_struct *) &mram; - mm_ld_args->mswp = (struct memphy_struct**) &mswp; -#ifdef MM_PAGING_HEAP_GODOWN - mm_ld_args->vmemsz = vmemsz; -#endif - mm_ld_args->active_mswp = (struct memphy_struct *) &mswp[0]; -#endif - - - /* Init scheduler */ - init_scheduler(); - - /* Run CPU and loader */ -#ifdef MM_PAGING - pthread_create(&ld, NULL, ld_routine, (void*)mm_ld_args); -#else - pthread_create(&ld, NULL, ld_routine, (void*)ld_event); -#endif - for (i = 0; i < num_cpus; i++) { - pthread_create(&cpu[i], NULL, - cpu_routine, (void*)&args[i]); - } - - /* Wait for CPU and loader finishing */ - for (i = 0; i < num_cpus; i++) { - pthread_join(cpu[i], NULL); - } - pthread_join(ld, NULL); - - /* Stop timer */ - stop_timer(); - - return 0; - -} - - - diff --git a/ossim_source_code/src/paging.c b/ossim_source_code/src/paging.c deleted file mode 100644 index b061019..0000000 --- a/ossim_source_code/src/paging.c +++ /dev/null @@ -1,18 +0,0 @@ - -#include "mem.h" -#include "cpu.h" -#include "loader.h" -#include - -int main() { - struct pcb_t * ld = load("input/p0"); - struct pcb_t * proc = load("input/p0"); - unsigned int i; - for (i = 0; i < proc->code->size; i++) { - run(proc); - run(ld); - } - dump(); - return 0; -} - diff --git a/ossim_source_code/src/queue.c b/ossim_source_code/src/queue.c deleted file mode 100644 index 6273086..0000000 --- a/ossim_source_code/src/queue.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include "queue.h" - -int empty(struct queue_t * q) { - if (q == NULL) return 1; - return (q->size == 0); -} - -void enqueue(struct queue_t * q, struct pcb_t * proc) { - /* TODO: put a new process to queue [q] */ - if (q->size > MAX_QUEUE_SIZE){ - return; - } - else if (!q->size){ - q->proc[0] = proc; - q->size++; - } - else { - int index = q->size; - while (index > 0 && q->proc[index - 1]->priority > proc->priority){ - q->proc[index] = q->proc[index - 1]; - index--; - } - - q->proc[index] = proc; - q->size++; - } - -} - -struct pcb_t * dequeue(struct queue_t * q) { - /* TODO: return a pcb whose prioprity is the highest - * in the queue [q] and remember to remove it from q - * */ - struct pcb_t * result = NULL; - if (q->proc[0] != NULL){ - result = q->proc[0]; - - for (int i = 0; i < q->size - 1; i++){ - q->proc[i] = q->proc[i + 1]; - } - q->proc[q->size - 1] = NULL; - q->size--; - - } - return result; -} - diff --git a/ossim_source_code/src/sched.c b/ossim_source_code/src/sched.c deleted file mode 100644 index c4d5ce2..0000000 --- a/ossim_source_code/src/sched.c +++ /dev/null @@ -1,140 +0,0 @@ - -#include "queue.h" -#include "sched.h" -#include - -#include -#include -static struct queue_t ready_queue; -static struct queue_t run_queue; -static pthread_mutex_t queue_lock; - -#ifdef MLQ_SCHED -static struct queue_t mlq_ready_queue[MAX_PRIO]; -#endif - -int queue_empty(void) { -#ifdef MLQ_SCHED - unsigned long prio; - for (prio = 0; prio < MAX_PRIO; prio++) - if(!empty(&mlq_ready_queue[prio])) - return -1; -#endif - return (empty(&ready_queue) && empty(&run_queue)); -} - -void init_scheduler(void) { -#ifdef MLQ_SCHED - int i ; - - for (i = 0; i < MAX_PRIO; i ++) - mlq_ready_queue[i].size = 0; -#endif - ready_queue.size = 0; - run_queue.size = 0; - pthread_mutex_init(&queue_lock, NULL); -} - -#ifdef MLQ_SCHED -/* - * Stateful design for routine calling - * based on the priority and our MLQ policy - * We implement stateful here using transition technique - * State representation prio = 0 .. MAX_PRIO, curr_slot = 0..(MAX_PRIO - prio) - */ -struct pcb_t * get_mlq_proc(void) { - struct pcb_t * proc = NULL; - /*TODO: get a process from PRIORITY [ready_queue]. - * Remember to use lock to protect the queue. - * */ - //int curr_slot = 0; - pthread_mutex_lock(&queue_lock); - int prio; - - for (prio = 0; prio < MAX_PRIO; prio++){ - if (mlq_ready_queue[prio].size != 0 && mlq_ready_queue[prio].count_slot < MAX_PRIO - prio){ - proc = dequeue(&mlq_ready_queue[prio]); - mlq_ready_queue[prio].count_slot++; - break; - } - } - - if (prio == MAX_PRIO) { - for (int i = 0; i < MAX_PRIO; i++){ - mlq_ready_queue[i].count_slot = 0; - } - - for (int i = 0; i < MAX_PRIO; i++){ - if (mlq_ready_queue[i].size != 0 && mlq_ready_queue[i].count_slot < MAX_PRIO - i){ - proc = dequeue(&mlq_ready_queue[i]); - mlq_ready_queue[i].count_slot++; - break; - } - } - } - - // while (prio < MAX_PRIO){ - // curr_slot = MAX_PRIO - prio; - // if (!empty(&mlq_ready_queue[prio]) && mlq_ready_queue[prio].count_slot < curr_slot){ - // proc = dequeue(&mlq_ready_queue[prio]); - // curr_slot--; - // break; - // } - // else{ - // prio = (prio + 1) % MAX_PRIO; - // curr_slot = 0; - // } - // } - pthread_mutex_unlock(&queue_lock); - return proc; -} - -void put_mlq_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&mlq_ready_queue[proc->prio], proc); - pthread_mutex_unlock(&queue_lock); -} - -void add_mlq_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&mlq_ready_queue[proc->prio], proc); - pthread_mutex_unlock(&queue_lock); -} - -struct pcb_t * get_proc(void) { - return get_mlq_proc(); -} - -void put_proc(struct pcb_t * proc) { - return put_mlq_proc(proc); -} - -void add_proc(struct pcb_t * proc) { - return add_mlq_proc(proc); -} -#else -struct pcb_t * get_proc(void) { - struct pcb_t * proc = NULL; - /*TODO: get a process from [ready_queue]. - * Remember to use lock to protect the queue. - * */ - pthread_mutex_lock(&queue_lock); - dequeue(&ready_queue); - pthread_mutex_unlock(&queue_lock); - return proc; -} - -void put_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&run_queue, proc); - pthread_mutex_unlock(&queue_lock); -} - -void add_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&ready_queue, proc); - pthread_mutex_unlock(&queue_lock); -} -#endif - - diff --git a/ossim_source_code/src/timer.c b/ossim_source_code/src/timer.c deleted file mode 100644 index 02c4111..0000000 --- a/ossim_source_code/src/timer.c +++ /dev/null @@ -1,136 +0,0 @@ - -#include "timer.h" -#include -#include - -static pthread_t _timer; - -struct timer_id_container_t { - struct timer_id_t id; - struct timer_id_container_t * next; -}; - -static struct timer_id_container_t * dev_list = NULL; - -static uint64_t _time; - -static int timer_started = 0; -static int timer_stop = 0; - - -static void * timer_routine(void * args) { - while (!timer_stop) { - printf("Time slot %3lu\n", current_time()); - int fsh = 0; - int event = 0; - /* Wait for all devices have done the job in current - * time slot */ - struct timer_id_container_t * temp; - for (temp = dev_list; temp != NULL; temp = temp->next) { - pthread_mutex_lock(&temp->id.event_lock); - while (!temp->id.done && !temp->id.fsh) { - pthread_cond_wait( - &temp->id.event_cond, - &temp->id.event_lock - ); - } - if (temp->id.fsh) { - fsh++; - } - event++; - pthread_mutex_unlock(&temp->id.event_lock); - } - - /* Increase the time slot */ - _time++; - - /* Let devices continue their job */ - for (temp = dev_list; temp != NULL; temp = temp->next) { - pthread_mutex_lock(&temp->id.timer_lock); - temp->id.done = 0; - pthread_cond_signal(&temp->id.timer_cond); - pthread_mutex_unlock(&temp->id.timer_lock); - } - if (fsh == event) { - break; - } - } - pthread_exit(args); -} - -void next_slot(struct timer_id_t * timer_id) { - /* Tell to timer that we have done our job in current slot */ - pthread_mutex_lock(&timer_id->event_lock); - timer_id->done = 1; - pthread_cond_signal(&timer_id->event_cond); - pthread_mutex_unlock(&timer_id->event_lock); - - /* Wait for going to next slot */ - pthread_mutex_lock(&timer_id->timer_lock); - while (timer_id->done) { - pthread_cond_wait( - &timer_id->timer_cond, - &timer_id->timer_lock - ); - } - pthread_mutex_unlock(&timer_id->timer_lock); -} - -uint64_t current_time() { - return _time; -} - -void start_timer() { - timer_started = 1; - pthread_create(&_timer, NULL, timer_routine, NULL); -} - -void detach_event(struct timer_id_t * event) { - pthread_mutex_lock(&event->event_lock); - event->fsh = 1; - pthread_cond_signal(&event->event_cond); - pthread_mutex_unlock(&event->event_lock); -} - -struct timer_id_t * attach_event() { - if (timer_started) { - return NULL; - }else{ - struct timer_id_container_t * container = - (struct timer_id_container_t*)malloc( - sizeof(struct timer_id_container_t) - ); - container->id.done = 0; - container->id.fsh = 0; - pthread_cond_init(&container->id.event_cond, NULL); - pthread_mutex_init(&container->id.event_lock, NULL); - pthread_cond_init(&container->id.timer_cond, NULL); - pthread_mutex_init(&container->id.timer_lock, NULL); - if (dev_list == NULL) { - dev_list = container; - dev_list->next = NULL; - }else{ - container->next = dev_list; - dev_list = container; - } - return &(container->id); - } -} - -void stop_timer() { - timer_stop = 1; - pthread_join(_timer, NULL); - while (dev_list != NULL) { - struct timer_id_container_t * temp = dev_list; - dev_list = dev_list->next; - pthread_cond_destroy(&temp->id.event_cond); - pthread_mutex_destroy(&temp->id.event_lock); - pthread_cond_destroy(&temp->id.timer_cond); - pthread_mutex_destroy(&temp->id.timer_lock); - free(temp); - } -} - - - - From 3ef8496103cb27eca036efc7d3c0c65487f373da Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:52:43 +0700 Subject: [PATCH 4/9] Update .DS_Store --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 738a00003a32cfb30f4e54d01c49605913353202..46cc050947f8c4422ae2d16386667947ed2de4a4 100644 GIT binary patch delta 86 zcmZoMXfc=|#>CJzu~2NHo}wrt0|NsP3otPFGPpA6G2}9&c;-wjRNtJ*Jdb7b2IhNA lo7p+|Ie;2AFJ%7CJeglamlLGt01z`ww&9W993!%X831RJ6iWaA delta 440 zcmZoMXfc=|#>B)qu~2NHo}wrV0|Nsi1A_nqLoP!+Loq`>Ln%Yi#)Hcl>p?PtKz=b0 zW+KZnBr~J})g}YwQW#P_bMljua`Kaas)2?uI0CWWe=q>Dh%zCmytn{r!j7bZoXp}9 z1A}Xf^-RnxtZeKY>>S)2vB4Sn<-sM1C8fnqiAB*MUPyj^P7;irm=ucQViA`43XgA Date: Wed, 4 Dec 2024 20:53:05 +0700 Subject: [PATCH 5/9] src --- ossim_source_code/.DS_Store | Bin 0 -> 8196 bytes .../.vscode/c_cpp_properties.json | 18 + ossim_source_code/.vscode/launch.json | 13 + ossim_source_code/.vscode/settings.json | 66 ++ ossim_source_code/Makefile | 50 ++ ossim_source_code/include/bitops.h | 37 + ossim_source_code/include/common.h | 96 +++ ossim_source_code/include/cpu.h | 13 + ossim_source_code/include/loader.h | 9 + ossim_source_code/include/mem.h | 32 + ossim_source_code/include/mm.h | 163 +++++ ossim_source_code/include/os-cfg.h | 15 + ossim_source_code/include/os-mm.h | 88 +++ ossim_source_code/include/queue.h | 22 + ossim_source_code/include/sched.h | 28 + ossim_source_code/include/timer.h | 28 + ossim_source_code/input/os_0_mlq_paging | 4 + ossim_source_code/input/os_1_mlq_paging | 10 + .../input/os_1_mlq_paging_small_1K | 10 + .../input/os_1_mlq_paging_small_4K | 10 + ossim_source_code/input/os_1_singleCPU_mlq | 9 + .../input/os_1_singleCPU_mlq_paging | 10 + ossim_source_code/input/proc/m0s | 8 + ossim_source_code/input/proc/m1s | 8 + ossim_source_code/input/proc/p0s | 15 + ossim_source_code/input/proc/p1s | 12 + ossim_source_code/input/proc/p2s | 14 + ossim_source_code/input/proc/p3s | 18 + ossim_source_code/input/proc/s0 | 16 + ossim_source_code/input/proc/s1 | 8 + ossim_source_code/input/proc/s2 | 14 + ossim_source_code/input/proc/s3 | 18 + ossim_source_code/input/proc/s4 | 31 + ossim_source_code/input/sched | 4 + ossim_source_code/input/sched_0 | 3 + ossim_source_code/input/sched_1 | 5 + ossim_source_code/obj/cpu.o | Bin 0 -> 6704 bytes ossim_source_code/obj/loader.o | Bin 0 -> 9176 bytes ossim_source_code/obj/mem.o | Bin 0 -> 10144 bytes ossim_source_code/obj/mm-memphy.o | Bin 0 -> 7368 bytes ossim_source_code/obj/mm-vm.o | Bin 0 -> 18048 bytes ossim_source_code/obj/mm.o | Bin 0 -> 15672 bytes ossim_source_code/obj/os.o | Bin 0 -> 15984 bytes ossim_source_code/obj/queue.o | Bin 0 -> 5624 bytes ossim_source_code/obj/sched.o | Bin 0 -> 9032 bytes ossim_source_code/obj/timer.o | Bin 0 -> 8360 bytes ossim_source_code/os | Bin 0 -> 81039 bytes .../output/os_0_mlq_paging.output | 78 +++ .../output/os_1_mlq_paging.output | 173 +++++ .../output/os_1_mlq_paging_small_1K.output | 171 +++++ .../output/os_1_mlq_paging_small_4K.output | 172 +++++ .../output/os_1_singleCPU_mlq.output | 185 +++++ .../output/os_1_singleCPU_mlq_paging.output | 185 +++++ ossim_source_code/output/sched.output | 42 ++ ossim_source_code/output/sched_0.output | 68 ++ ossim_source_code/output/sched_1.output | 132 ++++ ossim_source_code/src/cpu.c | 102 +++ ossim_source_code/src/loader.c | 108 +++ ossim_source_code/src/mem.c | 173 +++++ ossim_source_code/src/mm-memphy.c | 199 ++++++ ossim_source_code/src/mm-vm.c | 649 ++++++++++++++++++ ossim_source_code/src/mm.c | 458 ++++++++++++ ossim_source_code/src/os.c | 292 ++++++++ ossim_source_code/src/paging.c | 18 + ossim_source_code/src/queue.c | 49 ++ ossim_source_code/src/sched.c | 140 ++++ ossim_source_code/src/timer.c | 136 ++++ 67 files changed, 4435 insertions(+) create mode 100644 ossim_source_code/.DS_Store create mode 100644 ossim_source_code/.vscode/c_cpp_properties.json create mode 100644 ossim_source_code/.vscode/launch.json create mode 100644 ossim_source_code/.vscode/settings.json create mode 100644 ossim_source_code/Makefile create mode 100644 ossim_source_code/include/bitops.h create mode 100644 ossim_source_code/include/common.h create mode 100644 ossim_source_code/include/cpu.h create mode 100644 ossim_source_code/include/loader.h create mode 100644 ossim_source_code/include/mem.h create mode 100644 ossim_source_code/include/mm.h create mode 100644 ossim_source_code/include/os-cfg.h create mode 100644 ossim_source_code/include/os-mm.h create mode 100644 ossim_source_code/include/queue.h create mode 100644 ossim_source_code/include/sched.h create mode 100644 ossim_source_code/include/timer.h create mode 100644 ossim_source_code/input/os_0_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_1K create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_4K create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq_paging create mode 100644 ossim_source_code/input/proc/m0s create mode 100644 ossim_source_code/input/proc/m1s create mode 100644 ossim_source_code/input/proc/p0s create mode 100644 ossim_source_code/input/proc/p1s create mode 100644 ossim_source_code/input/proc/p2s create mode 100644 ossim_source_code/input/proc/p3s create mode 100644 ossim_source_code/input/proc/s0 create mode 100644 ossim_source_code/input/proc/s1 create mode 100644 ossim_source_code/input/proc/s2 create mode 100644 ossim_source_code/input/proc/s3 create mode 100644 ossim_source_code/input/proc/s4 create mode 100644 ossim_source_code/input/sched create mode 100644 ossim_source_code/input/sched_0 create mode 100644 ossim_source_code/input/sched_1 create mode 100644 ossim_source_code/obj/cpu.o create mode 100644 ossim_source_code/obj/loader.o create mode 100644 ossim_source_code/obj/mem.o create mode 100644 ossim_source_code/obj/mm-memphy.o create mode 100644 ossim_source_code/obj/mm-vm.o create mode 100644 ossim_source_code/obj/mm.o create mode 100644 ossim_source_code/obj/os.o create mode 100644 ossim_source_code/obj/queue.o create mode 100644 ossim_source_code/obj/sched.o create mode 100644 ossim_source_code/obj/timer.o create mode 100755 ossim_source_code/os create mode 100644 ossim_source_code/output/os_0_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_1K.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_4K.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq_paging.output create mode 100644 ossim_source_code/output/sched.output create mode 100644 ossim_source_code/output/sched_0.output create mode 100644 ossim_source_code/output/sched_1.output create mode 100644 ossim_source_code/src/cpu.c create mode 100644 ossim_source_code/src/loader.c create mode 100644 ossim_source_code/src/mem.c create mode 100644 ossim_source_code/src/mm-memphy.c create mode 100644 ossim_source_code/src/mm-vm.c create mode 100644 ossim_source_code/src/mm.c create mode 100644 ossim_source_code/src/os.c create mode 100644 ossim_source_code/src/paging.c create mode 100644 ossim_source_code/src/queue.c create mode 100644 ossim_source_code/src/sched.c create mode 100644 ossim_source_code/src/timer.c diff --git a/ossim_source_code/.DS_Store b/ossim_source_code/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6b57edf22290270271faf7b59de119eb25d10e75 GIT binary patch literal 8196 zcmeHMzi-n(6n@vFjiU;wNPxN^Swd`4NoiFmEFld;2Nr_pKv9Te)0#TIC_kE^ij)}` z;15AeNQ_KOY#>(3pTNij@7u4Fq18{J`3wD<4EuKP~2ZjN|fMLKeU>GnAoCXGP&8B2!tozby za>IaO;9N35?*|(%vK3{=(u!9HW?~C~Hjj@*!h75Yh!|Vhin3#AMJSdjcMnX3GPT8E zG93Lj!O>Qf9ZM_2fyr=Ss%EBkC`{CjakhX1t4M2d!+>ER%>eD)3$O(H(1TWd|K9FM zu=O^LX!Bal3AlqE>%+INZ!UVD?;VA5{{hw6rPG3_wlY;(03SkZO#lNrPuL82OVvh` zn`&D6BNBm=XlK~#DD+3C6ZpM;x%{2Y4qTTkn|d|2-{`-5J!*?mI49&sKx z(S6f-?0dt;!lex!_M3j_bwz;hdI;Ix@SMp3HV(HFC8WGn7 zz2$e?N)wICHlJ#ejnXywguo=r`}J-Z@Nfq`)Qef6SO@j$C)9e6-nd#ZJIM}30iOk!6P+T?KlJMcp51$#|LgUS={ z!R9aT$Cb7iV-xRmY^A+=%MY$$#c9ZCyQUC{r~;!^Z(;*gel!HU>G=223WpUuT`-L(FbX=HMG~Z z@p^_ACBluR6(N`rgr1A-INHe{hInr)Uq#umwCKU~-wy)ld;fHN<7?}(zS@}e{{;75 I=VJZ;3#dblSpWb4 literal 0 HcmV?d00001 diff --git a/ossim_source_code/.vscode/c_cpp_properties.json b/ossim_source_code/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f6526a0 --- /dev/null +++ b/ossim_source_code/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "macos-clang-arm64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "${default}", + "cppStandard": "c++20", + "intelliSenseMode": "macos-clang-arm64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/launch.json b/ossim_source_code/.vscode/launch.json new file mode 100644 index 0000000..5de968d --- /dev/null +++ b/ossim_source_code/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/admin/Downloads/ossim_source_code/src", + "program": "/Users/admin/Downloads/ossim_source_code/src/build/Debug/outDebug" + } + ] +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/settings.json b/ossim_source_code/.vscode/settings.json new file mode 100644 index 0000000..7a3b5b2 --- /dev/null +++ b/ossim_source_code/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "C_Cpp_Runner.cCompilerPath": "clang", + "C_Cpp_Runner.cppCompilerPath": "clang++", + "C_Cpp_Runner.debuggerPath": "lldb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "c++20", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "git.ignoreLimitWarning": true, + "files.associations": { + "cstdlib": "cpp", + "locale": "cpp", + "ostream": "cpp", + "new": "cpp" + } +} \ No newline at end of file diff --git a/ossim_source_code/Makefile b/ossim_source_code/Makefile new file mode 100644 index 0000000..f7ed868 --- /dev/null +++ b/ossim_source_code/Makefile @@ -0,0 +1,50 @@ + +INC = -Iinclude +LIB = -lpthread + +SRC = src +OBJ = obj +INCLUDE = include + +CC = gcc +DEBUG = -g +CFLAGS = -Wall -c $(DEBUG) +LFLAGS = -Wall $(DEBUG) + +vpath %.c $(SRC) +vpath %.h $(INCLUDE) + +MAKE = $(CC) $(INC) + +# Object files needed by modules +MEM_OBJ = $(addprefix $(OBJ)/, paging.o mem.o cpu.o loader.o) +OS_OBJ = $(addprefix $(OBJ)/, cpu.o mem.o loader.o queue.o os.o sched.o timer.o mm-vm.o mm.o mm-memphy.o) +SCHED_OBJ = $(addprefix $(OBJ)/, cpu.o loader.o) +HEADER = $(wildcard $(INCLUDE)/*.h) + +all: os +#mem sched os + +# Just compile memory management modules +mem: $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(MEM_OBJ) -o mem $(LIB) + +# Just compile scheduler +sched: $(SCHED_OBJ) $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(SCHED_OBJ) $(MEM_OBJ) -o sched $(LIB) + +# Compile the whole OS simulation +os: $(OS_OBJ) + $(MAKE) $(LFLAGS) $(OS_OBJ) -o os $(LIB) + +$(OBJ)/%.o: %.c ${HEADER} $(OBJ) + $(MAKE) $(CFLAGS) $< -o $@ + +# Prepare objectives container +$(OBJ): + mkdir -p $(OBJ) + +clean: + rm -f $(OBJ)/*.o os sched mem + rm -r $(OBJ) + diff --git a/ossim_source_code/include/bitops.h b/ossim_source_code/include/bitops.h new file mode 100644 index 0000000..0cc9413 --- /dev/null +++ b/ossim_source_code/include/bitops.h @@ -0,0 +1,37 @@ +#ifdef CONFIG_64BIT +#define BITS_PER_LONG 64 +#else +#define BITS_PER_LONG 32 +#endif /* CONFIG_64BIT */ + +#define BITS_PER_BYTE 8 +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define BIT(nr) (1U << (nr)) +#define BIT_ULL(nr) (1ULL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +/* + * Create a contiguous bitmask starting at bit position @l and ending at + * position @h. For example + * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. + */ +#define GENMASK(h, l) \ + (((~0U) << (l)) & (~0U >> (BITS_PER_LONG - (h) - 1))) + +#define NBITS2(n) ((n&2)?1:0) +#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n))) +#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n))) +#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n))) +#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n))) +#define NBITS(n) (n==0?0:NBITS32(n)) + +#define EXTRACT_NBITS(nr, h, l) ((nr&GENMASK(h,l)) >> l) diff --git a/ossim_source_code/include/common.h b/ossim_source_code/include/common.h new file mode 100644 index 0000000..c1d5a17 --- /dev/null +++ b/ossim_source_code/include/common.h @@ -0,0 +1,96 @@ +#ifndef COMMON_H +#define COMMON_H + +/* Define structs and routine could be used by every source files */ + +#include + +#ifndef OSCFG_H +#include "os-cfg.h" +#endif + +#ifndef OSMM_H +#include "os-mm.h" +#endif + +#define ADDRESS_SIZE 20 +#define OFFSET_LEN 10 +#define FIRST_LV_LEN 5 +#define SECOND_LV_LEN 5 +#define SEGMENT_LEN FIRST_LV_LEN +#define PAGE_LEN SECOND_LV_LEN + +#define NUM_PAGES (1 << (ADDRESS_SIZE - OFFSET_LEN)) +#define PAGE_SIZE (1 << OFFSET_LEN) + +enum ins_opcode_t { + CALC, // Just perform calculation, only use CPU + ALLOC, // Allocate memory +#ifdef MM_PAGING + MALLOC, // Allocate dynamic memory +#endif + FREE, // Deallocated a memory block + READ, // Write data to a byte on memory + WRITE // Read data from a byte on memory +}; + +/* instructions executed by the CPU */ +struct inst_t { + enum ins_opcode_t opcode; + uint32_t arg_0; // Argument lists for instructions + uint32_t arg_1; + uint32_t arg_2; +}; + +struct code_seg_t { + struct inst_t * text; + uint32_t size; +}; + +struct trans_table_t { + /* A row in the page table of the second layer */ + struct { + addr_t v_index; // The index of virtual address + addr_t p_index; // The index of physical address + } table[1 << SECOND_LV_LEN]; + int size; +}; + +/* Mapping virtual addresses and physical ones */ +struct page_table_t { + /* Translation table for the first layer */ + struct { + addr_t v_index; // Virtual index + struct trans_table_t * next_lv; + } table[1 << FIRST_LV_LEN]; + int size; // Number of row in the first layer +}; + +/* PCB, describe information about a process */ +struct pcb_t { + uint32_t pid; // PID + uint32_t priority; // Default priority, this legacy (FIXED) value depend on process itself + struct code_seg_t * code; // Code segment + addr_t regs[10]; // Registers, store address of allocated regions + uint32_t pc; // Program pointer, point to the next instruction +#ifdef MLQ_SCHED + // Priority on execution (if supported), on-fly aka. changeable + // and this vale overwrites the default priority when it existed + uint32_t prio; +#endif +#ifdef MM_PAGING + struct mm_struct *mm; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; +#ifdef MM_PAGING_HEAP_GODOWN + uint32_t vmemsz; +#endif +#endif + struct page_table_t * page_table; // Page table + uint32_t bp; // Break pointer + +}; + +#endif + diff --git a/ossim_source_code/include/cpu.h b/ossim_source_code/include/cpu.h new file mode 100644 index 0000000..0b95b07 --- /dev/null +++ b/ossim_source_code/include/cpu.h @@ -0,0 +1,13 @@ + +#ifndef CPU_H +#define CPU_H + +#include "common.h" + +/* Execute an instruction of a process. Return 0 + * if the instruction is executed successfully. + * Otherwise, return 1. */ +int run(struct pcb_t * proc); + +#endif + diff --git a/ossim_source_code/include/loader.h b/ossim_source_code/include/loader.h new file mode 100644 index 0000000..8fedc07 --- /dev/null +++ b/ossim_source_code/include/loader.h @@ -0,0 +1,9 @@ +#ifndef LOADER_H +#define LOADER_H + +#include "common.h" + +struct pcb_t * load(const char * path); + +#endif + diff --git a/ossim_source_code/include/mem.h b/ossim_source_code/include/mem.h new file mode 100644 index 0000000..3c2f5a3 --- /dev/null +++ b/ossim_source_code/include/mem.h @@ -0,0 +1,32 @@ +#ifndef MEM_H +#define MEM_H + +#include "common.h" + +#define RAM_SIZE (1 << ADDRESS_SIZE) + +/* Init related parameters, must be called before being used */ +void init_mem(void); + +/* Allocate [size] bytes for process [proc] and return its virtual address. + * If we cannot allocate new memory region for this process, return 0 */ +addr_t alloc_mem(uint32_t size, struct pcb_t * proc); + +/* Free a memory block having the first byte at [address] used by + * process [proc]. Return 0 if [address] is valid. Otherwise, return 1 */ +int free_mem(addr_t address, struct pcb_t * proc); + +/* Read 1 byte memory pointed by [address] used by process [proc] and + * save it to [data]. + * If the given [address] is valid, return 0. Otherwise, return 1 */ +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data); + +/* Write [data] to 1 byte on the memory pointed by [address] of process + * [proc]. If given [address] is valid, return 0. Otherwise, return 1 */ +int write_mem(addr_t address, struct pcb_t * proc, BYTE data); + +void dump(void); + +#endif + + diff --git a/ossim_source_code/include/mm.h b/ossim_source_code/include/mm.h new file mode 100644 index 0000000..e7d9094 --- /dev/null +++ b/ossim_source_code/include/mm.h @@ -0,0 +1,163 @@ +#ifndef MM_H + +#include "bitops.h" +#include "common.h" + +/* CPU Bus definition */ +#define PAGING_CPU_BUS_WIDTH 22 /* 22bit bus - MAX SPACE 4MB */ +#define PAGING_PAGESZ 256 /* 256B or 8-bits PAGE NUMBER */ +#define PAGING_MEMRAMSZ BIT(10) /* 1MB */ +#define PAGING_PAGE_ALIGNSZ(sz) (DIV_ROUND_UP(sz,PAGING_PAGESZ) *PAGING_PAGESZ) + +#define PAGING_MEMSWPSZ BIT(14) /* 16MB */ +#define PAGING_SWPFPN_OFFSET 5 +#define PAGING_MAX_PGN (DIV_ROUND_UP(BIT(PAGING_CPU_BUS_WIDTH),PAGING_PAGESZ)) + +#define PAGING_SBRK_INIT_SZ PAGING_PAGESZ +/* PTE BIT */ +#define PAGING_PTE_PRESENT_MASK BIT(31) +#define PAGING_PTE_SWAPPED_MASK BIT(30) +#define PAGING_PTE_RESERVE_MASK BIT(29) +#define PAGING_PTE_DIRTY_MASK BIT(28) +#define PAGING_PTE_EMPTY01_MASK BIT(14) +#define PAGING_PTE_EMPTY02_MASK BIT(13) + +/* PTE BIT PRESENT */ +#define PAGING_PTE_SET_PRESENT(pte) (pte=pte|PAGING_PTE_PRESENT_MASK) +#define PAGING_PTE_PAGE_PRESENT(pte) (pte&PAGING_PTE_PRESENT_MASK) + +/* USRNUM */ +#define PAGING_PTE_USRNUM_LOBIT 15 +#define PAGING_PTE_USRNUM_HIBIT 27 +/* FPN */ +#define PAGING_PTE_FPN_LOBIT 0 +#define PAGING_PTE_FPN_HIBIT 12 +/* SWPTYP */ +#define PAGING_PTE_SWPTYP_LOBIT 0 +#define PAGING_PTE_SWPTYP_HIBIT 4 +/* SWPOFF */ +#define PAGING_PTE_SWPOFF_LOBIT 5 +#define PAGING_PTE_SWPOFF_HIBIT 25 + +/* PTE masks */ +#define PAGING_PTE_USRNUM_MASK GENMASK(PAGING_PTE_USRNUM_HIBIT,PAGING_PTE_USRNUM_LOBIT) +#define PAGING_PTE_FPN_MASK GENMASK(PAGING_PTE_FPN_HIBIT,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWPTYP_MASK GENMASK(PAGING_PTE_SWPTYP_HIBIT,PAGING_PTE_SWPTYP_LOBIT) +#define PAGING_PTE_SWPOFF_MASK GENMASK(PAGING_PTE_SWPOFF_HIBIT,PAGING_PTE_SWPOFF_LOBIT) + +/* Extract PTE */ +#define PAGING_PTE_OFFST(pte) GETVAL(pte,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PTE_PGN(pte) GETVAL(pte,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +#define PAGING_PTE_FPN(pte) GETVAL(pte,PAGING_PTE_FPN_MASK,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWP(pte) GETVAL(pte,PAGING_PTE_SWPOFF_MASK,PAGING_SWPFPN_OFFSET) + +/* OFFSET */ +#define PAGING_ADDR_OFFST_LOBIT 0 +#define PAGING_ADDR_OFFST_HIBIT (NBITS(PAGING_PAGESZ) - 1) + +/* PAGE Num */ +#define PAGING_ADDR_PGN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_PGN_HIBIT (PAGING_CPU_BUS_WIDTH - 1) + +/* Frame PHY Num */ +#define PAGING_ADDR_FPN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_FPN_HIBIT (NBITS(PAGING_MEMRAMSZ) - 1) + +/* SWAPFPN */ +#define PAGING_SWP_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_SWP_HIBIT (NBITS(PAGING_MEMSWPSZ) - 1) + +/* Value operators */ +#define SETBIT(v,mask) (v=v|mask) +#define CLRBIT(v,mask) (v=v&~mask) + +#define SETVAL(v,value,mask,offst) (v=(v&~mask)|((value<>offst) + +/* Other masks */ +#define PAGING_OFFST_MASK GENMASK(PAGING_ADDR_OFFST_HIBIT,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PGN_MASK GENMASK(PAGING_ADDR_PGN_HIBIT,PAGING_ADDR_PGN_LOBIT) +#define PAGING_FPN_MASK GENMASK(PAGING_ADDR_FPN_HIBIT,PAGING_ADDR_FPN_LOBIT) +#define PAGING_SWP_MASK GENMASK(PAGING_SWP_HIBIT,PAGING_SWP_LOBIT) + +/* Extract OFFSET */ +//#define PAGING_OFFST(x) ((x&PAGING_OFFST_MASK) >> PAGING_ADDR_OFFST_LOBIT) +#define PAGING_OFFST(x) GETVAL(x,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +/* Extract Page Number*/ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract FramePHY Number*/ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) +/* Extract SWAPFPN */ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract SWAPTYPE */ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) + +/* Memory range operator */ +/* TODO implement the INCLUDE checking mechanism - currently dummy op only */ +#define INCLUDE(x1,x2,y1,y2) (0) +/* TODO implement the OVERLAP checking mechanism - currently dummy op only */ +#define OVERLAP(x1,x2,y1,y2) (1) + +/* VM region prototypes */ +struct vm_rg_struct * init_vm_rg(int rg_start, int rg_endi, int vmaid); +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode); +int enlist_pgn_node(struct pgn_t **pgnlist, int pgn); +int vmap_page_range(struct pcb_t *caller, int addr, int pgnum, + struct framephy_struct *frames, struct vm_rg_struct *ret_rg); +int vm_map_ram(struct pcb_t *caller, int astart, int send, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg); +int alloc_pages_range(struct pcb_t *caller, int incpgnum, struct framephy_struct **frm_lst); +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) ; +int pte_set_fpn(uint32_t *pte, int fpn); +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff); +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff); //swap offset +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr); +int __free(struct pcb_t *caller, int rgid); +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data); +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value); +int init_mm(struct mm_struct *mm, struct pcb_t *caller); + +/* VM prototypes */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgfree_data(struct pcb_t *proc, uint32_t reg_index); +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination); +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset); +/* Local VM prototypes */ +struct vm_rg_struct * get_symrg_byid(struct mm_struct* mm, int rgid); +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend); +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg); +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret); +int find_victim_page(struct mm_struct* mm, int *pgn); +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid); + +/* MEM/PHY protypes */ +int MEMPHY_get_freefp(struct memphy_struct *mp, int *fpn); +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn); +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value); +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data); +int MEMPHY_dump(struct memphy_struct * mp); +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg); +/* DEBUG */ +int print_list_fp(struct framephy_struct *fp); +int print_list_rg(struct vm_rg_struct *rg); +int print_list_vma(struct vm_area_struct *rg); + + +int print_list_pgn(struct pgn_t *ip); +int print_pgtbl(struct pcb_t *ip, uint32_t start, uint32_t end); +#endif diff --git a/ossim_source_code/include/os-cfg.h b/ossim_source_code/include/os-cfg.h new file mode 100644 index 0000000..d5034e0 --- /dev/null +++ b/ossim_source_code/include/os-cfg.h @@ -0,0 +1,15 @@ +#ifndef OSCFG_H +#define OSCFG_H + +#define MLQ_SCHED 1 +#define MAX_PRIO 140 + +#define MM_PAGING +#define MM_PAGING_HEAP_GODOWN +// #define MM_FIXED_MEMSZ +#define VMDBG 1 +#define MMDBG 1 +#define IODUMP 1 +#define PAGETBL_DUMP 1 + +#endif diff --git a/ossim_source_code/include/os-mm.h b/ossim_source_code/include/os-mm.h new file mode 100644 index 0000000..beef90e --- /dev/null +++ b/ossim_source_code/include/os-mm.h @@ -0,0 +1,88 @@ +#ifndef OSMM_H +#define OSMM_H + +#define MM_PAGING +#define PAGING_MAX_MMSWP 4 /* max number of supported swapped space */ +#define PAGING_MAX_SYMTBL_SZ 30 + +typedef char BYTE; +typedef uint32_t addr_t; +//typedef unsigned int uint32_t; + +struct pgn_t{ + int pgn; + struct pgn_t *pg_next; +}; + +/* + * Memory region struct + */ +struct vm_rg_struct { + int vmaid; + + unsigned long rg_start; + unsigned long rg_end; + + struct vm_rg_struct *rg_next; +}; + +/* + * Memory area struct + */ +struct vm_area_struct { + unsigned long vm_id; + unsigned long vm_start; + unsigned long vm_end; + + unsigned long sbrk; +/* + * Derived field + * unsigned long vm_limit = vm_end - vm_start + */ + struct mm_struct *vm_mm; + + struct vm_rg_struct *vm_freerg_list; + struct vm_area_struct *vm_next; +}; + +/* + * Memory management struct + */ +struct mm_struct { + uint32_t *pgd; + + struct vm_area_struct *mmap; + + /* Currently we support a fixed number of symbol */ + struct vm_rg_struct symrgtbl[PAGING_MAX_SYMTBL_SZ]; + + /* list of free page */ + struct pgn_t *fifo_pgn; +}; + +/* + * FRAME/MEM PHY struct + */ +struct framephy_struct { + int fpn; + struct framephy_struct *fp_next; + + /* Resereed for tracking allocated framed */ + struct mm_struct* owner; +}; + +struct memphy_struct { + /* Basic field of data and size */ + BYTE *storage; + int maxsz; + + /* Sequential device fields */ + int rdmflg; + int cursor; + + /* Management structure */ + struct framephy_struct *free_fp_list; + struct framephy_struct *used_fp_list; +}; + +#endif diff --git a/ossim_source_code/include/queue.h b/ossim_source_code/include/queue.h new file mode 100644 index 0000000..d26881c --- /dev/null +++ b/ossim_source_code/include/queue.h @@ -0,0 +1,22 @@ + +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#define MAX_QUEUE_SIZE 10 + +struct queue_t { + int count_slot; + struct pcb_t * proc[MAX_QUEUE_SIZE]; + int size; +}; + +void enqueue(struct queue_t * q, struct pcb_t * proc); + +struct pcb_t * dequeue(struct queue_t * q); + +int empty(struct queue_t * q); + +#endif + diff --git a/ossim_source_code/include/sched.h b/ossim_source_code/include/sched.h new file mode 100644 index 0000000..d252c72 --- /dev/null +++ b/ossim_source_code/include/sched.h @@ -0,0 +1,28 @@ +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#ifndef MLQ_SCHED +#define MLQ_SCHED +#endif + +//#define MAX_PRIO 139 + +int queue_empty(void); + +void init_scheduler(void); +void finish_scheduler(void); + +/* Get the next process from ready queue */ +struct pcb_t * get_proc(void); + +/* Put a process back to run queue */ +void put_proc(struct pcb_t * proc); + +/* Add a new process to ready queue */ +void add_proc(struct pcb_t * proc); + +#endif + + diff --git a/ossim_source_code/include/timer.h b/ossim_source_code/include/timer.h new file mode 100644 index 0000000..e480b66 --- /dev/null +++ b/ossim_source_code/include/timer.h @@ -0,0 +1,28 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +#include + +struct timer_id_t { + int done; + int fsh; + pthread_cond_t event_cond; + pthread_mutex_t event_lock; + pthread_cond_t timer_cond; + pthread_mutex_t timer_lock; +}; + +void start_timer(); + +void stop_timer(); + +struct timer_id_t * attach_event(); + +void detach_event(struct timer_id_t * event); + +void next_slot(struct timer_id_t* timer_id); + +uint64_t current_time(); + +#endif diff --git a/ossim_source_code/input/os_0_mlq_paging b/ossim_source_code/input/os_0_mlq_paging new file mode 100644 index 0000000..6872297 --- /dev/null +++ b/ossim_source_code/input/os_0_mlq_paging @@ -0,0 +1,4 @@ +6 2 4 +1048576 16777216 0 0 0 3145728 +0 p0s 0 +2 p1s 15 diff --git a/ossim_source_code/input/os_1_mlq_paging b/ossim_source_code/input/os_1_mlq_paging new file mode 100644 index 0000000..0068caf --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging @@ -0,0 +1,10 @@ +2 4 8 +1048576 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_1K b/ossim_source_code/input/os_1_mlq_paging_small_1K new file mode 100644 index 0000000..a5788e4 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_1K @@ -0,0 +1,10 @@ +2 4 8 +2048 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_4K b/ossim_source_code/input/os_1_mlq_paging_small_4K new file mode 100644 index 0000000..bd6af03 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_4K @@ -0,0 +1,10 @@ +2 4 8 +4096 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq b/ossim_source_code/input/os_1_singleCPU_mlq new file mode 100644 index 0000000..98efc7e --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq @@ -0,0 +1,9 @@ +2 1 8 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq_paging b/ossim_source_code/input/os_1_singleCPU_mlq_paging new file mode 100644 index 0000000..99e0a04 --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq_paging @@ -0,0 +1,10 @@ +2 1 8 +1048576 16777216 0 0 0 3145728 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/proc/m0s b/ossim_source_code/input/proc/m0s new file mode 100644 index 0000000..3466b3a --- /dev/null +++ b/ossim_source_code/input/proc/m0s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 3 +write 102 1 20 +write 1 2 1000 diff --git a/ossim_source_code/input/proc/m1s b/ossim_source_code/input/proc/m1s new file mode 100644 index 0000000..b3b24a6 --- /dev/null +++ b/ossim_source_code/input/proc/m1s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 2 +free 2 +free 1 diff --git a/ossim_source_code/input/proc/p0s b/ossim_source_code/input/proc/p0s new file mode 100644 index 0000000..7c443f9 --- /dev/null +++ b/ossim_source_code/input/proc/p0s @@ -0,0 +1,15 @@ +1 14 +calc +alloc 300 0 +malloc 300 4 +free 0 +alloc 100 1 +write 100 1 20 +read 1 20 20 +write 102 2 20 +read 2 20 20 +write 103 3 20 +read 3 20 20 +calc +free 4 +calc diff --git a/ossim_source_code/input/proc/p1s b/ossim_source_code/input/proc/p1s new file mode 100644 index 0000000..79c5fba --- /dev/null +++ b/ossim_source_code/input/proc/p1s @@ -0,0 +1,12 @@ +1 10 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p2s b/ossim_source_code/input/proc/p2s new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/p2s @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p3s b/ossim_source_code/input/proc/p3s new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/p3s @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s0 b/ossim_source_code/input/proc/s0 new file mode 100644 index 0000000..6186100 --- /dev/null +++ b/ossim_source_code/input/proc/s0 @@ -0,0 +1,16 @@ +12 15 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s1 b/ossim_source_code/input/proc/s1 new file mode 100644 index 0000000..8614b76 --- /dev/null +++ b/ossim_source_code/input/proc/s1 @@ -0,0 +1,8 @@ +20 7 +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s2 b/ossim_source_code/input/proc/s2 new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/s2 @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s3 b/ossim_source_code/input/proc/s3 new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/s3 @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s4 b/ossim_source_code/input/proc/s4 new file mode 100644 index 0000000..79dfde8 --- /dev/null +++ b/ossim_source_code/input/proc/s4 @@ -0,0 +1,31 @@ +20 30 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/sched b/ossim_source_code/input/sched new file mode 100644 index 0000000..33c50ef --- /dev/null +++ b/ossim_source_code/input/sched @@ -0,0 +1,4 @@ +4 2 3 +0 p1s +1 p2s +2 p3s diff --git a/ossim_source_code/input/sched_0 b/ossim_source_code/input/sched_0 new file mode 100644 index 0000000..ae979fd --- /dev/null +++ b/ossim_source_code/input/sched_0 @@ -0,0 +1,3 @@ +2 1 2 +0 s0 137 +4 s1 138 diff --git a/ossim_source_code/input/sched_1 b/ossim_source_code/input/sched_1 new file mode 100644 index 0000000..c7fac37 --- /dev/null +++ b/ossim_source_code/input/sched_1 @@ -0,0 +1,5 @@ +2 1 4 +0 s0 +4 s1 +6 s2 +7 s3 diff --git a/ossim_source_code/obj/cpu.o b/ossim_source_code/obj/cpu.o new file mode 100644 index 0000000000000000000000000000000000000000..4a5586b973b826c9dfde1f75b31550dadaf2ee7e GIT binary patch literal 6704 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 literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mem.o b/ossim_source_code/obj/mem.o new file mode 100644 index 0000000000000000000000000000000000000000..f258d187737468b32ed6fc56d256396ffd09ba10 GIT binary patch literal 10144 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 V-&)~#Tm=N=T$cm_vc}EV{{qDeHkAMX literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm-memphy.o b/ossim_source_code/obj/mm-memphy.o new file mode 100644 index 0000000000000000000000000000000000000000..f63706c64e7fbc56bc446fef39a60f5ee9f8eca3 GIT binary patch literal 7368 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 SDgMq>?zGN81!z4&Mg12x`YFEv literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm.o b/ossim_source_code/obj/mm.o new file mode 100644 index 0000000000000000000000000000000000000000..75aaf47eff60a6b3230770472559f5ba3df912a2 GIT binary patch literal 15672 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

RUv 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 literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/queue.o b/ossim_source_code/obj/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..47a4309fce16cefca819f7cfdbc4a024032f2a2f GIT binary patch literal 5624 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 OJmampKlNWS^Zx=KIrByU literal 0 HcmV?d00001 diff --git a/ossim_source_code/output/os_0_mlq_paging.output b/ossim_source_code/output/os_0_mlq_paging.output new file mode 100644 index 0000000..87d78bc --- /dev/null +++ b/ossim_source_code/output/os_0_mlq_paging.output @@ -0,0 +1,78 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p0s, PID: 1 PRIO: 0 + CPU 0: Dispatched process 1 +Time slot 1 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 15 +Time slot 3 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 4 + CPU 1: Dispatched process 2 + Loaded a process at input/proc/p1s, PID: 4 PRIO: 0 +Time slot 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 6 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 7 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 8 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 3 +Time slot 11 +Time slot 12 +Time slot 13 +Time slot 14 +Time slot 15 +Time slot 16 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 17 +Time slot 18 +Time slot 19 +Time slot 20 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 4 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 21 +Time slot 22 +Time slot 23 +Time slot 24 + CPU 0: Processed 4 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging.output b/ossim_source_code/output/os_1_mlq_paging.output new file mode 100644 index 0000000..2f675f0 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging.output @@ -0,0 +1,173 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 +Time slot 2 + CPU 1: Dispatched process 1 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 0: Dispatched process 2 +Time slot 4 + CPU 1: Put process 1 to run queue + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 + CPU 3: Dispatched process 1 +Time slot 5 + CPU 2: Dispatched process 3 + CPU 0: Put process 2 to run queue +Time slot 6 + CPU 0: Dispatched process 2 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 + CPU 3: Put process 1 to run queue +Time slot 7 + CPU 1: Dispatched process 4 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 6 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 1 to run queue + CPU 3: Dispatched process 4 +Time slot 12 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 5 +Time slot 13 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 + CPU 3: Put process 4 to run queue + CPU 3: Dispatched process 3 +Time slot 14 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 2 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 + CPU 3: Processed 3 has finished + CPU 3: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 16 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 17 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 7 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 8 +Time slot 18 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 2 +Time slot 19 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 6 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 7 + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 4 +Time slot 20 + CPU 2: Processed 5 has finished + CPU 2: Dispatched process 8 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1 stopped + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 7 +Time slot 22 + CPU 2: Put process 8 to run queue + CPU 2 stopped +Time slot 23 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3 stopped +Time slot 24 +Time slot 25 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 26 +Time slot 27 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 28 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 +Time slot 32 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 33 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_1K.output b/ossim_source_code/output/os_1_mlq_paging_small_1K.output new file mode 100644 index 0000000..cb2fb07 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_1K.output @@ -0,0 +1,171 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 6 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 3 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 2 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 +Time slot 15 + CPU 1: Processed 3 has finished + CPU 1: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 7 +Time slot 16 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 4 + CPU 1: Put process 5 to run queue + CPU 1: Dispatched process 8 + CPU 2: Processed 2 has finished + CPU 2: Dispatched process 6 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 2: Put process 6 to run queue + CPU 2 stopped + CPU 1: Put process 8 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 8 +Time slot 20 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 4 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 7 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 6 +Time slot 22 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 8 +Time slot 23 + CPU 1: Put process 7 to run queue + CPU 1 stopped + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 24 + CPU 3: Put process 8 to run queue + CPU 3 stopped +Time slot 25 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 26 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 27 +Time slot 28 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_4K.output b/ossim_source_code/output/os_1_mlq_paging_small_4K.output new file mode 100644 index 0000000..25afa10 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_4K.output @@ -0,0 +1,172 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 3 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 7 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 2 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 16 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 7 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 4 + CPU 3: Put process 6 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 8 + CPU 1: Processed 2 has finished + CPU 1: Dispatched process 6 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0 stopped +Time slot 20 + CPU 2: Put process 8 to run queue + CPU 2: Dispatched process 4 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 21 +Time slot 22 + CPU 2: Processed 4 has finished + CPU 2: Dispatched process 7 + CPU 1: Put process 8 to run queue + CPU 1 stopped + CPU 3: Processed 6 has finished + CPU 3: Dispatched process 8 +Time slot 23 +Time slot 24 + CPU 2: Put process 7 to run queue + CPU 2 stopped + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 7 +Time slot 25 +Time slot 26 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 8 +Time slot 27 + CPU 3: Processed 8 has finished + CPU 3: Dispatched process 7 +Time slot 28 +Time slot 29 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 30 +Time slot 31 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 32 + CPU 3: Processed 7 has finished + CPU 3 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq.output b/ossim_source_code/output/os_1_singleCPU_mlq.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched.output b/ossim_source_code/output/sched.output new file mode 100644 index 0000000..edfe4cf --- /dev/null +++ b/ossim_source_code/output/sched.output @@ -0,0 +1,42 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p1s, PID: 1 PRIO: 1 + CPU 1: Dispatched process 1 +Time slot 1 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Dispatched process 3 +Time slot 4 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 2 +Time slot 5 +Time slot 6 +Time slot 7 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 1 +Time slot 8 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 2 +Time slot 9 +Time slot 10 +Time slot 11 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 +Time slot 12 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 1 +Time slot 13 +Time slot 14 + CPU 1: Processed 1 has finished + CPU 1: Dispatched process 2 +Time slot 15 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 16 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 17 + CPU 0: Processed 3 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_0.output b/ossim_source_code/output/sched_0.output new file mode 100644 index 0000000..0676714 --- /dev/null +++ b/ossim_source_code/output/sched_0.output @@ -0,0 +1,68 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 14 +Time slot 15 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 16 +Time slot 17 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 18 +Time slot 19 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 20 +Time slot 21 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 22 +Time slot 23 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 24 +Time slot 25 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 28 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 29 +Time slot 30 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 31 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_1.output b/ossim_source_code/output/sched_1.output new file mode 100644 index 0000000..9c338f7 --- /dev/null +++ b/ossim_source_code/output/sched_1.output @@ -0,0 +1,132 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/s0, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 4 PRIO: 0 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 4 +Time slot 6 +Time slot 7 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 8 +Time slot 9 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 10 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 3 +Time slot 21 +Time slot 22 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 23 +Time slot 24 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 25 +Time slot 26 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 27 +Time slot 28 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 29 +Time slot 30 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 31 +Time slot 32 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 33 +Time slot 34 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 35 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 2 +Time slot 36 +Time slot 37 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 38 +Time slot 39 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 40 +Time slot 41 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 42 +Time slot 43 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 44 +Time slot 45 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 46 +Time slot 47 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 48 +Time slot 49 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 50 +Time slot 51 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 52 +Time slot 53 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 54 +Time slot 55 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 56 +Time slot 57 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 58 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 59 +Time slot 60 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 61 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/src/cpu.c b/ossim_source_code/src/cpu.c new file mode 100644 index 0000000..b8deb25 --- /dev/null +++ b/ossim_source_code/src/cpu.c @@ -0,0 +1,102 @@ + +#include "cpu.h" +#include "mem.h" +#include "mm.h" + +int calc(struct pcb_t * proc) { + return ((unsigned long)proc & 0UL); +} + +int alloc(struct pcb_t * proc, uint32_t size, uint32_t reg_index) { + addr_t addr = alloc_mem(size, proc); + if (addr == 0) { + return 1; + }else{ + proc->regs[reg_index] = addr; + return 0; + } +} + +int free_data(struct pcb_t * proc, uint32_t reg_index) { + return free_mem(proc->regs[reg_index], proc); +} + +int read( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) { // Index of destination register + + BYTE data; + if (read_mem(proc->regs[source] + offset, proc, &data)) { + proc->regs[destination] = data; + return 0; + }else{ + return 1; + } +} + +int write( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) { // Destination address = + // [destination] + [offset] + return write_mem(proc->regs[destination] + offset, proc, data); +} + +int run(struct pcb_t * proc) { + /* Check if Program Counter point to the proper instruction */ + if (proc->pc >= proc->code->size) { + return 1; + } + + struct inst_t ins = proc->code->text[proc->pc]; + proc->pc++; + int stat = 1; + switch (ins.opcode) { + case CALC: + stat = calc(proc); + break; + case ALLOC: +#ifdef MM_PAGING + stat = pgalloc(proc, ins.arg_0, ins.arg_1); + +#else + stat = alloc(proc, ins.arg_0, ins.arg_1); +#endif + break; +#ifdef MM_PAGING + case MALLOC: + stat = pgmalloc(proc, ins.arg_0, ins.arg_1); + break; +#endif + case FREE: +#ifdef MM_PAGING + stat = pgfree_data(proc, ins.arg_0); +#else + stat = free_data(proc, ins.arg_0); +#endif + break; + case READ: +#ifdef MM_PAGING + stat = pgread(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = read(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + case WRITE: +#ifdef MM_PAGING + stat = pgwrite(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = write(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + default: + stat = 1; + } + return stat; + +} + + diff --git a/ossim_source_code/src/loader.c b/ossim_source_code/src/loader.c new file mode 100644 index 0000000..5f8e56a --- /dev/null +++ b/ossim_source_code/src/loader.c @@ -0,0 +1,108 @@ + +#include "loader.h" +#include +#include +#include + +static uint32_t avail_pid = 1; + +#define OPT_CALC "calc" +#define OPT_ALLOC "alloc" +#define OPT_FREE "free" +#define OPT_READ "read" +#define OPT_WRITE "write" +#ifdef MM_PAGING +#define OPT_MALLOC "malloc" +#endif + +static enum ins_opcode_t get_opcode(char * opt) { + if (!strcmp(opt, OPT_CALC)) { + return CALC; + }else if (!strcmp(opt, OPT_ALLOC)) { + return ALLOC; +#ifdef MM_PAGING + }else if (!strcmp(opt, OPT_MALLOC)) { + return MALLOC; +#endif + }else if (!strcmp(opt, OPT_FREE)) { + return FREE; + }else if (!strcmp(opt, OPT_READ)) { + return READ; + }else if (!strcmp(opt, OPT_WRITE)) { + return WRITE; + }else{ + printf("Opcode: %s\n", opt); + exit(1); + } +} + +struct pcb_t * load(const char * path) { + /* Create new PCB for the new process */ + struct pcb_t * proc = (struct pcb_t * )malloc(sizeof(struct pcb_t)); + proc->pid = avail_pid; + avail_pid++; + proc->page_table = + (struct page_table_t*)malloc(sizeof(struct page_table_t)); + proc->bp = PAGE_SIZE; + proc->pc = 0; + + /* Read process code from file */ + FILE * file; + // printf(path); + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find process description at '%s'\n", path); + exit(1); + } + char opcode[10]; + proc->code = (struct code_seg_t*)malloc(sizeof(struct code_seg_t)); + fscanf(file, "%u %u", &proc->priority, &proc->code->size); + proc->code->text = (struct inst_t*)malloc( + sizeof(struct inst_t) * proc->code->size + ); + uint32_t i = 0; + for (i = 0; i < proc->code->size; i++) { + fscanf(file, "%s", opcode); + proc->code->text[i].opcode = get_opcode(opcode); + switch(proc->code->text[i].opcode) { + case CALC: + break; + case ALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); + break; +#ifdef MM_PAGING + case MALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); +#endif + case FREE: + fscanf(file, "%u\n", &proc->code->text[i].arg_0); + break; + case READ: + case WRITE: + fscanf( + file, + "%u %u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1, + &proc->code->text[i].arg_2 + ); + break; + default: + printf("Opcode: %s\n", opcode); + exit(1); + } + } + return proc; +} + + + diff --git a/ossim_source_code/src/mem.c b/ossim_source_code/src/mem.c new file mode 100644 index 0000000..187108f --- /dev/null +++ b/ossim_source_code/src/mem.c @@ -0,0 +1,173 @@ + +#include "mem.h" +#include "stdlib.h" +#include "string.h" +#include +#include + +static BYTE _ram[RAM_SIZE]; + +static struct { + uint32_t proc; // ID of process currently uses this page + int index; // Index of the page in the list of pages allocated + // to the process. + int next; // The next page in the list. -1 if it is the last + // page. +} _mem_stat [NUM_PAGES]; + +static pthread_mutex_t mem_lock; + +void init_mem(void) { + memset(_mem_stat, 0, sizeof(*_mem_stat) * NUM_PAGES); + memset(_ram, 0, sizeof(BYTE) * RAM_SIZE); + pthread_mutex_init(&mem_lock, NULL); +} + +/* get offset of the virtual address */ +static addr_t get_offset(addr_t addr) { + return addr & ~((~0U) << OFFSET_LEN); +} + +/* get the first layer index */ +static addr_t get_first_lv(addr_t addr) { + return addr >> (OFFSET_LEN + PAGE_LEN); +} + +/* get the second layer index */ +static addr_t get_second_lv(addr_t addr) { + return (addr >> OFFSET_LEN) - (get_first_lv(addr) << PAGE_LEN); +} + +/* Search for page table table from the a segment table */ +static struct trans_table_t * get_trans_table( + addr_t index, // Segment level index + struct page_table_t * page_table) { // first level table + + /* DO NOTHING HERE. This mem is obsoleted */ + + int i; + for (i = 0; i < page_table->size; i++) { + // Enter your code here + } + return NULL; + +} + +/* Translate virtual address to physical address. If [virtual_addr] is valid, + * return 1 and write its physical counterpart to [physical_addr]. + * Otherwise, return 0 */ +static int translate( + addr_t virtual_addr, // Given virtual address + addr_t * physical_addr, // Physical address to be returned + struct pcb_t * proc) { // Process uses given virtual address + + /* Offset of the virtual address */ + addr_t offset = get_offset(virtual_addr); + offset++; offset--; + /* The first layer index */ + addr_t first_lv = get_first_lv(virtual_addr); + /* The second layer index */ + addr_t second_lv = get_second_lv(virtual_addr); + + /* Search in the first level */ + struct trans_table_t * trans_table = NULL; + trans_table = get_trans_table(first_lv, proc->page_table); + if (trans_table == NULL) { + return 0; + } + + int i; + for (i = 0; i < trans_table->size; i++) { + if (trans_table->table[i].v_index == second_lv) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 1; + } + } + return 0; +} + +addr_t alloc_mem(uint32_t size, struct pcb_t * proc) { + pthread_mutex_lock(&mem_lock); + addr_t ret_mem = 0; + /* DO NOTHING HERE. This mem is obsoleted */ + + uint32_t num_pages = (size % PAGE_SIZE) ? size / PAGE_SIZE : + size / PAGE_SIZE + 1; // Number of pages we will use + int mem_avail = 0; // We could allocate new memory region or not? + + /* First we must check if the amount of free memory in + * virtual address space and physical address space is + * large enough to represent the amount of required + * memory. If so, set 1 to [mem_avail]. + * Hint: check [proc] bit in each page of _mem_stat + * to know whether this page has been used by a process. + * For virtual memory space, check bp (break pointer). + * */ + + if (mem_avail) { + /* We could allocate new memory region to the process */ + ret_mem = proc->bp; + proc->bp += num_pages * PAGE_SIZE; + /* Update status of physical pages which will be allocated + * to [proc] in _mem_stat. Tasks to do: + * - Update [proc], [index], and [next] field + * - Add entries to segment table page tables of [proc] + * to ensure accesses to allocated memory slot is + * valid. */ + } + pthread_mutex_unlock(&mem_lock); + return ret_mem; +} + +int free_mem(addr_t address, struct pcb_t * proc) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 0; +} + +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + *data = _ram[physical_addr]; + return 0; + }else{ + return 1; + } +} + +int write_mem(addr_t address, struct pcb_t * proc, BYTE data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + _ram[physical_addr] = data; + return 0; + }else{ + return 1; + } +} + +void dump(void) { + int i; + for (i = 0; i < NUM_PAGES; i++) { + if (_mem_stat[i].proc != 0) { + printf("%03d: ", i); + printf("%05x-%05x - PID: %02d (idx %03d, nxt: %03d)\n", + i << OFFSET_LEN, + ((i + 1) << OFFSET_LEN) - 1, + _mem_stat[i].proc, + _mem_stat[i].index, + _mem_stat[i].next + ); + int j; + for ( j = i << OFFSET_LEN; + j < ((i+1) << OFFSET_LEN) - 1; + j++) { + + if (_ram[j] != 0) { + printf("\t%05x: %02x\n", j, _ram[j]); + } + + } + } + } +} + + diff --git a/ossim_source_code/src/mm-memphy.c b/ossim_source_code/src/mm-memphy.c new file mode 100644 index 0000000..880a858 --- /dev/null +++ b/ossim_source_code/src/mm-memphy.c @@ -0,0 +1,199 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory physical module mm/mm-memphy.c + */ + +#include "mm.h" +#include + +/* + * MEMPHY_mv_csr - move MEMPHY cursor + * @mp: memphy struct + * @offset: offset + */ +int MEMPHY_mv_csr(struct memphy_struct *mp, int offset) +{ + int numstep = 0; + + mp->cursor = 0; + while(numstep < offset && numstep < mp->maxsz){ + /* Traverse sequentially */ + mp->cursor = (mp->cursor + 1) % mp->maxsz; + numstep++; + } + + return 0; +} + +/* + * MEMPHY_seq_read - read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_seq_read(struct memphy_struct *mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + *value = (BYTE) mp->storage[addr]; + + return 0; +} + +/* + * MEMPHY_read read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + *value = mp->storage[addr]; + else /* Sequential access device */ + return MEMPHY_seq_read(mp, addr, value); + + return 0; +} + +/* + * MEMPHY_seq_write - write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_seq_write(struct memphy_struct * mp, int addr, BYTE value) +{ + + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + mp->storage[addr] = value; + + return 0; +} + +/* + * MEMPHY_write-write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + mp->storage[addr] = data; + else /* Sequential access device */ + return MEMPHY_seq_write(mp, addr, data); + + return 0; +} + +/* + * MEMPHY_format-format MEMPHY device + * @mp: memphy struct + */ +int MEMPHY_format(struct memphy_struct *mp, int pagesz) +{ + /* This setting come with fixed constant PAGESZ */ + int numfp = mp->maxsz / pagesz; + struct framephy_struct *newfst, *fst; + int iter = 0; + + if (numfp <= 0) + return -1; + + /* Init head of free framephy list */ + fst = malloc(sizeof(struct framephy_struct)); + fst->fpn = iter; + mp->free_fp_list = fst; + + /* We have list with first element, fill in the rest num-1 element member*/ + for (iter = 1; iter < numfp ; iter++) + { + newfst = malloc(sizeof(struct framephy_struct)); + newfst->fpn = iter; + newfst->fp_next = NULL; + fst->fp_next = newfst; + fst = newfst; + } + + return 0; +} + +int MEMPHY_get_freefp(struct memphy_struct *mp, int *retfpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + + if (fp == NULL) + return -1; + + *retfpn = fp->fpn; + mp->free_fp_list = fp->fp_next; + + /* MEMPHY is iteratively used up until its exhausted + * No garbage collector acting then it not been released + */ + free(fp); + + return 0; +} + +int MEMPHY_dump(struct memphy_struct * mp) +{ + /*TODO dump memphy contnt mp->storage + * for tracing the memory content + */ + + return 0; +} + +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + struct framephy_struct *newnode = malloc(sizeof(struct framephy_struct)); + + /* Create new node with value fpn */ + newnode->fpn = fpn; + newnode->fp_next = fp; + mp->free_fp_list = newnode; + + return 0; +} + + +/* + * Init MEMPHY struct + */ +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg) +{ + mp->storage = (BYTE *)malloc(max_size*sizeof(BYTE)); + mp->maxsz = max_size; + + MEMPHY_format(mp,PAGING_PAGESZ); + + mp->rdmflg = (randomflg != 0)?1:0; + + if (!mp->rdmflg ) /* Not Ramdom acess device, then it serial device*/ + mp->cursor = 0; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm-vm.c b/ossim_source_code/src/mm-vm.c new file mode 100644 index 0000000..c262322 --- /dev/null +++ b/ossim_source_code/src/mm-vm.c @@ -0,0 +1,649 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Virtual memory module mm/mm-vm.c + */ + +#include "string.h" +#include "mm.h" +#include +#include + +/*enlist_vm_freerg_list - add new rg to freerg_list + *@mm: memory region + *@rg_elmt: new region + * + */ +int enlist_vm_freerg_list(struct mm_struct *mm, struct vm_rg_struct rg_elmt) +{ + struct vm_rg_struct *new_node; + struct vm_rg_struct *head = mm->mmap->vm_freerg_list; + + // Check for invalid region + if (rg_elmt.rg_start >= rg_elmt.rg_end) + return -1; + + // Dynamically allocate memory for the new region + new_node = (struct vm_rg_struct *)malloc(sizeof(struct vm_rg_struct)); + if (!new_node) + return -1; // Allocation failed + + // Copy the data into the new node + *new_node = rg_elmt; + new_node->rg_next = head; + + // Update the list head + mm->mmap->vm_freerg_list = new_node; + + return 0; +} + + +/*get_vma_by_num - get vm area by numID + *@mm: memory region + *@vmaid: ID vm area to alloc memory region + * + */ +//get địa chỉ ô vma +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid) +{ + struct vm_area_struct *pvma= mm->mmap; + + if(mm->mmap == NULL) + return NULL; + + int vmait = 0; + + while (vmait < vmaid) + { + if(pvma == NULL) + return NULL; + + vmait++; + pvma = pvma->vm_next; + } + + return pvma; +} + +/*get_symrg_byid - get mem region by region ID + *@mm: memory region + *@rgid: region ID act as symbol index of variable + * + */ +struct vm_rg_struct *get_symrg_byid(struct mm_struct *mm, int rgid) +{ + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return NULL; + + return &mm->symrgtbl[rgid]; +} + +/*__alloc - allocate a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + *@alloc_addr: address of allocated memory region + * + */ +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr) +{ + /*Allocate at the toproof */ + struct vm_rg_struct rgnode; + + /* TODO: commit the vmaid */ + rgnode.vmaid = vmaid; + + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0) + { + //symrgtbl là vm_rg_struct + caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start; + caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end; + + caller->mm->symrgtbl[rgid].vmaid = rgnode.vmaid; + + *alloc_addr = rgnode.rg_start; + + return 0; + } + + /* TODO: get_free_vmrg_area FAILED handle the region management (Fig.6)*/ + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == -1 ){return -1;} + /* TODO retrive current vma if needed, current comment out due to compiler redundant warning*/ + /*Attempt to increate limit to get space */ + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + int inc_sz = PAGING_PAGE_ALIGNSZ(size); + int inc_limit_ret; + + /* TODO retrive old_sbrk if needed, current comment out due to compiler redundant warning*/ + int old_sbrk = cur_vma->sbrk; + + /* TODO INCREASE THE LIMIT + * inc_vma_limit(caller, vmaid, inc_sz) + */ + if (inc_vma_limit(caller, vmaid, inc_sz, &inc_limit_ret) < 0) return -1; + + cur_vma->sbrk += inc_sz; + /* TODO: commit the limit increment */ + if ( old_sbrk + size > cur_vma -> vm_end ) + { + if ( inc_vma_limit ( caller , vmaid , inc_sz, &inc_limit_ret ) < 0) + { + struct framephy_struct * frm_lst = NULL ; + struct vm_rg_struct * ret_rg = malloc ( sizeof ( struct vm_rg_struct ) ); + int pages = ( inc_sz / PAGING_PAGESZ ); + ret_rg -> rg_start = ret_rg -> rg_end = old_sbrk ; + ret_rg -> rg_next = NULL ; + alloc_pages_range ( caller , pages , & frm_lst ); + vmap_page_range ( caller , old_sbrk , pages , frm_lst , ret_rg ); + caller ->mm -> symrgtbl [ rgid ]. rg_start = ret_rg -> rg_start ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = ret_rg -> rg_end ; + cur_vma -> sbrk += ret_rg -> rg_end - ret_rg -> rg_start ; + return 0; + } + } + + /* Successful increase limit */ + caller ->mm -> symrgtbl [ rgid ]. rg_start = old_sbrk ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = old_sbrk + size ; + /* TODO: commit the allocation address + // *alloc_addr = ... + */ + *alloc_addr = rgnode.rg_start; + + return 0; +} + +/*__free - remove a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __free(struct pcb_t *caller, int rgid) +{ + struct vm_rg_struct rgnode; + + // Dummy initialization for avoding compiler dummay warning + // in incompleted TODO code rgnode will overwrite through implementing + // the manipulation of rgid later + rgnode.vmaid = 0; //dummy initialization + rgnode.vmaid = 1; //dummy initialization + + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return -1; + + /* TODO: Manage the collect freed region to freerg_list */ + struct vm_rg_struct *sym_rg = &caller->mm->symrgtbl[rgid]; + rgnode.rg_start = sym_rg->rg_start; + rgnode.rg_end = sym_rg->rg_end; + rgnode.vmaid = sym_rg->vmaid; + + /*enlist the obsoleted memory region */ + enlist_vm_freerg_list(caller->mm, rgnode); + + return 0; +} + +/*pgalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 0 */ + return __alloc(proc, 0, reg_index, size, &addr); +} + +/*pgmalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify vaiable in symbole table) + */ +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 1 */ + return __alloc(proc, 1, reg_index, size, &addr); +} + +/*pgfree - PAGING-based free a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ + +int pgfree_data(struct pcb_t *proc, uint32_t reg_index) +{ + return __free(proc, reg_index); +} + +/*pg_getpage - get the page in ram + *@mm: memory region + *@pagenum: PGN + *@framenum: return FPN + *@caller: caller + * + */ +int pg_getpage(struct mm_struct *mm, int pgn, int *fpn, struct pcb_t *caller) +{ + uint32_t pte = mm->pgd[pgn]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + // Page không tồn tại, cần đưa vào bộ nhớ + int vicpgn, swpfpn, vicfpn; + uint32_t vicpte; + + int tgtfpn = PAGING_PTE_SWP(pte); // Frame mục tiêu trong swap + + // Tìm victim page + if (find_victim_page(caller->mm, &vicpgn) < 0) + return -1; + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + // Lấy free frame từ MEMSWP + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) < 0) + { + struct memphy_struct **mswpit = caller->mswp; + for (int i = 0; i < PAGING_MAX_MMSWP; i++) + { + struct memphy_struct *tmp_swp = mswpit[i]; + if (MEMPHY_get_freefp(tmp_swp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, tmp_swp, swpfpn); + caller->active_mswp = tmp_swp; + break; + } + } + } + else + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + } + + // Swap frame từ MEMRAM sang MEMSWP và ngược lại + __swap_cp_page(caller->active_mswp, tgtfpn, caller->mram, vicfpn); + + // Cập nhật page table + MEMPHY_put_freefp(caller->active_mswp, tgtfpn); + // swptype = 1 + pte_set_swap(&caller->mm->pgd[vicpgn], 1, swpfpn); + + // Đánh dấu trạng thái online của page mục tiêu + pte_set_fpn(&caller->mm->pgd[pgn], vicfpn); + pte = caller->mm->pgd[pgn]; + + + + *fpn = PAGING_OFFST(pte); + return 0; +} +} + + /* Do swap frame from MEMRAM to MEMSWP and vice versa*/ + /* Copy victim frame to swap */ + //__swap_cp_page(); + /* Copy target frame from swap to mem */ + //__swap_cp_page(); + + /* Update page table */ + //pte_set_swap() &mm->pgd; + + /* Update its online status of the target page */ + //pte_set_fpn() & mm->pgd[pgn]; + // pte_set_fpn(&pte, tgtfpn); + + // enlist_pgn_node(&caller->mm->fifo_pgn,pgn); + // } + + // *fpn = PAGING_PTE_FPN(pte); + + // return 0; + + +/*pg_getval - read value at given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_getval(struct mm_struct *mm, int addr, BYTE *data, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_read(caller->mram,phyaddr, data); + + return 0; +} + +/*pg_setval - write value to given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_setval(struct mm_struct *mm, int addr, BYTE value, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_write(caller->mram,phyaddr, value); + + return 0; +} + +/*__read - read value in region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_getval(caller->mm, currg->rg_start + offset, data, caller); + + return 0; +} + + +/*pgwrite - PAGING-based read a region memory */ +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) +{ + BYTE data; + int val = __read(proc, source, offset, &data); + + destination = (uint32_t) data; +#ifdef IODUMP + printf("read region=%d offset=%d value=%d\n", source, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return val; +} + +/*__write - write a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_setval(caller->mm, currg->rg_start + offset, value, caller); + + return 0; +} + +/*pgwrite - PAGING-based write a region memory */ +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) +{ +#ifdef IODUMP + printf("write region=%d offset=%d value=%d\n", destination, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return __write(proc, destination, offset, data); +} + + +/*free_pcb_memphy - collect all memphy of pcb + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + */ +int free_pcb_memph(struct pcb_t *caller) +{ + int pagenum, fpn; + uint32_t pte; + + + for(pagenum = 0; pagenum < PAGING_MAX_PGN; pagenum++) + { + pte= caller->mm->pgd[pagenum]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + fpn = PAGING_PTE_FPN(pte); + MEMPHY_put_freefp(caller->mram, fpn); + } else { + fpn = PAGING_PTE_SWP(pte); + MEMPHY_put_freefp(caller->active_mswp, fpn); + } + } + + return 0; +} + +/*get_vm_area_node - get vm area for a number of pages + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + *@vmastart: vma end + *@vmaend: vma end + * + */ +struct vm_rg_struct* get_vm_area_node_at_brk(struct pcb_t *caller, int vmaid, int size, int alignedsz) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct));; + /* TODO retrive current vma to obtain newrg, current comment out due to compiler redundant warning*/ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + /* TODO: update the newrg boundary + // newrg->rg_start = ... + // newrg->rg_end = ... + */ + + newrg->rg_start = cur_vma -> sbrk; + + if ( (cur_vma ->sbrk + alignedsz) > cur_vma -> vm_end ) return newrg = cur_vma -> sbrk; +cur_vma ->sbrk = cur_vma->sbrk + alignedsz; + + newrg->rg_end = cur_vma -> sbrk; + +return newrg; +} + +/*validate_overlap_vm_area + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@vmastart: vma end + *@vmaend: vma end + * + */ +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend) +{ + struct vm_area_struct *vma = caller->mm->mmap; + + /* TODO validate the planned memory area is not overlapped */ + while(vma != NULL) + { + + if ((vmastart >= vma->vm_start && vmastart < vma->vm_end) || (vmastart <= vma->vm_start && vmaend >= vma->vm_end)) + { + return -1; + } + vma = vma->vm_next; + } + return 0; +} + +/*inc_vma_limit - increase vm area limits to reserve space for new variable + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@inc_sz: increment size + *@inc_limit_ret: increment limit return + * + */ +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct)); + int inc_amt = PAGING_PAGE_ALIGNSZ(inc_sz); + int incnumpage = inc_amt / PAGING_PAGESZ; + struct vm_rg_struct *area = get_vm_area_node_at_brk(caller, vmaid, inc_sz, inc_amt); + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + int old_end = cur_vma->vm_end; + + /*Validate overlap of obtained region */ + if (validate_overlap_vm_area(caller, vmaid, area->rg_start, area->rg_end) < 0) + return -1; /*Overlap and failed allocation */ + + /* TODO: Obtain the new vm area based on vmaid */ + cur_vma->sbrk = area -> rg_start; + + + if (vm_map_ram(caller, area->rg_start, area->rg_end, + old_end, incnumpage , newrg) < 0) + return -1; /* Map the memory to MEMRAM */ + inc_limit_ret = cur_vma->vm_end + inc_sz; + return 0; + +} + +/*find_victim_page - find victim page + *@caller: caller + *@pgn: return page number + * + */ +int find_victim_page(struct mm_struct *mm, int *retpgn) +{ + struct pgn_t *pg = mm->fifo_pgn; + + /* TODO: Implement the theorical mechanism to find the victim page */ + if (pg == NULL) return -1; + + *retpgn = pg->pgn; + + mm->fifo_pgn = pg->pg_next; + + free(pg); + + return 0; +} + +/*get_free_vmrg_area - get a free vm region + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@size: allocated size + * + */ +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg) +{ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + struct vm_rg_struct *rgit = cur_vma->vm_freerg_list; + + if (rgit == NULL) + return -1; + + /* Probe unintialized newrg */ + newrg->rg_start = newrg->rg_end = -1; + + /* Traverse on list of free vm region to find a fit space */ + //check điều kiện bịp + while (rgit != NULL && rgit->vmaid == vmaid) + { + if (rgit->rg_start + size <= rgit->rg_end) + { /* Current region has enough space */ + newrg->rg_start = rgit->rg_start; + newrg->rg_end = rgit->rg_start + size; + + /* Update left space in chosen region */ + if (rgit->rg_start + size < rgit->rg_end) + { + rgit->rg_start = rgit->rg_start + size; + } + else + { /*Use up all space, remove current node */ + /*Clone next rg node */ + struct vm_rg_struct *nextrg = rgit->rg_next; + + /*Cloning */ + if (nextrg != NULL) + { + rgit->rg_start = nextrg->rg_start; + rgit->rg_end = nextrg->rg_end; + + rgit->rg_next = nextrg->rg_next; + + free(nextrg); + } + else + { /*End of free list */ + rgit->rg_start = rgit->rg_end; //dummy, size 0 region + rgit->rg_next = NULL; + } + } + } + else + { + rgit = rgit->rg_next; // Traverse next rg + } + } + + if(newrg->rg_start == -1) // new region not found + return -1; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm.c b/ossim_source_code/src/mm.c new file mode 100644 index 0000000..5071151 --- /dev/null +++ b/ossim_source_code/src/mm.c @@ -0,0 +1,458 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory management unit mm/mm.c + */ + +#include "mm.h" +#include +#include + +/* + * init_pte - Initialize PTE entry + */ +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff) //swap offset +{ + if (pre != 0) { + if (swp == 0) { // Non swap ~ page online + if (fpn == 0) + return -1; // Invalid setting + + /* Valid setting with FPN */ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + } else { // page swapped + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + } + } + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for swapped page + * @pte : target page table entry (PTE) + * @swptyp : swap type + * @swpoff : swap offset + */ +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for on-line page + * @pte : target page table entry (PTE) + * @fpn : frame page number (FPN) + */ +int pte_set_fpn(uint32_t *pte, int fpn) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + + return 0; +} + + +/* + * vmap_page_range - map a range of page at aligned address + */ +int vmap_page_range(struct pcb_t *caller, // process call + int addr, // start address which is aligned to pagesz + int pgnum, // num of mapping page + struct framephy_struct *frames,// list of the mapped frames + struct vm_rg_struct *ret_rg)// return mapped region, the real mapped fp +{ // no guarantee all given pages are mapped + //uint32_t * pte = malloc(sizeof(uint32_t)); + struct framephy_struct *fpit = malloc(sizeof(struct framephy_struct)); + //int fpn; + int pgit = 0; + int pgn = PAGING_PGN(addr); + + /* TODO: update the rg_end and rg_start of ret_rg + //ret_rg->rg_end = .... + //ret_rg->rg_start = ... + //ret_rg->vmaid = ... + */ + ret_rg -> rg_end = ret_rg -> rg_start = addr ; + + fpit->fp_next = frames; + + /* TODO map range of frame to address space + * in page table pgd in caller->mm + */ + + /* Tracking for later page replacement activities (if needed) + * Enqueue new usage page */ + while ( pgit < pgnum ) + { + if ( fpit == NULL ) + { + break ; + } + pgn = PAGING_PGN ( addr + pgnum * PAGING_PAGESZ ); + pte_set_fpn (&( caller ->mm -> pgd [ pgn ]) , fpit -> fpn ) ; + enlist_pgn_node (& caller -> mm -> fifo_pgn , pgn + pgit ) ; + fpit = fpit -> fp_next ; + } + ret_rg -> rg_end += pgit * PAGING_PAGESZ ; + return 0; + +} + +/* + * alloc_pages_range - allocate req_pgnum of frame in ram + * @caller : caller + * @req_pgnum : request page num + * @frm_lst : frame list + */ + +int alloc_pages_range(struct pcb_t *caller, int req_pgnum, struct framephy_struct** frm_lst) +{ + int pgit, fpn; + struct framephy_struct *newfp_str; + + for (pgit = 0; pgit < req_pgnum; pgit++) + { + if (MEMPHY_get_freefp(caller->mram, &fpn) == 0) + { + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = fpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + struct framephy_struct *temp = malloc(sizeof(struct framephy_struct)); + *temp = *newfp_str; + temp->fp_next = caller->mram->used_fp_list; + caller->mram->used_fp_list = temp; + } + else + { + // ERROR CODE of obtaining some but not enough frames + int vicfpn, vicpgn, swpfpn; + uint32_t vicpte; + + if (find_victim_page(caller->mm, &vicpgn) < 0) + { + return -1; + } + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = vicfpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + int i; + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + struct memphy_struct *mswp = *caller->mswp; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (mswp + i == caller->active_mswp) break; + } + } + else + { + struct memphy_struct *mswp = *caller->mswp; + swpfpn = -1; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (MEMPHY_get_freefp(mswp + i, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, mswp + i, swpfpn); + break; + } + } + } + + if (swpfpn == -1) + return -3000; + + pte_set_swap(&caller->mm->pgd[vicpgn], i, swpfpn); + } + } + + return 0; +} + + + +/* + * vm_map_ram - do the mapping all vm are to ram storage device + * @caller : caller + * @astart : vm area start + * @aend : vm area end + * @mapstart : start mapping point + * @incpgnum : number of mapped page + * @ret_rg : returned region + */ +int vm_map_ram(struct pcb_t *caller, int astart, int aend, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg) +{ + struct framephy_struct *frm_lst = NULL; + int ret_alloc; + + /*@bksysnet: author provides a feasible solution of getting frames + *FATAL logic in here, wrong behaviour if we have not enough page + *i.e. we request 1000 frames meanwhile our RAM has size of 3 frames + *Don't try to perform that case in this simple work, it will result + *in endless procedure of swap-off to get frame and we have not provide + *duplicate control mechanism, keep it simple + */ + ret_alloc = alloc_pages_range(caller, incpgnum, &frm_lst); + + if (ret_alloc < 0 && ret_alloc != -3000) + return -1; + + /* Out of memory */ + if (ret_alloc == -3000) + { +#ifdef MMDBG + printf("OOM: vm_map_ram out of memory \n"); +#endif + return -1; + } + + /* it leaves the case of memory is enough but half in ram, half in swap + * do the swaping all to swapper to get the all in ram */ + vmap_page_range(caller, mapstart, incpgnum, frm_lst, ret_rg); + + return 0; +} + +/* Swap copy content page from source frame to destination frame + * @mpsrc : source memphy + * @srcfpn : source physical page number (FPN) + * @mpdst : destination memphy + * @dstfpn : destination physical page number (FPN) + **/ +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) +{ + int cellidx; + int addrsrc,addrdst; + for(cellidx = 0; cellidx < PAGING_PAGESZ; cellidx++) + { + addrsrc = srcfpn * PAGING_PAGESZ + cellidx; + addrdst = dstfpn * PAGING_PAGESZ + cellidx; + + BYTE data; + MEMPHY_read(mpsrc, addrsrc, &data); + MEMPHY_write(mpdst, addrdst, data); + } + + return 0; +} + +/* + *Initialize a empty Memory Management instance + * @mm: self mm + * @caller: mm owner + */ +int init_mm(struct mm_struct *mm, struct pcb_t *caller) +{ + struct vm_area_struct *vma0 = malloc(sizeof(struct vm_area_struct)); + struct vm_area_struct *vma1 = malloc(sizeof(struct vm_area_struct)); + + mm->pgd = malloc(PAGING_MAX_PGN * sizeof(uint32_t)); + + /* By default the owner comes with at least one vma for DATA */ + vma0->vm_id = 0; + vma0->vm_start = 0; + vma0->vm_end = vma0->vm_start; + vma0->sbrk = vma0->vm_start; + + struct vm_rg_struct *first_rg = init_vm_rg(vma0->vm_start, vma0->vm_end, 0); + enlist_vm_rg_node(&vma0->vm_freerg_list, first_rg); + + /* Update vma0 next */ + vma0->vm_next = vma1; // Assuming vma1 is the next VM area + + /* Update one vma for HEAP */ + vma1->vm_id = 1; // Assuming ID for heap + // vma1->vm_start = HEAP_START; // Define an appropriate start address for the heap + //vma1->vm_end = HEAP_END; // Define the end address for the heap + vma1->sbrk = vma1->vm_start; + + struct vm_rg_struct *first_rg_heap = init_vm_rg(vma1->vm_start, vma1->vm_end, 0); + enlist_vm_rg_node(&vma1->vm_freerg_list, first_rg_heap); + + /* Set next for vma1 */ + vma1->vm_next = NULL; // Assuming it's the last one in the list for now + + /* Point vma owner backward */ + vma0->vm_mm = mm; + vma1->vm_mm = mm; + + /* Update mmap */ + mm->mmap = vma0; // Start the mmap list with vma0 + + return 0; +} + + +struct vm_rg_struct* init_vm_rg(int rg_start, int rg_end, int vmaid) +{ + struct vm_rg_struct *rgnode = malloc(sizeof(struct vm_rg_struct)); + + rgnode->rg_start = rg_start; + rgnode->rg_end = rg_end; + rgnode->vmaid = vmaid; + rgnode->rg_next = NULL; + + return rgnode; +} + +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode) +{ + rgnode->rg_next = *rglist; + *rglist = rgnode; + + return 0; +} + +int enlist_pgn_node(struct pgn_t **plist, int pgn) +{ + struct pgn_t* pnode = malloc(sizeof(struct pgn_t)); + + pnode->pgn = pgn; + pnode->pg_next = *plist; + *plist = pnode; + + return 0; +} + +int print_list_fp(struct framephy_struct *ifp) +{ + struct framephy_struct *fp = ifp; + + printf("print_list_fp: "); + if (fp == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (fp != NULL ) + { + printf("fp[%d]\n",fp->fpn); + fp = fp->fp_next; + } + printf("\n"); + return 0; +} + +int print_list_rg(struct vm_rg_struct *irg) +{ + struct vm_rg_struct *rg = irg; + + printf("print_list_rg: "); + if (rg == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (rg != NULL) + { + printf("rg[%ld->%ldvma=%d]\n",rg->rg_start, rg->rg_end, rg->vmaid); + rg = rg->rg_next; + } + printf("\n"); + return 0; +} + +int print_list_vma(struct vm_area_struct *ivma) +{ + struct vm_area_struct *vma = ivma; + + printf("print_list_vma: "); + if (vma == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (vma != NULL ) + { + printf("va[%ld->%ld]\n",vma->vm_start, vma->vm_end); + vma = vma->vm_next; + } + printf("\n"); + return 0; +} + +int print_list_pgn(struct pgn_t *ip) +{ + printf("print_list_pgn: "); + if (ip == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (ip != NULL ) + { + printf("va[%d]-\n",ip->pgn); + ip = ip->pg_next; + } + printf("n"); + return 0; +} + +int print_pgtbl(struct pcb_t *caller, uint32_t start, uint32_t end) +{ + int pgn_start,pgn_end; + int pgit; + + if(end == -1){ + pgn_start = 0; + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, 0); + end = cur_vma->vm_end; + } + pgn_start = PAGING_PGN(start); + pgn_end = PAGING_PGN(end); + + printf("print_pgtbl: %d - %d", start, end); + if (caller == NULL) {printf("NULL caller\n"); return -1;} + printf("\n"); + + + for(pgit = pgn_start; pgit < pgn_end; pgit++) + { + printf("%08ld: %08x\n", pgit * sizeof(uint32_t), caller->mm->pgd[pgit]); + } + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/os.c b/ossim_source_code/src/os.c new file mode 100644 index 0000000..288a3c1 --- /dev/null +++ b/ossim_source_code/src/os.c @@ -0,0 +1,292 @@ + +#include "cpu.h" +#include "timer.h" +#include "sched.h" +#include "loader.h" +#include "mm.h" + +#include +#include +#include +#include + +static int time_slot; +static int num_cpus; +static int done = 0; + +#ifdef MM_PAGING +static int memramsz; +static int memswpsz[PAGING_MAX_MMSWP]; +#ifdef MM_PAGING_HEAP_GODOWN +static int vmemsz; +#endif + +struct mmpaging_ld_args { + /* A dispatched argument struct to compact many-fields passing to loader */ + int vmemsz; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; + struct timer_id_t *timer_id; +}; +#endif + +static struct ld_args{ + char ** path; + unsigned long * start_time; +#ifdef MLQ_SCHED + unsigned long * prio; +#endif +} ld_processes; +int num_processes; + +struct cpu_args { + struct timer_id_t * timer_id; + int id; +}; + + +static void * cpu_routine(void * args) { + struct timer_id_t * timer_id = ((struct cpu_args*)args)->timer_id; + int id = ((struct cpu_args*)args)->id; + /* Check for new process in ready queue */ + int time_left = 0; + struct pcb_t * proc = NULL; + while (1) { + /* Check the status of current process */ + if (proc == NULL) { + /* No process is running, the we load new process from + * ready queue */ + proc = get_proc(); + if (proc == NULL) { + next_slot(timer_id); + continue; /* First load failed. skip dummy load */ + } + }else if (proc->pc == proc->code->size) { + /* The porcess has finish it job */ + printf("\tCPU %d: Processed %2d has finished\n", + id ,proc->pid); + free(proc); + proc = get_proc(); + time_left = 0; + }else if (time_left == 0) { + /* The process has done its job in current time slot */ + printf("\tCPU %d: Put process %2d to run queue\n", + id, proc->pid); + put_proc(proc); + proc = get_proc(); + } + + /* Recheck process status after loading new process */ + if (proc == NULL && done) { + /* No process to run, exit */ + printf("\tCPU %d stopped\n", id); + break; + }else if (proc == NULL) { + /* There may be new processes to run in + * next time slots, just skip current slot */ + next_slot(timer_id); + continue; + }else if (time_left == 0) { + printf("\tCPU %d: Dispatched process %2d\n", + id, proc->pid); + time_left = time_slot; + } + + /* Run current process */ + run(proc); + time_left--; + next_slot(timer_id); + } + detach_event(timer_id); + pthread_exit(NULL); +} + +static void * ld_routine(void * args) { +#ifdef MM_PAGING + struct memphy_struct* mram = ((struct mmpaging_ld_args *)args)->mram; + struct memphy_struct** mswp = ((struct mmpaging_ld_args *)args)->mswp; + struct memphy_struct* active_mswp = ((struct mmpaging_ld_args *)args)->active_mswp; + struct timer_id_t * timer_id = ((struct mmpaging_ld_args *)args)->timer_id; +#else + struct timer_id_t * timer_id = (struct timer_id_t*)args; +#endif + int i = 0; + printf("ld_routine\n"); + while (i < num_processes) { + struct pcb_t * proc = load(ld_processes.path[i]); +#ifdef MLQ_SCHED + proc->prio = ld_processes.prio[i]; +#endif + while (current_time() < ld_processes.start_time[i]) { + next_slot(timer_id); + } +#ifdef MM_PAGING + proc->mm = malloc(sizeof(struct mm_struct)); +#ifdef MM_PAGING_HEAP_GODOWN + proc->vmemsz = vmemsz; +#endif + init_mm(proc->mm, proc); + proc->mram = mram; + proc->mswp = mswp; + proc->active_mswp = active_mswp; +#endif + printf("\tLoaded a process at %s, PID: %d PRIO: %ld\n", + ld_processes.path[i], proc->pid, ld_processes.prio[i]); + add_proc(proc); + free(ld_processes.path[i]); + i++; + next_slot(timer_id); + } + free(ld_processes.path); + free(ld_processes.start_time); + done = 1; + detach_event(timer_id); + pthread_exit(NULL); +} + +static void read_config(const char * path) { + FILE * file; + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find configure file at %s\n", path); + exit(1); + } + fscanf(file, "%d %d %d\n", &time_slot, &num_cpus, &num_processes); + + ld_processes.path = (char**)malloc(sizeof(char*) * num_processes); + ld_processes.start_time = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#ifdef MM_PAGING + int sit; +#ifdef MM_FIXED_MEMSZ + /* We provide here a back compatible with legacy OS simulatiom config file + * In which, it have no addition config line for Mema, keep only one line + * for legacy info + * [time slice] [N = Number of CPU] [M = Number of Processes to be run] + */ + memramsz = 0x100000; + memswpsz[0] = 0x1000000; + for(sit = 1; sit < PAGING_MAX_MMSWP; sit++) + memswpsz[sit] = 0; + +#ifdef MM_PAGING_HEAP_GODOWN + vmemsz = 0x300000; +#endif +#else + /* Read input config of memory size: MEMRAM and upto 4 MEMSWP (mem swap) + * Format: (size=0 result non-used memswap, must have RAM and at least 1 SWAP) + * MEM_RAM_SZ MEM_SWP0_SZ MEM_SWP1_SZ MEM_SWP2_SZ MEM_SWP3_SZ + */ + fscanf(file, "%d\n", &memramsz); + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + fscanf(file, "%d", &(memswpsz[sit])); +#ifdef MM_PAGING_HEAP_GODOWN + fscanf(file, "%d\n", &vmemsz); +#endif + fscanf(file, "\n"); /* Final character */ +#endif +#endif + +#ifdef MLQ_SCHED + ld_processes.prio = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#endif + int i; + for (i = 0; i < num_processes; i++) { + ld_processes.path[i] = (char*)malloc(sizeof(char) * 100); + ld_processes.path[i][0] = '\0'; + strcat(ld_processes.path[i], "input/proc/"); + char proc[100]; +#ifdef MLQ_SCHED + fscanf(file, "%lu %s %lu\n", &ld_processes.start_time[i], proc, &ld_processes.prio[i]); +#else + fscanf(file, "%lu %s\n", &ld_processes.start_time[i], proc); +#endif + strcat(ld_processes.path[i], proc); + } +} + +int main(int argc, char * argv[]) { + /* Read config */ + if (argc != 2) { + printf("Usage: os [path to configure file]\n"); + return 1; + } + char path[100]; + path[0] = '\0'; + strcat(path, "input/"); + strcat(path, argv[1]); + + read_config(path); + + pthread_t * cpu = (pthread_t*)malloc(num_cpus * sizeof(pthread_t)); + struct cpu_args * args = + (struct cpu_args*)malloc(sizeof(struct cpu_args) * num_cpus); + pthread_t ld; + + /* Init timer */ + int i; + for (i = 0; i < num_cpus; i++) { + args[i].timer_id = attach_event(); + args[i].id = i; + } + struct timer_id_t * ld_event = attach_event(); + start_timer(); + +#ifdef MM_PAGING + /* Init all MEMPHY include 1 MEMRAM and n of MEMSWP */ + int rdmflag = 1; /* By default memphy is RANDOM ACCESS MEMORY */ + + struct memphy_struct mram; + struct memphy_struct mswp[PAGING_MAX_MMSWP]; + + /* Create MEM RAM */ + init_memphy(&mram, memramsz, rdmflag); + + /* Create all MEM SWAP */ + int sit; + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + init_memphy(&mswp[sit], memswpsz[sit], rdmflag); + + /* In Paging mode, it needs passing the system mem to each PCB through loader*/ + struct mmpaging_ld_args *mm_ld_args = malloc(sizeof(struct mmpaging_ld_args)); + + mm_ld_args->timer_id = ld_event; + mm_ld_args->mram = (struct memphy_struct *) &mram; + mm_ld_args->mswp = (struct memphy_struct**) &mswp; +#ifdef MM_PAGING_HEAP_GODOWN + mm_ld_args->vmemsz = vmemsz; +#endif + mm_ld_args->active_mswp = (struct memphy_struct *) &mswp[0]; +#endif + + + /* Init scheduler */ + init_scheduler(); + + /* Run CPU and loader */ +#ifdef MM_PAGING + pthread_create(&ld, NULL, ld_routine, (void*)mm_ld_args); +#else + pthread_create(&ld, NULL, ld_routine, (void*)ld_event); +#endif + for (i = 0; i < num_cpus; i++) { + pthread_create(&cpu[i], NULL, + cpu_routine, (void*)&args[i]); + } + + /* Wait for CPU and loader finishing */ + for (i = 0; i < num_cpus; i++) { + pthread_join(cpu[i], NULL); + } + pthread_join(ld, NULL); + + /* Stop timer */ + stop_timer(); + + return 0; + +} + + + diff --git a/ossim_source_code/src/paging.c b/ossim_source_code/src/paging.c new file mode 100644 index 0000000..b061019 --- /dev/null +++ b/ossim_source_code/src/paging.c @@ -0,0 +1,18 @@ + +#include "mem.h" +#include "cpu.h" +#include "loader.h" +#include + +int main() { + struct pcb_t * ld = load("input/p0"); + struct pcb_t * proc = load("input/p0"); + unsigned int i; + for (i = 0; i < proc->code->size; i++) { + run(proc); + run(ld); + } + dump(); + return 0; +} + diff --git a/ossim_source_code/src/queue.c b/ossim_source_code/src/queue.c new file mode 100644 index 0000000..6273086 --- /dev/null +++ b/ossim_source_code/src/queue.c @@ -0,0 +1,49 @@ +#include +#include +#include "queue.h" + +int empty(struct queue_t * q) { + if (q == NULL) return 1; + return (q->size == 0); +} + +void enqueue(struct queue_t * q, struct pcb_t * proc) { + /* TODO: put a new process to queue [q] */ + if (q->size > MAX_QUEUE_SIZE){ + return; + } + else if (!q->size){ + q->proc[0] = proc; + q->size++; + } + else { + int index = q->size; + while (index > 0 && q->proc[index - 1]->priority > proc->priority){ + q->proc[index] = q->proc[index - 1]; + index--; + } + + q->proc[index] = proc; + q->size++; + } + +} + +struct pcb_t * dequeue(struct queue_t * q) { + /* TODO: return a pcb whose prioprity is the highest + * in the queue [q] and remember to remove it from q + * */ + struct pcb_t * result = NULL; + if (q->proc[0] != NULL){ + result = q->proc[0]; + + for (int i = 0; i < q->size - 1; i++){ + q->proc[i] = q->proc[i + 1]; + } + q->proc[q->size - 1] = NULL; + q->size--; + + } + return result; +} + diff --git a/ossim_source_code/src/sched.c b/ossim_source_code/src/sched.c new file mode 100644 index 0000000..c4d5ce2 --- /dev/null +++ b/ossim_source_code/src/sched.c @@ -0,0 +1,140 @@ + +#include "queue.h" +#include "sched.h" +#include + +#include +#include +static struct queue_t ready_queue; +static struct queue_t run_queue; +static pthread_mutex_t queue_lock; + +#ifdef MLQ_SCHED +static struct queue_t mlq_ready_queue[MAX_PRIO]; +#endif + +int queue_empty(void) { +#ifdef MLQ_SCHED + unsigned long prio; + for (prio = 0; prio < MAX_PRIO; prio++) + if(!empty(&mlq_ready_queue[prio])) + return -1; +#endif + return (empty(&ready_queue) && empty(&run_queue)); +} + +void init_scheduler(void) { +#ifdef MLQ_SCHED + int i ; + + for (i = 0; i < MAX_PRIO; i ++) + mlq_ready_queue[i].size = 0; +#endif + ready_queue.size = 0; + run_queue.size = 0; + pthread_mutex_init(&queue_lock, NULL); +} + +#ifdef MLQ_SCHED +/* + * Stateful design for routine calling + * based on the priority and our MLQ policy + * We implement stateful here using transition technique + * State representation prio = 0 .. MAX_PRIO, curr_slot = 0..(MAX_PRIO - prio) + */ +struct pcb_t * get_mlq_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from PRIORITY [ready_queue]. + * Remember to use lock to protect the queue. + * */ + //int curr_slot = 0; + pthread_mutex_lock(&queue_lock); + int prio; + + for (prio = 0; prio < MAX_PRIO; prio++){ + if (mlq_ready_queue[prio].size != 0 && mlq_ready_queue[prio].count_slot < MAX_PRIO - prio){ + proc = dequeue(&mlq_ready_queue[prio]); + mlq_ready_queue[prio].count_slot++; + break; + } + } + + if (prio == MAX_PRIO) { + for (int i = 0; i < MAX_PRIO; i++){ + mlq_ready_queue[i].count_slot = 0; + } + + for (int i = 0; i < MAX_PRIO; i++){ + if (mlq_ready_queue[i].size != 0 && mlq_ready_queue[i].count_slot < MAX_PRIO - i){ + proc = dequeue(&mlq_ready_queue[i]); + mlq_ready_queue[i].count_slot++; + break; + } + } + } + + // while (prio < MAX_PRIO){ + // curr_slot = MAX_PRIO - prio; + // if (!empty(&mlq_ready_queue[prio]) && mlq_ready_queue[prio].count_slot < curr_slot){ + // proc = dequeue(&mlq_ready_queue[prio]); + // curr_slot--; + // break; + // } + // else{ + // prio = (prio + 1) % MAX_PRIO; + // curr_slot = 0; + // } + // } + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +struct pcb_t * get_proc(void) { + return get_mlq_proc(); +} + +void put_proc(struct pcb_t * proc) { + return put_mlq_proc(proc); +} + +void add_proc(struct pcb_t * proc) { + return add_mlq_proc(proc); +} +#else +struct pcb_t * get_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from [ready_queue]. + * Remember to use lock to protect the queue. + * */ + pthread_mutex_lock(&queue_lock); + dequeue(&ready_queue); + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&run_queue, proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&ready_queue, proc); + pthread_mutex_unlock(&queue_lock); +} +#endif + + diff --git a/ossim_source_code/src/timer.c b/ossim_source_code/src/timer.c new file mode 100644 index 0000000..02c4111 --- /dev/null +++ b/ossim_source_code/src/timer.c @@ -0,0 +1,136 @@ + +#include "timer.h" +#include +#include + +static pthread_t _timer; + +struct timer_id_container_t { + struct timer_id_t id; + struct timer_id_container_t * next; +}; + +static struct timer_id_container_t * dev_list = NULL; + +static uint64_t _time; + +static int timer_started = 0; +static int timer_stop = 0; + + +static void * timer_routine(void * args) { + while (!timer_stop) { + printf("Time slot %3lu\n", current_time()); + int fsh = 0; + int event = 0; + /* Wait for all devices have done the job in current + * time slot */ + struct timer_id_container_t * temp; + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.event_lock); + while (!temp->id.done && !temp->id.fsh) { + pthread_cond_wait( + &temp->id.event_cond, + &temp->id.event_lock + ); + } + if (temp->id.fsh) { + fsh++; + } + event++; + pthread_mutex_unlock(&temp->id.event_lock); + } + + /* Increase the time slot */ + _time++; + + /* Let devices continue their job */ + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.timer_lock); + temp->id.done = 0; + pthread_cond_signal(&temp->id.timer_cond); + pthread_mutex_unlock(&temp->id.timer_lock); + } + if (fsh == event) { + break; + } + } + pthread_exit(args); +} + +void next_slot(struct timer_id_t * timer_id) { + /* Tell to timer that we have done our job in current slot */ + pthread_mutex_lock(&timer_id->event_lock); + timer_id->done = 1; + pthread_cond_signal(&timer_id->event_cond); + pthread_mutex_unlock(&timer_id->event_lock); + + /* Wait for going to next slot */ + pthread_mutex_lock(&timer_id->timer_lock); + while (timer_id->done) { + pthread_cond_wait( + &timer_id->timer_cond, + &timer_id->timer_lock + ); + } + pthread_mutex_unlock(&timer_id->timer_lock); +} + +uint64_t current_time() { + return _time; +} + +void start_timer() { + timer_started = 1; + pthread_create(&_timer, NULL, timer_routine, NULL); +} + +void detach_event(struct timer_id_t * event) { + pthread_mutex_lock(&event->event_lock); + event->fsh = 1; + pthread_cond_signal(&event->event_cond); + pthread_mutex_unlock(&event->event_lock); +} + +struct timer_id_t * attach_event() { + if (timer_started) { + return NULL; + }else{ + struct timer_id_container_t * container = + (struct timer_id_container_t*)malloc( + sizeof(struct timer_id_container_t) + ); + container->id.done = 0; + container->id.fsh = 0; + pthread_cond_init(&container->id.event_cond, NULL); + pthread_mutex_init(&container->id.event_lock, NULL); + pthread_cond_init(&container->id.timer_cond, NULL); + pthread_mutex_init(&container->id.timer_lock, NULL); + if (dev_list == NULL) { + dev_list = container; + dev_list->next = NULL; + }else{ + container->next = dev_list; + dev_list = container; + } + return &(container->id); + } +} + +void stop_timer() { + timer_stop = 1; + pthread_join(_timer, NULL); + while (dev_list != NULL) { + struct timer_id_container_t * temp = dev_list; + dev_list = dev_list->next; + pthread_cond_destroy(&temp->id.event_cond); + pthread_mutex_destroy(&temp->id.event_lock); + pthread_cond_destroy(&temp->id.timer_cond); + pthread_mutex_destroy(&temp->id.timer_lock); + free(temp); + } +} + + + + From a35e6dc2729d6ecd527eb924354ff5432348821a Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:55:16 +0700 Subject: [PATCH 6/9] Update .DS_Store --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 46cc050947f8c4422ae2d16386667947ed2de4a4..054674dca4467ae7ae39c89da7c1d66928d97205 100644 GIT binary patch literal 6148 zcmeHKU2oGc6usWcmNFp~38Xzn;wB+1j$^wfA~CAtU7{WlIY^A1i^zTNnT+7gN5ws) zo$pFeYSltCFQ=x3uhBG1%W63MCf3$F7dAGXO=rt_uf;{-0RU#3MY=ObAcaj9Z`ZE(6yH|T9I7B}|y`tI)V*0S#| zZto5I?*8?g%VpQOdTns$FnFKkh5V%ELIP)*l1m0p;4=y>xSCec6k+=p^qtqEkx-B^aQ6S*M?v`$7&SHLt+hdL;+v6KY*>Ghp3I9JwqP> zRz$DhF`~G2_8qhy?^8407PD*D<_CXPWU@GhH?!HLLps11$MgiagAv9*eNkWFb^42f zYUP|6FyFbeb}pJ%-y;&IlgOMq_;>c?AK^iA;`>itO|S;ZzCyz&E*2n VGuUWE4aEKtP&C-gGVn(k_yO-srB(m{ delta 90 zcmZoMXfc=|#>CJzu~2NHo}wrt0|NsP3otPFGPpA6G2}9&c;-wjRNtJ-Hj8ny0tY+G p#)jLBo7p+|Ie?lr3vzsCp3E>#6m0+i From 2842f4ab8abd84d5ca3d7252ecf52130017a62f3 Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:57:43 +0700 Subject: [PATCH 7/9] Update .DS_Store --- .DS_Store | Bin 6148 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index 054674dca4467ae7ae39c89da7c1d66928d97205..5d41a69196e64470365a6f3a07941a3810eb78a5 100644 GIT binary patch delta 49 zcmZoMXffDO&%(HEasx{tr&x8hk)@7;x#i?PEYge}lO Date: Wed, 4 Dec 2024 20:58:05 +0700 Subject: [PATCH 8/9] src --- ossim_source_code/.DS_Store | Bin 8196 -> 0 bytes .../.vscode/c_cpp_properties.json | 18 - ossim_source_code/.vscode/launch.json | 13 - ossim_source_code/.vscode/settings.json | 66 -- ossim_source_code/Makefile | 50 -- ossim_source_code/include/bitops.h | 37 - ossim_source_code/include/common.h | 96 --- ossim_source_code/include/cpu.h | 13 - ossim_source_code/include/loader.h | 9 - ossim_source_code/include/mem.h | 32 - ossim_source_code/include/mm.h | 163 ----- ossim_source_code/include/os-cfg.h | 15 - ossim_source_code/include/os-mm.h | 88 --- ossim_source_code/include/queue.h | 22 - ossim_source_code/include/sched.h | 28 - ossim_source_code/include/timer.h | 28 - ossim_source_code/input/os_0_mlq_paging | 4 - ossim_source_code/input/os_1_mlq_paging | 10 - .../input/os_1_mlq_paging_small_1K | 10 - .../input/os_1_mlq_paging_small_4K | 10 - ossim_source_code/input/os_1_singleCPU_mlq | 9 - .../input/os_1_singleCPU_mlq_paging | 10 - ossim_source_code/input/proc/m0s | 8 - ossim_source_code/input/proc/m1s | 8 - ossim_source_code/input/proc/p0s | 15 - ossim_source_code/input/proc/p1s | 12 - ossim_source_code/input/proc/p2s | 14 - ossim_source_code/input/proc/p3s | 18 - ossim_source_code/input/proc/s0 | 16 - ossim_source_code/input/proc/s1 | 8 - ossim_source_code/input/proc/s2 | 14 - ossim_source_code/input/proc/s3 | 18 - ossim_source_code/input/proc/s4 | 31 - ossim_source_code/input/sched | 4 - ossim_source_code/input/sched_0 | 3 - ossim_source_code/input/sched_1 | 5 - ossim_source_code/obj/cpu.o | Bin 6704 -> 0 bytes ossim_source_code/obj/loader.o | Bin 9176 -> 0 bytes ossim_source_code/obj/mem.o | Bin 10144 -> 0 bytes ossim_source_code/obj/mm-memphy.o | Bin 7368 -> 0 bytes ossim_source_code/obj/mm-vm.o | Bin 18048 -> 0 bytes ossim_source_code/obj/mm.o | Bin 15672 -> 0 bytes ossim_source_code/obj/os.o | Bin 15984 -> 0 bytes ossim_source_code/obj/queue.o | Bin 5624 -> 0 bytes ossim_source_code/obj/sched.o | Bin 9032 -> 0 bytes ossim_source_code/obj/timer.o | Bin 8360 -> 0 bytes ossim_source_code/os | Bin 81039 -> 0 bytes .../output/os_0_mlq_paging.output | 78 --- .../output/os_1_mlq_paging.output | 173 ----- .../output/os_1_mlq_paging_small_1K.output | 171 ----- .../output/os_1_mlq_paging_small_4K.output | 172 ----- .../output/os_1_singleCPU_mlq.output | 185 ----- .../output/os_1_singleCPU_mlq_paging.output | 185 ----- ossim_source_code/output/sched.output | 42 -- ossim_source_code/output/sched_0.output | 68 -- ossim_source_code/output/sched_1.output | 132 ---- ossim_source_code/src/cpu.c | 102 --- ossim_source_code/src/loader.c | 108 --- ossim_source_code/src/mem.c | 173 ----- ossim_source_code/src/mm-memphy.c | 199 ------ ossim_source_code/src/mm-vm.c | 649 ------------------ ossim_source_code/src/mm.c | 458 ------------ ossim_source_code/src/os.c | 292 -------- ossim_source_code/src/paging.c | 18 - ossim_source_code/src/queue.c | 49 -- ossim_source_code/src/sched.c | 140 ---- ossim_source_code/src/timer.c | 136 ---- 67 files changed, 4435 deletions(-) delete mode 100644 ossim_source_code/.DS_Store delete mode 100644 ossim_source_code/.vscode/c_cpp_properties.json delete mode 100644 ossim_source_code/.vscode/launch.json delete mode 100644 ossim_source_code/.vscode/settings.json delete mode 100644 ossim_source_code/Makefile delete mode 100644 ossim_source_code/include/bitops.h delete mode 100644 ossim_source_code/include/common.h delete mode 100644 ossim_source_code/include/cpu.h delete mode 100644 ossim_source_code/include/loader.h delete mode 100644 ossim_source_code/include/mem.h delete mode 100644 ossim_source_code/include/mm.h delete mode 100644 ossim_source_code/include/os-cfg.h delete mode 100644 ossim_source_code/include/os-mm.h delete mode 100644 ossim_source_code/include/queue.h delete mode 100644 ossim_source_code/include/sched.h delete mode 100644 ossim_source_code/include/timer.h delete mode 100644 ossim_source_code/input/os_0_mlq_paging delete mode 100644 ossim_source_code/input/os_1_mlq_paging delete mode 100644 ossim_source_code/input/os_1_mlq_paging_small_1K delete mode 100644 ossim_source_code/input/os_1_mlq_paging_small_4K delete mode 100644 ossim_source_code/input/os_1_singleCPU_mlq delete mode 100644 ossim_source_code/input/os_1_singleCPU_mlq_paging delete mode 100644 ossim_source_code/input/proc/m0s delete mode 100644 ossim_source_code/input/proc/m1s delete mode 100644 ossim_source_code/input/proc/p0s delete mode 100644 ossim_source_code/input/proc/p1s delete mode 100644 ossim_source_code/input/proc/p2s delete mode 100644 ossim_source_code/input/proc/p3s delete mode 100644 ossim_source_code/input/proc/s0 delete mode 100644 ossim_source_code/input/proc/s1 delete mode 100644 ossim_source_code/input/proc/s2 delete mode 100644 ossim_source_code/input/proc/s3 delete mode 100644 ossim_source_code/input/proc/s4 delete mode 100644 ossim_source_code/input/sched delete mode 100644 ossim_source_code/input/sched_0 delete mode 100644 ossim_source_code/input/sched_1 delete mode 100644 ossim_source_code/obj/cpu.o delete mode 100644 ossim_source_code/obj/loader.o delete mode 100644 ossim_source_code/obj/mem.o delete mode 100644 ossim_source_code/obj/mm-memphy.o delete mode 100644 ossim_source_code/obj/mm-vm.o delete mode 100644 ossim_source_code/obj/mm.o delete mode 100644 ossim_source_code/obj/os.o delete mode 100644 ossim_source_code/obj/queue.o delete mode 100644 ossim_source_code/obj/sched.o delete mode 100644 ossim_source_code/obj/timer.o delete mode 100755 ossim_source_code/os delete mode 100644 ossim_source_code/output/os_0_mlq_paging.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging_small_1K.output delete mode 100644 ossim_source_code/output/os_1_mlq_paging_small_4K.output delete mode 100644 ossim_source_code/output/os_1_singleCPU_mlq.output delete mode 100644 ossim_source_code/output/os_1_singleCPU_mlq_paging.output delete mode 100644 ossim_source_code/output/sched.output delete mode 100644 ossim_source_code/output/sched_0.output delete mode 100644 ossim_source_code/output/sched_1.output delete mode 100644 ossim_source_code/src/cpu.c delete mode 100644 ossim_source_code/src/loader.c delete mode 100644 ossim_source_code/src/mem.c delete mode 100644 ossim_source_code/src/mm-memphy.c delete mode 100644 ossim_source_code/src/mm-vm.c delete mode 100644 ossim_source_code/src/mm.c delete mode 100644 ossim_source_code/src/os.c delete mode 100644 ossim_source_code/src/paging.c delete mode 100644 ossim_source_code/src/queue.c delete mode 100644 ossim_source_code/src/sched.c delete mode 100644 ossim_source_code/src/timer.c diff --git a/ossim_source_code/.DS_Store b/ossim_source_code/.DS_Store deleted file mode 100644 index 6b57edf22290270271faf7b59de119eb25d10e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMzi-n(6n@vFjiU;wNPxN^Swd`4NoiFmEFld;2Nr_pKv9Te)0#TIC_kE^ij)}` z;15AeNQ_KOY#>(3pTNij@7u4Fq18{J`3wD<4EuKP~2ZjN|fMLKeU>GnAoCXGP&8B2!tozby za>IaO;9N35?*|(%vK3{=(u!9HW?~C~Hjj@*!h75Yh!|Vhin3#AMJSdjcMnX3GPT8E zG93Lj!O>Qf9ZM_2fyr=Ss%EBkC`{CjakhX1t4M2d!+>ER%>eD)3$O(H(1TWd|K9FM zu=O^LX!Bal3AlqE>%+INZ!UVD?;VA5{{hw6rPG3_wlY;(03SkZO#lNrPuL82OVvh` zn`&D6BNBm=XlK~#DD+3C6ZpM;x%{2Y4qTTkn|d|2-{`-5J!*?mI49&sKx z(S6f-?0dt;!lex!_M3j_bwz;hdI;Ix@SMp3HV(HFC8WGn7 zz2$e?N)wICHlJ#ejnXywguo=r`}J-Z@Nfq`)Qef6SO@j$C)9e6-nd#ZJIM}30iOk!6P+T?KlJMcp51$#|LgUS={ z!R9aT$Cb7iV-xRmY^A+=%MY$$#c9ZCyQUC{r~;!^Z(;*gel!HU>G=223WpUuT`-L(FbX=HMG~Z z@p^_ACBluR6(N`rgr1A-INHe{hInr)Uq#umwCKU~-wy)ld;fHN<7?}(zS@}e{{;75 I=VJZ;3#dblSpWb4 diff --git a/ossim_source_code/.vscode/c_cpp_properties.json b/ossim_source_code/.vscode/c_cpp_properties.json deleted file mode 100644 index f6526a0..0000000 --- a/ossim_source_code/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "configurations": [ - { - "name": "macos-clang-arm64", - "includePath": [ - "${workspaceFolder}/**" - ], - "compilerPath": "/usr/bin/clang", - "cStandard": "${default}", - "cppStandard": "c++20", - "intelliSenseMode": "macos-clang-arm64", - "compilerArgs": [ - "" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/ossim_source_code/.vscode/launch.json b/ossim_source_code/.vscode/launch.json deleted file mode 100644 index 5de968d..0000000 --- a/ossim_source_code/.vscode/launch.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "C/C++ Runner: Debug Session", - "type": "lldb", - "request": "launch", - "args": [], - "cwd": "/Users/admin/Downloads/ossim_source_code/src", - "program": "/Users/admin/Downloads/ossim_source_code/src/build/Debug/outDebug" - } - ] -} \ No newline at end of file diff --git a/ossim_source_code/.vscode/settings.json b/ossim_source_code/.vscode/settings.json deleted file mode 100644 index 7a3b5b2..0000000 --- a/ossim_source_code/.vscode/settings.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "C_Cpp_Runner.cCompilerPath": "clang", - "C_Cpp_Runner.cppCompilerPath": "clang++", - "C_Cpp_Runner.debuggerPath": "lldb", - "C_Cpp_Runner.cStandard": "", - "C_Cpp_Runner.cppStandard": "c++20", - "C_Cpp_Runner.msvcBatchPath": "", - "C_Cpp_Runner.useMsvc": false, - "C_Cpp_Runner.warnings": [ - "-Wall", - "-Wextra", - "-Wpedantic", - "-Wshadow", - "-Wformat=2", - "-Wcast-align", - "-Wconversion", - "-Wsign-conversion", - "-Wnull-dereference" - ], - "C_Cpp_Runner.msvcWarnings": [ - "/W4", - "/permissive-", - "/w14242", - "/w14287", - "/w14296", - "/w14311", - "/w14826", - "/w44062", - "/w44242", - "/w14905", - "/w14906", - "/w14263", - "/w44265", - "/w14928" - ], - "C_Cpp_Runner.enableWarnings": true, - "C_Cpp_Runner.warningsAsError": false, - "C_Cpp_Runner.compilerArgs": [], - "C_Cpp_Runner.linkerArgs": [], - "C_Cpp_Runner.includePaths": [], - "C_Cpp_Runner.includeSearch": [ - "*", - "**/*" - ], - "C_Cpp_Runner.excludeSearch": [ - "**/build", - "**/build/**", - "**/.*", - "**/.*/**", - "**/.vscode", - "**/.vscode/**" - ], - "C_Cpp_Runner.useAddressSanitizer": false, - "C_Cpp_Runner.useUndefinedSanitizer": false, - "C_Cpp_Runner.useLeakSanitizer": false, - "C_Cpp_Runner.showCompilationTime": false, - "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false, - "git.ignoreLimitWarning": true, - "files.associations": { - "cstdlib": "cpp", - "locale": "cpp", - "ostream": "cpp", - "new": "cpp" - } -} \ No newline at end of file diff --git a/ossim_source_code/Makefile b/ossim_source_code/Makefile deleted file mode 100644 index f7ed868..0000000 --- a/ossim_source_code/Makefile +++ /dev/null @@ -1,50 +0,0 @@ - -INC = -Iinclude -LIB = -lpthread - -SRC = src -OBJ = obj -INCLUDE = include - -CC = gcc -DEBUG = -g -CFLAGS = -Wall -c $(DEBUG) -LFLAGS = -Wall $(DEBUG) - -vpath %.c $(SRC) -vpath %.h $(INCLUDE) - -MAKE = $(CC) $(INC) - -# Object files needed by modules -MEM_OBJ = $(addprefix $(OBJ)/, paging.o mem.o cpu.o loader.o) -OS_OBJ = $(addprefix $(OBJ)/, cpu.o mem.o loader.o queue.o os.o sched.o timer.o mm-vm.o mm.o mm-memphy.o) -SCHED_OBJ = $(addprefix $(OBJ)/, cpu.o loader.o) -HEADER = $(wildcard $(INCLUDE)/*.h) - -all: os -#mem sched os - -# Just compile memory management modules -mem: $(MEM_OBJ) - $(MAKE) $(LFLAGS) $(MEM_OBJ) -o mem $(LIB) - -# Just compile scheduler -sched: $(SCHED_OBJ) $(MEM_OBJ) - $(MAKE) $(LFLAGS) $(SCHED_OBJ) $(MEM_OBJ) -o sched $(LIB) - -# Compile the whole OS simulation -os: $(OS_OBJ) - $(MAKE) $(LFLAGS) $(OS_OBJ) -o os $(LIB) - -$(OBJ)/%.o: %.c ${HEADER} $(OBJ) - $(MAKE) $(CFLAGS) $< -o $@ - -# Prepare objectives container -$(OBJ): - mkdir -p $(OBJ) - -clean: - rm -f $(OBJ)/*.o os sched mem - rm -r $(OBJ) - diff --git a/ossim_source_code/include/bitops.h b/ossim_source_code/include/bitops.h deleted file mode 100644 index 0cc9413..0000000 --- a/ossim_source_code/include/bitops.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifdef CONFIG_64BIT -#define BITS_PER_LONG 64 -#else -#define BITS_PER_LONG 32 -#endif /* CONFIG_64BIT */ - -#define BITS_PER_BYTE 8 -#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) - -#define BIT(nr) (1U << (nr)) -#define BIT_ULL(nr) (1ULL << (nr)) -#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) -#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) -#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) -#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) - -#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) - -#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) -#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) - -/* - * Create a contiguous bitmask starting at bit position @l and ending at - * position @h. For example - * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. - */ -#define GENMASK(h, l) \ - (((~0U) << (l)) & (~0U >> (BITS_PER_LONG - (h) - 1))) - -#define NBITS2(n) ((n&2)?1:0) -#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n))) -#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n))) -#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n))) -#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n))) -#define NBITS(n) (n==0?0:NBITS32(n)) - -#define EXTRACT_NBITS(nr, h, l) ((nr&GENMASK(h,l)) >> l) diff --git a/ossim_source_code/include/common.h b/ossim_source_code/include/common.h deleted file mode 100644 index c1d5a17..0000000 --- a/ossim_source_code/include/common.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef COMMON_H -#define COMMON_H - -/* Define structs and routine could be used by every source files */ - -#include - -#ifndef OSCFG_H -#include "os-cfg.h" -#endif - -#ifndef OSMM_H -#include "os-mm.h" -#endif - -#define ADDRESS_SIZE 20 -#define OFFSET_LEN 10 -#define FIRST_LV_LEN 5 -#define SECOND_LV_LEN 5 -#define SEGMENT_LEN FIRST_LV_LEN -#define PAGE_LEN SECOND_LV_LEN - -#define NUM_PAGES (1 << (ADDRESS_SIZE - OFFSET_LEN)) -#define PAGE_SIZE (1 << OFFSET_LEN) - -enum ins_opcode_t { - CALC, // Just perform calculation, only use CPU - ALLOC, // Allocate memory -#ifdef MM_PAGING - MALLOC, // Allocate dynamic memory -#endif - FREE, // Deallocated a memory block - READ, // Write data to a byte on memory - WRITE // Read data from a byte on memory -}; - -/* instructions executed by the CPU */ -struct inst_t { - enum ins_opcode_t opcode; - uint32_t arg_0; // Argument lists for instructions - uint32_t arg_1; - uint32_t arg_2; -}; - -struct code_seg_t { - struct inst_t * text; - uint32_t size; -}; - -struct trans_table_t { - /* A row in the page table of the second layer */ - struct { - addr_t v_index; // The index of virtual address - addr_t p_index; // The index of physical address - } table[1 << SECOND_LV_LEN]; - int size; -}; - -/* Mapping virtual addresses and physical ones */ -struct page_table_t { - /* Translation table for the first layer */ - struct { - addr_t v_index; // Virtual index - struct trans_table_t * next_lv; - } table[1 << FIRST_LV_LEN]; - int size; // Number of row in the first layer -}; - -/* PCB, describe information about a process */ -struct pcb_t { - uint32_t pid; // PID - uint32_t priority; // Default priority, this legacy (FIXED) value depend on process itself - struct code_seg_t * code; // Code segment - addr_t regs[10]; // Registers, store address of allocated regions - uint32_t pc; // Program pointer, point to the next instruction -#ifdef MLQ_SCHED - // Priority on execution (if supported), on-fly aka. changeable - // and this vale overwrites the default priority when it existed - uint32_t prio; -#endif -#ifdef MM_PAGING - struct mm_struct *mm; - struct memphy_struct *mram; - struct memphy_struct **mswp; - struct memphy_struct *active_mswp; -#ifdef MM_PAGING_HEAP_GODOWN - uint32_t vmemsz; -#endif -#endif - struct page_table_t * page_table; // Page table - uint32_t bp; // Break pointer - -}; - -#endif - diff --git a/ossim_source_code/include/cpu.h b/ossim_source_code/include/cpu.h deleted file mode 100644 index 0b95b07..0000000 --- a/ossim_source_code/include/cpu.h +++ /dev/null @@ -1,13 +0,0 @@ - -#ifndef CPU_H -#define CPU_H - -#include "common.h" - -/* Execute an instruction of a process. Return 0 - * if the instruction is executed successfully. - * Otherwise, return 1. */ -int run(struct pcb_t * proc); - -#endif - diff --git a/ossim_source_code/include/loader.h b/ossim_source_code/include/loader.h deleted file mode 100644 index 8fedc07..0000000 --- a/ossim_source_code/include/loader.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef LOADER_H -#define LOADER_H - -#include "common.h" - -struct pcb_t * load(const char * path); - -#endif - diff --git a/ossim_source_code/include/mem.h b/ossim_source_code/include/mem.h deleted file mode 100644 index 3c2f5a3..0000000 --- a/ossim_source_code/include/mem.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MEM_H -#define MEM_H - -#include "common.h" - -#define RAM_SIZE (1 << ADDRESS_SIZE) - -/* Init related parameters, must be called before being used */ -void init_mem(void); - -/* Allocate [size] bytes for process [proc] and return its virtual address. - * If we cannot allocate new memory region for this process, return 0 */ -addr_t alloc_mem(uint32_t size, struct pcb_t * proc); - -/* Free a memory block having the first byte at [address] used by - * process [proc]. Return 0 if [address] is valid. Otherwise, return 1 */ -int free_mem(addr_t address, struct pcb_t * proc); - -/* Read 1 byte memory pointed by [address] used by process [proc] and - * save it to [data]. - * If the given [address] is valid, return 0. Otherwise, return 1 */ -int read_mem(addr_t address, struct pcb_t * proc, BYTE * data); - -/* Write [data] to 1 byte on the memory pointed by [address] of process - * [proc]. If given [address] is valid, return 0. Otherwise, return 1 */ -int write_mem(addr_t address, struct pcb_t * proc, BYTE data); - -void dump(void); - -#endif - - diff --git a/ossim_source_code/include/mm.h b/ossim_source_code/include/mm.h deleted file mode 100644 index e7d9094..0000000 --- a/ossim_source_code/include/mm.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef MM_H - -#include "bitops.h" -#include "common.h" - -/* CPU Bus definition */ -#define PAGING_CPU_BUS_WIDTH 22 /* 22bit bus - MAX SPACE 4MB */ -#define PAGING_PAGESZ 256 /* 256B or 8-bits PAGE NUMBER */ -#define PAGING_MEMRAMSZ BIT(10) /* 1MB */ -#define PAGING_PAGE_ALIGNSZ(sz) (DIV_ROUND_UP(sz,PAGING_PAGESZ) *PAGING_PAGESZ) - -#define PAGING_MEMSWPSZ BIT(14) /* 16MB */ -#define PAGING_SWPFPN_OFFSET 5 -#define PAGING_MAX_PGN (DIV_ROUND_UP(BIT(PAGING_CPU_BUS_WIDTH),PAGING_PAGESZ)) - -#define PAGING_SBRK_INIT_SZ PAGING_PAGESZ -/* PTE BIT */ -#define PAGING_PTE_PRESENT_MASK BIT(31) -#define PAGING_PTE_SWAPPED_MASK BIT(30) -#define PAGING_PTE_RESERVE_MASK BIT(29) -#define PAGING_PTE_DIRTY_MASK BIT(28) -#define PAGING_PTE_EMPTY01_MASK BIT(14) -#define PAGING_PTE_EMPTY02_MASK BIT(13) - -/* PTE BIT PRESENT */ -#define PAGING_PTE_SET_PRESENT(pte) (pte=pte|PAGING_PTE_PRESENT_MASK) -#define PAGING_PTE_PAGE_PRESENT(pte) (pte&PAGING_PTE_PRESENT_MASK) - -/* USRNUM */ -#define PAGING_PTE_USRNUM_LOBIT 15 -#define PAGING_PTE_USRNUM_HIBIT 27 -/* FPN */ -#define PAGING_PTE_FPN_LOBIT 0 -#define PAGING_PTE_FPN_HIBIT 12 -/* SWPTYP */ -#define PAGING_PTE_SWPTYP_LOBIT 0 -#define PAGING_PTE_SWPTYP_HIBIT 4 -/* SWPOFF */ -#define PAGING_PTE_SWPOFF_LOBIT 5 -#define PAGING_PTE_SWPOFF_HIBIT 25 - -/* PTE masks */ -#define PAGING_PTE_USRNUM_MASK GENMASK(PAGING_PTE_USRNUM_HIBIT,PAGING_PTE_USRNUM_LOBIT) -#define PAGING_PTE_FPN_MASK GENMASK(PAGING_PTE_FPN_HIBIT,PAGING_PTE_FPN_LOBIT) -#define PAGING_PTE_SWPTYP_MASK GENMASK(PAGING_PTE_SWPTYP_HIBIT,PAGING_PTE_SWPTYP_LOBIT) -#define PAGING_PTE_SWPOFF_MASK GENMASK(PAGING_PTE_SWPOFF_HIBIT,PAGING_PTE_SWPOFF_LOBIT) - -/* Extract PTE */ -#define PAGING_PTE_OFFST(pte) GETVAL(pte,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) -#define PAGING_PTE_PGN(pte) GETVAL(pte,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -#define PAGING_PTE_FPN(pte) GETVAL(pte,PAGING_PTE_FPN_MASK,PAGING_PTE_FPN_LOBIT) -#define PAGING_PTE_SWP(pte) GETVAL(pte,PAGING_PTE_SWPOFF_MASK,PAGING_SWPFPN_OFFSET) - -/* OFFSET */ -#define PAGING_ADDR_OFFST_LOBIT 0 -#define PAGING_ADDR_OFFST_HIBIT (NBITS(PAGING_PAGESZ) - 1) - -/* PAGE Num */ -#define PAGING_ADDR_PGN_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_ADDR_PGN_HIBIT (PAGING_CPU_BUS_WIDTH - 1) - -/* Frame PHY Num */ -#define PAGING_ADDR_FPN_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_ADDR_FPN_HIBIT (NBITS(PAGING_MEMRAMSZ) - 1) - -/* SWAPFPN */ -#define PAGING_SWP_LOBIT NBITS(PAGING_PAGESZ) -#define PAGING_SWP_HIBIT (NBITS(PAGING_MEMSWPSZ) - 1) - -/* Value operators */ -#define SETBIT(v,mask) (v=v|mask) -#define CLRBIT(v,mask) (v=v&~mask) - -#define SETVAL(v,value,mask,offst) (v=(v&~mask)|((value<>offst) - -/* Other masks */ -#define PAGING_OFFST_MASK GENMASK(PAGING_ADDR_OFFST_HIBIT,PAGING_ADDR_OFFST_LOBIT) -#define PAGING_PGN_MASK GENMASK(PAGING_ADDR_PGN_HIBIT,PAGING_ADDR_PGN_LOBIT) -#define PAGING_FPN_MASK GENMASK(PAGING_ADDR_FPN_HIBIT,PAGING_ADDR_FPN_LOBIT) -#define PAGING_SWP_MASK GENMASK(PAGING_SWP_HIBIT,PAGING_SWP_LOBIT) - -/* Extract OFFSET */ -//#define PAGING_OFFST(x) ((x&PAGING_OFFST_MASK) >> PAGING_ADDR_OFFST_LOBIT) -#define PAGING_OFFST(x) GETVAL(x,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) -/* Extract Page Number*/ -#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -/* Extract FramePHY Number*/ -#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) -/* Extract SWAPFPN */ -#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) -/* Extract SWAPTYPE */ -#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) - -/* Memory range operator */ -/* TODO implement the INCLUDE checking mechanism - currently dummy op only */ -#define INCLUDE(x1,x2,y1,y2) (0) -/* TODO implement the OVERLAP checking mechanism - currently dummy op only */ -#define OVERLAP(x1,x2,y1,y2) (1) - -/* VM region prototypes */ -struct vm_rg_struct * init_vm_rg(int rg_start, int rg_endi, int vmaid); -int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode); -int enlist_pgn_node(struct pgn_t **pgnlist, int pgn); -int vmap_page_range(struct pcb_t *caller, int addr, int pgnum, - struct framephy_struct *frames, struct vm_rg_struct *ret_rg); -int vm_map_ram(struct pcb_t *caller, int astart, int send, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg); -int alloc_pages_range(struct pcb_t *caller, int incpgnum, struct framephy_struct **frm_lst); -int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, - struct memphy_struct *mpdst, int dstfpn) ; -int pte_set_fpn(uint32_t *pte, int fpn); -int pte_set_swap(uint32_t *pte, int swptyp, int swpoff); -int init_pte(uint32_t *pte, - int pre, // present - int fpn, // FPN - int drt, // dirty - int swp, // swap - int swptyp, // swap type - int swpoff); //swap offset -int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr); -int __free(struct pcb_t *caller, int rgid); -int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data); -int __write(struct pcb_t *caller, int rgid, int offset, BYTE value); -int init_mm(struct mm_struct *mm, struct pcb_t *caller); - -/* VM prototypes */ -int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); -int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); -int pgfree_data(struct pcb_t *proc, uint32_t reg_index); -int pgread( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination); -int pgwrite( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset); -/* Local VM prototypes */ -struct vm_rg_struct * get_symrg_byid(struct mm_struct* mm, int rgid); -int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend); -int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg); -int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret); -int find_victim_page(struct mm_struct* mm, int *pgn); -struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid); - -/* MEM/PHY protypes */ -int MEMPHY_get_freefp(struct memphy_struct *mp, int *fpn); -int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn); -int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value); -int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data); -int MEMPHY_dump(struct memphy_struct * mp); -int init_memphy(struct memphy_struct *mp, int max_size, int randomflg); -/* DEBUG */ -int print_list_fp(struct framephy_struct *fp); -int print_list_rg(struct vm_rg_struct *rg); -int print_list_vma(struct vm_area_struct *rg); - - -int print_list_pgn(struct pgn_t *ip); -int print_pgtbl(struct pcb_t *ip, uint32_t start, uint32_t end); -#endif diff --git a/ossim_source_code/include/os-cfg.h b/ossim_source_code/include/os-cfg.h deleted file mode 100644 index d5034e0..0000000 --- a/ossim_source_code/include/os-cfg.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef OSCFG_H -#define OSCFG_H - -#define MLQ_SCHED 1 -#define MAX_PRIO 140 - -#define MM_PAGING -#define MM_PAGING_HEAP_GODOWN -// #define MM_FIXED_MEMSZ -#define VMDBG 1 -#define MMDBG 1 -#define IODUMP 1 -#define PAGETBL_DUMP 1 - -#endif diff --git a/ossim_source_code/include/os-mm.h b/ossim_source_code/include/os-mm.h deleted file mode 100644 index beef90e..0000000 --- a/ossim_source_code/include/os-mm.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef OSMM_H -#define OSMM_H - -#define MM_PAGING -#define PAGING_MAX_MMSWP 4 /* max number of supported swapped space */ -#define PAGING_MAX_SYMTBL_SZ 30 - -typedef char BYTE; -typedef uint32_t addr_t; -//typedef unsigned int uint32_t; - -struct pgn_t{ - int pgn; - struct pgn_t *pg_next; -}; - -/* - * Memory region struct - */ -struct vm_rg_struct { - int vmaid; - - unsigned long rg_start; - unsigned long rg_end; - - struct vm_rg_struct *rg_next; -}; - -/* - * Memory area struct - */ -struct vm_area_struct { - unsigned long vm_id; - unsigned long vm_start; - unsigned long vm_end; - - unsigned long sbrk; -/* - * Derived field - * unsigned long vm_limit = vm_end - vm_start - */ - struct mm_struct *vm_mm; - - struct vm_rg_struct *vm_freerg_list; - struct vm_area_struct *vm_next; -}; - -/* - * Memory management struct - */ -struct mm_struct { - uint32_t *pgd; - - struct vm_area_struct *mmap; - - /* Currently we support a fixed number of symbol */ - struct vm_rg_struct symrgtbl[PAGING_MAX_SYMTBL_SZ]; - - /* list of free page */ - struct pgn_t *fifo_pgn; -}; - -/* - * FRAME/MEM PHY struct - */ -struct framephy_struct { - int fpn; - struct framephy_struct *fp_next; - - /* Resereed for tracking allocated framed */ - struct mm_struct* owner; -}; - -struct memphy_struct { - /* Basic field of data and size */ - BYTE *storage; - int maxsz; - - /* Sequential device fields */ - int rdmflg; - int cursor; - - /* Management structure */ - struct framephy_struct *free_fp_list; - struct framephy_struct *used_fp_list; -}; - -#endif diff --git a/ossim_source_code/include/queue.h b/ossim_source_code/include/queue.h deleted file mode 100644 index d26881c..0000000 --- a/ossim_source_code/include/queue.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef QUEUE_H -#define QUEUE_H - -#include "common.h" - -#define MAX_QUEUE_SIZE 10 - -struct queue_t { - int count_slot; - struct pcb_t * proc[MAX_QUEUE_SIZE]; - int size; -}; - -void enqueue(struct queue_t * q, struct pcb_t * proc); - -struct pcb_t * dequeue(struct queue_t * q); - -int empty(struct queue_t * q); - -#endif - diff --git a/ossim_source_code/include/sched.h b/ossim_source_code/include/sched.h deleted file mode 100644 index d252c72..0000000 --- a/ossim_source_code/include/sched.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef QUEUE_H -#define QUEUE_H - -#include "common.h" - -#ifndef MLQ_SCHED -#define MLQ_SCHED -#endif - -//#define MAX_PRIO 139 - -int queue_empty(void); - -void init_scheduler(void); -void finish_scheduler(void); - -/* Get the next process from ready queue */ -struct pcb_t * get_proc(void); - -/* Put a process back to run queue */ -void put_proc(struct pcb_t * proc); - -/* Add a new process to ready queue */ -void add_proc(struct pcb_t * proc); - -#endif - - diff --git a/ossim_source_code/include/timer.h b/ossim_source_code/include/timer.h deleted file mode 100644 index e480b66..0000000 --- a/ossim_source_code/include/timer.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TIMER_H -#define TIMER_H - -#include -#include - -struct timer_id_t { - int done; - int fsh; - pthread_cond_t event_cond; - pthread_mutex_t event_lock; - pthread_cond_t timer_cond; - pthread_mutex_t timer_lock; -}; - -void start_timer(); - -void stop_timer(); - -struct timer_id_t * attach_event(); - -void detach_event(struct timer_id_t * event); - -void next_slot(struct timer_id_t* timer_id); - -uint64_t current_time(); - -#endif diff --git a/ossim_source_code/input/os_0_mlq_paging b/ossim_source_code/input/os_0_mlq_paging deleted file mode 100644 index 6872297..0000000 --- a/ossim_source_code/input/os_0_mlq_paging +++ /dev/null @@ -1,4 +0,0 @@ -6 2 4 -1048576 16777216 0 0 0 3145728 -0 p0s 0 -2 p1s 15 diff --git a/ossim_source_code/input/os_1_mlq_paging b/ossim_source_code/input/os_1_mlq_paging deleted file mode 100644 index 0068caf..0000000 --- a/ossim_source_code/input/os_1_mlq_paging +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -1048576 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_1K b/ossim_source_code/input/os_1_mlq_paging_small_1K deleted file mode 100644 index a5788e4..0000000 --- a/ossim_source_code/input/os_1_mlq_paging_small_1K +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -2048 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_4K b/ossim_source_code/input/os_1_mlq_paging_small_4K deleted file mode 100644 index bd6af03..0000000 --- a/ossim_source_code/input/os_1_mlq_paging_small_4K +++ /dev/null @@ -1,10 +0,0 @@ -2 4 8 -4096 16777216 0 0 0 3145728 -1 p0s 130 -2 s3 39 -4 m1s 15 -6 s2 120 -7 m0s 120 -9 p1s 15 -11 s0 38 -16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq b/ossim_source_code/input/os_1_singleCPU_mlq deleted file mode 100644 index 98efc7e..0000000 --- a/ossim_source_code/input/os_1_singleCPU_mlq +++ /dev/null @@ -1,9 +0,0 @@ -2 1 8 -1 s4 4 -2 s3 3 -4 m1s 2 -6 s2 3 -7 m0s 3 -9 p1s 2 -11 s0 1 -16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq_paging b/ossim_source_code/input/os_1_singleCPU_mlq_paging deleted file mode 100644 index 99e0a04..0000000 --- a/ossim_source_code/input/os_1_singleCPU_mlq_paging +++ /dev/null @@ -1,10 +0,0 @@ -2 1 8 -1048576 16777216 0 0 0 3145728 -1 s4 4 -2 s3 3 -4 m1s 2 -6 s2 3 -7 m0s 3 -9 p1s 2 -11 s0 1 -16 s1 0 diff --git a/ossim_source_code/input/proc/m0s b/ossim_source_code/input/proc/m0s deleted file mode 100644 index 3466b3a..0000000 --- a/ossim_source_code/input/proc/m0s +++ /dev/null @@ -1,8 +0,0 @@ -1 7 -alloc 300 0 -alloc 100 1 -free 0 -alloc 100 2 -malloc 100 3 -write 102 1 20 -write 1 2 1000 diff --git a/ossim_source_code/input/proc/m1s b/ossim_source_code/input/proc/m1s deleted file mode 100644 index b3b24a6..0000000 --- a/ossim_source_code/input/proc/m1s +++ /dev/null @@ -1,8 +0,0 @@ -1 7 -alloc 300 0 -alloc 100 1 -free 0 -alloc 100 2 -malloc 100 2 -free 2 -free 1 diff --git a/ossim_source_code/input/proc/p0s b/ossim_source_code/input/proc/p0s deleted file mode 100644 index 7c443f9..0000000 --- a/ossim_source_code/input/proc/p0s +++ /dev/null @@ -1,15 +0,0 @@ -1 14 -calc -alloc 300 0 -malloc 300 4 -free 0 -alloc 100 1 -write 100 1 20 -read 1 20 20 -write 102 2 20 -read 2 20 20 -write 103 3 20 -read 3 20 20 -calc -free 4 -calc diff --git a/ossim_source_code/input/proc/p1s b/ossim_source_code/input/proc/p1s deleted file mode 100644 index 79c5fba..0000000 --- a/ossim_source_code/input/proc/p1s +++ /dev/null @@ -1,12 +0,0 @@ -1 10 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/p2s b/ossim_source_code/input/proc/p2s deleted file mode 100644 index 2d9336d..0000000 --- a/ossim_source_code/input/proc/p2s +++ /dev/null @@ -1,14 +0,0 @@ -20 13 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/p3s b/ossim_source_code/input/proc/p3s deleted file mode 100644 index 08a2128..0000000 --- a/ossim_source_code/input/proc/p3s +++ /dev/null @@ -1,18 +0,0 @@ -7 17 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s0 b/ossim_source_code/input/proc/s0 deleted file mode 100644 index 6186100..0000000 --- a/ossim_source_code/input/proc/s0 +++ /dev/null @@ -1,16 +0,0 @@ -12 15 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s1 b/ossim_source_code/input/proc/s1 deleted file mode 100644 index 8614b76..0000000 --- a/ossim_source_code/input/proc/s1 +++ /dev/null @@ -1,8 +0,0 @@ -20 7 -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s2 b/ossim_source_code/input/proc/s2 deleted file mode 100644 index 2d9336d..0000000 --- a/ossim_source_code/input/proc/s2 +++ /dev/null @@ -1,14 +0,0 @@ -20 13 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s3 b/ossim_source_code/input/proc/s3 deleted file mode 100644 index 08a2128..0000000 --- a/ossim_source_code/input/proc/s3 +++ /dev/null @@ -1,18 +0,0 @@ -7 17 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/proc/s4 b/ossim_source_code/input/proc/s4 deleted file mode 100644 index 79dfde8..0000000 --- a/ossim_source_code/input/proc/s4 +++ /dev/null @@ -1,31 +0,0 @@ -20 30 -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc -calc diff --git a/ossim_source_code/input/sched b/ossim_source_code/input/sched deleted file mode 100644 index 33c50ef..0000000 --- a/ossim_source_code/input/sched +++ /dev/null @@ -1,4 +0,0 @@ -4 2 3 -0 p1s -1 p2s -2 p3s diff --git a/ossim_source_code/input/sched_0 b/ossim_source_code/input/sched_0 deleted file mode 100644 index ae979fd..0000000 --- a/ossim_source_code/input/sched_0 +++ /dev/null @@ -1,3 +0,0 @@ -2 1 2 -0 s0 137 -4 s1 138 diff --git a/ossim_source_code/input/sched_1 b/ossim_source_code/input/sched_1 deleted file mode 100644 index c7fac37..0000000 --- a/ossim_source_code/input/sched_1 +++ /dev/null @@ -1,5 +0,0 @@ -2 1 4 -0 s0 -4 s1 -6 s2 -7 s3 diff --git a/ossim_source_code/obj/cpu.o b/ossim_source_code/obj/cpu.o deleted file mode 100644 index 4a5586b973b826c9dfde1f75b31550dadaf2ee7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6704 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 diff --git a/ossim_source_code/obj/mem.o b/ossim_source_code/obj/mem.o deleted file mode 100644 index f258d187737468b32ed6fc56d256396ffd09ba10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10144 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 V-&)~#Tm=N=T$cm_vc}EV{{qDeHkAMX diff --git a/ossim_source_code/obj/mm-memphy.o b/ossim_source_code/obj/mm-memphy.o deleted file mode 100644 index f63706c64e7fbc56bc446fef39a60f5ee9f8eca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7368 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 SDgMq>?zGN81!z4&Mg12x`YFEv diff --git a/ossim_source_code/obj/mm.o b/ossim_source_code/obj/mm.o deleted file mode 100644 index 75aaf47eff60a6b3230770472559f5ba3df912a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15672 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

RUv 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 diff --git a/ossim_source_code/obj/queue.o b/ossim_source_code/obj/queue.o deleted file mode 100644 index 47a4309fce16cefca819f7cfdbc4a024032f2a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5624 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 OJmampKlNWS^Zx=KIrByU diff --git a/ossim_source_code/output/os_0_mlq_paging.output b/ossim_source_code/output/os_0_mlq_paging.output deleted file mode 100644 index 87d78bc..0000000 --- a/ossim_source_code/output/os_0_mlq_paging.output +++ /dev/null @@ -1,78 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/p0s, PID: 1 PRIO: 0 - CPU 0: Dispatched process 1 -Time slot 1 -Time slot 2 - Loaded a process at input/proc/p1s, PID: 2 PRIO: 15 -Time slot 3 - Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 -Time slot 4 - CPU 1: Dispatched process 2 - Loaded a process at input/proc/p1s, PID: 4 PRIO: 0 -Time slot 5 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 6 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 7 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 8 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 9 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 10 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 3 -Time slot 11 -Time slot 12 -Time slot 13 -Time slot 14 -Time slot 15 -Time slot 16 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 17 -Time slot 18 -Time slot 19 -Time slot 20 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 4 - CPU 1: Processed 2 has finished - CPU 1 stopped -Time slot 21 -Time slot 22 -Time slot 23 -Time slot 24 - CPU 0: Processed 4 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging.output b/ossim_source_code/output/os_1_mlq_paging.output deleted file mode 100644 index 2f675f0..0000000 --- a/ossim_source_code/output/os_1_mlq_paging.output +++ /dev/null @@ -1,173 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 -Time slot 2 - CPU 1: Dispatched process 1 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 0: Dispatched process 2 -Time slot 4 - CPU 1: Put process 1 to run queue - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 - CPU 3: Dispatched process 1 -Time slot 5 - CPU 2: Dispatched process 3 - CPU 0: Put process 2 to run queue -Time slot 6 - CPU 0: Dispatched process 2 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 - CPU 3: Put process 1 to run queue -Time slot 7 - CPU 1: Dispatched process 4 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 10 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 6 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 2 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 1 to run queue - CPU 3: Dispatched process 4 -Time slot 12 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 5 -Time slot 13 - CPU 2: Put process 2 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 6 - CPU 3: Put process 4 to run queue - CPU 3: Dispatched process 3 -Time slot 14 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 7 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 15 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 2 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 4 - CPU 3: Processed 3 has finished - CPU 3: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 -Time slot 16 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 -Time slot 17 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 7 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 8 -Time slot 18 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 2 -Time slot 19 - CPU 2: Put process 7 to run queue - CPU 2: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 6 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 7 - CPU 3: Put process 8 to run queue - CPU 3: Dispatched process 4 -Time slot 20 - CPU 2: Processed 5 has finished - CPU 2: Dispatched process 8 -Time slot 21 - CPU 1: Put process 6 to run queue - CPU 1 stopped - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - CPU 3: Processed 4 has finished - CPU 3: Dispatched process 7 -Time slot 22 - CPU 2: Put process 8 to run queue - CPU 2 stopped -Time slot 23 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 8 - CPU 3: Put process 7 to run queue - CPU 3 stopped -Time slot 24 -Time slot 25 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 26 -Time slot 27 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 8 -Time slot 28 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 29 -Time slot 30 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 31 -Time slot 32 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 33 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_1K.output b/ossim_source_code/output/os_1_mlq_paging_small_1K.output deleted file mode 100644 index cb2fb07..0000000 --- a/ossim_source_code/output/os_1_mlq_paging_small_1K.output +++ /dev/null @@ -1,171 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 - CPU 1: Dispatched process 1 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 2: Dispatched process 2 - CPU 1: Put process 1 to run queue - CPU 3: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 -Time slot 5 - CPU 2: Put process 2 to run queue - CPU 0: Dispatched process 3 - CPU 1: Dispatched process 2 - CPU 3: Put process 1 to run queue -Time slot 6 - CPU 2: Dispatched process 1 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 -Time slot 7 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 2 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 5 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 2 -Time slot 10 - CPU 2: Put process 5 to run queue - CPU 2: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 6 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 5 -Time slot 12 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 13 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 3 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 2 -Time slot 14 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 4 -Time slot 15 - CPU 1: Processed 3 has finished - CPU 1: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 7 -Time slot 16 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 2: Put process 4 to run queue - CPU 2: Dispatched process 2 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 4 - CPU 1: Put process 5 to run queue - CPU 1: Dispatched process 8 - CPU 2: Processed 2 has finished - CPU 2: Dispatched process 6 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 -Time slot 18 - CPU 3: Processed 5 has finished - CPU 3: Dispatched process 7 -Time slot 19 - CPU 2: Put process 6 to run queue - CPU 2 stopped - CPU 1: Put process 8 to run queue - CPU 1: Dispatched process 6 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 8 -Time slot 20 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 4 -Time slot 21 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 7 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 6 -Time slot 22 - CPU 3: Processed 4 has finished - CPU 3: Dispatched process 8 -Time slot 23 - CPU 1: Put process 7 to run queue - CPU 1 stopped - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 24 - CPU 3: Put process 8 to run queue - CPU 3 stopped -Time slot 25 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 8 -Time slot 26 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 27 -Time slot 28 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 29 -Time slot 30 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 31 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_4K.output b/ossim_source_code/output/os_1_mlq_paging_small_4K.output deleted file mode 100644 index 25afa10..0000000 --- a/ossim_source_code/output/os_1_mlq_paging_small_4K.output +++ /dev/null @@ -1,172 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 - CPU 1: Dispatched process 1 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 39 -Time slot 3 - CPU 2: Dispatched process 2 - CPU 1: Put process 1 to run queue - CPU 3: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 -Time slot 5 - CPU 2: Put process 2 to run queue - CPU 0: Dispatched process 3 - CPU 1: Dispatched process 2 - CPU 3: Put process 1 to run queue -Time slot 6 - CPU 2: Dispatched process 1 - Loaded a process at input/proc/s2, PID: 4 PRIO: 120 -Time slot 7 -write region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 4 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 2 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 - CPU 3: Dispatched process 3 -Time slot 8 - CPU 2: Put process 1 to run queue - CPU 2: Dispatched process 5 -Time slot 9 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 1 -read region=1 offset=20 value=100 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 - CPU 3: Put process 3 to run queue - CPU 3: Dispatched process 2 -Time slot 10 - CPU 2: Put process 5 to run queue - CPU 2: Dispatched process 3 -write region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 11 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 6 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 38 - CPU 3: Put process 2 to run queue - CPU 3: Dispatched process 5 -Time slot 12 - CPU 2: Put process 3 to run queue - CPU 2: Dispatched process 1 -read region=2 offset=20 value=102 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 -Time slot 13 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 6 -write region=3 offset=20 value=103 -print_pgtbl: 0 - 1024 -00000000: 80000001 -00000004: 80000000 -00000008: 80000003 -00000012: 80000002 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 3 - CPU 3: Put process 5 to run queue - CPU 3: Dispatched process 7 -Time slot 14 - CPU 2: Processed 1 has finished - CPU 2: Dispatched process 2 -Time slot 15 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 4 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 6 -Time slot 16 - CPU 2: Put process 2 to run queue - CPU 2: Dispatched process 7 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: 80000006 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 1: Put process 4 to run queue - CPU 1: Dispatched process 2 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 4 - CPU 3: Put process 6 to run queue - CPU 3: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000007 -00000004: c0000000 -Time slot 18 - CPU 2: Put process 7 to run queue - CPU 2: Dispatched process 8 - CPU 1: Processed 2 has finished - CPU 1: Dispatched process 6 - CPU 3: Processed 5 has finished - CPU 3: Dispatched process 7 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0 stopped -Time slot 20 - CPU 2: Put process 8 to run queue - CPU 2: Dispatched process 4 - CPU 1: Put process 6 to run queue - CPU 1: Dispatched process 8 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 6 -Time slot 21 -Time slot 22 - CPU 2: Processed 4 has finished - CPU 2: Dispatched process 7 - CPU 1: Put process 8 to run queue - CPU 1 stopped - CPU 3: Processed 6 has finished - CPU 3: Dispatched process 8 -Time slot 23 -Time slot 24 - CPU 2: Put process 7 to run queue - CPU 2 stopped - CPU 3: Put process 8 to run queue - CPU 3: Dispatched process 7 -Time slot 25 -Time slot 26 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 8 -Time slot 27 - CPU 3: Processed 8 has finished - CPU 3: Dispatched process 7 -Time slot 28 -Time slot 29 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 7 -Time slot 30 -Time slot 31 - CPU 3: Put process 7 to run queue - CPU 3: Dispatched process 7 -Time slot 32 - CPU 3: Processed 7 has finished - CPU 3 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq.output b/ossim_source_code/output/os_1_singleCPU_mlq.output deleted file mode 100644 index 65a13db..0000000 --- a/ossim_source_code/output/os_1_singleCPU_mlq.output +++ /dev/null @@ -1,185 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/s4, PID: 1 PRIO: 4 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 3 -Time slot 3 - CPU 0: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 - Loaded a process at input/proc/s2, PID: 4 PRIO: 3 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 -Time slot 21 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 22 -Time slot 23 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 2 -Time slot 24 -Time slot 25 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 28 -Time slot 29 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 30 -Time slot 31 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 32 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 5 -Time slot 33 -Time slot 34 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 35 -Time slot 36 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 8 -Time slot 37 -Time slot 38 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 39 -Time slot 40 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 3 -Time slot 41 -Time slot 42 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 43 -Time slot 44 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 45 -Time slot 46 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 6 -Time slot 47 -Time slot 48 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -Time slot 49 -Time slot 50 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 51 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 8 -Time slot 52 -Time slot 53 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 54 -Time slot 55 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 56 -Time slot 57 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 58 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 59 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 8 -Time slot 60 -Time slot 61 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 62 -Time slot 63 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 64 -Time slot 65 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: c0000000 -Time slot 66 - CPU 0: Processed 5 has finished - CPU 0: Dispatched process 8 -Time slot 67 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 68 -Time slot 69 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 70 -Time slot 71 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -Time slot 72 -Time slot 73 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 74 -Time slot 75 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 76 -Time slot 77 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 78 -Time slot 79 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 80 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output deleted file mode 100644 index 65a13db..0000000 --- a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output +++ /dev/null @@ -1,185 +0,0 @@ -Time slot 0 -ld_routine -Time slot 1 - Loaded a process at input/proc/s4, PID: 1 PRIO: 4 -Time slot 2 - Loaded a process at input/proc/s3, PID: 2 PRIO: 3 -Time slot 3 - CPU 0: Dispatched process 1 -Time slot 4 - Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 - Loaded a process at input/proc/s2, PID: 4 PRIO: 3 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 - Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 4 - Loaded a process at input/proc/s0, PID: 7 PRIO: 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 - Loaded a process at input/proc/s1, PID: 8 PRIO: 0 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 -Time slot 21 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 22 -Time slot 23 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 2 -Time slot 24 -Time slot 25 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 28 -Time slot 29 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 30 -Time slot 31 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 32 - CPU 0: Processed 2 has finished - CPU 0: Dispatched process 5 -Time slot 33 -Time slot 34 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 35 -Time slot 36 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 8 -Time slot 37 -Time slot 38 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 39 -Time slot 40 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 3 -Time slot 41 -Time slot 42 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 43 -Time slot 44 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 45 -Time slot 46 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 6 -Time slot 47 -Time slot 48 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -Time slot 49 -Time slot 50 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 1 -Time slot 51 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 8 -Time slot 52 -Time slot 53 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 54 -Time slot 55 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 56 -Time slot 57 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=1 offset=20 value=102 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 58 -write region=2 offset=1000 value=1 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: 80000002 -Time slot 59 - CPU 0: Put process 5 to run queue - CPU 0: Dispatched process 8 -Time slot 60 -Time slot 61 - CPU 0: Put process 8 to run queue - CPU 0: Dispatched process 7 -Time slot 62 -Time slot 63 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 64 -Time slot 65 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 5 -write region=0 offset=0 value=0 -print_pgtbl: 0 - 512 -00000000: 80000003 -00000004: c0000000 -Time slot 66 - CPU 0: Processed 5 has finished - CPU 0: Dispatched process 8 -Time slot 67 - CPU 0: Processed 8 has finished - CPU 0: Dispatched process 7 -Time slot 68 -Time slot 69 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 70 -Time slot 71 - CPU 0: Put process 6 to run queue - CPU 0: Dispatched process 7 -Time slot 72 -Time slot 73 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 6 -Time slot 74 -Time slot 75 - CPU 0: Processed 6 has finished - CPU 0: Dispatched process 7 -Time slot 76 -Time slot 77 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 78 -Time slot 79 - CPU 0: Put process 7 to run queue - CPU 0: Dispatched process 7 -Time slot 80 - CPU 0: Processed 7 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched.output b/ossim_source_code/output/sched.output deleted file mode 100644 index edfe4cf..0000000 --- a/ossim_source_code/output/sched.output +++ /dev/null @@ -1,42 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/p1s, PID: 1 PRIO: 1 - CPU 1: Dispatched process 1 -Time slot 1 - Loaded a process at input/proc/p1s, PID: 2 PRIO: 0 -Time slot 2 - Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 -Time slot 3 - CPU 0: Dispatched process 3 -Time slot 4 - CPU 1: Put process 1 to run queue - CPU 1: Dispatched process 2 -Time slot 5 -Time slot 6 -Time slot 7 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 1 -Time slot 8 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 2 -Time slot 9 -Time slot 10 -Time slot 11 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 3 -Time slot 12 - CPU 1: Put process 2 to run queue - CPU 1: Dispatched process 1 -Time slot 13 -Time slot 14 - CPU 1: Processed 1 has finished - CPU 1: Dispatched process 2 -Time slot 15 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 16 - CPU 1: Processed 2 has finished - CPU 1 stopped -Time slot 17 - CPU 0: Processed 3 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched_0.output b/ossim_source_code/output/sched_0.output deleted file mode 100644 index 0676714..0000000 --- a/ossim_source_code/output/sched_0.output +++ /dev/null @@ -1,68 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/s0, PID: 1 PRIO: 4 -Time slot 1 - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 2 PRIO: 0 -Time slot 2 -Time slot 3 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 -Time slot 4 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 6 -Time slot 7 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 8 -Time slot 9 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 10 -Time slot 11 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 12 -Time slot 13 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 14 -Time slot 15 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 16 -Time slot 17 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 18 -Time slot 19 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 20 -Time slot 21 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 22 -Time slot 23 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 24 -Time slot 25 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 26 -Time slot 27 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 28 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 2 -Time slot 29 -Time slot 30 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 31 - CPU 0: Processed 2 has finished - CPU 0 stopped diff --git a/ossim_source_code/output/sched_1.output b/ossim_source_code/output/sched_1.output deleted file mode 100644 index 9c338f7..0000000 --- a/ossim_source_code/output/sched_1.output +++ /dev/null @@ -1,132 +0,0 @@ -Time slot 0 -ld_routine - Loaded a process at input/proc/s0, PID: 1 PRIO: 4 -Time slot 1 - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 2 PRIO: 0 -Time slot 2 - Loaded a process at input/proc/s0, PID: 3 PRIO: 0 -Time slot 3 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 1 - Loaded a process at input/proc/s0, PID: 4 PRIO: 0 -Time slot 4 -Time slot 5 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 4 -Time slot 6 -Time slot 7 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 8 -Time slot 9 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 10 -Time slot 11 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 12 -Time slot 13 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 14 -Time slot 15 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 16 -Time slot 17 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 18 -Time slot 19 - CPU 0: Put process 4 to run queue - CPU 0: Dispatched process 4 -Time slot 20 - CPU 0: Processed 4 has finished - CPU 0: Dispatched process 3 -Time slot 21 -Time slot 22 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 23 -Time slot 24 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 25 -Time slot 26 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 27 -Time slot 28 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 29 -Time slot 30 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 31 -Time slot 32 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 33 -Time slot 34 - CPU 0: Put process 3 to run queue - CPU 0: Dispatched process 3 -Time slot 35 - CPU 0: Processed 3 has finished - CPU 0: Dispatched process 2 -Time slot 36 -Time slot 37 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 38 -Time slot 39 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 40 -Time slot 41 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 42 -Time slot 43 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 44 -Time slot 45 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 46 -Time slot 47 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 48 -Time slot 49 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 50 -Time slot 51 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 52 -Time slot 53 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 54 -Time slot 55 - CPU 0: Put process 1 to run queue - CPU 0: Dispatched process 2 -Time slot 56 -Time slot 57 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 1 -Time slot 58 - CPU 0: Processed 1 has finished - CPU 0: Dispatched process 2 -Time slot 59 -Time slot 60 - CPU 0: Put process 2 to run queue - CPU 0: Dispatched process 2 -Time slot 61 - CPU 0: Processed 2 has finished - CPU 0 stopped diff --git a/ossim_source_code/src/cpu.c b/ossim_source_code/src/cpu.c deleted file mode 100644 index b8deb25..0000000 --- a/ossim_source_code/src/cpu.c +++ /dev/null @@ -1,102 +0,0 @@ - -#include "cpu.h" -#include "mem.h" -#include "mm.h" - -int calc(struct pcb_t * proc) { - return ((unsigned long)proc & 0UL); -} - -int alloc(struct pcb_t * proc, uint32_t size, uint32_t reg_index) { - addr_t addr = alloc_mem(size, proc); - if (addr == 0) { - return 1; - }else{ - proc->regs[reg_index] = addr; - return 0; - } -} - -int free_data(struct pcb_t * proc, uint32_t reg_index) { - return free_mem(proc->regs[reg_index], proc); -} - -int read( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination) { // Index of destination register - - BYTE data; - if (read_mem(proc->regs[source] + offset, proc, &data)) { - proc->regs[destination] = data; - return 0; - }else{ - return 1; - } -} - -int write( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset) { // Destination address = - // [destination] + [offset] - return write_mem(proc->regs[destination] + offset, proc, data); -} - -int run(struct pcb_t * proc) { - /* Check if Program Counter point to the proper instruction */ - if (proc->pc >= proc->code->size) { - return 1; - } - - struct inst_t ins = proc->code->text[proc->pc]; - proc->pc++; - int stat = 1; - switch (ins.opcode) { - case CALC: - stat = calc(proc); - break; - case ALLOC: -#ifdef MM_PAGING - stat = pgalloc(proc, ins.arg_0, ins.arg_1); - -#else - stat = alloc(proc, ins.arg_0, ins.arg_1); -#endif - break; -#ifdef MM_PAGING - case MALLOC: - stat = pgmalloc(proc, ins.arg_0, ins.arg_1); - break; -#endif - case FREE: -#ifdef MM_PAGING - stat = pgfree_data(proc, ins.arg_0); -#else - stat = free_data(proc, ins.arg_0); -#endif - break; - case READ: -#ifdef MM_PAGING - stat = pgread(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#else - stat = read(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#endif - break; - case WRITE: -#ifdef MM_PAGING - stat = pgwrite(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#else - stat = write(proc, ins.arg_0, ins.arg_1, ins.arg_2); -#endif - break; - default: - stat = 1; - } - return stat; - -} - - diff --git a/ossim_source_code/src/loader.c b/ossim_source_code/src/loader.c deleted file mode 100644 index 5f8e56a..0000000 --- a/ossim_source_code/src/loader.c +++ /dev/null @@ -1,108 +0,0 @@ - -#include "loader.h" -#include -#include -#include - -static uint32_t avail_pid = 1; - -#define OPT_CALC "calc" -#define OPT_ALLOC "alloc" -#define OPT_FREE "free" -#define OPT_READ "read" -#define OPT_WRITE "write" -#ifdef MM_PAGING -#define OPT_MALLOC "malloc" -#endif - -static enum ins_opcode_t get_opcode(char * opt) { - if (!strcmp(opt, OPT_CALC)) { - return CALC; - }else if (!strcmp(opt, OPT_ALLOC)) { - return ALLOC; -#ifdef MM_PAGING - }else if (!strcmp(opt, OPT_MALLOC)) { - return MALLOC; -#endif - }else if (!strcmp(opt, OPT_FREE)) { - return FREE; - }else if (!strcmp(opt, OPT_READ)) { - return READ; - }else if (!strcmp(opt, OPT_WRITE)) { - return WRITE; - }else{ - printf("Opcode: %s\n", opt); - exit(1); - } -} - -struct pcb_t * load(const char * path) { - /* Create new PCB for the new process */ - struct pcb_t * proc = (struct pcb_t * )malloc(sizeof(struct pcb_t)); - proc->pid = avail_pid; - avail_pid++; - proc->page_table = - (struct page_table_t*)malloc(sizeof(struct page_table_t)); - proc->bp = PAGE_SIZE; - proc->pc = 0; - - /* Read process code from file */ - FILE * file; - // printf(path); - if ((file = fopen(path, "r")) == NULL) { - printf("Cannot find process description at '%s'\n", path); - exit(1); - } - char opcode[10]; - proc->code = (struct code_seg_t*)malloc(sizeof(struct code_seg_t)); - fscanf(file, "%u %u", &proc->priority, &proc->code->size); - proc->code->text = (struct inst_t*)malloc( - sizeof(struct inst_t) * proc->code->size - ); - uint32_t i = 0; - for (i = 0; i < proc->code->size; i++) { - fscanf(file, "%s", opcode); - proc->code->text[i].opcode = get_opcode(opcode); - switch(proc->code->text[i].opcode) { - case CALC: - break; - case ALLOC: - fscanf( - file, - "%u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1 - ); - break; -#ifdef MM_PAGING - case MALLOC: - fscanf( - file, - "%u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1 - ); -#endif - case FREE: - fscanf(file, "%u\n", &proc->code->text[i].arg_0); - break; - case READ: - case WRITE: - fscanf( - file, - "%u %u %u\n", - &proc->code->text[i].arg_0, - &proc->code->text[i].arg_1, - &proc->code->text[i].arg_2 - ); - break; - default: - printf("Opcode: %s\n", opcode); - exit(1); - } - } - return proc; -} - - - diff --git a/ossim_source_code/src/mem.c b/ossim_source_code/src/mem.c deleted file mode 100644 index 187108f..0000000 --- a/ossim_source_code/src/mem.c +++ /dev/null @@ -1,173 +0,0 @@ - -#include "mem.h" -#include "stdlib.h" -#include "string.h" -#include -#include - -static BYTE _ram[RAM_SIZE]; - -static struct { - uint32_t proc; // ID of process currently uses this page - int index; // Index of the page in the list of pages allocated - // to the process. - int next; // The next page in the list. -1 if it is the last - // page. -} _mem_stat [NUM_PAGES]; - -static pthread_mutex_t mem_lock; - -void init_mem(void) { - memset(_mem_stat, 0, sizeof(*_mem_stat) * NUM_PAGES); - memset(_ram, 0, sizeof(BYTE) * RAM_SIZE); - pthread_mutex_init(&mem_lock, NULL); -} - -/* get offset of the virtual address */ -static addr_t get_offset(addr_t addr) { - return addr & ~((~0U) << OFFSET_LEN); -} - -/* get the first layer index */ -static addr_t get_first_lv(addr_t addr) { - return addr >> (OFFSET_LEN + PAGE_LEN); -} - -/* get the second layer index */ -static addr_t get_second_lv(addr_t addr) { - return (addr >> OFFSET_LEN) - (get_first_lv(addr) << PAGE_LEN); -} - -/* Search for page table table from the a segment table */ -static struct trans_table_t * get_trans_table( - addr_t index, // Segment level index - struct page_table_t * page_table) { // first level table - - /* DO NOTHING HERE. This mem is obsoleted */ - - int i; - for (i = 0; i < page_table->size; i++) { - // Enter your code here - } - return NULL; - -} - -/* Translate virtual address to physical address. If [virtual_addr] is valid, - * return 1 and write its physical counterpart to [physical_addr]. - * Otherwise, return 0 */ -static int translate( - addr_t virtual_addr, // Given virtual address - addr_t * physical_addr, // Physical address to be returned - struct pcb_t * proc) { // Process uses given virtual address - - /* Offset of the virtual address */ - addr_t offset = get_offset(virtual_addr); - offset++; offset--; - /* The first layer index */ - addr_t first_lv = get_first_lv(virtual_addr); - /* The second layer index */ - addr_t second_lv = get_second_lv(virtual_addr); - - /* Search in the first level */ - struct trans_table_t * trans_table = NULL; - trans_table = get_trans_table(first_lv, proc->page_table); - if (trans_table == NULL) { - return 0; - } - - int i; - for (i = 0; i < trans_table->size; i++) { - if (trans_table->table[i].v_index == second_lv) { - /* DO NOTHING HERE. This mem is obsoleted */ - return 1; - } - } - return 0; -} - -addr_t alloc_mem(uint32_t size, struct pcb_t * proc) { - pthread_mutex_lock(&mem_lock); - addr_t ret_mem = 0; - /* DO NOTHING HERE. This mem is obsoleted */ - - uint32_t num_pages = (size % PAGE_SIZE) ? size / PAGE_SIZE : - size / PAGE_SIZE + 1; // Number of pages we will use - int mem_avail = 0; // We could allocate new memory region or not? - - /* First we must check if the amount of free memory in - * virtual address space and physical address space is - * large enough to represent the amount of required - * memory. If so, set 1 to [mem_avail]. - * Hint: check [proc] bit in each page of _mem_stat - * to know whether this page has been used by a process. - * For virtual memory space, check bp (break pointer). - * */ - - if (mem_avail) { - /* We could allocate new memory region to the process */ - ret_mem = proc->bp; - proc->bp += num_pages * PAGE_SIZE; - /* Update status of physical pages which will be allocated - * to [proc] in _mem_stat. Tasks to do: - * - Update [proc], [index], and [next] field - * - Add entries to segment table page tables of [proc] - * to ensure accesses to allocated memory slot is - * valid. */ - } - pthread_mutex_unlock(&mem_lock); - return ret_mem; -} - -int free_mem(addr_t address, struct pcb_t * proc) { - /* DO NOTHING HERE. This mem is obsoleted */ - return 0; -} - -int read_mem(addr_t address, struct pcb_t * proc, BYTE * data) { - addr_t physical_addr; - if (translate(address, &physical_addr, proc)) { - *data = _ram[physical_addr]; - return 0; - }else{ - return 1; - } -} - -int write_mem(addr_t address, struct pcb_t * proc, BYTE data) { - addr_t physical_addr; - if (translate(address, &physical_addr, proc)) { - _ram[physical_addr] = data; - return 0; - }else{ - return 1; - } -} - -void dump(void) { - int i; - for (i = 0; i < NUM_PAGES; i++) { - if (_mem_stat[i].proc != 0) { - printf("%03d: ", i); - printf("%05x-%05x - PID: %02d (idx %03d, nxt: %03d)\n", - i << OFFSET_LEN, - ((i + 1) << OFFSET_LEN) - 1, - _mem_stat[i].proc, - _mem_stat[i].index, - _mem_stat[i].next - ); - int j; - for ( j = i << OFFSET_LEN; - j < ((i+1) << OFFSET_LEN) - 1; - j++) { - - if (_ram[j] != 0) { - printf("\t%05x: %02x\n", j, _ram[j]); - } - - } - } - } -} - - diff --git a/ossim_source_code/src/mm-memphy.c b/ossim_source_code/src/mm-memphy.c deleted file mode 100644 index 880a858..0000000 --- a/ossim_source_code/src/mm-memphy.c +++ /dev/null @@ -1,199 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Memory physical module mm/mm-memphy.c - */ - -#include "mm.h" -#include - -/* - * MEMPHY_mv_csr - move MEMPHY cursor - * @mp: memphy struct - * @offset: offset - */ -int MEMPHY_mv_csr(struct memphy_struct *mp, int offset) -{ - int numstep = 0; - - mp->cursor = 0; - while(numstep < offset && numstep < mp->maxsz){ - /* Traverse sequentially */ - mp->cursor = (mp->cursor + 1) % mp->maxsz; - numstep++; - } - - return 0; -} - -/* - * MEMPHY_seq_read - read MEMPHY device - * @mp: memphy struct - * @addr: address - * @value: obtained value - */ -int MEMPHY_seq_read(struct memphy_struct *mp, int addr, BYTE *value) -{ - if (mp == NULL) - return -1; - - if (!mp->rdmflg) - return -1; /* Not compatible mode for sequential read */ - - MEMPHY_mv_csr(mp, addr); - *value = (BYTE) mp->storage[addr]; - - return 0; -} - -/* - * MEMPHY_read read MEMPHY device - * @mp: memphy struct - * @addr: address - * @value: obtained value - */ -int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value) -{ - if (mp == NULL) - return -1; - - if (mp->rdmflg) - *value = mp->storage[addr]; - else /* Sequential access device */ - return MEMPHY_seq_read(mp, addr, value); - - return 0; -} - -/* - * MEMPHY_seq_write - write MEMPHY device - * @mp: memphy struct - * @addr: address - * @data: written data - */ -int MEMPHY_seq_write(struct memphy_struct * mp, int addr, BYTE value) -{ - - if (mp == NULL) - return -1; - - if (!mp->rdmflg) - return -1; /* Not compatible mode for sequential read */ - - MEMPHY_mv_csr(mp, addr); - mp->storage[addr] = value; - - return 0; -} - -/* - * MEMPHY_write-write MEMPHY device - * @mp: memphy struct - * @addr: address - * @data: written data - */ -int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data) -{ - if (mp == NULL) - return -1; - - if (mp->rdmflg) - mp->storage[addr] = data; - else /* Sequential access device */ - return MEMPHY_seq_write(mp, addr, data); - - return 0; -} - -/* - * MEMPHY_format-format MEMPHY device - * @mp: memphy struct - */ -int MEMPHY_format(struct memphy_struct *mp, int pagesz) -{ - /* This setting come with fixed constant PAGESZ */ - int numfp = mp->maxsz / pagesz; - struct framephy_struct *newfst, *fst; - int iter = 0; - - if (numfp <= 0) - return -1; - - /* Init head of free framephy list */ - fst = malloc(sizeof(struct framephy_struct)); - fst->fpn = iter; - mp->free_fp_list = fst; - - /* We have list with first element, fill in the rest num-1 element member*/ - for (iter = 1; iter < numfp ; iter++) - { - newfst = malloc(sizeof(struct framephy_struct)); - newfst->fpn = iter; - newfst->fp_next = NULL; - fst->fp_next = newfst; - fst = newfst; - } - - return 0; -} - -int MEMPHY_get_freefp(struct memphy_struct *mp, int *retfpn) -{ - struct framephy_struct *fp = mp->free_fp_list; - - if (fp == NULL) - return -1; - - *retfpn = fp->fpn; - mp->free_fp_list = fp->fp_next; - - /* MEMPHY is iteratively used up until its exhausted - * No garbage collector acting then it not been released - */ - free(fp); - - return 0; -} - -int MEMPHY_dump(struct memphy_struct * mp) -{ - /*TODO dump memphy contnt mp->storage - * for tracing the memory content - */ - - return 0; -} - -int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn) -{ - struct framephy_struct *fp = mp->free_fp_list; - struct framephy_struct *newnode = malloc(sizeof(struct framephy_struct)); - - /* Create new node with value fpn */ - newnode->fpn = fpn; - newnode->fp_next = fp; - mp->free_fp_list = newnode; - - return 0; -} - - -/* - * Init MEMPHY struct - */ -int init_memphy(struct memphy_struct *mp, int max_size, int randomflg) -{ - mp->storage = (BYTE *)malloc(max_size*sizeof(BYTE)); - mp->maxsz = max_size; - - MEMPHY_format(mp,PAGING_PAGESZ); - - mp->rdmflg = (randomflg != 0)?1:0; - - if (!mp->rdmflg ) /* Not Ramdom acess device, then it serial device*/ - mp->cursor = 0; - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/mm-vm.c b/ossim_source_code/src/mm-vm.c deleted file mode 100644 index c262322..0000000 --- a/ossim_source_code/src/mm-vm.c +++ /dev/null @@ -1,649 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Virtual memory module mm/mm-vm.c - */ - -#include "string.h" -#include "mm.h" -#include -#include - -/*enlist_vm_freerg_list - add new rg to freerg_list - *@mm: memory region - *@rg_elmt: new region - * - */ -int enlist_vm_freerg_list(struct mm_struct *mm, struct vm_rg_struct rg_elmt) -{ - struct vm_rg_struct *new_node; - struct vm_rg_struct *head = mm->mmap->vm_freerg_list; - - // Check for invalid region - if (rg_elmt.rg_start >= rg_elmt.rg_end) - return -1; - - // Dynamically allocate memory for the new region - new_node = (struct vm_rg_struct *)malloc(sizeof(struct vm_rg_struct)); - if (!new_node) - return -1; // Allocation failed - - // Copy the data into the new node - *new_node = rg_elmt; - new_node->rg_next = head; - - // Update the list head - mm->mmap->vm_freerg_list = new_node; - - return 0; -} - - -/*get_vma_by_num - get vm area by numID - *@mm: memory region - *@vmaid: ID vm area to alloc memory region - * - */ -//get địa chỉ ô vma -struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid) -{ - struct vm_area_struct *pvma= mm->mmap; - - if(mm->mmap == NULL) - return NULL; - - int vmait = 0; - - while (vmait < vmaid) - { - if(pvma == NULL) - return NULL; - - vmait++; - pvma = pvma->vm_next; - } - - return pvma; -} - -/*get_symrg_byid - get mem region by region ID - *@mm: memory region - *@rgid: region ID act as symbol index of variable - * - */ -struct vm_rg_struct *get_symrg_byid(struct mm_struct *mm, int rgid) -{ - if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) - return NULL; - - return &mm->symrgtbl[rgid]; -} - -/*__alloc - allocate a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - *@alloc_addr: address of allocated memory region - * - */ -int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr) -{ - /*Allocate at the toproof */ - struct vm_rg_struct rgnode; - - /* TODO: commit the vmaid */ - rgnode.vmaid = vmaid; - - if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0) - { - //symrgtbl là vm_rg_struct - caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start; - caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end; - - caller->mm->symrgtbl[rgid].vmaid = rgnode.vmaid; - - *alloc_addr = rgnode.rg_start; - - return 0; - } - - /* TODO: get_free_vmrg_area FAILED handle the region management (Fig.6)*/ - if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == -1 ){return -1;} - /* TODO retrive current vma if needed, current comment out due to compiler redundant warning*/ - /*Attempt to increate limit to get space */ - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - int inc_sz = PAGING_PAGE_ALIGNSZ(size); - int inc_limit_ret; - - /* TODO retrive old_sbrk if needed, current comment out due to compiler redundant warning*/ - int old_sbrk = cur_vma->sbrk; - - /* TODO INCREASE THE LIMIT - * inc_vma_limit(caller, vmaid, inc_sz) - */ - if (inc_vma_limit(caller, vmaid, inc_sz, &inc_limit_ret) < 0) return -1; - - cur_vma->sbrk += inc_sz; - /* TODO: commit the limit increment */ - if ( old_sbrk + size > cur_vma -> vm_end ) - { - if ( inc_vma_limit ( caller , vmaid , inc_sz, &inc_limit_ret ) < 0) - { - struct framephy_struct * frm_lst = NULL ; - struct vm_rg_struct * ret_rg = malloc ( sizeof ( struct vm_rg_struct ) ); - int pages = ( inc_sz / PAGING_PAGESZ ); - ret_rg -> rg_start = ret_rg -> rg_end = old_sbrk ; - ret_rg -> rg_next = NULL ; - alloc_pages_range ( caller , pages , & frm_lst ); - vmap_page_range ( caller , old_sbrk , pages , frm_lst , ret_rg ); - caller ->mm -> symrgtbl [ rgid ]. rg_start = ret_rg -> rg_start ; - caller ->mm -> symrgtbl [ rgid ]. rg_end = ret_rg -> rg_end ; - cur_vma -> sbrk += ret_rg -> rg_end - ret_rg -> rg_start ; - return 0; - } - } - - /* Successful increase limit */ - caller ->mm -> symrgtbl [ rgid ]. rg_start = old_sbrk ; - caller ->mm -> symrgtbl [ rgid ]. rg_end = old_sbrk + size ; - /* TODO: commit the allocation address - // *alloc_addr = ... - */ - *alloc_addr = rgnode.rg_start; - - return 0; -} - -/*__free - remove a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __free(struct pcb_t *caller, int rgid) -{ - struct vm_rg_struct rgnode; - - // Dummy initialization for avoding compiler dummay warning - // in incompleted TODO code rgnode will overwrite through implementing - // the manipulation of rgid later - rgnode.vmaid = 0; //dummy initialization - rgnode.vmaid = 1; //dummy initialization - - if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) - return -1; - - /* TODO: Manage the collect freed region to freerg_list */ - struct vm_rg_struct *sym_rg = &caller->mm->symrgtbl[rgid]; - rgnode.rg_start = sym_rg->rg_start; - rgnode.rg_end = sym_rg->rg_end; - rgnode.vmaid = sym_rg->vmaid; - - /*enlist the obsoleted memory region */ - enlist_vm_freerg_list(caller->mm, rgnode); - - return 0; -} - -/*pgalloc - PAGING-based allocate a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify variable in symbole table) - */ -int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) -{ - int addr; - - /* By default using vmaid = 0 */ - return __alloc(proc, 0, reg_index, size, &addr); -} - -/*pgmalloc - PAGING-based allocate a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify vaiable in symbole table) - */ -int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) -{ - int addr; - - /* By default using vmaid = 1 */ - return __alloc(proc, 1, reg_index, size, &addr); -} - -/*pgfree - PAGING-based free a region memory - *@proc: Process executing the instruction - *@size: allocated size - *@reg_index: memory region ID (used to identify variable in symbole table) - */ - -int pgfree_data(struct pcb_t *proc, uint32_t reg_index) -{ - return __free(proc, reg_index); -} - -/*pg_getpage - get the page in ram - *@mm: memory region - *@pagenum: PGN - *@framenum: return FPN - *@caller: caller - * - */ -int pg_getpage(struct mm_struct *mm, int pgn, int *fpn, struct pcb_t *caller) -{ - uint32_t pte = mm->pgd[pgn]; - - if (!PAGING_PTE_PAGE_PRESENT(pte)) - { - // Page không tồn tại, cần đưa vào bộ nhớ - int vicpgn, swpfpn, vicfpn; - uint32_t vicpte; - - int tgtfpn = PAGING_PTE_SWP(pte); // Frame mục tiêu trong swap - - // Tìm victim page - if (find_victim_page(caller->mm, &vicpgn) < 0) - return -1; - - vicpte = caller->mm->pgd[vicpgn]; - vicfpn = PAGING_OFFST(vicpte); - - // Lấy free frame từ MEMSWP - if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) < 0) - { - struct memphy_struct **mswpit = caller->mswp; - for (int i = 0; i < PAGING_MAX_MMSWP; i++) - { - struct memphy_struct *tmp_swp = mswpit[i]; - if (MEMPHY_get_freefp(tmp_swp, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, tmp_swp, swpfpn); - caller->active_mswp = tmp_swp; - break; - } - } - } - else - { - __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); - } - - // Swap frame từ MEMRAM sang MEMSWP và ngược lại - __swap_cp_page(caller->active_mswp, tgtfpn, caller->mram, vicfpn); - - // Cập nhật page table - MEMPHY_put_freefp(caller->active_mswp, tgtfpn); - // swptype = 1 - pte_set_swap(&caller->mm->pgd[vicpgn], 1, swpfpn); - - // Đánh dấu trạng thái online của page mục tiêu - pte_set_fpn(&caller->mm->pgd[pgn], vicfpn); - pte = caller->mm->pgd[pgn]; - - - - *fpn = PAGING_OFFST(pte); - return 0; -} -} - - /* Do swap frame from MEMRAM to MEMSWP and vice versa*/ - /* Copy victim frame to swap */ - //__swap_cp_page(); - /* Copy target frame from swap to mem */ - //__swap_cp_page(); - - /* Update page table */ - //pte_set_swap() &mm->pgd; - - /* Update its online status of the target page */ - //pte_set_fpn() & mm->pgd[pgn]; - // pte_set_fpn(&pte, tgtfpn); - - // enlist_pgn_node(&caller->mm->fifo_pgn,pgn); - // } - - // *fpn = PAGING_PTE_FPN(pte); - - // return 0; - - -/*pg_getval - read value at given offset - *@mm: memory region - *@addr: virtual address to acess - *@value: value - * - */ -int pg_getval(struct mm_struct *mm, int addr, BYTE *data, struct pcb_t *caller) -{ - int pgn = PAGING_PGN(addr); - int off = PAGING_OFFST(addr); - int fpn; - - /* Get the page to MEMRAM, swap from MEMSWAP if needed */ - if(pg_getpage(mm, pgn, &fpn, caller) != 0) - return -1; /* invalid page access */ - - int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; - - MEMPHY_read(caller->mram,phyaddr, data); - - return 0; -} - -/*pg_setval - write value to given offset - *@mm: memory region - *@addr: virtual address to acess - *@value: value - * - */ -int pg_setval(struct mm_struct *mm, int addr, BYTE value, struct pcb_t *caller) -{ - int pgn = PAGING_PGN(addr); - int off = PAGING_OFFST(addr); - int fpn; - - /* Get the page to MEMRAM, swap from MEMSWAP if needed */ - if(pg_getpage(mm, pgn, &fpn, caller) != 0) - return -1; /* invalid page access */ - - int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; - - MEMPHY_write(caller->mram,phyaddr, value); - - return 0; -} - -/*__read - read value in region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@offset: offset to acess in memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data) -{ - struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); - int vmaid = currg->vmaid; - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ - return -1; - - pg_getval(caller->mm, currg->rg_start + offset, data, caller); - - return 0; -} - - -/*pgwrite - PAGING-based read a region memory */ -int pgread( - struct pcb_t * proc, // Process executing the instruction - uint32_t source, // Index of source register - uint32_t offset, // Source address = [source] + [offset] - uint32_t destination) -{ - BYTE data; - int val = __read(proc, source, offset, &data); - - destination = (uint32_t) data; -#ifdef IODUMP - printf("read region=%d offset=%d value=%d\n", source, offset, data); -#ifdef PAGETBL_DUMP - print_pgtbl(proc, 0, -1); //print max TBL -#endif - MEMPHY_dump(proc->mram); -#endif - - return val; -} - -/*__write - write a region memory - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@offset: offset to acess in memory region - *@rgid: memory region ID (used to identify variable in symbole table) - *@size: allocated size - * - */ -int __write(struct pcb_t *caller, int rgid, int offset, BYTE value) -{ - struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); - int vmaid = currg->vmaid; - - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ - return -1; - - pg_setval(caller->mm, currg->rg_start + offset, value, caller); - - return 0; -} - -/*pgwrite - PAGING-based write a region memory */ -int pgwrite( - struct pcb_t * proc, // Process executing the instruction - BYTE data, // Data to be wrttien into memory - uint32_t destination, // Index of destination register - uint32_t offset) -{ -#ifdef IODUMP - printf("write region=%d offset=%d value=%d\n", destination, offset, data); -#ifdef PAGETBL_DUMP - print_pgtbl(proc, 0, -1); //print max TBL -#endif - MEMPHY_dump(proc->mram); -#endif - - return __write(proc, destination, offset, data); -} - - -/*free_pcb_memphy - collect all memphy of pcb - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@incpgnum: number of page - */ -int free_pcb_memph(struct pcb_t *caller) -{ - int pagenum, fpn; - uint32_t pte; - - - for(pagenum = 0; pagenum < PAGING_MAX_PGN; pagenum++) - { - pte= caller->mm->pgd[pagenum]; - - if (!PAGING_PTE_PAGE_PRESENT(pte)) - { - fpn = PAGING_PTE_FPN(pte); - MEMPHY_put_freefp(caller->mram, fpn); - } else { - fpn = PAGING_PTE_SWP(pte); - MEMPHY_put_freefp(caller->active_mswp, fpn); - } - } - - return 0; -} - -/*get_vm_area_node - get vm area for a number of pages - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@incpgnum: number of page - *@vmastart: vma end - *@vmaend: vma end - * - */ -struct vm_rg_struct* get_vm_area_node_at_brk(struct pcb_t *caller, int vmaid, int size, int alignedsz) -{ - struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct));; - /* TODO retrive current vma to obtain newrg, current comment out due to compiler redundant warning*/ - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - /* TODO: update the newrg boundary - // newrg->rg_start = ... - // newrg->rg_end = ... - */ - - newrg->rg_start = cur_vma -> sbrk; - - if ( (cur_vma ->sbrk + alignedsz) > cur_vma -> vm_end ) return newrg = cur_vma -> sbrk; -cur_vma ->sbrk = cur_vma->sbrk + alignedsz; - - newrg->rg_end = cur_vma -> sbrk; - -return newrg; -} - -/*validate_overlap_vm_area - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@vmastart: vma end - *@vmaend: vma end - * - */ -int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend) -{ - struct vm_area_struct *vma = caller->mm->mmap; - - /* TODO validate the planned memory area is not overlapped */ - while(vma != NULL) - { - - if ((vmastart >= vma->vm_start && vmastart < vma->vm_end) || (vmastart <= vma->vm_start && vmaend >= vma->vm_end)) - { - return -1; - } - vma = vma->vm_next; - } - return 0; -} - -/*inc_vma_limit - increase vm area limits to reserve space for new variable - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@inc_sz: increment size - *@inc_limit_ret: increment limit return - * - */ -int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret) -{ - struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct)); - int inc_amt = PAGING_PAGE_ALIGNSZ(inc_sz); - int incnumpage = inc_amt / PAGING_PAGESZ; - struct vm_rg_struct *area = get_vm_area_node_at_brk(caller, vmaid, inc_sz, inc_amt); - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - int old_end = cur_vma->vm_end; - - /*Validate overlap of obtained region */ - if (validate_overlap_vm_area(caller, vmaid, area->rg_start, area->rg_end) < 0) - return -1; /*Overlap and failed allocation */ - - /* TODO: Obtain the new vm area based on vmaid */ - cur_vma->sbrk = area -> rg_start; - - - if (vm_map_ram(caller, area->rg_start, area->rg_end, - old_end, incnumpage , newrg) < 0) - return -1; /* Map the memory to MEMRAM */ - inc_limit_ret = cur_vma->vm_end + inc_sz; - return 0; - -} - -/*find_victim_page - find victim page - *@caller: caller - *@pgn: return page number - * - */ -int find_victim_page(struct mm_struct *mm, int *retpgn) -{ - struct pgn_t *pg = mm->fifo_pgn; - - /* TODO: Implement the theorical mechanism to find the victim page */ - if (pg == NULL) return -1; - - *retpgn = pg->pgn; - - mm->fifo_pgn = pg->pg_next; - - free(pg); - - return 0; -} - -/*get_free_vmrg_area - get a free vm region - *@caller: caller - *@vmaid: ID vm area to alloc memory region - *@size: allocated size - * - */ -int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg) -{ - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); - - struct vm_rg_struct *rgit = cur_vma->vm_freerg_list; - - if (rgit == NULL) - return -1; - - /* Probe unintialized newrg */ - newrg->rg_start = newrg->rg_end = -1; - - /* Traverse on list of free vm region to find a fit space */ - //check điều kiện bịp - while (rgit != NULL && rgit->vmaid == vmaid) - { - if (rgit->rg_start + size <= rgit->rg_end) - { /* Current region has enough space */ - newrg->rg_start = rgit->rg_start; - newrg->rg_end = rgit->rg_start + size; - - /* Update left space in chosen region */ - if (rgit->rg_start + size < rgit->rg_end) - { - rgit->rg_start = rgit->rg_start + size; - } - else - { /*Use up all space, remove current node */ - /*Clone next rg node */ - struct vm_rg_struct *nextrg = rgit->rg_next; - - /*Cloning */ - if (nextrg != NULL) - { - rgit->rg_start = nextrg->rg_start; - rgit->rg_end = nextrg->rg_end; - - rgit->rg_next = nextrg->rg_next; - - free(nextrg); - } - else - { /*End of free list */ - rgit->rg_start = rgit->rg_end; //dummy, size 0 region - rgit->rg_next = NULL; - } - } - } - else - { - rgit = rgit->rg_next; // Traverse next rg - } - } - - if(newrg->rg_start == -1) // new region not found - return -1; - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/mm.c b/ossim_source_code/src/mm.c deleted file mode 100644 index 5071151..0000000 --- a/ossim_source_code/src/mm.c +++ /dev/null @@ -1,458 +0,0 @@ -//#ifdef MM_PAGING -/* - * PAGING based Memory Management - * Memory management unit mm/mm.c - */ - -#include "mm.h" -#include -#include - -/* - * init_pte - Initialize PTE entry - */ -int init_pte(uint32_t *pte, - int pre, // present - int fpn, // FPN - int drt, // dirty - int swp, // swap - int swptyp, // swap type - int swpoff) //swap offset -{ - if (pre != 0) { - if (swp == 0) { // Non swap ~ page online - if (fpn == 0) - return -1; // Invalid setting - - /* Valid setting with FPN */ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); - CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); - - SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); - } else { // page swapped - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); - CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); - - SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); - SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); - } - } - - return 0; -} - -/* - * pte_set_swap - Set PTE entry for swapped page - * @pte : target page table entry (PTE) - * @swptyp : swap type - * @swpoff : swap offset - */ -int pte_set_swap(uint32_t *pte, int swptyp, int swpoff) -{ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); - - SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); - SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); - - return 0; -} - -/* - * pte_set_swap - Set PTE entry for on-line page - * @pte : target page table entry (PTE) - * @fpn : frame page number (FPN) - */ -int pte_set_fpn(uint32_t *pte, int fpn) -{ - SETBIT(*pte, PAGING_PTE_PRESENT_MASK); - CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); - - SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); - - return 0; -} - - -/* - * vmap_page_range - map a range of page at aligned address - */ -int vmap_page_range(struct pcb_t *caller, // process call - int addr, // start address which is aligned to pagesz - int pgnum, // num of mapping page - struct framephy_struct *frames,// list of the mapped frames - struct vm_rg_struct *ret_rg)// return mapped region, the real mapped fp -{ // no guarantee all given pages are mapped - //uint32_t * pte = malloc(sizeof(uint32_t)); - struct framephy_struct *fpit = malloc(sizeof(struct framephy_struct)); - //int fpn; - int pgit = 0; - int pgn = PAGING_PGN(addr); - - /* TODO: update the rg_end and rg_start of ret_rg - //ret_rg->rg_end = .... - //ret_rg->rg_start = ... - //ret_rg->vmaid = ... - */ - ret_rg -> rg_end = ret_rg -> rg_start = addr ; - - fpit->fp_next = frames; - - /* TODO map range of frame to address space - * in page table pgd in caller->mm - */ - - /* Tracking for later page replacement activities (if needed) - * Enqueue new usage page */ - while ( pgit < pgnum ) - { - if ( fpit == NULL ) - { - break ; - } - pgn = PAGING_PGN ( addr + pgnum * PAGING_PAGESZ ); - pte_set_fpn (&( caller ->mm -> pgd [ pgn ]) , fpit -> fpn ) ; - enlist_pgn_node (& caller -> mm -> fifo_pgn , pgn + pgit ) ; - fpit = fpit -> fp_next ; - } - ret_rg -> rg_end += pgit * PAGING_PAGESZ ; - return 0; - -} - -/* - * alloc_pages_range - allocate req_pgnum of frame in ram - * @caller : caller - * @req_pgnum : request page num - * @frm_lst : frame list - */ - -int alloc_pages_range(struct pcb_t *caller, int req_pgnum, struct framephy_struct** frm_lst) -{ - int pgit, fpn; - struct framephy_struct *newfp_str; - - for (pgit = 0; pgit < req_pgnum; pgit++) - { - if (MEMPHY_get_freefp(caller->mram, &fpn) == 0) - { - newfp_str = malloc(sizeof(struct framephy_struct)); - newfp_str->fpn = fpn; - newfp_str->owner = caller->mm; - newfp_str->fp_next = NULL; - - if (!*frm_lst) - { - *frm_lst = newfp_str; - } - else - { - newfp_str->fp_next = *frm_lst; - *frm_lst = newfp_str; - } - - struct framephy_struct *temp = malloc(sizeof(struct framephy_struct)); - *temp = *newfp_str; - temp->fp_next = caller->mram->used_fp_list; - caller->mram->used_fp_list = temp; - } - else - { - // ERROR CODE of obtaining some but not enough frames - int vicfpn, vicpgn, swpfpn; - uint32_t vicpte; - - if (find_victim_page(caller->mm, &vicpgn) < 0) - { - return -1; - } - - vicpte = caller->mm->pgd[vicpgn]; - vicfpn = PAGING_OFFST(vicpte); - - newfp_str = malloc(sizeof(struct framephy_struct)); - newfp_str->fpn = vicfpn; - newfp_str->owner = caller->mm; - newfp_str->fp_next = NULL; - - if (!*frm_lst) - { - *frm_lst = newfp_str; - } - else - { - newfp_str->fp_next = *frm_lst; - *frm_lst = newfp_str; - } - - int i; - if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); - struct memphy_struct *mswp = *caller->mswp; - for (i = 0; i < PAGING_MAX_MMSWP; i++) - { - if (mswp + i == caller->active_mswp) break; - } - } - else - { - struct memphy_struct *mswp = *caller->mswp; - swpfpn = -1; - for (i = 0; i < PAGING_MAX_MMSWP; i++) - { - if (MEMPHY_get_freefp(mswp + i, &swpfpn) == 0) - { - __swap_cp_page(caller->mram, vicfpn, mswp + i, swpfpn); - break; - } - } - } - - if (swpfpn == -1) - return -3000; - - pte_set_swap(&caller->mm->pgd[vicpgn], i, swpfpn); - } - } - - return 0; -} - - - -/* - * vm_map_ram - do the mapping all vm are to ram storage device - * @caller : caller - * @astart : vm area start - * @aend : vm area end - * @mapstart : start mapping point - * @incpgnum : number of mapped page - * @ret_rg : returned region - */ -int vm_map_ram(struct pcb_t *caller, int astart, int aend, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg) -{ - struct framephy_struct *frm_lst = NULL; - int ret_alloc; - - /*@bksysnet: author provides a feasible solution of getting frames - *FATAL logic in here, wrong behaviour if we have not enough page - *i.e. we request 1000 frames meanwhile our RAM has size of 3 frames - *Don't try to perform that case in this simple work, it will result - *in endless procedure of swap-off to get frame and we have not provide - *duplicate control mechanism, keep it simple - */ - ret_alloc = alloc_pages_range(caller, incpgnum, &frm_lst); - - if (ret_alloc < 0 && ret_alloc != -3000) - return -1; - - /* Out of memory */ - if (ret_alloc == -3000) - { -#ifdef MMDBG - printf("OOM: vm_map_ram out of memory \n"); -#endif - return -1; - } - - /* it leaves the case of memory is enough but half in ram, half in swap - * do the swaping all to swapper to get the all in ram */ - vmap_page_range(caller, mapstart, incpgnum, frm_lst, ret_rg); - - return 0; -} - -/* Swap copy content page from source frame to destination frame - * @mpsrc : source memphy - * @srcfpn : source physical page number (FPN) - * @mpdst : destination memphy - * @dstfpn : destination physical page number (FPN) - **/ -int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, - struct memphy_struct *mpdst, int dstfpn) -{ - int cellidx; - int addrsrc,addrdst; - for(cellidx = 0; cellidx < PAGING_PAGESZ; cellidx++) - { - addrsrc = srcfpn * PAGING_PAGESZ + cellidx; - addrdst = dstfpn * PAGING_PAGESZ + cellidx; - - BYTE data; - MEMPHY_read(mpsrc, addrsrc, &data); - MEMPHY_write(mpdst, addrdst, data); - } - - return 0; -} - -/* - *Initialize a empty Memory Management instance - * @mm: self mm - * @caller: mm owner - */ -int init_mm(struct mm_struct *mm, struct pcb_t *caller) -{ - struct vm_area_struct *vma0 = malloc(sizeof(struct vm_area_struct)); - struct vm_area_struct *vma1 = malloc(sizeof(struct vm_area_struct)); - - mm->pgd = malloc(PAGING_MAX_PGN * sizeof(uint32_t)); - - /* By default the owner comes with at least one vma for DATA */ - vma0->vm_id = 0; - vma0->vm_start = 0; - vma0->vm_end = vma0->vm_start; - vma0->sbrk = vma0->vm_start; - - struct vm_rg_struct *first_rg = init_vm_rg(vma0->vm_start, vma0->vm_end, 0); - enlist_vm_rg_node(&vma0->vm_freerg_list, first_rg); - - /* Update vma0 next */ - vma0->vm_next = vma1; // Assuming vma1 is the next VM area - - /* Update one vma for HEAP */ - vma1->vm_id = 1; // Assuming ID for heap - // vma1->vm_start = HEAP_START; // Define an appropriate start address for the heap - //vma1->vm_end = HEAP_END; // Define the end address for the heap - vma1->sbrk = vma1->vm_start; - - struct vm_rg_struct *first_rg_heap = init_vm_rg(vma1->vm_start, vma1->vm_end, 0); - enlist_vm_rg_node(&vma1->vm_freerg_list, first_rg_heap); - - /* Set next for vma1 */ - vma1->vm_next = NULL; // Assuming it's the last one in the list for now - - /* Point vma owner backward */ - vma0->vm_mm = mm; - vma1->vm_mm = mm; - - /* Update mmap */ - mm->mmap = vma0; // Start the mmap list with vma0 - - return 0; -} - - -struct vm_rg_struct* init_vm_rg(int rg_start, int rg_end, int vmaid) -{ - struct vm_rg_struct *rgnode = malloc(sizeof(struct vm_rg_struct)); - - rgnode->rg_start = rg_start; - rgnode->rg_end = rg_end; - rgnode->vmaid = vmaid; - rgnode->rg_next = NULL; - - return rgnode; -} - -int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode) -{ - rgnode->rg_next = *rglist; - *rglist = rgnode; - - return 0; -} - -int enlist_pgn_node(struct pgn_t **plist, int pgn) -{ - struct pgn_t* pnode = malloc(sizeof(struct pgn_t)); - - pnode->pgn = pgn; - pnode->pg_next = *plist; - *plist = pnode; - - return 0; -} - -int print_list_fp(struct framephy_struct *ifp) -{ - struct framephy_struct *fp = ifp; - - printf("print_list_fp: "); - if (fp == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (fp != NULL ) - { - printf("fp[%d]\n",fp->fpn); - fp = fp->fp_next; - } - printf("\n"); - return 0; -} - -int print_list_rg(struct vm_rg_struct *irg) -{ - struct vm_rg_struct *rg = irg; - - printf("print_list_rg: "); - if (rg == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (rg != NULL) - { - printf("rg[%ld->%ldvma=%d]\n",rg->rg_start, rg->rg_end, rg->vmaid); - rg = rg->rg_next; - } - printf("\n"); - return 0; -} - -int print_list_vma(struct vm_area_struct *ivma) -{ - struct vm_area_struct *vma = ivma; - - printf("print_list_vma: "); - if (vma == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (vma != NULL ) - { - printf("va[%ld->%ld]\n",vma->vm_start, vma->vm_end); - vma = vma->vm_next; - } - printf("\n"); - return 0; -} - -int print_list_pgn(struct pgn_t *ip) -{ - printf("print_list_pgn: "); - if (ip == NULL) {printf("NULL list\n"); return -1;} - printf("\n"); - while (ip != NULL ) - { - printf("va[%d]-\n",ip->pgn); - ip = ip->pg_next; - } - printf("n"); - return 0; -} - -int print_pgtbl(struct pcb_t *caller, uint32_t start, uint32_t end) -{ - int pgn_start,pgn_end; - int pgit; - - if(end == -1){ - pgn_start = 0; - struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, 0); - end = cur_vma->vm_end; - } - pgn_start = PAGING_PGN(start); - pgn_end = PAGING_PGN(end); - - printf("print_pgtbl: %d - %d", start, end); - if (caller == NULL) {printf("NULL caller\n"); return -1;} - printf("\n"); - - - for(pgit = pgn_start; pgit < pgn_end; pgit++) - { - printf("%08ld: %08x\n", pgit * sizeof(uint32_t), caller->mm->pgd[pgit]); - } - - return 0; -} - -//#endif diff --git a/ossim_source_code/src/os.c b/ossim_source_code/src/os.c deleted file mode 100644 index 288a3c1..0000000 --- a/ossim_source_code/src/os.c +++ /dev/null @@ -1,292 +0,0 @@ - -#include "cpu.h" -#include "timer.h" -#include "sched.h" -#include "loader.h" -#include "mm.h" - -#include -#include -#include -#include - -static int time_slot; -static int num_cpus; -static int done = 0; - -#ifdef MM_PAGING -static int memramsz; -static int memswpsz[PAGING_MAX_MMSWP]; -#ifdef MM_PAGING_HEAP_GODOWN -static int vmemsz; -#endif - -struct mmpaging_ld_args { - /* A dispatched argument struct to compact many-fields passing to loader */ - int vmemsz; - struct memphy_struct *mram; - struct memphy_struct **mswp; - struct memphy_struct *active_mswp; - struct timer_id_t *timer_id; -}; -#endif - -static struct ld_args{ - char ** path; - unsigned long * start_time; -#ifdef MLQ_SCHED - unsigned long * prio; -#endif -} ld_processes; -int num_processes; - -struct cpu_args { - struct timer_id_t * timer_id; - int id; -}; - - -static void * cpu_routine(void * args) { - struct timer_id_t * timer_id = ((struct cpu_args*)args)->timer_id; - int id = ((struct cpu_args*)args)->id; - /* Check for new process in ready queue */ - int time_left = 0; - struct pcb_t * proc = NULL; - while (1) { - /* Check the status of current process */ - if (proc == NULL) { - /* No process is running, the we load new process from - * ready queue */ - proc = get_proc(); - if (proc == NULL) { - next_slot(timer_id); - continue; /* First load failed. skip dummy load */ - } - }else if (proc->pc == proc->code->size) { - /* The porcess has finish it job */ - printf("\tCPU %d: Processed %2d has finished\n", - id ,proc->pid); - free(proc); - proc = get_proc(); - time_left = 0; - }else if (time_left == 0) { - /* The process has done its job in current time slot */ - printf("\tCPU %d: Put process %2d to run queue\n", - id, proc->pid); - put_proc(proc); - proc = get_proc(); - } - - /* Recheck process status after loading new process */ - if (proc == NULL && done) { - /* No process to run, exit */ - printf("\tCPU %d stopped\n", id); - break; - }else if (proc == NULL) { - /* There may be new processes to run in - * next time slots, just skip current slot */ - next_slot(timer_id); - continue; - }else if (time_left == 0) { - printf("\tCPU %d: Dispatched process %2d\n", - id, proc->pid); - time_left = time_slot; - } - - /* Run current process */ - run(proc); - time_left--; - next_slot(timer_id); - } - detach_event(timer_id); - pthread_exit(NULL); -} - -static void * ld_routine(void * args) { -#ifdef MM_PAGING - struct memphy_struct* mram = ((struct mmpaging_ld_args *)args)->mram; - struct memphy_struct** mswp = ((struct mmpaging_ld_args *)args)->mswp; - struct memphy_struct* active_mswp = ((struct mmpaging_ld_args *)args)->active_mswp; - struct timer_id_t * timer_id = ((struct mmpaging_ld_args *)args)->timer_id; -#else - struct timer_id_t * timer_id = (struct timer_id_t*)args; -#endif - int i = 0; - printf("ld_routine\n"); - while (i < num_processes) { - struct pcb_t * proc = load(ld_processes.path[i]); -#ifdef MLQ_SCHED - proc->prio = ld_processes.prio[i]; -#endif - while (current_time() < ld_processes.start_time[i]) { - next_slot(timer_id); - } -#ifdef MM_PAGING - proc->mm = malloc(sizeof(struct mm_struct)); -#ifdef MM_PAGING_HEAP_GODOWN - proc->vmemsz = vmemsz; -#endif - init_mm(proc->mm, proc); - proc->mram = mram; - proc->mswp = mswp; - proc->active_mswp = active_mswp; -#endif - printf("\tLoaded a process at %s, PID: %d PRIO: %ld\n", - ld_processes.path[i], proc->pid, ld_processes.prio[i]); - add_proc(proc); - free(ld_processes.path[i]); - i++; - next_slot(timer_id); - } - free(ld_processes.path); - free(ld_processes.start_time); - done = 1; - detach_event(timer_id); - pthread_exit(NULL); -} - -static void read_config(const char * path) { - FILE * file; - if ((file = fopen(path, "r")) == NULL) { - printf("Cannot find configure file at %s\n", path); - exit(1); - } - fscanf(file, "%d %d %d\n", &time_slot, &num_cpus, &num_processes); - - ld_processes.path = (char**)malloc(sizeof(char*) * num_processes); - ld_processes.start_time = (unsigned long*) - malloc(sizeof(unsigned long) * num_processes); -#ifdef MM_PAGING - int sit; -#ifdef MM_FIXED_MEMSZ - /* We provide here a back compatible with legacy OS simulatiom config file - * In which, it have no addition config line for Mema, keep only one line - * for legacy info - * [time slice] [N = Number of CPU] [M = Number of Processes to be run] - */ - memramsz = 0x100000; - memswpsz[0] = 0x1000000; - for(sit = 1; sit < PAGING_MAX_MMSWP; sit++) - memswpsz[sit] = 0; - -#ifdef MM_PAGING_HEAP_GODOWN - vmemsz = 0x300000; -#endif -#else - /* Read input config of memory size: MEMRAM and upto 4 MEMSWP (mem swap) - * Format: (size=0 result non-used memswap, must have RAM and at least 1 SWAP) - * MEM_RAM_SZ MEM_SWP0_SZ MEM_SWP1_SZ MEM_SWP2_SZ MEM_SWP3_SZ - */ - fscanf(file, "%d\n", &memramsz); - for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) - fscanf(file, "%d", &(memswpsz[sit])); -#ifdef MM_PAGING_HEAP_GODOWN - fscanf(file, "%d\n", &vmemsz); -#endif - fscanf(file, "\n"); /* Final character */ -#endif -#endif - -#ifdef MLQ_SCHED - ld_processes.prio = (unsigned long*) - malloc(sizeof(unsigned long) * num_processes); -#endif - int i; - for (i = 0; i < num_processes; i++) { - ld_processes.path[i] = (char*)malloc(sizeof(char) * 100); - ld_processes.path[i][0] = '\0'; - strcat(ld_processes.path[i], "input/proc/"); - char proc[100]; -#ifdef MLQ_SCHED - fscanf(file, "%lu %s %lu\n", &ld_processes.start_time[i], proc, &ld_processes.prio[i]); -#else - fscanf(file, "%lu %s\n", &ld_processes.start_time[i], proc); -#endif - strcat(ld_processes.path[i], proc); - } -} - -int main(int argc, char * argv[]) { - /* Read config */ - if (argc != 2) { - printf("Usage: os [path to configure file]\n"); - return 1; - } - char path[100]; - path[0] = '\0'; - strcat(path, "input/"); - strcat(path, argv[1]); - - read_config(path); - - pthread_t * cpu = (pthread_t*)malloc(num_cpus * sizeof(pthread_t)); - struct cpu_args * args = - (struct cpu_args*)malloc(sizeof(struct cpu_args) * num_cpus); - pthread_t ld; - - /* Init timer */ - int i; - for (i = 0; i < num_cpus; i++) { - args[i].timer_id = attach_event(); - args[i].id = i; - } - struct timer_id_t * ld_event = attach_event(); - start_timer(); - -#ifdef MM_PAGING - /* Init all MEMPHY include 1 MEMRAM and n of MEMSWP */ - int rdmflag = 1; /* By default memphy is RANDOM ACCESS MEMORY */ - - struct memphy_struct mram; - struct memphy_struct mswp[PAGING_MAX_MMSWP]; - - /* Create MEM RAM */ - init_memphy(&mram, memramsz, rdmflag); - - /* Create all MEM SWAP */ - int sit; - for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) - init_memphy(&mswp[sit], memswpsz[sit], rdmflag); - - /* In Paging mode, it needs passing the system mem to each PCB through loader*/ - struct mmpaging_ld_args *mm_ld_args = malloc(sizeof(struct mmpaging_ld_args)); - - mm_ld_args->timer_id = ld_event; - mm_ld_args->mram = (struct memphy_struct *) &mram; - mm_ld_args->mswp = (struct memphy_struct**) &mswp; -#ifdef MM_PAGING_HEAP_GODOWN - mm_ld_args->vmemsz = vmemsz; -#endif - mm_ld_args->active_mswp = (struct memphy_struct *) &mswp[0]; -#endif - - - /* Init scheduler */ - init_scheduler(); - - /* Run CPU and loader */ -#ifdef MM_PAGING - pthread_create(&ld, NULL, ld_routine, (void*)mm_ld_args); -#else - pthread_create(&ld, NULL, ld_routine, (void*)ld_event); -#endif - for (i = 0; i < num_cpus; i++) { - pthread_create(&cpu[i], NULL, - cpu_routine, (void*)&args[i]); - } - - /* Wait for CPU and loader finishing */ - for (i = 0; i < num_cpus; i++) { - pthread_join(cpu[i], NULL); - } - pthread_join(ld, NULL); - - /* Stop timer */ - stop_timer(); - - return 0; - -} - - - diff --git a/ossim_source_code/src/paging.c b/ossim_source_code/src/paging.c deleted file mode 100644 index b061019..0000000 --- a/ossim_source_code/src/paging.c +++ /dev/null @@ -1,18 +0,0 @@ - -#include "mem.h" -#include "cpu.h" -#include "loader.h" -#include - -int main() { - struct pcb_t * ld = load("input/p0"); - struct pcb_t * proc = load("input/p0"); - unsigned int i; - for (i = 0; i < proc->code->size; i++) { - run(proc); - run(ld); - } - dump(); - return 0; -} - diff --git a/ossim_source_code/src/queue.c b/ossim_source_code/src/queue.c deleted file mode 100644 index 6273086..0000000 --- a/ossim_source_code/src/queue.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include "queue.h" - -int empty(struct queue_t * q) { - if (q == NULL) return 1; - return (q->size == 0); -} - -void enqueue(struct queue_t * q, struct pcb_t * proc) { - /* TODO: put a new process to queue [q] */ - if (q->size > MAX_QUEUE_SIZE){ - return; - } - else if (!q->size){ - q->proc[0] = proc; - q->size++; - } - else { - int index = q->size; - while (index > 0 && q->proc[index - 1]->priority > proc->priority){ - q->proc[index] = q->proc[index - 1]; - index--; - } - - q->proc[index] = proc; - q->size++; - } - -} - -struct pcb_t * dequeue(struct queue_t * q) { - /* TODO: return a pcb whose prioprity is the highest - * in the queue [q] and remember to remove it from q - * */ - struct pcb_t * result = NULL; - if (q->proc[0] != NULL){ - result = q->proc[0]; - - for (int i = 0; i < q->size - 1; i++){ - q->proc[i] = q->proc[i + 1]; - } - q->proc[q->size - 1] = NULL; - q->size--; - - } - return result; -} - diff --git a/ossim_source_code/src/sched.c b/ossim_source_code/src/sched.c deleted file mode 100644 index c4d5ce2..0000000 --- a/ossim_source_code/src/sched.c +++ /dev/null @@ -1,140 +0,0 @@ - -#include "queue.h" -#include "sched.h" -#include - -#include -#include -static struct queue_t ready_queue; -static struct queue_t run_queue; -static pthread_mutex_t queue_lock; - -#ifdef MLQ_SCHED -static struct queue_t mlq_ready_queue[MAX_PRIO]; -#endif - -int queue_empty(void) { -#ifdef MLQ_SCHED - unsigned long prio; - for (prio = 0; prio < MAX_PRIO; prio++) - if(!empty(&mlq_ready_queue[prio])) - return -1; -#endif - return (empty(&ready_queue) && empty(&run_queue)); -} - -void init_scheduler(void) { -#ifdef MLQ_SCHED - int i ; - - for (i = 0; i < MAX_PRIO; i ++) - mlq_ready_queue[i].size = 0; -#endif - ready_queue.size = 0; - run_queue.size = 0; - pthread_mutex_init(&queue_lock, NULL); -} - -#ifdef MLQ_SCHED -/* - * Stateful design for routine calling - * based on the priority and our MLQ policy - * We implement stateful here using transition technique - * State representation prio = 0 .. MAX_PRIO, curr_slot = 0..(MAX_PRIO - prio) - */ -struct pcb_t * get_mlq_proc(void) { - struct pcb_t * proc = NULL; - /*TODO: get a process from PRIORITY [ready_queue]. - * Remember to use lock to protect the queue. - * */ - //int curr_slot = 0; - pthread_mutex_lock(&queue_lock); - int prio; - - for (prio = 0; prio < MAX_PRIO; prio++){ - if (mlq_ready_queue[prio].size != 0 && mlq_ready_queue[prio].count_slot < MAX_PRIO - prio){ - proc = dequeue(&mlq_ready_queue[prio]); - mlq_ready_queue[prio].count_slot++; - break; - } - } - - if (prio == MAX_PRIO) { - for (int i = 0; i < MAX_PRIO; i++){ - mlq_ready_queue[i].count_slot = 0; - } - - for (int i = 0; i < MAX_PRIO; i++){ - if (mlq_ready_queue[i].size != 0 && mlq_ready_queue[i].count_slot < MAX_PRIO - i){ - proc = dequeue(&mlq_ready_queue[i]); - mlq_ready_queue[i].count_slot++; - break; - } - } - } - - // while (prio < MAX_PRIO){ - // curr_slot = MAX_PRIO - prio; - // if (!empty(&mlq_ready_queue[prio]) && mlq_ready_queue[prio].count_slot < curr_slot){ - // proc = dequeue(&mlq_ready_queue[prio]); - // curr_slot--; - // break; - // } - // else{ - // prio = (prio + 1) % MAX_PRIO; - // curr_slot = 0; - // } - // } - pthread_mutex_unlock(&queue_lock); - return proc; -} - -void put_mlq_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&mlq_ready_queue[proc->prio], proc); - pthread_mutex_unlock(&queue_lock); -} - -void add_mlq_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&mlq_ready_queue[proc->prio], proc); - pthread_mutex_unlock(&queue_lock); -} - -struct pcb_t * get_proc(void) { - return get_mlq_proc(); -} - -void put_proc(struct pcb_t * proc) { - return put_mlq_proc(proc); -} - -void add_proc(struct pcb_t * proc) { - return add_mlq_proc(proc); -} -#else -struct pcb_t * get_proc(void) { - struct pcb_t * proc = NULL; - /*TODO: get a process from [ready_queue]. - * Remember to use lock to protect the queue. - * */ - pthread_mutex_lock(&queue_lock); - dequeue(&ready_queue); - pthread_mutex_unlock(&queue_lock); - return proc; -} - -void put_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&run_queue, proc); - pthread_mutex_unlock(&queue_lock); -} - -void add_proc(struct pcb_t * proc) { - pthread_mutex_lock(&queue_lock); - enqueue(&ready_queue, proc); - pthread_mutex_unlock(&queue_lock); -} -#endif - - diff --git a/ossim_source_code/src/timer.c b/ossim_source_code/src/timer.c deleted file mode 100644 index 02c4111..0000000 --- a/ossim_source_code/src/timer.c +++ /dev/null @@ -1,136 +0,0 @@ - -#include "timer.h" -#include -#include - -static pthread_t _timer; - -struct timer_id_container_t { - struct timer_id_t id; - struct timer_id_container_t * next; -}; - -static struct timer_id_container_t * dev_list = NULL; - -static uint64_t _time; - -static int timer_started = 0; -static int timer_stop = 0; - - -static void * timer_routine(void * args) { - while (!timer_stop) { - printf("Time slot %3lu\n", current_time()); - int fsh = 0; - int event = 0; - /* Wait for all devices have done the job in current - * time slot */ - struct timer_id_container_t * temp; - for (temp = dev_list; temp != NULL; temp = temp->next) { - pthread_mutex_lock(&temp->id.event_lock); - while (!temp->id.done && !temp->id.fsh) { - pthread_cond_wait( - &temp->id.event_cond, - &temp->id.event_lock - ); - } - if (temp->id.fsh) { - fsh++; - } - event++; - pthread_mutex_unlock(&temp->id.event_lock); - } - - /* Increase the time slot */ - _time++; - - /* Let devices continue their job */ - for (temp = dev_list; temp != NULL; temp = temp->next) { - pthread_mutex_lock(&temp->id.timer_lock); - temp->id.done = 0; - pthread_cond_signal(&temp->id.timer_cond); - pthread_mutex_unlock(&temp->id.timer_lock); - } - if (fsh == event) { - break; - } - } - pthread_exit(args); -} - -void next_slot(struct timer_id_t * timer_id) { - /* Tell to timer that we have done our job in current slot */ - pthread_mutex_lock(&timer_id->event_lock); - timer_id->done = 1; - pthread_cond_signal(&timer_id->event_cond); - pthread_mutex_unlock(&timer_id->event_lock); - - /* Wait for going to next slot */ - pthread_mutex_lock(&timer_id->timer_lock); - while (timer_id->done) { - pthread_cond_wait( - &timer_id->timer_cond, - &timer_id->timer_lock - ); - } - pthread_mutex_unlock(&timer_id->timer_lock); -} - -uint64_t current_time() { - return _time; -} - -void start_timer() { - timer_started = 1; - pthread_create(&_timer, NULL, timer_routine, NULL); -} - -void detach_event(struct timer_id_t * event) { - pthread_mutex_lock(&event->event_lock); - event->fsh = 1; - pthread_cond_signal(&event->event_cond); - pthread_mutex_unlock(&event->event_lock); -} - -struct timer_id_t * attach_event() { - if (timer_started) { - return NULL; - }else{ - struct timer_id_container_t * container = - (struct timer_id_container_t*)malloc( - sizeof(struct timer_id_container_t) - ); - container->id.done = 0; - container->id.fsh = 0; - pthread_cond_init(&container->id.event_cond, NULL); - pthread_mutex_init(&container->id.event_lock, NULL); - pthread_cond_init(&container->id.timer_cond, NULL); - pthread_mutex_init(&container->id.timer_lock, NULL); - if (dev_list == NULL) { - dev_list = container; - dev_list->next = NULL; - }else{ - container->next = dev_list; - dev_list = container; - } - return &(container->id); - } -} - -void stop_timer() { - timer_stop = 1; - pthread_join(_timer, NULL); - while (dev_list != NULL) { - struct timer_id_container_t * temp = dev_list; - dev_list = dev_list->next; - pthread_cond_destroy(&temp->id.event_cond); - pthread_mutex_destroy(&temp->id.event_lock); - pthread_cond_destroy(&temp->id.timer_cond); - pthread_mutex_destroy(&temp->id.timer_lock); - free(temp); - } -} - - - - From f441c5f4b4d3f6da74e0757a61108b0b60d0af77 Mon Sep 17 00:00:00 2001 From: nguyenhuy0206 <61077873+nguyenhuy0206@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:58:43 +0700 Subject: [PATCH 9/9] btl src code --- .DS_Store | Bin 6148 -> 6148 bytes ossim_source_code/.DS_Store | Bin 0 -> 8196 bytes .../.vscode/c_cpp_properties.json | 18 + ossim_source_code/.vscode/launch.json | 13 + ossim_source_code/.vscode/settings.json | 66 ++ ossim_source_code/Makefile | 50 ++ ossim_source_code/include/bitops.h | 37 + ossim_source_code/include/common.h | 96 +++ ossim_source_code/include/cpu.h | 13 + ossim_source_code/include/loader.h | 9 + ossim_source_code/include/mem.h | 32 + ossim_source_code/include/mm.h | 163 +++++ ossim_source_code/include/os-cfg.h | 15 + ossim_source_code/include/os-mm.h | 88 +++ ossim_source_code/include/queue.h | 22 + ossim_source_code/include/sched.h | 28 + ossim_source_code/include/timer.h | 28 + ossim_source_code/input/os_0_mlq_paging | 4 + ossim_source_code/input/os_1_mlq_paging | 10 + .../input/os_1_mlq_paging_small_1K | 10 + .../input/os_1_mlq_paging_small_4K | 10 + ossim_source_code/input/os_1_singleCPU_mlq | 9 + .../input/os_1_singleCPU_mlq_paging | 10 + ossim_source_code/input/proc/m0s | 8 + ossim_source_code/input/proc/m1s | 8 + ossim_source_code/input/proc/p0s | 15 + ossim_source_code/input/proc/p1s | 12 + ossim_source_code/input/proc/p2s | 14 + ossim_source_code/input/proc/p3s | 18 + ossim_source_code/input/proc/s0 | 16 + ossim_source_code/input/proc/s1 | 8 + ossim_source_code/input/proc/s2 | 14 + ossim_source_code/input/proc/s3 | 18 + ossim_source_code/input/proc/s4 | 31 + ossim_source_code/input/sched | 4 + ossim_source_code/input/sched_0 | 3 + ossim_source_code/input/sched_1 | 5 + ossim_source_code/obj/cpu.o | Bin 0 -> 6704 bytes ossim_source_code/obj/loader.o | Bin 0 -> 9176 bytes ossim_source_code/obj/mem.o | Bin 0 -> 10144 bytes ossim_source_code/obj/mm-memphy.o | Bin 0 -> 7368 bytes ossim_source_code/obj/mm-vm.o | Bin 0 -> 18048 bytes ossim_source_code/obj/mm.o | Bin 0 -> 15672 bytes ossim_source_code/obj/os.o | Bin 0 -> 15984 bytes ossim_source_code/obj/queue.o | Bin 0 -> 5624 bytes ossim_source_code/obj/sched.o | Bin 0 -> 9032 bytes ossim_source_code/obj/timer.o | Bin 0 -> 8360 bytes ossim_source_code/os | Bin 0 -> 81039 bytes .../output/os_0_mlq_paging.output | 78 +++ .../output/os_1_mlq_paging.output | 173 +++++ .../output/os_1_mlq_paging_small_1K.output | 171 +++++ .../output/os_1_mlq_paging_small_4K.output | 172 +++++ .../output/os_1_singleCPU_mlq.output | 185 +++++ .../output/os_1_singleCPU_mlq_paging.output | 185 +++++ ossim_source_code/output/sched.output | 42 ++ ossim_source_code/output/sched_0.output | 68 ++ ossim_source_code/output/sched_1.output | 132 ++++ ossim_source_code/src/cpu.c | 102 +++ ossim_source_code/src/loader.c | 108 +++ ossim_source_code/src/mem.c | 173 +++++ ossim_source_code/src/mm-memphy.c | 199 ++++++ ossim_source_code/src/mm-vm.c | 649 ++++++++++++++++++ ossim_source_code/src/mm.c | 458 ++++++++++++ ossim_source_code/src/os.c | 292 ++++++++ ossim_source_code/src/paging.c | 18 + ossim_source_code/src/queue.c | 49 ++ ossim_source_code/src/sched.c | 140 ++++ ossim_source_code/src/timer.c | 136 ++++ 68 files changed, 4435 insertions(+) create mode 100644 ossim_source_code/.DS_Store create mode 100644 ossim_source_code/.vscode/c_cpp_properties.json create mode 100644 ossim_source_code/.vscode/launch.json create mode 100644 ossim_source_code/.vscode/settings.json create mode 100644 ossim_source_code/Makefile create mode 100644 ossim_source_code/include/bitops.h create mode 100644 ossim_source_code/include/common.h create mode 100644 ossim_source_code/include/cpu.h create mode 100644 ossim_source_code/include/loader.h create mode 100644 ossim_source_code/include/mem.h create mode 100644 ossim_source_code/include/mm.h create mode 100644 ossim_source_code/include/os-cfg.h create mode 100644 ossim_source_code/include/os-mm.h create mode 100644 ossim_source_code/include/queue.h create mode 100644 ossim_source_code/include/sched.h create mode 100644 ossim_source_code/include/timer.h create mode 100644 ossim_source_code/input/os_0_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_1K create mode 100644 ossim_source_code/input/os_1_mlq_paging_small_4K create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq create mode 100644 ossim_source_code/input/os_1_singleCPU_mlq_paging create mode 100644 ossim_source_code/input/proc/m0s create mode 100644 ossim_source_code/input/proc/m1s create mode 100644 ossim_source_code/input/proc/p0s create mode 100644 ossim_source_code/input/proc/p1s create mode 100644 ossim_source_code/input/proc/p2s create mode 100644 ossim_source_code/input/proc/p3s create mode 100644 ossim_source_code/input/proc/s0 create mode 100644 ossim_source_code/input/proc/s1 create mode 100644 ossim_source_code/input/proc/s2 create mode 100644 ossim_source_code/input/proc/s3 create mode 100644 ossim_source_code/input/proc/s4 create mode 100644 ossim_source_code/input/sched create mode 100644 ossim_source_code/input/sched_0 create mode 100644 ossim_source_code/input/sched_1 create mode 100644 ossim_source_code/obj/cpu.o create mode 100644 ossim_source_code/obj/loader.o create mode 100644 ossim_source_code/obj/mem.o create mode 100644 ossim_source_code/obj/mm-memphy.o create mode 100644 ossim_source_code/obj/mm-vm.o create mode 100644 ossim_source_code/obj/mm.o create mode 100644 ossim_source_code/obj/os.o create mode 100644 ossim_source_code/obj/queue.o create mode 100644 ossim_source_code/obj/sched.o create mode 100644 ossim_source_code/obj/timer.o create mode 100755 ossim_source_code/os create mode 100644 ossim_source_code/output/os_0_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_1K.output create mode 100644 ossim_source_code/output/os_1_mlq_paging_small_4K.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq.output create mode 100644 ossim_source_code/output/os_1_singleCPU_mlq_paging.output create mode 100644 ossim_source_code/output/sched.output create mode 100644 ossim_source_code/output/sched_0.output create mode 100644 ossim_source_code/output/sched_1.output create mode 100644 ossim_source_code/src/cpu.c create mode 100644 ossim_source_code/src/loader.c create mode 100644 ossim_source_code/src/mem.c create mode 100644 ossim_source_code/src/mm-memphy.c create mode 100644 ossim_source_code/src/mm-vm.c create mode 100644 ossim_source_code/src/mm.c create mode 100644 ossim_source_code/src/os.c create mode 100644 ossim_source_code/src/paging.c create mode 100644 ossim_source_code/src/queue.c create mode 100644 ossim_source_code/src/sched.c create mode 100644 ossim_source_code/src/timer.c diff --git a/.DS_Store b/.DS_Store index 5d41a69196e64470365a6f3a07941a3810eb78a5..39abe131f832517e8d0e2aee88718a814e843b69 100644 GIT binary patch delta 100 zcmZoMXfc=|#>B)qu~2NHo+2aj#(>?7jLeh$SPU6=Om1K)jP=VU!1h(aj8yj4hH?wo_a{$fQEXeVlc{0Cp6F!wdjR Cr5N%6 delta 292 zcmZoMXfc=|#>B!ku~2NHo+2aL#(>?7iwl^U7}+NCFsaFS=Hw?Q<>V(ZFfa%Ju_F-c z{RaaE2A~2%#%+`Bms;iAGbrj4e?_`o;?3jFwNuIG2q`$tPB*~|=xTFZE&z>Qe zp^~APp@booA(ug)A&eoPA%~$9$W8@{>NB`7Bm(6Ufviv(3pTNij@7u4Fq18{J`3wD<4EuKP~2ZjN|fMLKeU>GnAoCXGP&8B2!tozby za>IaO;9N35?*|(%vK3{=(u!9HW?~C~Hjj@*!h75Yh!|Vhin3#AMJSdjcMnX3GPT8E zG93Lj!O>Qf9ZM_2fyr=Ss%EBkC`{CjakhX1t4M2d!+>ER%>eD)3$O(H(1TWd|K9FM zu=O^LX!Bal3AlqE>%+INZ!UVD?;VA5{{hw6rPG3_wlY;(03SkZO#lNrPuL82OVvh` zn`&D6BNBm=XlK~#DD+3C6ZpM;x%{2Y4qTTkn|d|2-{`-5J!*?mI49&sKx z(S6f-?0dt;!lex!_M3j_bwz;hdI;Ix@SMp3HV(HFC8WGn7 zz2$e?N)wICHlJ#ejnXywguo=r`}J-Z@Nfq`)Qef6SO@j$C)9e6-nd#ZJIM}30iOk!6P+T?KlJMcp51$#|LgUS={ z!R9aT$Cb7iV-xRmY^A+=%MY$$#c9ZCyQUC{r~;!^Z(;*gel!HU>G=223WpUuT`-L(FbX=HMG~Z z@p^_ACBluR6(N`rgr1A-INHe{hInr)Uq#umwCKU~-wy)ld;fHN<7?}(zS@}e{{;75 I=VJZ;3#dblSpWb4 literal 0 HcmV?d00001 diff --git a/ossim_source_code/.vscode/c_cpp_properties.json b/ossim_source_code/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f6526a0 --- /dev/null +++ b/ossim_source_code/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "macos-clang-arm64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "${default}", + "cppStandard": "c++20", + "intelliSenseMode": "macos-clang-arm64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/launch.json b/ossim_source_code/.vscode/launch.json new file mode 100644 index 0000000..5de968d --- /dev/null +++ b/ossim_source_code/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/admin/Downloads/ossim_source_code/src", + "program": "/Users/admin/Downloads/ossim_source_code/src/build/Debug/outDebug" + } + ] +} \ No newline at end of file diff --git a/ossim_source_code/.vscode/settings.json b/ossim_source_code/.vscode/settings.json new file mode 100644 index 0000000..7a3b5b2 --- /dev/null +++ b/ossim_source_code/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "C_Cpp_Runner.cCompilerPath": "clang", + "C_Cpp_Runner.cppCompilerPath": "clang++", + "C_Cpp_Runner.debuggerPath": "lldb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "c++20", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "git.ignoreLimitWarning": true, + "files.associations": { + "cstdlib": "cpp", + "locale": "cpp", + "ostream": "cpp", + "new": "cpp" + } +} \ No newline at end of file diff --git a/ossim_source_code/Makefile b/ossim_source_code/Makefile new file mode 100644 index 0000000..f7ed868 --- /dev/null +++ b/ossim_source_code/Makefile @@ -0,0 +1,50 @@ + +INC = -Iinclude +LIB = -lpthread + +SRC = src +OBJ = obj +INCLUDE = include + +CC = gcc +DEBUG = -g +CFLAGS = -Wall -c $(DEBUG) +LFLAGS = -Wall $(DEBUG) + +vpath %.c $(SRC) +vpath %.h $(INCLUDE) + +MAKE = $(CC) $(INC) + +# Object files needed by modules +MEM_OBJ = $(addprefix $(OBJ)/, paging.o mem.o cpu.o loader.o) +OS_OBJ = $(addprefix $(OBJ)/, cpu.o mem.o loader.o queue.o os.o sched.o timer.o mm-vm.o mm.o mm-memphy.o) +SCHED_OBJ = $(addprefix $(OBJ)/, cpu.o loader.o) +HEADER = $(wildcard $(INCLUDE)/*.h) + +all: os +#mem sched os + +# Just compile memory management modules +mem: $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(MEM_OBJ) -o mem $(LIB) + +# Just compile scheduler +sched: $(SCHED_OBJ) $(MEM_OBJ) + $(MAKE) $(LFLAGS) $(SCHED_OBJ) $(MEM_OBJ) -o sched $(LIB) + +# Compile the whole OS simulation +os: $(OS_OBJ) + $(MAKE) $(LFLAGS) $(OS_OBJ) -o os $(LIB) + +$(OBJ)/%.o: %.c ${HEADER} $(OBJ) + $(MAKE) $(CFLAGS) $< -o $@ + +# Prepare objectives container +$(OBJ): + mkdir -p $(OBJ) + +clean: + rm -f $(OBJ)/*.o os sched mem + rm -r $(OBJ) + diff --git a/ossim_source_code/include/bitops.h b/ossim_source_code/include/bitops.h new file mode 100644 index 0000000..0cc9413 --- /dev/null +++ b/ossim_source_code/include/bitops.h @@ -0,0 +1,37 @@ +#ifdef CONFIG_64BIT +#define BITS_PER_LONG 64 +#else +#define BITS_PER_LONG 32 +#endif /* CONFIG_64BIT */ + +#define BITS_PER_BYTE 8 +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define BIT(nr) (1U << (nr)) +#define BIT_ULL(nr) (1ULL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) + +/* + * Create a contiguous bitmask starting at bit position @l and ending at + * position @h. For example + * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. + */ +#define GENMASK(h, l) \ + (((~0U) << (l)) & (~0U >> (BITS_PER_LONG - (h) - 1))) + +#define NBITS2(n) ((n&2)?1:0) +#define NBITS4(n) ((n&(0xC))?(2+NBITS2(n>>2)):(NBITS2(n))) +#define NBITS8(n) ((n&0xF0)?(4+NBITS4(n>>4)):(NBITS4(n))) +#define NBITS16(n) ((n&0xFF00)?(8+NBITS8(n>>8)):(NBITS8(n))) +#define NBITS32(n) ((n&0xFFFF0000)?(16+NBITS16(n>>16)):(NBITS16(n))) +#define NBITS(n) (n==0?0:NBITS32(n)) + +#define EXTRACT_NBITS(nr, h, l) ((nr&GENMASK(h,l)) >> l) diff --git a/ossim_source_code/include/common.h b/ossim_source_code/include/common.h new file mode 100644 index 0000000..c1d5a17 --- /dev/null +++ b/ossim_source_code/include/common.h @@ -0,0 +1,96 @@ +#ifndef COMMON_H +#define COMMON_H + +/* Define structs and routine could be used by every source files */ + +#include + +#ifndef OSCFG_H +#include "os-cfg.h" +#endif + +#ifndef OSMM_H +#include "os-mm.h" +#endif + +#define ADDRESS_SIZE 20 +#define OFFSET_LEN 10 +#define FIRST_LV_LEN 5 +#define SECOND_LV_LEN 5 +#define SEGMENT_LEN FIRST_LV_LEN +#define PAGE_LEN SECOND_LV_LEN + +#define NUM_PAGES (1 << (ADDRESS_SIZE - OFFSET_LEN)) +#define PAGE_SIZE (1 << OFFSET_LEN) + +enum ins_opcode_t { + CALC, // Just perform calculation, only use CPU + ALLOC, // Allocate memory +#ifdef MM_PAGING + MALLOC, // Allocate dynamic memory +#endif + FREE, // Deallocated a memory block + READ, // Write data to a byte on memory + WRITE // Read data from a byte on memory +}; + +/* instructions executed by the CPU */ +struct inst_t { + enum ins_opcode_t opcode; + uint32_t arg_0; // Argument lists for instructions + uint32_t arg_1; + uint32_t arg_2; +}; + +struct code_seg_t { + struct inst_t * text; + uint32_t size; +}; + +struct trans_table_t { + /* A row in the page table of the second layer */ + struct { + addr_t v_index; // The index of virtual address + addr_t p_index; // The index of physical address + } table[1 << SECOND_LV_LEN]; + int size; +}; + +/* Mapping virtual addresses and physical ones */ +struct page_table_t { + /* Translation table for the first layer */ + struct { + addr_t v_index; // Virtual index + struct trans_table_t * next_lv; + } table[1 << FIRST_LV_LEN]; + int size; // Number of row in the first layer +}; + +/* PCB, describe information about a process */ +struct pcb_t { + uint32_t pid; // PID + uint32_t priority; // Default priority, this legacy (FIXED) value depend on process itself + struct code_seg_t * code; // Code segment + addr_t regs[10]; // Registers, store address of allocated regions + uint32_t pc; // Program pointer, point to the next instruction +#ifdef MLQ_SCHED + // Priority on execution (if supported), on-fly aka. changeable + // and this vale overwrites the default priority when it existed + uint32_t prio; +#endif +#ifdef MM_PAGING + struct mm_struct *mm; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; +#ifdef MM_PAGING_HEAP_GODOWN + uint32_t vmemsz; +#endif +#endif + struct page_table_t * page_table; // Page table + uint32_t bp; // Break pointer + +}; + +#endif + diff --git a/ossim_source_code/include/cpu.h b/ossim_source_code/include/cpu.h new file mode 100644 index 0000000..0b95b07 --- /dev/null +++ b/ossim_source_code/include/cpu.h @@ -0,0 +1,13 @@ + +#ifndef CPU_H +#define CPU_H + +#include "common.h" + +/* Execute an instruction of a process. Return 0 + * if the instruction is executed successfully. + * Otherwise, return 1. */ +int run(struct pcb_t * proc); + +#endif + diff --git a/ossim_source_code/include/loader.h b/ossim_source_code/include/loader.h new file mode 100644 index 0000000..8fedc07 --- /dev/null +++ b/ossim_source_code/include/loader.h @@ -0,0 +1,9 @@ +#ifndef LOADER_H +#define LOADER_H + +#include "common.h" + +struct pcb_t * load(const char * path); + +#endif + diff --git a/ossim_source_code/include/mem.h b/ossim_source_code/include/mem.h new file mode 100644 index 0000000..3c2f5a3 --- /dev/null +++ b/ossim_source_code/include/mem.h @@ -0,0 +1,32 @@ +#ifndef MEM_H +#define MEM_H + +#include "common.h" + +#define RAM_SIZE (1 << ADDRESS_SIZE) + +/* Init related parameters, must be called before being used */ +void init_mem(void); + +/* Allocate [size] bytes for process [proc] and return its virtual address. + * If we cannot allocate new memory region for this process, return 0 */ +addr_t alloc_mem(uint32_t size, struct pcb_t * proc); + +/* Free a memory block having the first byte at [address] used by + * process [proc]. Return 0 if [address] is valid. Otherwise, return 1 */ +int free_mem(addr_t address, struct pcb_t * proc); + +/* Read 1 byte memory pointed by [address] used by process [proc] and + * save it to [data]. + * If the given [address] is valid, return 0. Otherwise, return 1 */ +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data); + +/* Write [data] to 1 byte on the memory pointed by [address] of process + * [proc]. If given [address] is valid, return 0. Otherwise, return 1 */ +int write_mem(addr_t address, struct pcb_t * proc, BYTE data); + +void dump(void); + +#endif + + diff --git a/ossim_source_code/include/mm.h b/ossim_source_code/include/mm.h new file mode 100644 index 0000000..e7d9094 --- /dev/null +++ b/ossim_source_code/include/mm.h @@ -0,0 +1,163 @@ +#ifndef MM_H + +#include "bitops.h" +#include "common.h" + +/* CPU Bus definition */ +#define PAGING_CPU_BUS_WIDTH 22 /* 22bit bus - MAX SPACE 4MB */ +#define PAGING_PAGESZ 256 /* 256B or 8-bits PAGE NUMBER */ +#define PAGING_MEMRAMSZ BIT(10) /* 1MB */ +#define PAGING_PAGE_ALIGNSZ(sz) (DIV_ROUND_UP(sz,PAGING_PAGESZ) *PAGING_PAGESZ) + +#define PAGING_MEMSWPSZ BIT(14) /* 16MB */ +#define PAGING_SWPFPN_OFFSET 5 +#define PAGING_MAX_PGN (DIV_ROUND_UP(BIT(PAGING_CPU_BUS_WIDTH),PAGING_PAGESZ)) + +#define PAGING_SBRK_INIT_SZ PAGING_PAGESZ +/* PTE BIT */ +#define PAGING_PTE_PRESENT_MASK BIT(31) +#define PAGING_PTE_SWAPPED_MASK BIT(30) +#define PAGING_PTE_RESERVE_MASK BIT(29) +#define PAGING_PTE_DIRTY_MASK BIT(28) +#define PAGING_PTE_EMPTY01_MASK BIT(14) +#define PAGING_PTE_EMPTY02_MASK BIT(13) + +/* PTE BIT PRESENT */ +#define PAGING_PTE_SET_PRESENT(pte) (pte=pte|PAGING_PTE_PRESENT_MASK) +#define PAGING_PTE_PAGE_PRESENT(pte) (pte&PAGING_PTE_PRESENT_MASK) + +/* USRNUM */ +#define PAGING_PTE_USRNUM_LOBIT 15 +#define PAGING_PTE_USRNUM_HIBIT 27 +/* FPN */ +#define PAGING_PTE_FPN_LOBIT 0 +#define PAGING_PTE_FPN_HIBIT 12 +/* SWPTYP */ +#define PAGING_PTE_SWPTYP_LOBIT 0 +#define PAGING_PTE_SWPTYP_HIBIT 4 +/* SWPOFF */ +#define PAGING_PTE_SWPOFF_LOBIT 5 +#define PAGING_PTE_SWPOFF_HIBIT 25 + +/* PTE masks */ +#define PAGING_PTE_USRNUM_MASK GENMASK(PAGING_PTE_USRNUM_HIBIT,PAGING_PTE_USRNUM_LOBIT) +#define PAGING_PTE_FPN_MASK GENMASK(PAGING_PTE_FPN_HIBIT,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWPTYP_MASK GENMASK(PAGING_PTE_SWPTYP_HIBIT,PAGING_PTE_SWPTYP_LOBIT) +#define PAGING_PTE_SWPOFF_MASK GENMASK(PAGING_PTE_SWPOFF_HIBIT,PAGING_PTE_SWPOFF_LOBIT) + +/* Extract PTE */ +#define PAGING_PTE_OFFST(pte) GETVAL(pte,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PTE_PGN(pte) GETVAL(pte,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +#define PAGING_PTE_FPN(pte) GETVAL(pte,PAGING_PTE_FPN_MASK,PAGING_PTE_FPN_LOBIT) +#define PAGING_PTE_SWP(pte) GETVAL(pte,PAGING_PTE_SWPOFF_MASK,PAGING_SWPFPN_OFFSET) + +/* OFFSET */ +#define PAGING_ADDR_OFFST_LOBIT 0 +#define PAGING_ADDR_OFFST_HIBIT (NBITS(PAGING_PAGESZ) - 1) + +/* PAGE Num */ +#define PAGING_ADDR_PGN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_PGN_HIBIT (PAGING_CPU_BUS_WIDTH - 1) + +/* Frame PHY Num */ +#define PAGING_ADDR_FPN_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_ADDR_FPN_HIBIT (NBITS(PAGING_MEMRAMSZ) - 1) + +/* SWAPFPN */ +#define PAGING_SWP_LOBIT NBITS(PAGING_PAGESZ) +#define PAGING_SWP_HIBIT (NBITS(PAGING_MEMSWPSZ) - 1) + +/* Value operators */ +#define SETBIT(v,mask) (v=v|mask) +#define CLRBIT(v,mask) (v=v&~mask) + +#define SETVAL(v,value,mask,offst) (v=(v&~mask)|((value<>offst) + +/* Other masks */ +#define PAGING_OFFST_MASK GENMASK(PAGING_ADDR_OFFST_HIBIT,PAGING_ADDR_OFFST_LOBIT) +#define PAGING_PGN_MASK GENMASK(PAGING_ADDR_PGN_HIBIT,PAGING_ADDR_PGN_LOBIT) +#define PAGING_FPN_MASK GENMASK(PAGING_ADDR_FPN_HIBIT,PAGING_ADDR_FPN_LOBIT) +#define PAGING_SWP_MASK GENMASK(PAGING_SWP_HIBIT,PAGING_SWP_LOBIT) + +/* Extract OFFSET */ +//#define PAGING_OFFST(x) ((x&PAGING_OFFST_MASK) >> PAGING_ADDR_OFFST_LOBIT) +#define PAGING_OFFST(x) GETVAL(x,PAGING_OFFST_MASK,PAGING_ADDR_OFFST_LOBIT) +/* Extract Page Number*/ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract FramePHY Number*/ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) +/* Extract SWAPFPN */ +#define PAGING_PGN(x) GETVAL(x,PAGING_PGN_MASK,PAGING_ADDR_PGN_LOBIT) +/* Extract SWAPTYPE */ +#define PAGING_FPN(x) GETVAL(x,PAGING_FPN_MASK,PAGING_ADDR_FPN_LOBIT) + +/* Memory range operator */ +/* TODO implement the INCLUDE checking mechanism - currently dummy op only */ +#define INCLUDE(x1,x2,y1,y2) (0) +/* TODO implement the OVERLAP checking mechanism - currently dummy op only */ +#define OVERLAP(x1,x2,y1,y2) (1) + +/* VM region prototypes */ +struct vm_rg_struct * init_vm_rg(int rg_start, int rg_endi, int vmaid); +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode); +int enlist_pgn_node(struct pgn_t **pgnlist, int pgn); +int vmap_page_range(struct pcb_t *caller, int addr, int pgnum, + struct framephy_struct *frames, struct vm_rg_struct *ret_rg); +int vm_map_ram(struct pcb_t *caller, int astart, int send, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg); +int alloc_pages_range(struct pcb_t *caller, int incpgnum, struct framephy_struct **frm_lst); +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) ; +int pte_set_fpn(uint32_t *pte, int fpn); +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff); +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff); //swap offset +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr); +int __free(struct pcb_t *caller, int rgid); +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data); +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value); +int init_mm(struct mm_struct *mm, struct pcb_t *caller); + +/* VM prototypes */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index); +int pgfree_data(struct pcb_t *proc, uint32_t reg_index); +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination); +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset); +/* Local VM prototypes */ +struct vm_rg_struct * get_symrg_byid(struct mm_struct* mm, int rgid); +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend); +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg); +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret); +int find_victim_page(struct mm_struct* mm, int *pgn); +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid); + +/* MEM/PHY protypes */ +int MEMPHY_get_freefp(struct memphy_struct *mp, int *fpn); +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn); +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value); +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data); +int MEMPHY_dump(struct memphy_struct * mp); +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg); +/* DEBUG */ +int print_list_fp(struct framephy_struct *fp); +int print_list_rg(struct vm_rg_struct *rg); +int print_list_vma(struct vm_area_struct *rg); + + +int print_list_pgn(struct pgn_t *ip); +int print_pgtbl(struct pcb_t *ip, uint32_t start, uint32_t end); +#endif diff --git a/ossim_source_code/include/os-cfg.h b/ossim_source_code/include/os-cfg.h new file mode 100644 index 0000000..d5034e0 --- /dev/null +++ b/ossim_source_code/include/os-cfg.h @@ -0,0 +1,15 @@ +#ifndef OSCFG_H +#define OSCFG_H + +#define MLQ_SCHED 1 +#define MAX_PRIO 140 + +#define MM_PAGING +#define MM_PAGING_HEAP_GODOWN +// #define MM_FIXED_MEMSZ +#define VMDBG 1 +#define MMDBG 1 +#define IODUMP 1 +#define PAGETBL_DUMP 1 + +#endif diff --git a/ossim_source_code/include/os-mm.h b/ossim_source_code/include/os-mm.h new file mode 100644 index 0000000..beef90e --- /dev/null +++ b/ossim_source_code/include/os-mm.h @@ -0,0 +1,88 @@ +#ifndef OSMM_H +#define OSMM_H + +#define MM_PAGING +#define PAGING_MAX_MMSWP 4 /* max number of supported swapped space */ +#define PAGING_MAX_SYMTBL_SZ 30 + +typedef char BYTE; +typedef uint32_t addr_t; +//typedef unsigned int uint32_t; + +struct pgn_t{ + int pgn; + struct pgn_t *pg_next; +}; + +/* + * Memory region struct + */ +struct vm_rg_struct { + int vmaid; + + unsigned long rg_start; + unsigned long rg_end; + + struct vm_rg_struct *rg_next; +}; + +/* + * Memory area struct + */ +struct vm_area_struct { + unsigned long vm_id; + unsigned long vm_start; + unsigned long vm_end; + + unsigned long sbrk; +/* + * Derived field + * unsigned long vm_limit = vm_end - vm_start + */ + struct mm_struct *vm_mm; + + struct vm_rg_struct *vm_freerg_list; + struct vm_area_struct *vm_next; +}; + +/* + * Memory management struct + */ +struct mm_struct { + uint32_t *pgd; + + struct vm_area_struct *mmap; + + /* Currently we support a fixed number of symbol */ + struct vm_rg_struct symrgtbl[PAGING_MAX_SYMTBL_SZ]; + + /* list of free page */ + struct pgn_t *fifo_pgn; +}; + +/* + * FRAME/MEM PHY struct + */ +struct framephy_struct { + int fpn; + struct framephy_struct *fp_next; + + /* Resereed for tracking allocated framed */ + struct mm_struct* owner; +}; + +struct memphy_struct { + /* Basic field of data and size */ + BYTE *storage; + int maxsz; + + /* Sequential device fields */ + int rdmflg; + int cursor; + + /* Management structure */ + struct framephy_struct *free_fp_list; + struct framephy_struct *used_fp_list; +}; + +#endif diff --git a/ossim_source_code/include/queue.h b/ossim_source_code/include/queue.h new file mode 100644 index 0000000..d26881c --- /dev/null +++ b/ossim_source_code/include/queue.h @@ -0,0 +1,22 @@ + +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#define MAX_QUEUE_SIZE 10 + +struct queue_t { + int count_slot; + struct pcb_t * proc[MAX_QUEUE_SIZE]; + int size; +}; + +void enqueue(struct queue_t * q, struct pcb_t * proc); + +struct pcb_t * dequeue(struct queue_t * q); + +int empty(struct queue_t * q); + +#endif + diff --git a/ossim_source_code/include/sched.h b/ossim_source_code/include/sched.h new file mode 100644 index 0000000..d252c72 --- /dev/null +++ b/ossim_source_code/include/sched.h @@ -0,0 +1,28 @@ +#ifndef QUEUE_H +#define QUEUE_H + +#include "common.h" + +#ifndef MLQ_SCHED +#define MLQ_SCHED +#endif + +//#define MAX_PRIO 139 + +int queue_empty(void); + +void init_scheduler(void); +void finish_scheduler(void); + +/* Get the next process from ready queue */ +struct pcb_t * get_proc(void); + +/* Put a process back to run queue */ +void put_proc(struct pcb_t * proc); + +/* Add a new process to ready queue */ +void add_proc(struct pcb_t * proc); + +#endif + + diff --git a/ossim_source_code/include/timer.h b/ossim_source_code/include/timer.h new file mode 100644 index 0000000..e480b66 --- /dev/null +++ b/ossim_source_code/include/timer.h @@ -0,0 +1,28 @@ +#ifndef TIMER_H +#define TIMER_H + +#include +#include + +struct timer_id_t { + int done; + int fsh; + pthread_cond_t event_cond; + pthread_mutex_t event_lock; + pthread_cond_t timer_cond; + pthread_mutex_t timer_lock; +}; + +void start_timer(); + +void stop_timer(); + +struct timer_id_t * attach_event(); + +void detach_event(struct timer_id_t * event); + +void next_slot(struct timer_id_t* timer_id); + +uint64_t current_time(); + +#endif diff --git a/ossim_source_code/input/os_0_mlq_paging b/ossim_source_code/input/os_0_mlq_paging new file mode 100644 index 0000000..6872297 --- /dev/null +++ b/ossim_source_code/input/os_0_mlq_paging @@ -0,0 +1,4 @@ +6 2 4 +1048576 16777216 0 0 0 3145728 +0 p0s 0 +2 p1s 15 diff --git a/ossim_source_code/input/os_1_mlq_paging b/ossim_source_code/input/os_1_mlq_paging new file mode 100644 index 0000000..0068caf --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging @@ -0,0 +1,10 @@ +2 4 8 +1048576 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_1K b/ossim_source_code/input/os_1_mlq_paging_small_1K new file mode 100644 index 0000000..a5788e4 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_1K @@ -0,0 +1,10 @@ +2 4 8 +2048 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_mlq_paging_small_4K b/ossim_source_code/input/os_1_mlq_paging_small_4K new file mode 100644 index 0000000..bd6af03 --- /dev/null +++ b/ossim_source_code/input/os_1_mlq_paging_small_4K @@ -0,0 +1,10 @@ +2 4 8 +4096 16777216 0 0 0 3145728 +1 p0s 130 +2 s3 39 +4 m1s 15 +6 s2 120 +7 m0s 120 +9 p1s 15 +11 s0 38 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq b/ossim_source_code/input/os_1_singleCPU_mlq new file mode 100644 index 0000000..98efc7e --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq @@ -0,0 +1,9 @@ +2 1 8 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/os_1_singleCPU_mlq_paging b/ossim_source_code/input/os_1_singleCPU_mlq_paging new file mode 100644 index 0000000..99e0a04 --- /dev/null +++ b/ossim_source_code/input/os_1_singleCPU_mlq_paging @@ -0,0 +1,10 @@ +2 1 8 +1048576 16777216 0 0 0 3145728 +1 s4 4 +2 s3 3 +4 m1s 2 +6 s2 3 +7 m0s 3 +9 p1s 2 +11 s0 1 +16 s1 0 diff --git a/ossim_source_code/input/proc/m0s b/ossim_source_code/input/proc/m0s new file mode 100644 index 0000000..3466b3a --- /dev/null +++ b/ossim_source_code/input/proc/m0s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 3 +write 102 1 20 +write 1 2 1000 diff --git a/ossim_source_code/input/proc/m1s b/ossim_source_code/input/proc/m1s new file mode 100644 index 0000000..b3b24a6 --- /dev/null +++ b/ossim_source_code/input/proc/m1s @@ -0,0 +1,8 @@ +1 7 +alloc 300 0 +alloc 100 1 +free 0 +alloc 100 2 +malloc 100 2 +free 2 +free 1 diff --git a/ossim_source_code/input/proc/p0s b/ossim_source_code/input/proc/p0s new file mode 100644 index 0000000..7c443f9 --- /dev/null +++ b/ossim_source_code/input/proc/p0s @@ -0,0 +1,15 @@ +1 14 +calc +alloc 300 0 +malloc 300 4 +free 0 +alloc 100 1 +write 100 1 20 +read 1 20 20 +write 102 2 20 +read 2 20 20 +write 103 3 20 +read 3 20 20 +calc +free 4 +calc diff --git a/ossim_source_code/input/proc/p1s b/ossim_source_code/input/proc/p1s new file mode 100644 index 0000000..79c5fba --- /dev/null +++ b/ossim_source_code/input/proc/p1s @@ -0,0 +1,12 @@ +1 10 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p2s b/ossim_source_code/input/proc/p2s new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/p2s @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/p3s b/ossim_source_code/input/proc/p3s new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/p3s @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s0 b/ossim_source_code/input/proc/s0 new file mode 100644 index 0000000..6186100 --- /dev/null +++ b/ossim_source_code/input/proc/s0 @@ -0,0 +1,16 @@ +12 15 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s1 b/ossim_source_code/input/proc/s1 new file mode 100644 index 0000000..8614b76 --- /dev/null +++ b/ossim_source_code/input/proc/s1 @@ -0,0 +1,8 @@ +20 7 +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s2 b/ossim_source_code/input/proc/s2 new file mode 100644 index 0000000..2d9336d --- /dev/null +++ b/ossim_source_code/input/proc/s2 @@ -0,0 +1,14 @@ +20 13 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s3 b/ossim_source_code/input/proc/s3 new file mode 100644 index 0000000..08a2128 --- /dev/null +++ b/ossim_source_code/input/proc/s3 @@ -0,0 +1,18 @@ +7 17 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/proc/s4 b/ossim_source_code/input/proc/s4 new file mode 100644 index 0000000..79dfde8 --- /dev/null +++ b/ossim_source_code/input/proc/s4 @@ -0,0 +1,31 @@ +20 30 +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc +calc diff --git a/ossim_source_code/input/sched b/ossim_source_code/input/sched new file mode 100644 index 0000000..33c50ef --- /dev/null +++ b/ossim_source_code/input/sched @@ -0,0 +1,4 @@ +4 2 3 +0 p1s +1 p2s +2 p3s diff --git a/ossim_source_code/input/sched_0 b/ossim_source_code/input/sched_0 new file mode 100644 index 0000000..ae979fd --- /dev/null +++ b/ossim_source_code/input/sched_0 @@ -0,0 +1,3 @@ +2 1 2 +0 s0 137 +4 s1 138 diff --git a/ossim_source_code/input/sched_1 b/ossim_source_code/input/sched_1 new file mode 100644 index 0000000..c7fac37 --- /dev/null +++ b/ossim_source_code/input/sched_1 @@ -0,0 +1,5 @@ +2 1 4 +0 s0 +4 s1 +6 s2 +7 s3 diff --git a/ossim_source_code/obj/cpu.o b/ossim_source_code/obj/cpu.o new file mode 100644 index 0000000000000000000000000000000000000000..4a5586b973b826c9dfde1f75b31550dadaf2ee7e GIT binary patch literal 6704 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 literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mem.o b/ossim_source_code/obj/mem.o new file mode 100644 index 0000000000000000000000000000000000000000..f258d187737468b32ed6fc56d256396ffd09ba10 GIT binary patch literal 10144 zcmbVS3v^V~x!z~aoRgU|VKR^a2`G#YG(qwpVnrp8n1C<@K?o|M9w(V0jAkCpOhS0a zpk7~Hnrf}9+AFQP3{-D>dwacvYp;5JEZf?9eN->4)*D;93QBK%FVG_Q`}Wxc{Hjn0O`!3|i++$lVRW=I^eajKAMNOhkQ_OxWcHux z2o?aaPjEaQ&#Sas11&NVO~8SpQtV+$ok?Bb0&C*OAS(WAWC`c01bI znvHi!|E_3Qy<|wFPsQ2Gq@&$7#vWLsOuF_GsSRn$Bi>Q=ikWP*e^4-hMP>7yDMXQj zj%zO)O|{37$g%dG4LV9S4iE#y3K<6D+Cvhh#8`VDDSKa=7y>#pKZ5$u#-;okW3+a;WJ#PHbZCrcOzf81kti8}=N7=RK zn>N}QsB!J(w`9hRcb>90sI=z%MSE@OB>c+TovF=>U$N1;$=Z-`w&f&4~cB_2VdmZJ>3^;6)^zC_W=KgmB;+U&TJ12_7K>u_0eygWvwcr1-|9ez+uqkpnVlqpnQ{~JJP4YqWXd3+b-S<-}__?jpEfo=)SAd_ny@!8Wn$J zY`dM+7}J^^kPl4zCD=pyZX$d-`hRoDCcB8_cYGf-`{xce&(fr7~e$P zl^Hxk3=H8jkuR*t;2HG;{kyL{s-0KQ^|^NtJm&3IA^w?u(6{M;TrZhx9A~ zUJ;LIk$mtD7xfHOe6-_rUm~&p@J!?x_^b1*Gtc_o zEwt(VfD=pqa}VvmP3w8hzr+8)(3&D zsCc2rx%Xk*&H3!a`}5uS59!vva`-XwS>t@}oN~{?he7OvAwK+&eC&%o;2+=Cxc3D1 z{>bO@5cZ;&B_<6$m+EAAb zTf^QHyVY|Jy+J%De0QC^|1XyN`+c>)={M(f_w?uR8SjkOTwAkh&W&9d7PD&3>#pQa zxH7zIS<{8#Sv9q>aCsuu4eZ?5oN%f;Pv*I?3QPDYC`Gz0p-t3g1&a+m*t%~j3|XBIkwCFVX=kiZ%7Z(>i@ApR!E)%Ff|I9+r%$L#(82mr zXY#Yl7L^Gxu?lgFWG*Wvdy*kMN{-GK&l^RSI7)xmRW@wQ(VKj-IU%NuWpak80c|Z7 zq;y$T_|75=Sc(bMbo-dYUBKRtLym7Q~*1fnI{{ z@%i=rE1XgNazO7!Nuc&NqQLsmHJ|wefTa#)Tf$WpYUg0nF zSk^0G9H3M{SRVksOuW!*edgjppD=ZguP_ezeN z(}Hn85xgG1S}=oOPjEAS_272=dV@FO*APXH2N0}B*OGrnxsr(_*q%q%l6RB2ZZ4K$ zlBaL`S*VCS>zIK_p1VTKhG*T^F;?ukt8fq%n`b>GLHSTF2+y^Y1m*ph)OF03DDlD~ z8w)Ef{cYOc$`RNv{4?dYs@a6Jzm@jI#8Z?OzuL6q!_?ZPw7R9%E=NmwwToKt(dPy9 z?3#|lph(XRo4$2@NuK`YM~Q#U+hduHc%4w z!{?A{Qq(E)NG(xRXd$U(3mnP92&t7aBNJ~`#b`!)@+3XE&GkgacAMjgitRQPTak?I zHtuj{TzYvsCB>AZ%Hkuir6r%C#e0geesb1(X&a9x)%v=d>BvLU5mEXewb7ild4YP< zow@r8FQuTQMCp%5$-P3k@F+P+iODZ3x%sfEC4WP?SxRoZv?nQ1>g6Mk){L&DKcL)f zW(xT}h0mGi9HkZd33texE983iIa#cc&KuloUqVy!mo-3jng==XYG$n!0&*ib=J~?! zGv`@TK+~Lgp0H-P_}9E*I(Ij1ne&Av^vfY4AFZ$``v&m9IT-FXmsoQFIhlEhu+DSw zrCw_x@beLfxy)zffImPy60*8ondS4XZ7#lYfz<>2G0Lp2w=P6jFW>+%*DSRj1-=>q znk}oWeJ+3PmDZEM<-Av1XE6;-f_c?O>o+cceMXcmfWbf`EQicW>r%jLI75}N7@X9u z_KC7qO0AJnXIWPP)*^A{*}{stQsrK&-Nh?>R?@|17Yd!plbNwZ+2gP@Z8t^_>e{*1 z*Ma;29BrPk`hXuH{xzR91uou$@U#m;(`N#Ii1>n6bWui^%08ky_d$NX7PcM*yp-do z32VT`Pxo2>?&4>Jte?90tWxVgfHRHS?6CDq;A^Qnr`!r+9yxzyjWEBDfdXIIRTvBW z4tQ8Au|5Rka%+=?^*L}k=~SO}!o^ENmI))$;IvYqQ(MM8LzF#2OXV01X@yo5ptLkW zShc`qcsL5menzQ9;FN0-YXu-*L|U`3*18%ieAapwUsY(ey7*-wD*-%A`Ib`aeivVh z-N+}tY!*fWU0|1L7hAWuYK_9W-4$)}S>FIIb8|^ZlyQHRT@AHqFM;jzmG;$aWOuM^-WN59}R8>u>i7c+ZDXYr8ziGYv6TCxUB>C zJ>jl+HkU}J!gJ?U)l}7l%O$sR?z|dMRkasX&8?}e5V>qybuyl;Y7^DXiPmg1yQR7* z-WBgiXX4rF#&j|nO~smV8_<$YcjT(qG%e3nuZXs-TyterE_Q<$fmW~0VZQ2UESX4E zH>EeHI?~Ztt~#B|C6ab7-I;BR+imGsT-e!YQe3>QWwB`67|r5}p<(svhIRIuWmhe> zTh^^wY}>+yM|LhB&5KMn-6lE{sr zqM^BYWusW(fF-LJFBYp8H#CVWRxd+jiBuxbAVjnSK1pmtHXfIV;~d8FxRuLwMDua6 zIh)8kgR#zJMzqKCc6!5xTs$w)4T)?nZ+CP_A{TE<~m)IH?nYLC4WD+qXIgy43TZCL68DuWrPHiR@q33}+(Tixd-L8?pbLDTX z$i~}qFea^tWD@_dblJ`}*lv%3ie^Mt(vBi*mk$!N4lSn4GY@V|5R7~Vrvo{cj zLHsg#n7AX6lLA216kW+EOi7x`K&T8L_XIR0%xy_#+w-j*Vnbp>+Rn76;982oOU#i; za$91_G8?zJ#&h{}HrgH+$!K?OtH{QZ8#>xWTW2p|~NF5*U+n z<4K5TMQ1J^vt99IZgWQ9(k{`3MJL{cc`-uhT$jh9`KW+5xkOvE!{)XSU5RYI()#y->Y&$kXKQ93ksoywcF|3KKqbUUi>P4PRMOkAEj{c~!r9swsEmzBB$Sb$4#o zt1A!w_ZQ2K#mes4p4`*4^V*x1lm|{L$=`VJz$cGy{Ql+#e*ewwsn-sER-CP@cnLNR zqO;&Xiq6lNQgqx=;FuGF&aztHh~ABUEBgKDEKBiEY~c?Y3sa&znb}ySlaBERjRiE( zUn!cUG0`F=|1faUwdiat)<}Oxy`oWNBWOy++8Q~*v76C^Zx&lp?)d4x-ysd#$0b5EA5pxwa)xJiQKj4x>Jw) zB!oT*o%7Ph+qb-N#S=d`EmT)>X6WYME&gIs^!SYR>$ku6$owas&#ztb&NYYDOuXR5 z-tE7*XTgsKUicxMh3J=|a~=6@c02la(0_>j9QvE+htdCx&b2%poz>=2 z^!4Z|^c&IdMSl$a0QxV`dA37E@Sw*>HX939vRK6`7AqIBSjH$8YYDPgSSS|1OUdFM zo`R0X4^y(_x2og_)>CA$JW`7MiY4n4bfw5IVzOB9DOSH?v7S*ZelSz&1@tq~(O5o_ z#ac?4XXQ#3%UH!?fkzgLIHky^i!9c*Tzxe8eE`U!Ma{@>b4tC8t`u2`lEt!Andj#= zS^O4PQjJQA6}OV&CkLe(U|z9!%Rp8XT`BHXQY@X76fYqtwQ*Pq*ifr?FjyVk>J|CC z15X^*YU$`y)RqMfl|SS>AfZ1VpK6+Lyrz1PqysM5?W$6Llae&%dSStnSQZtCfvv+xbJ< z-%z@aGLzeqt9Hvkys&eX$z;_=I*W4|l`)prc56`Z@z}V+&ivpZ-XWeUJRL6nK9@|V z9Babs5&ogQq8DqX-qCA#OiQ19z!0W>Lj;6AMdH^>eCh#1TW$#bSv zy@r3eQM$r7)$BDOGpE;>3#8Z3&Ew zqZlv{F^V9q11;oS&(ecCAP*NlcP8*)Oqf40Jl3a%xY-C37 z?(~>=A|@_Cu7&>o&WKT>-v>oFF&Xx}l6@HVy!yAmHV_~DM&N$Odw9w;Ad^u4J=7=Z z4?wO6x&|aB9T-Mo!`#7CAKK}A5BBbdT+m#N1&|A8MWC_V2sjk-g{*kZWk&GdsPi^V z`}IdOEZ9ugK3mTB7MQ2&kHQX=g#Omfj}23jG~{gtu@yGI zUc}?W%i;*0C!9BxR|DcWspS7nK@Hj5;=nq-U+^F`&v#(mDT*#t^dO#5>b(t!I<)zq z1M7MK@mM$Wa~iO&1(0&90P#1U=4J=h&2h$?)oEV$5+>t(&pWX0aX?H}`6-N`=Ba!e z5T|=3Ye4$V+7gFQB~MD~wK%Y@9*}w;;$4XA{K_MMn5vm|0AStKfH+esuT=aN#h(X= zi^a-0ieIkyX9D7HxXc$7{CfpeiDE8P^br_= zp4qA(Z~9388b5?v736I==|R|sh`C+CMGBq;$nkn57gmr=@(0!UGYaleut&k`6s%V; ztRR5Y=Q&F|EQ^BZZd(W>2#4H1IPmWcl2(7ccy@?pl`6#Rq@nMg%dF{1KZwO*qiNFa zxyio_k#^5XR#&9mb8#7I9(KUx7`*_9Z%LydPy_Ju%YX&(yf9|0mK|O!xnD z+yc4?I`x2TtI$cibwO6qZk=+Cq5)*%I#J%OQ`!~n)*Y9F#_&-4`51b}7}_nyT!n9q z85cJ1G={!7B{lrnIp*Z#<%y%9zEthu`=AcHivRb>miHuf>(+QSEpVx!Zd>f(ixhcf zAn#l3p$iv#_%_Ctw@_my?!=uHE|A7>9UdwH=X%M;ZAmJ>LD<9BH!_@&-_9NRWaeDK V-&)~#Tm=N=T$cm_vc}EV{{qDeHkAMX literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm-memphy.o b/ossim_source_code/obj/mm-memphy.o new file mode 100644 index 0000000000000000000000000000000000000000..f63706c64e7fbc56bc446fef39a60f5ee9f8eca3 GIT binary patch literal 7368 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 SDgMq>?zGN81!z4&Mg12x`YFEv literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/mm.o b/ossim_source_code/obj/mm.o new file mode 100644 index 0000000000000000000000000000000000000000..75aaf47eff60a6b3230770472559f5ba3df912a2 GIT binary patch literal 15672 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

RUv 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 literal 0 HcmV?d00001 diff --git a/ossim_source_code/obj/queue.o b/ossim_source_code/obj/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..47a4309fce16cefca819f7cfdbc4a024032f2a2f GIT binary patch literal 5624 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 OJmampKlNWS^Zx=KIrByU literal 0 HcmV?d00001 diff --git a/ossim_source_code/output/os_0_mlq_paging.output b/ossim_source_code/output/os_0_mlq_paging.output new file mode 100644 index 0000000..87d78bc --- /dev/null +++ b/ossim_source_code/output/os_0_mlq_paging.output @@ -0,0 +1,78 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p0s, PID: 1 PRIO: 0 + CPU 0: Dispatched process 1 +Time slot 1 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 15 +Time slot 3 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 4 + CPU 1: Dispatched process 2 + Loaded a process at input/proc/p1s, PID: 4 PRIO: 0 +Time slot 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 6 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 7 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 8 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 3 +Time slot 11 +Time slot 12 +Time slot 13 +Time slot 14 +Time slot 15 +Time slot 16 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 17 +Time slot 18 +Time slot 19 +Time slot 20 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 4 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 21 +Time slot 22 +Time slot 23 +Time slot 24 + CPU 0: Processed 4 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging.output b/ossim_source_code/output/os_1_mlq_paging.output new file mode 100644 index 0000000..2f675f0 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging.output @@ -0,0 +1,173 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 +Time slot 2 + CPU 1: Dispatched process 1 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 0: Dispatched process 2 +Time slot 4 + CPU 1: Put process 1 to run queue + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 + CPU 3: Dispatched process 1 +Time slot 5 + CPU 2: Dispatched process 3 + CPU 0: Put process 2 to run queue +Time slot 6 + CPU 0: Dispatched process 2 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 + CPU 3: Put process 1 to run queue +Time slot 7 + CPU 1: Dispatched process 4 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 10 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 6 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 1 to run queue + CPU 3: Dispatched process 4 +Time slot 12 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 5 +Time slot 13 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 + CPU 3: Put process 4 to run queue + CPU 3: Dispatched process 3 +Time slot 14 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 2 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 + CPU 3: Processed 3 has finished + CPU 3: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 16 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 +Time slot 17 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 7 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 8 +Time slot 18 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 2 +Time slot 19 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 6 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 7 + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 4 +Time slot 20 + CPU 2: Processed 5 has finished + CPU 2: Dispatched process 8 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1 stopped + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 7 +Time slot 22 + CPU 2: Put process 8 to run queue + CPU 2 stopped +Time slot 23 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3 stopped +Time slot 24 +Time slot 25 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 26 +Time slot 27 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 28 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 +Time slot 32 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 33 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_1K.output b/ossim_source_code/output/os_1_mlq_paging_small_1K.output new file mode 100644 index 0000000..cb2fb07 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_1K.output @@ -0,0 +1,171 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 6 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 3 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 2 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 4 +Time slot 15 + CPU 1: Processed 3 has finished + CPU 1: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 7 +Time slot 16 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 2: Put process 4 to run queue + CPU 2: Dispatched process 2 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 4 + CPU 1: Put process 5 to run queue + CPU 1: Dispatched process 8 + CPU 2: Processed 2 has finished + CPU 2: Dispatched process 6 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 2: Put process 6 to run queue + CPU 2 stopped + CPU 1: Put process 8 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 8 +Time slot 20 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 4 +Time slot 21 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 7 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 6 +Time slot 22 + CPU 3: Processed 4 has finished + CPU 3: Dispatched process 8 +Time slot 23 + CPU 1: Put process 7 to run queue + CPU 1 stopped + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 24 + CPU 3: Put process 8 to run queue + CPU 3 stopped +Time slot 25 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 8 +Time slot 26 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 27 +Time slot 28 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 29 +Time slot 30 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 31 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_mlq_paging_small_4K.output b/ossim_source_code/output/os_1_mlq_paging_small_4K.output new file mode 100644 index 0000000..25afa10 --- /dev/null +++ b/ossim_source_code/output/os_1_mlq_paging_small_4K.output @@ -0,0 +1,172 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/p0s, PID: 1 PRIO: 130 + CPU 1: Dispatched process 1 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 39 +Time slot 3 + CPU 2: Dispatched process 2 + CPU 1: Put process 1 to run queue + CPU 3: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 15 +Time slot 5 + CPU 2: Put process 2 to run queue + CPU 0: Dispatched process 3 + CPU 1: Dispatched process 2 + CPU 3: Put process 1 to run queue +Time slot 6 + CPU 2: Dispatched process 1 + Loaded a process at input/proc/s2, PID: 4 PRIO: 120 +Time slot 7 +write region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 4 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 2 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 120 + CPU 3: Dispatched process 3 +Time slot 8 + CPU 2: Put process 1 to run queue + CPU 2: Dispatched process 5 +Time slot 9 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 1 +read region=1 offset=20 value=100 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 15 + CPU 3: Put process 3 to run queue + CPU 3: Dispatched process 2 +Time slot 10 + CPU 2: Put process 5 to run queue + CPU 2: Dispatched process 3 +write region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 11 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 6 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 38 + CPU 3: Put process 2 to run queue + CPU 3: Dispatched process 5 +Time slot 12 + CPU 2: Put process 3 to run queue + CPU 2: Dispatched process 1 +read region=2 offset=20 value=102 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 +Time slot 13 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 6 +write region=3 offset=20 value=103 +print_pgtbl: 0 - 1024 +00000000: 80000001 +00000004: 80000000 +00000008: 80000003 +00000012: 80000002 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 3 + CPU 3: Put process 5 to run queue + CPU 3: Dispatched process 7 +Time slot 14 + CPU 2: Processed 1 has finished + CPU 2: Dispatched process 2 +Time slot 15 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 4 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 16 + CPU 2: Put process 2 to run queue + CPU 2: Dispatched process 7 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: 80000006 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 1: Put process 4 to run queue + CPU 1: Dispatched process 2 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 4 + CPU 3: Put process 6 to run queue + CPU 3: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000007 +00000004: c0000000 +Time slot 18 + CPU 2: Put process 7 to run queue + CPU 2: Dispatched process 8 + CPU 1: Processed 2 has finished + CPU 1: Dispatched process 6 + CPU 3: Processed 5 has finished + CPU 3: Dispatched process 7 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0 stopped +Time slot 20 + CPU 2: Put process 8 to run queue + CPU 2: Dispatched process 4 + CPU 1: Put process 6 to run queue + CPU 1: Dispatched process 8 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 6 +Time slot 21 +Time slot 22 + CPU 2: Processed 4 has finished + CPU 2: Dispatched process 7 + CPU 1: Put process 8 to run queue + CPU 1 stopped + CPU 3: Processed 6 has finished + CPU 3: Dispatched process 8 +Time slot 23 +Time slot 24 + CPU 2: Put process 7 to run queue + CPU 2 stopped + CPU 3: Put process 8 to run queue + CPU 3: Dispatched process 7 +Time slot 25 +Time slot 26 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 8 +Time slot 27 + CPU 3: Processed 8 has finished + CPU 3: Dispatched process 7 +Time slot 28 +Time slot 29 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 30 +Time slot 31 + CPU 3: Put process 7 to run queue + CPU 3: Dispatched process 7 +Time slot 32 + CPU 3: Processed 7 has finished + CPU 3 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq.output b/ossim_source_code/output/os_1_singleCPU_mlq.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/os_1_singleCPU_mlq_paging.output b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output new file mode 100644 index 0000000..65a13db --- /dev/null +++ b/ossim_source_code/output/os_1_singleCPU_mlq_paging.output @@ -0,0 +1,185 @@ +Time slot 0 +ld_routine +Time slot 1 + Loaded a process at input/proc/s4, PID: 1 PRIO: 4 +Time slot 2 + Loaded a process at input/proc/s3, PID: 2 PRIO: 3 +Time slot 3 + CPU 0: Dispatched process 1 +Time slot 4 + Loaded a process at input/proc/m1s, PID: 3 PRIO: 2 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 + Loaded a process at input/proc/s2, PID: 4 PRIO: 3 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/m0s, PID: 5 PRIO: 3 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 + Loaded a process at input/proc/p1s, PID: 6 PRIO: 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 4 + Loaded a process at input/proc/s0, PID: 7 PRIO: 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 + Loaded a process at input/proc/s1, PID: 8 PRIO: 0 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 +Time slot 21 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 22 +Time slot 23 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 2 +Time slot 24 +Time slot 25 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 28 +Time slot 29 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 30 +Time slot 31 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 32 + CPU 0: Processed 2 has finished + CPU 0: Dispatched process 5 +Time slot 33 +Time slot 34 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 35 +Time slot 36 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 8 +Time slot 37 +Time slot 38 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 39 +Time slot 40 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 3 +Time slot 41 +Time slot 42 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 43 +Time slot 44 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 45 +Time slot 46 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 6 +Time slot 47 +Time slot 48 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +Time slot 49 +Time slot 50 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 1 +Time slot 51 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 8 +Time slot 52 +Time slot 53 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 54 +Time slot 55 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 56 +Time slot 57 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=1 offset=20 value=102 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 58 +write region=2 offset=1000 value=1 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: 80000002 +Time slot 59 + CPU 0: Put process 5 to run queue + CPU 0: Dispatched process 8 +Time slot 60 +Time slot 61 + CPU 0: Put process 8 to run queue + CPU 0: Dispatched process 7 +Time slot 62 +Time slot 63 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 64 +Time slot 65 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 5 +write region=0 offset=0 value=0 +print_pgtbl: 0 - 512 +00000000: 80000003 +00000004: c0000000 +Time slot 66 + CPU 0: Processed 5 has finished + CPU 0: Dispatched process 8 +Time slot 67 + CPU 0: Processed 8 has finished + CPU 0: Dispatched process 7 +Time slot 68 +Time slot 69 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 70 +Time slot 71 + CPU 0: Put process 6 to run queue + CPU 0: Dispatched process 7 +Time slot 72 +Time slot 73 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 6 +Time slot 74 +Time slot 75 + CPU 0: Processed 6 has finished + CPU 0: Dispatched process 7 +Time slot 76 +Time slot 77 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 78 +Time slot 79 + CPU 0: Put process 7 to run queue + CPU 0: Dispatched process 7 +Time slot 80 + CPU 0: Processed 7 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched.output b/ossim_source_code/output/sched.output new file mode 100644 index 0000000..edfe4cf --- /dev/null +++ b/ossim_source_code/output/sched.output @@ -0,0 +1,42 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/p1s, PID: 1 PRIO: 1 + CPU 1: Dispatched process 1 +Time slot 1 + Loaded a process at input/proc/p1s, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/p1s, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Dispatched process 3 +Time slot 4 + CPU 1: Put process 1 to run queue + CPU 1: Dispatched process 2 +Time slot 5 +Time slot 6 +Time slot 7 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 1 +Time slot 8 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 2 +Time slot 9 +Time slot 10 +Time slot 11 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 3 +Time slot 12 + CPU 1: Put process 2 to run queue + CPU 1: Dispatched process 1 +Time slot 13 +Time slot 14 + CPU 1: Processed 1 has finished + CPU 1: Dispatched process 2 +Time slot 15 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 16 + CPU 1: Processed 2 has finished + CPU 1 stopped +Time slot 17 + CPU 0: Processed 3 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_0.output b/ossim_source_code/output/sched_0.output new file mode 100644 index 0000000..0676714 --- /dev/null +++ b/ossim_source_code/output/sched_0.output @@ -0,0 +1,68 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 6 +Time slot 7 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 8 +Time slot 9 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 10 +Time slot 11 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 12 +Time slot 13 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 14 +Time slot 15 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 16 +Time slot 17 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 18 +Time slot 19 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 20 +Time slot 21 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 22 +Time slot 23 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 24 +Time slot 25 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 26 +Time slot 27 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 28 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 29 +Time slot 30 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 31 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/output/sched_1.output b/ossim_source_code/output/sched_1.output new file mode 100644 index 0000000..9c338f7 --- /dev/null +++ b/ossim_source_code/output/sched_1.output @@ -0,0 +1,132 @@ +Time slot 0 +ld_routine + Loaded a process at input/proc/s0, PID: 1 PRIO: 4 +Time slot 1 + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 2 PRIO: 0 +Time slot 2 + Loaded a process at input/proc/s0, PID: 3 PRIO: 0 +Time slot 3 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 1 + Loaded a process at input/proc/s0, PID: 4 PRIO: 0 +Time slot 4 +Time slot 5 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 4 +Time slot 6 +Time slot 7 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 8 +Time slot 9 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 10 +Time slot 11 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 12 +Time slot 13 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 14 +Time slot 15 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 16 +Time slot 17 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 18 +Time slot 19 + CPU 0: Put process 4 to run queue + CPU 0: Dispatched process 4 +Time slot 20 + CPU 0: Processed 4 has finished + CPU 0: Dispatched process 3 +Time slot 21 +Time slot 22 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 23 +Time slot 24 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 25 +Time slot 26 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 27 +Time slot 28 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 29 +Time slot 30 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 31 +Time slot 32 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 33 +Time slot 34 + CPU 0: Put process 3 to run queue + CPU 0: Dispatched process 3 +Time slot 35 + CPU 0: Processed 3 has finished + CPU 0: Dispatched process 2 +Time slot 36 +Time slot 37 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 38 +Time slot 39 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 40 +Time slot 41 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 42 +Time slot 43 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 44 +Time slot 45 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 46 +Time slot 47 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 48 +Time slot 49 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 50 +Time slot 51 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 52 +Time slot 53 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 54 +Time slot 55 + CPU 0: Put process 1 to run queue + CPU 0: Dispatched process 2 +Time slot 56 +Time slot 57 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 1 +Time slot 58 + CPU 0: Processed 1 has finished + CPU 0: Dispatched process 2 +Time slot 59 +Time slot 60 + CPU 0: Put process 2 to run queue + CPU 0: Dispatched process 2 +Time slot 61 + CPU 0: Processed 2 has finished + CPU 0 stopped diff --git a/ossim_source_code/src/cpu.c b/ossim_source_code/src/cpu.c new file mode 100644 index 0000000..b8deb25 --- /dev/null +++ b/ossim_source_code/src/cpu.c @@ -0,0 +1,102 @@ + +#include "cpu.h" +#include "mem.h" +#include "mm.h" + +int calc(struct pcb_t * proc) { + return ((unsigned long)proc & 0UL); +} + +int alloc(struct pcb_t * proc, uint32_t size, uint32_t reg_index) { + addr_t addr = alloc_mem(size, proc); + if (addr == 0) { + return 1; + }else{ + proc->regs[reg_index] = addr; + return 0; + } +} + +int free_data(struct pcb_t * proc, uint32_t reg_index) { + return free_mem(proc->regs[reg_index], proc); +} + +int read( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) { // Index of destination register + + BYTE data; + if (read_mem(proc->regs[source] + offset, proc, &data)) { + proc->regs[destination] = data; + return 0; + }else{ + return 1; + } +} + +int write( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) { // Destination address = + // [destination] + [offset] + return write_mem(proc->regs[destination] + offset, proc, data); +} + +int run(struct pcb_t * proc) { + /* Check if Program Counter point to the proper instruction */ + if (proc->pc >= proc->code->size) { + return 1; + } + + struct inst_t ins = proc->code->text[proc->pc]; + proc->pc++; + int stat = 1; + switch (ins.opcode) { + case CALC: + stat = calc(proc); + break; + case ALLOC: +#ifdef MM_PAGING + stat = pgalloc(proc, ins.arg_0, ins.arg_1); + +#else + stat = alloc(proc, ins.arg_0, ins.arg_1); +#endif + break; +#ifdef MM_PAGING + case MALLOC: + stat = pgmalloc(proc, ins.arg_0, ins.arg_1); + break; +#endif + case FREE: +#ifdef MM_PAGING + stat = pgfree_data(proc, ins.arg_0); +#else + stat = free_data(proc, ins.arg_0); +#endif + break; + case READ: +#ifdef MM_PAGING + stat = pgread(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = read(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + case WRITE: +#ifdef MM_PAGING + stat = pgwrite(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#else + stat = write(proc, ins.arg_0, ins.arg_1, ins.arg_2); +#endif + break; + default: + stat = 1; + } + return stat; + +} + + diff --git a/ossim_source_code/src/loader.c b/ossim_source_code/src/loader.c new file mode 100644 index 0000000..5f8e56a --- /dev/null +++ b/ossim_source_code/src/loader.c @@ -0,0 +1,108 @@ + +#include "loader.h" +#include +#include +#include + +static uint32_t avail_pid = 1; + +#define OPT_CALC "calc" +#define OPT_ALLOC "alloc" +#define OPT_FREE "free" +#define OPT_READ "read" +#define OPT_WRITE "write" +#ifdef MM_PAGING +#define OPT_MALLOC "malloc" +#endif + +static enum ins_opcode_t get_opcode(char * opt) { + if (!strcmp(opt, OPT_CALC)) { + return CALC; + }else if (!strcmp(opt, OPT_ALLOC)) { + return ALLOC; +#ifdef MM_PAGING + }else if (!strcmp(opt, OPT_MALLOC)) { + return MALLOC; +#endif + }else if (!strcmp(opt, OPT_FREE)) { + return FREE; + }else if (!strcmp(opt, OPT_READ)) { + return READ; + }else if (!strcmp(opt, OPT_WRITE)) { + return WRITE; + }else{ + printf("Opcode: %s\n", opt); + exit(1); + } +} + +struct pcb_t * load(const char * path) { + /* Create new PCB for the new process */ + struct pcb_t * proc = (struct pcb_t * )malloc(sizeof(struct pcb_t)); + proc->pid = avail_pid; + avail_pid++; + proc->page_table = + (struct page_table_t*)malloc(sizeof(struct page_table_t)); + proc->bp = PAGE_SIZE; + proc->pc = 0; + + /* Read process code from file */ + FILE * file; + // printf(path); + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find process description at '%s'\n", path); + exit(1); + } + char opcode[10]; + proc->code = (struct code_seg_t*)malloc(sizeof(struct code_seg_t)); + fscanf(file, "%u %u", &proc->priority, &proc->code->size); + proc->code->text = (struct inst_t*)malloc( + sizeof(struct inst_t) * proc->code->size + ); + uint32_t i = 0; + for (i = 0; i < proc->code->size; i++) { + fscanf(file, "%s", opcode); + proc->code->text[i].opcode = get_opcode(opcode); + switch(proc->code->text[i].opcode) { + case CALC: + break; + case ALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); + break; +#ifdef MM_PAGING + case MALLOC: + fscanf( + file, + "%u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1 + ); +#endif + case FREE: + fscanf(file, "%u\n", &proc->code->text[i].arg_0); + break; + case READ: + case WRITE: + fscanf( + file, + "%u %u %u\n", + &proc->code->text[i].arg_0, + &proc->code->text[i].arg_1, + &proc->code->text[i].arg_2 + ); + break; + default: + printf("Opcode: %s\n", opcode); + exit(1); + } + } + return proc; +} + + + diff --git a/ossim_source_code/src/mem.c b/ossim_source_code/src/mem.c new file mode 100644 index 0000000..187108f --- /dev/null +++ b/ossim_source_code/src/mem.c @@ -0,0 +1,173 @@ + +#include "mem.h" +#include "stdlib.h" +#include "string.h" +#include +#include + +static BYTE _ram[RAM_SIZE]; + +static struct { + uint32_t proc; // ID of process currently uses this page + int index; // Index of the page in the list of pages allocated + // to the process. + int next; // The next page in the list. -1 if it is the last + // page. +} _mem_stat [NUM_PAGES]; + +static pthread_mutex_t mem_lock; + +void init_mem(void) { + memset(_mem_stat, 0, sizeof(*_mem_stat) * NUM_PAGES); + memset(_ram, 0, sizeof(BYTE) * RAM_SIZE); + pthread_mutex_init(&mem_lock, NULL); +} + +/* get offset of the virtual address */ +static addr_t get_offset(addr_t addr) { + return addr & ~((~0U) << OFFSET_LEN); +} + +/* get the first layer index */ +static addr_t get_first_lv(addr_t addr) { + return addr >> (OFFSET_LEN + PAGE_LEN); +} + +/* get the second layer index */ +static addr_t get_second_lv(addr_t addr) { + return (addr >> OFFSET_LEN) - (get_first_lv(addr) << PAGE_LEN); +} + +/* Search for page table table from the a segment table */ +static struct trans_table_t * get_trans_table( + addr_t index, // Segment level index + struct page_table_t * page_table) { // first level table + + /* DO NOTHING HERE. This mem is obsoleted */ + + int i; + for (i = 0; i < page_table->size; i++) { + // Enter your code here + } + return NULL; + +} + +/* Translate virtual address to physical address. If [virtual_addr] is valid, + * return 1 and write its physical counterpart to [physical_addr]. + * Otherwise, return 0 */ +static int translate( + addr_t virtual_addr, // Given virtual address + addr_t * physical_addr, // Physical address to be returned + struct pcb_t * proc) { // Process uses given virtual address + + /* Offset of the virtual address */ + addr_t offset = get_offset(virtual_addr); + offset++; offset--; + /* The first layer index */ + addr_t first_lv = get_first_lv(virtual_addr); + /* The second layer index */ + addr_t second_lv = get_second_lv(virtual_addr); + + /* Search in the first level */ + struct trans_table_t * trans_table = NULL; + trans_table = get_trans_table(first_lv, proc->page_table); + if (trans_table == NULL) { + return 0; + } + + int i; + for (i = 0; i < trans_table->size; i++) { + if (trans_table->table[i].v_index == second_lv) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 1; + } + } + return 0; +} + +addr_t alloc_mem(uint32_t size, struct pcb_t * proc) { + pthread_mutex_lock(&mem_lock); + addr_t ret_mem = 0; + /* DO NOTHING HERE. This mem is obsoleted */ + + uint32_t num_pages = (size % PAGE_SIZE) ? size / PAGE_SIZE : + size / PAGE_SIZE + 1; // Number of pages we will use + int mem_avail = 0; // We could allocate new memory region or not? + + /* First we must check if the amount of free memory in + * virtual address space and physical address space is + * large enough to represent the amount of required + * memory. If so, set 1 to [mem_avail]. + * Hint: check [proc] bit in each page of _mem_stat + * to know whether this page has been used by a process. + * For virtual memory space, check bp (break pointer). + * */ + + if (mem_avail) { + /* We could allocate new memory region to the process */ + ret_mem = proc->bp; + proc->bp += num_pages * PAGE_SIZE; + /* Update status of physical pages which will be allocated + * to [proc] in _mem_stat. Tasks to do: + * - Update [proc], [index], and [next] field + * - Add entries to segment table page tables of [proc] + * to ensure accesses to allocated memory slot is + * valid. */ + } + pthread_mutex_unlock(&mem_lock); + return ret_mem; +} + +int free_mem(addr_t address, struct pcb_t * proc) { + /* DO NOTHING HERE. This mem is obsoleted */ + return 0; +} + +int read_mem(addr_t address, struct pcb_t * proc, BYTE * data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + *data = _ram[physical_addr]; + return 0; + }else{ + return 1; + } +} + +int write_mem(addr_t address, struct pcb_t * proc, BYTE data) { + addr_t physical_addr; + if (translate(address, &physical_addr, proc)) { + _ram[physical_addr] = data; + return 0; + }else{ + return 1; + } +} + +void dump(void) { + int i; + for (i = 0; i < NUM_PAGES; i++) { + if (_mem_stat[i].proc != 0) { + printf("%03d: ", i); + printf("%05x-%05x - PID: %02d (idx %03d, nxt: %03d)\n", + i << OFFSET_LEN, + ((i + 1) << OFFSET_LEN) - 1, + _mem_stat[i].proc, + _mem_stat[i].index, + _mem_stat[i].next + ); + int j; + for ( j = i << OFFSET_LEN; + j < ((i+1) << OFFSET_LEN) - 1; + j++) { + + if (_ram[j] != 0) { + printf("\t%05x: %02x\n", j, _ram[j]); + } + + } + } + } +} + + diff --git a/ossim_source_code/src/mm-memphy.c b/ossim_source_code/src/mm-memphy.c new file mode 100644 index 0000000..880a858 --- /dev/null +++ b/ossim_source_code/src/mm-memphy.c @@ -0,0 +1,199 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory physical module mm/mm-memphy.c + */ + +#include "mm.h" +#include + +/* + * MEMPHY_mv_csr - move MEMPHY cursor + * @mp: memphy struct + * @offset: offset + */ +int MEMPHY_mv_csr(struct memphy_struct *mp, int offset) +{ + int numstep = 0; + + mp->cursor = 0; + while(numstep < offset && numstep < mp->maxsz){ + /* Traverse sequentially */ + mp->cursor = (mp->cursor + 1) % mp->maxsz; + numstep++; + } + + return 0; +} + +/* + * MEMPHY_seq_read - read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_seq_read(struct memphy_struct *mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + *value = (BYTE) mp->storage[addr]; + + return 0; +} + +/* + * MEMPHY_read read MEMPHY device + * @mp: memphy struct + * @addr: address + * @value: obtained value + */ +int MEMPHY_read(struct memphy_struct * mp, int addr, BYTE *value) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + *value = mp->storage[addr]; + else /* Sequential access device */ + return MEMPHY_seq_read(mp, addr, value); + + return 0; +} + +/* + * MEMPHY_seq_write - write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_seq_write(struct memphy_struct * mp, int addr, BYTE value) +{ + + if (mp == NULL) + return -1; + + if (!mp->rdmflg) + return -1; /* Not compatible mode for sequential read */ + + MEMPHY_mv_csr(mp, addr); + mp->storage[addr] = value; + + return 0; +} + +/* + * MEMPHY_write-write MEMPHY device + * @mp: memphy struct + * @addr: address + * @data: written data + */ +int MEMPHY_write(struct memphy_struct * mp, int addr, BYTE data) +{ + if (mp == NULL) + return -1; + + if (mp->rdmflg) + mp->storage[addr] = data; + else /* Sequential access device */ + return MEMPHY_seq_write(mp, addr, data); + + return 0; +} + +/* + * MEMPHY_format-format MEMPHY device + * @mp: memphy struct + */ +int MEMPHY_format(struct memphy_struct *mp, int pagesz) +{ + /* This setting come with fixed constant PAGESZ */ + int numfp = mp->maxsz / pagesz; + struct framephy_struct *newfst, *fst; + int iter = 0; + + if (numfp <= 0) + return -1; + + /* Init head of free framephy list */ + fst = malloc(sizeof(struct framephy_struct)); + fst->fpn = iter; + mp->free_fp_list = fst; + + /* We have list with first element, fill in the rest num-1 element member*/ + for (iter = 1; iter < numfp ; iter++) + { + newfst = malloc(sizeof(struct framephy_struct)); + newfst->fpn = iter; + newfst->fp_next = NULL; + fst->fp_next = newfst; + fst = newfst; + } + + return 0; +} + +int MEMPHY_get_freefp(struct memphy_struct *mp, int *retfpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + + if (fp == NULL) + return -1; + + *retfpn = fp->fpn; + mp->free_fp_list = fp->fp_next; + + /* MEMPHY is iteratively used up until its exhausted + * No garbage collector acting then it not been released + */ + free(fp); + + return 0; +} + +int MEMPHY_dump(struct memphy_struct * mp) +{ + /*TODO dump memphy contnt mp->storage + * for tracing the memory content + */ + + return 0; +} + +int MEMPHY_put_freefp(struct memphy_struct *mp, int fpn) +{ + struct framephy_struct *fp = mp->free_fp_list; + struct framephy_struct *newnode = malloc(sizeof(struct framephy_struct)); + + /* Create new node with value fpn */ + newnode->fpn = fpn; + newnode->fp_next = fp; + mp->free_fp_list = newnode; + + return 0; +} + + +/* + * Init MEMPHY struct + */ +int init_memphy(struct memphy_struct *mp, int max_size, int randomflg) +{ + mp->storage = (BYTE *)malloc(max_size*sizeof(BYTE)); + mp->maxsz = max_size; + + MEMPHY_format(mp,PAGING_PAGESZ); + + mp->rdmflg = (randomflg != 0)?1:0; + + if (!mp->rdmflg ) /* Not Ramdom acess device, then it serial device*/ + mp->cursor = 0; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm-vm.c b/ossim_source_code/src/mm-vm.c new file mode 100644 index 0000000..c262322 --- /dev/null +++ b/ossim_source_code/src/mm-vm.c @@ -0,0 +1,649 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Virtual memory module mm/mm-vm.c + */ + +#include "string.h" +#include "mm.h" +#include +#include + +/*enlist_vm_freerg_list - add new rg to freerg_list + *@mm: memory region + *@rg_elmt: new region + * + */ +int enlist_vm_freerg_list(struct mm_struct *mm, struct vm_rg_struct rg_elmt) +{ + struct vm_rg_struct *new_node; + struct vm_rg_struct *head = mm->mmap->vm_freerg_list; + + // Check for invalid region + if (rg_elmt.rg_start >= rg_elmt.rg_end) + return -1; + + // Dynamically allocate memory for the new region + new_node = (struct vm_rg_struct *)malloc(sizeof(struct vm_rg_struct)); + if (!new_node) + return -1; // Allocation failed + + // Copy the data into the new node + *new_node = rg_elmt; + new_node->rg_next = head; + + // Update the list head + mm->mmap->vm_freerg_list = new_node; + + return 0; +} + + +/*get_vma_by_num - get vm area by numID + *@mm: memory region + *@vmaid: ID vm area to alloc memory region + * + */ +//get địa chỉ ô vma +struct vm_area_struct *get_vma_by_num(struct mm_struct *mm, int vmaid) +{ + struct vm_area_struct *pvma= mm->mmap; + + if(mm->mmap == NULL) + return NULL; + + int vmait = 0; + + while (vmait < vmaid) + { + if(pvma == NULL) + return NULL; + + vmait++; + pvma = pvma->vm_next; + } + + return pvma; +} + +/*get_symrg_byid - get mem region by region ID + *@mm: memory region + *@rgid: region ID act as symbol index of variable + * + */ +struct vm_rg_struct *get_symrg_byid(struct mm_struct *mm, int rgid) +{ + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return NULL; + + return &mm->symrgtbl[rgid]; +} + +/*__alloc - allocate a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + *@alloc_addr: address of allocated memory region + * + */ +int __alloc(struct pcb_t *caller, int vmaid, int rgid, int size, int *alloc_addr) +{ + /*Allocate at the toproof */ + struct vm_rg_struct rgnode; + + /* TODO: commit the vmaid */ + rgnode.vmaid = vmaid; + + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == 0) + { + //symrgtbl là vm_rg_struct + caller->mm->symrgtbl[rgid].rg_start = rgnode.rg_start; + caller->mm->symrgtbl[rgid].rg_end = rgnode.rg_end; + + caller->mm->symrgtbl[rgid].vmaid = rgnode.vmaid; + + *alloc_addr = rgnode.rg_start; + + return 0; + } + + /* TODO: get_free_vmrg_area FAILED handle the region management (Fig.6)*/ + if (get_free_vmrg_area(caller, vmaid, size, &rgnode) == -1 ){return -1;} + /* TODO retrive current vma if needed, current comment out due to compiler redundant warning*/ + /*Attempt to increate limit to get space */ + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + int inc_sz = PAGING_PAGE_ALIGNSZ(size); + int inc_limit_ret; + + /* TODO retrive old_sbrk if needed, current comment out due to compiler redundant warning*/ + int old_sbrk = cur_vma->sbrk; + + /* TODO INCREASE THE LIMIT + * inc_vma_limit(caller, vmaid, inc_sz) + */ + if (inc_vma_limit(caller, vmaid, inc_sz, &inc_limit_ret) < 0) return -1; + + cur_vma->sbrk += inc_sz; + /* TODO: commit the limit increment */ + if ( old_sbrk + size > cur_vma -> vm_end ) + { + if ( inc_vma_limit ( caller , vmaid , inc_sz, &inc_limit_ret ) < 0) + { + struct framephy_struct * frm_lst = NULL ; + struct vm_rg_struct * ret_rg = malloc ( sizeof ( struct vm_rg_struct ) ); + int pages = ( inc_sz / PAGING_PAGESZ ); + ret_rg -> rg_start = ret_rg -> rg_end = old_sbrk ; + ret_rg -> rg_next = NULL ; + alloc_pages_range ( caller , pages , & frm_lst ); + vmap_page_range ( caller , old_sbrk , pages , frm_lst , ret_rg ); + caller ->mm -> symrgtbl [ rgid ]. rg_start = ret_rg -> rg_start ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = ret_rg -> rg_end ; + cur_vma -> sbrk += ret_rg -> rg_end - ret_rg -> rg_start ; + return 0; + } + } + + /* Successful increase limit */ + caller ->mm -> symrgtbl [ rgid ]. rg_start = old_sbrk ; + caller ->mm -> symrgtbl [ rgid ]. rg_end = old_sbrk + size ; + /* TODO: commit the allocation address + // *alloc_addr = ... + */ + *alloc_addr = rgnode.rg_start; + + return 0; +} + +/*__free - remove a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __free(struct pcb_t *caller, int rgid) +{ + struct vm_rg_struct rgnode; + + // Dummy initialization for avoding compiler dummay warning + // in incompleted TODO code rgnode will overwrite through implementing + // the manipulation of rgid later + rgnode.vmaid = 0; //dummy initialization + rgnode.vmaid = 1; //dummy initialization + + if(rgid < 0 || rgid > PAGING_MAX_SYMTBL_SZ) + return -1; + + /* TODO: Manage the collect freed region to freerg_list */ + struct vm_rg_struct *sym_rg = &caller->mm->symrgtbl[rgid]; + rgnode.rg_start = sym_rg->rg_start; + rgnode.rg_end = sym_rg->rg_end; + rgnode.vmaid = sym_rg->vmaid; + + /*enlist the obsoleted memory region */ + enlist_vm_freerg_list(caller->mm, rgnode); + + return 0; +} + +/*pgalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ +int pgalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 0 */ + return __alloc(proc, 0, reg_index, size, &addr); +} + +/*pgmalloc - PAGING-based allocate a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify vaiable in symbole table) + */ +int pgmalloc(struct pcb_t *proc, uint32_t size, uint32_t reg_index) +{ + int addr; + + /* By default using vmaid = 1 */ + return __alloc(proc, 1, reg_index, size, &addr); +} + +/*pgfree - PAGING-based free a region memory + *@proc: Process executing the instruction + *@size: allocated size + *@reg_index: memory region ID (used to identify variable in symbole table) + */ + +int pgfree_data(struct pcb_t *proc, uint32_t reg_index) +{ + return __free(proc, reg_index); +} + +/*pg_getpage - get the page in ram + *@mm: memory region + *@pagenum: PGN + *@framenum: return FPN + *@caller: caller + * + */ +int pg_getpage(struct mm_struct *mm, int pgn, int *fpn, struct pcb_t *caller) +{ + uint32_t pte = mm->pgd[pgn]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + // Page không tồn tại, cần đưa vào bộ nhớ + int vicpgn, swpfpn, vicfpn; + uint32_t vicpte; + + int tgtfpn = PAGING_PTE_SWP(pte); // Frame mục tiêu trong swap + + // Tìm victim page + if (find_victim_page(caller->mm, &vicpgn) < 0) + return -1; + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + // Lấy free frame từ MEMSWP + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) < 0) + { + struct memphy_struct **mswpit = caller->mswp; + for (int i = 0; i < PAGING_MAX_MMSWP; i++) + { + struct memphy_struct *tmp_swp = mswpit[i]; + if (MEMPHY_get_freefp(tmp_swp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, tmp_swp, swpfpn); + caller->active_mswp = tmp_swp; + break; + } + } + } + else + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + } + + // Swap frame từ MEMRAM sang MEMSWP và ngược lại + __swap_cp_page(caller->active_mswp, tgtfpn, caller->mram, vicfpn); + + // Cập nhật page table + MEMPHY_put_freefp(caller->active_mswp, tgtfpn); + // swptype = 1 + pte_set_swap(&caller->mm->pgd[vicpgn], 1, swpfpn); + + // Đánh dấu trạng thái online của page mục tiêu + pte_set_fpn(&caller->mm->pgd[pgn], vicfpn); + pte = caller->mm->pgd[pgn]; + + + + *fpn = PAGING_OFFST(pte); + return 0; +} +} + + /* Do swap frame from MEMRAM to MEMSWP and vice versa*/ + /* Copy victim frame to swap */ + //__swap_cp_page(); + /* Copy target frame from swap to mem */ + //__swap_cp_page(); + + /* Update page table */ + //pte_set_swap() &mm->pgd; + + /* Update its online status of the target page */ + //pte_set_fpn() & mm->pgd[pgn]; + // pte_set_fpn(&pte, tgtfpn); + + // enlist_pgn_node(&caller->mm->fifo_pgn,pgn); + // } + + // *fpn = PAGING_PTE_FPN(pte); + + // return 0; + + +/*pg_getval - read value at given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_getval(struct mm_struct *mm, int addr, BYTE *data, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_read(caller->mram,phyaddr, data); + + return 0; +} + +/*pg_setval - write value to given offset + *@mm: memory region + *@addr: virtual address to acess + *@value: value + * + */ +int pg_setval(struct mm_struct *mm, int addr, BYTE value, struct pcb_t *caller) +{ + int pgn = PAGING_PGN(addr); + int off = PAGING_OFFST(addr); + int fpn; + + /* Get the page to MEMRAM, swap from MEMSWAP if needed */ + if(pg_getpage(mm, pgn, &fpn, caller) != 0) + return -1; /* invalid page access */ + + int phyaddr = (fpn << PAGING_ADDR_FPN_LOBIT) + off; + + MEMPHY_write(caller->mram,phyaddr, value); + + return 0; +} + +/*__read - read value in region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __read(struct pcb_t *caller, int rgid, int offset, BYTE *data) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_getval(caller->mm, currg->rg_start + offset, data, caller); + + return 0; +} + + +/*pgwrite - PAGING-based read a region memory */ +int pgread( + struct pcb_t * proc, // Process executing the instruction + uint32_t source, // Index of source register + uint32_t offset, // Source address = [source] + [offset] + uint32_t destination) +{ + BYTE data; + int val = __read(proc, source, offset, &data); + + destination = (uint32_t) data; +#ifdef IODUMP + printf("read region=%d offset=%d value=%d\n", source, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return val; +} + +/*__write - write a region memory + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@offset: offset to acess in memory region + *@rgid: memory region ID (used to identify variable in symbole table) + *@size: allocated size + * + */ +int __write(struct pcb_t *caller, int rgid, int offset, BYTE value) +{ + struct vm_rg_struct *currg = get_symrg_byid(caller->mm, rgid); + int vmaid = currg->vmaid; + + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + if(currg == NULL || cur_vma == NULL) /* Invalid memory identify */ + return -1; + + pg_setval(caller->mm, currg->rg_start + offset, value, caller); + + return 0; +} + +/*pgwrite - PAGING-based write a region memory */ +int pgwrite( + struct pcb_t * proc, // Process executing the instruction + BYTE data, // Data to be wrttien into memory + uint32_t destination, // Index of destination register + uint32_t offset) +{ +#ifdef IODUMP + printf("write region=%d offset=%d value=%d\n", destination, offset, data); +#ifdef PAGETBL_DUMP + print_pgtbl(proc, 0, -1); //print max TBL +#endif + MEMPHY_dump(proc->mram); +#endif + + return __write(proc, destination, offset, data); +} + + +/*free_pcb_memphy - collect all memphy of pcb + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + */ +int free_pcb_memph(struct pcb_t *caller) +{ + int pagenum, fpn; + uint32_t pte; + + + for(pagenum = 0; pagenum < PAGING_MAX_PGN; pagenum++) + { + pte= caller->mm->pgd[pagenum]; + + if (!PAGING_PTE_PAGE_PRESENT(pte)) + { + fpn = PAGING_PTE_FPN(pte); + MEMPHY_put_freefp(caller->mram, fpn); + } else { + fpn = PAGING_PTE_SWP(pte); + MEMPHY_put_freefp(caller->active_mswp, fpn); + } + } + + return 0; +} + +/*get_vm_area_node - get vm area for a number of pages + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@incpgnum: number of page + *@vmastart: vma end + *@vmaend: vma end + * + */ +struct vm_rg_struct* get_vm_area_node_at_brk(struct pcb_t *caller, int vmaid, int size, int alignedsz) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct));; + /* TODO retrive current vma to obtain newrg, current comment out due to compiler redundant warning*/ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + /* TODO: update the newrg boundary + // newrg->rg_start = ... + // newrg->rg_end = ... + */ + + newrg->rg_start = cur_vma -> sbrk; + + if ( (cur_vma ->sbrk + alignedsz) > cur_vma -> vm_end ) return newrg = cur_vma -> sbrk; +cur_vma ->sbrk = cur_vma->sbrk + alignedsz; + + newrg->rg_end = cur_vma -> sbrk; + +return newrg; +} + +/*validate_overlap_vm_area + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@vmastart: vma end + *@vmaend: vma end + * + */ +int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int vmastart, int vmaend) +{ + struct vm_area_struct *vma = caller->mm->mmap; + + /* TODO validate the planned memory area is not overlapped */ + while(vma != NULL) + { + + if ((vmastart >= vma->vm_start && vmastart < vma->vm_end) || (vmastart <= vma->vm_start && vmaend >= vma->vm_end)) + { + return -1; + } + vma = vma->vm_next; + } + return 0; +} + +/*inc_vma_limit - increase vm area limits to reserve space for new variable + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@inc_sz: increment size + *@inc_limit_ret: increment limit return + * + */ +int inc_vma_limit(struct pcb_t *caller, int vmaid, int inc_sz, int* inc_limit_ret) +{ + struct vm_rg_struct * newrg = malloc(sizeof(struct vm_rg_struct)); + int inc_amt = PAGING_PAGE_ALIGNSZ(inc_sz); + int incnumpage = inc_amt / PAGING_PAGESZ; + struct vm_rg_struct *area = get_vm_area_node_at_brk(caller, vmaid, inc_sz, inc_amt); + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + int old_end = cur_vma->vm_end; + + /*Validate overlap of obtained region */ + if (validate_overlap_vm_area(caller, vmaid, area->rg_start, area->rg_end) < 0) + return -1; /*Overlap and failed allocation */ + + /* TODO: Obtain the new vm area based on vmaid */ + cur_vma->sbrk = area -> rg_start; + + + if (vm_map_ram(caller, area->rg_start, area->rg_end, + old_end, incnumpage , newrg) < 0) + return -1; /* Map the memory to MEMRAM */ + inc_limit_ret = cur_vma->vm_end + inc_sz; + return 0; + +} + +/*find_victim_page - find victim page + *@caller: caller + *@pgn: return page number + * + */ +int find_victim_page(struct mm_struct *mm, int *retpgn) +{ + struct pgn_t *pg = mm->fifo_pgn; + + /* TODO: Implement the theorical mechanism to find the victim page */ + if (pg == NULL) return -1; + + *retpgn = pg->pgn; + + mm->fifo_pgn = pg->pg_next; + + free(pg); + + return 0; +} + +/*get_free_vmrg_area - get a free vm region + *@caller: caller + *@vmaid: ID vm area to alloc memory region + *@size: allocated size + * + */ +int get_free_vmrg_area(struct pcb_t *caller, int vmaid, int size, struct vm_rg_struct *newrg) +{ + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, vmaid); + + struct vm_rg_struct *rgit = cur_vma->vm_freerg_list; + + if (rgit == NULL) + return -1; + + /* Probe unintialized newrg */ + newrg->rg_start = newrg->rg_end = -1; + + /* Traverse on list of free vm region to find a fit space */ + //check điều kiện bịp + while (rgit != NULL && rgit->vmaid == vmaid) + { + if (rgit->rg_start + size <= rgit->rg_end) + { /* Current region has enough space */ + newrg->rg_start = rgit->rg_start; + newrg->rg_end = rgit->rg_start + size; + + /* Update left space in chosen region */ + if (rgit->rg_start + size < rgit->rg_end) + { + rgit->rg_start = rgit->rg_start + size; + } + else + { /*Use up all space, remove current node */ + /*Clone next rg node */ + struct vm_rg_struct *nextrg = rgit->rg_next; + + /*Cloning */ + if (nextrg != NULL) + { + rgit->rg_start = nextrg->rg_start; + rgit->rg_end = nextrg->rg_end; + + rgit->rg_next = nextrg->rg_next; + + free(nextrg); + } + else + { /*End of free list */ + rgit->rg_start = rgit->rg_end; //dummy, size 0 region + rgit->rg_next = NULL; + } + } + } + else + { + rgit = rgit->rg_next; // Traverse next rg + } + } + + if(newrg->rg_start == -1) // new region not found + return -1; + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/mm.c b/ossim_source_code/src/mm.c new file mode 100644 index 0000000..5071151 --- /dev/null +++ b/ossim_source_code/src/mm.c @@ -0,0 +1,458 @@ +//#ifdef MM_PAGING +/* + * PAGING based Memory Management + * Memory management unit mm/mm.c + */ + +#include "mm.h" +#include +#include + +/* + * init_pte - Initialize PTE entry + */ +int init_pte(uint32_t *pte, + int pre, // present + int fpn, // FPN + int drt, // dirty + int swp, // swap + int swptyp, // swap type + int swpoff) //swap offset +{ + if (pre != 0) { + if (swp == 0) { // Non swap ~ page online + if (fpn == 0) + return -1; // Invalid setting + + /* Valid setting with FPN */ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + } else { // page swapped + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + CLRBIT(*pte, PAGING_PTE_DIRTY_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + } + } + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for swapped page + * @pte : target page table entry (PTE) + * @swptyp : swap type + * @swpoff : swap offset + */ +int pte_set_swap(uint32_t *pte, int swptyp, int swpoff) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + SETBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, swptyp, PAGING_PTE_SWPTYP_MASK, PAGING_PTE_SWPTYP_LOBIT); + SETVAL(*pte, swpoff, PAGING_PTE_SWPOFF_MASK, PAGING_PTE_SWPOFF_LOBIT); + + return 0; +} + +/* + * pte_set_swap - Set PTE entry for on-line page + * @pte : target page table entry (PTE) + * @fpn : frame page number (FPN) + */ +int pte_set_fpn(uint32_t *pte, int fpn) +{ + SETBIT(*pte, PAGING_PTE_PRESENT_MASK); + CLRBIT(*pte, PAGING_PTE_SWAPPED_MASK); + + SETVAL(*pte, fpn, PAGING_PTE_FPN_MASK, PAGING_PTE_FPN_LOBIT); + + return 0; +} + + +/* + * vmap_page_range - map a range of page at aligned address + */ +int vmap_page_range(struct pcb_t *caller, // process call + int addr, // start address which is aligned to pagesz + int pgnum, // num of mapping page + struct framephy_struct *frames,// list of the mapped frames + struct vm_rg_struct *ret_rg)// return mapped region, the real mapped fp +{ // no guarantee all given pages are mapped + //uint32_t * pte = malloc(sizeof(uint32_t)); + struct framephy_struct *fpit = malloc(sizeof(struct framephy_struct)); + //int fpn; + int pgit = 0; + int pgn = PAGING_PGN(addr); + + /* TODO: update the rg_end and rg_start of ret_rg + //ret_rg->rg_end = .... + //ret_rg->rg_start = ... + //ret_rg->vmaid = ... + */ + ret_rg -> rg_end = ret_rg -> rg_start = addr ; + + fpit->fp_next = frames; + + /* TODO map range of frame to address space + * in page table pgd in caller->mm + */ + + /* Tracking for later page replacement activities (if needed) + * Enqueue new usage page */ + while ( pgit < pgnum ) + { + if ( fpit == NULL ) + { + break ; + } + pgn = PAGING_PGN ( addr + pgnum * PAGING_PAGESZ ); + pte_set_fpn (&( caller ->mm -> pgd [ pgn ]) , fpit -> fpn ) ; + enlist_pgn_node (& caller -> mm -> fifo_pgn , pgn + pgit ) ; + fpit = fpit -> fp_next ; + } + ret_rg -> rg_end += pgit * PAGING_PAGESZ ; + return 0; + +} + +/* + * alloc_pages_range - allocate req_pgnum of frame in ram + * @caller : caller + * @req_pgnum : request page num + * @frm_lst : frame list + */ + +int alloc_pages_range(struct pcb_t *caller, int req_pgnum, struct framephy_struct** frm_lst) +{ + int pgit, fpn; + struct framephy_struct *newfp_str; + + for (pgit = 0; pgit < req_pgnum; pgit++) + { + if (MEMPHY_get_freefp(caller->mram, &fpn) == 0) + { + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = fpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + struct framephy_struct *temp = malloc(sizeof(struct framephy_struct)); + *temp = *newfp_str; + temp->fp_next = caller->mram->used_fp_list; + caller->mram->used_fp_list = temp; + } + else + { + // ERROR CODE of obtaining some but not enough frames + int vicfpn, vicpgn, swpfpn; + uint32_t vicpte; + + if (find_victim_page(caller->mm, &vicpgn) < 0) + { + return -1; + } + + vicpte = caller->mm->pgd[vicpgn]; + vicfpn = PAGING_OFFST(vicpte); + + newfp_str = malloc(sizeof(struct framephy_struct)); + newfp_str->fpn = vicfpn; + newfp_str->owner = caller->mm; + newfp_str->fp_next = NULL; + + if (!*frm_lst) + { + *frm_lst = newfp_str; + } + else + { + newfp_str->fp_next = *frm_lst; + *frm_lst = newfp_str; + } + + int i; + if (MEMPHY_get_freefp(caller->active_mswp, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, caller->active_mswp, swpfpn); + struct memphy_struct *mswp = *caller->mswp; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (mswp + i == caller->active_mswp) break; + } + } + else + { + struct memphy_struct *mswp = *caller->mswp; + swpfpn = -1; + for (i = 0; i < PAGING_MAX_MMSWP; i++) + { + if (MEMPHY_get_freefp(mswp + i, &swpfpn) == 0) + { + __swap_cp_page(caller->mram, vicfpn, mswp + i, swpfpn); + break; + } + } + } + + if (swpfpn == -1) + return -3000; + + pte_set_swap(&caller->mm->pgd[vicpgn], i, swpfpn); + } + } + + return 0; +} + + + +/* + * vm_map_ram - do the mapping all vm are to ram storage device + * @caller : caller + * @astart : vm area start + * @aend : vm area end + * @mapstart : start mapping point + * @incpgnum : number of mapped page + * @ret_rg : returned region + */ +int vm_map_ram(struct pcb_t *caller, int astart, int aend, int mapstart, int incpgnum, struct vm_rg_struct *ret_rg) +{ + struct framephy_struct *frm_lst = NULL; + int ret_alloc; + + /*@bksysnet: author provides a feasible solution of getting frames + *FATAL logic in here, wrong behaviour if we have not enough page + *i.e. we request 1000 frames meanwhile our RAM has size of 3 frames + *Don't try to perform that case in this simple work, it will result + *in endless procedure of swap-off to get frame and we have not provide + *duplicate control mechanism, keep it simple + */ + ret_alloc = alloc_pages_range(caller, incpgnum, &frm_lst); + + if (ret_alloc < 0 && ret_alloc != -3000) + return -1; + + /* Out of memory */ + if (ret_alloc == -3000) + { +#ifdef MMDBG + printf("OOM: vm_map_ram out of memory \n"); +#endif + return -1; + } + + /* it leaves the case of memory is enough but half in ram, half in swap + * do the swaping all to swapper to get the all in ram */ + vmap_page_range(caller, mapstart, incpgnum, frm_lst, ret_rg); + + return 0; +} + +/* Swap copy content page from source frame to destination frame + * @mpsrc : source memphy + * @srcfpn : source physical page number (FPN) + * @mpdst : destination memphy + * @dstfpn : destination physical page number (FPN) + **/ +int __swap_cp_page(struct memphy_struct *mpsrc, int srcfpn, + struct memphy_struct *mpdst, int dstfpn) +{ + int cellidx; + int addrsrc,addrdst; + for(cellidx = 0; cellidx < PAGING_PAGESZ; cellidx++) + { + addrsrc = srcfpn * PAGING_PAGESZ + cellidx; + addrdst = dstfpn * PAGING_PAGESZ + cellidx; + + BYTE data; + MEMPHY_read(mpsrc, addrsrc, &data); + MEMPHY_write(mpdst, addrdst, data); + } + + return 0; +} + +/* + *Initialize a empty Memory Management instance + * @mm: self mm + * @caller: mm owner + */ +int init_mm(struct mm_struct *mm, struct pcb_t *caller) +{ + struct vm_area_struct *vma0 = malloc(sizeof(struct vm_area_struct)); + struct vm_area_struct *vma1 = malloc(sizeof(struct vm_area_struct)); + + mm->pgd = malloc(PAGING_MAX_PGN * sizeof(uint32_t)); + + /* By default the owner comes with at least one vma for DATA */ + vma0->vm_id = 0; + vma0->vm_start = 0; + vma0->vm_end = vma0->vm_start; + vma0->sbrk = vma0->vm_start; + + struct vm_rg_struct *first_rg = init_vm_rg(vma0->vm_start, vma0->vm_end, 0); + enlist_vm_rg_node(&vma0->vm_freerg_list, first_rg); + + /* Update vma0 next */ + vma0->vm_next = vma1; // Assuming vma1 is the next VM area + + /* Update one vma for HEAP */ + vma1->vm_id = 1; // Assuming ID for heap + // vma1->vm_start = HEAP_START; // Define an appropriate start address for the heap + //vma1->vm_end = HEAP_END; // Define the end address for the heap + vma1->sbrk = vma1->vm_start; + + struct vm_rg_struct *first_rg_heap = init_vm_rg(vma1->vm_start, vma1->vm_end, 0); + enlist_vm_rg_node(&vma1->vm_freerg_list, first_rg_heap); + + /* Set next for vma1 */ + vma1->vm_next = NULL; // Assuming it's the last one in the list for now + + /* Point vma owner backward */ + vma0->vm_mm = mm; + vma1->vm_mm = mm; + + /* Update mmap */ + mm->mmap = vma0; // Start the mmap list with vma0 + + return 0; +} + + +struct vm_rg_struct* init_vm_rg(int rg_start, int rg_end, int vmaid) +{ + struct vm_rg_struct *rgnode = malloc(sizeof(struct vm_rg_struct)); + + rgnode->rg_start = rg_start; + rgnode->rg_end = rg_end; + rgnode->vmaid = vmaid; + rgnode->rg_next = NULL; + + return rgnode; +} + +int enlist_vm_rg_node(struct vm_rg_struct **rglist, struct vm_rg_struct* rgnode) +{ + rgnode->rg_next = *rglist; + *rglist = rgnode; + + return 0; +} + +int enlist_pgn_node(struct pgn_t **plist, int pgn) +{ + struct pgn_t* pnode = malloc(sizeof(struct pgn_t)); + + pnode->pgn = pgn; + pnode->pg_next = *plist; + *plist = pnode; + + return 0; +} + +int print_list_fp(struct framephy_struct *ifp) +{ + struct framephy_struct *fp = ifp; + + printf("print_list_fp: "); + if (fp == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (fp != NULL ) + { + printf("fp[%d]\n",fp->fpn); + fp = fp->fp_next; + } + printf("\n"); + return 0; +} + +int print_list_rg(struct vm_rg_struct *irg) +{ + struct vm_rg_struct *rg = irg; + + printf("print_list_rg: "); + if (rg == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (rg != NULL) + { + printf("rg[%ld->%ldvma=%d]\n",rg->rg_start, rg->rg_end, rg->vmaid); + rg = rg->rg_next; + } + printf("\n"); + return 0; +} + +int print_list_vma(struct vm_area_struct *ivma) +{ + struct vm_area_struct *vma = ivma; + + printf("print_list_vma: "); + if (vma == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (vma != NULL ) + { + printf("va[%ld->%ld]\n",vma->vm_start, vma->vm_end); + vma = vma->vm_next; + } + printf("\n"); + return 0; +} + +int print_list_pgn(struct pgn_t *ip) +{ + printf("print_list_pgn: "); + if (ip == NULL) {printf("NULL list\n"); return -1;} + printf("\n"); + while (ip != NULL ) + { + printf("va[%d]-\n",ip->pgn); + ip = ip->pg_next; + } + printf("n"); + return 0; +} + +int print_pgtbl(struct pcb_t *caller, uint32_t start, uint32_t end) +{ + int pgn_start,pgn_end; + int pgit; + + if(end == -1){ + pgn_start = 0; + struct vm_area_struct *cur_vma = get_vma_by_num(caller->mm, 0); + end = cur_vma->vm_end; + } + pgn_start = PAGING_PGN(start); + pgn_end = PAGING_PGN(end); + + printf("print_pgtbl: %d - %d", start, end); + if (caller == NULL) {printf("NULL caller\n"); return -1;} + printf("\n"); + + + for(pgit = pgn_start; pgit < pgn_end; pgit++) + { + printf("%08ld: %08x\n", pgit * sizeof(uint32_t), caller->mm->pgd[pgit]); + } + + return 0; +} + +//#endif diff --git a/ossim_source_code/src/os.c b/ossim_source_code/src/os.c new file mode 100644 index 0000000..288a3c1 --- /dev/null +++ b/ossim_source_code/src/os.c @@ -0,0 +1,292 @@ + +#include "cpu.h" +#include "timer.h" +#include "sched.h" +#include "loader.h" +#include "mm.h" + +#include +#include +#include +#include + +static int time_slot; +static int num_cpus; +static int done = 0; + +#ifdef MM_PAGING +static int memramsz; +static int memswpsz[PAGING_MAX_MMSWP]; +#ifdef MM_PAGING_HEAP_GODOWN +static int vmemsz; +#endif + +struct mmpaging_ld_args { + /* A dispatched argument struct to compact many-fields passing to loader */ + int vmemsz; + struct memphy_struct *mram; + struct memphy_struct **mswp; + struct memphy_struct *active_mswp; + struct timer_id_t *timer_id; +}; +#endif + +static struct ld_args{ + char ** path; + unsigned long * start_time; +#ifdef MLQ_SCHED + unsigned long * prio; +#endif +} ld_processes; +int num_processes; + +struct cpu_args { + struct timer_id_t * timer_id; + int id; +}; + + +static void * cpu_routine(void * args) { + struct timer_id_t * timer_id = ((struct cpu_args*)args)->timer_id; + int id = ((struct cpu_args*)args)->id; + /* Check for new process in ready queue */ + int time_left = 0; + struct pcb_t * proc = NULL; + while (1) { + /* Check the status of current process */ + if (proc == NULL) { + /* No process is running, the we load new process from + * ready queue */ + proc = get_proc(); + if (proc == NULL) { + next_slot(timer_id); + continue; /* First load failed. skip dummy load */ + } + }else if (proc->pc == proc->code->size) { + /* The porcess has finish it job */ + printf("\tCPU %d: Processed %2d has finished\n", + id ,proc->pid); + free(proc); + proc = get_proc(); + time_left = 0; + }else if (time_left == 0) { + /* The process has done its job in current time slot */ + printf("\tCPU %d: Put process %2d to run queue\n", + id, proc->pid); + put_proc(proc); + proc = get_proc(); + } + + /* Recheck process status after loading new process */ + if (proc == NULL && done) { + /* No process to run, exit */ + printf("\tCPU %d stopped\n", id); + break; + }else if (proc == NULL) { + /* There may be new processes to run in + * next time slots, just skip current slot */ + next_slot(timer_id); + continue; + }else if (time_left == 0) { + printf("\tCPU %d: Dispatched process %2d\n", + id, proc->pid); + time_left = time_slot; + } + + /* Run current process */ + run(proc); + time_left--; + next_slot(timer_id); + } + detach_event(timer_id); + pthread_exit(NULL); +} + +static void * ld_routine(void * args) { +#ifdef MM_PAGING + struct memphy_struct* mram = ((struct mmpaging_ld_args *)args)->mram; + struct memphy_struct** mswp = ((struct mmpaging_ld_args *)args)->mswp; + struct memphy_struct* active_mswp = ((struct mmpaging_ld_args *)args)->active_mswp; + struct timer_id_t * timer_id = ((struct mmpaging_ld_args *)args)->timer_id; +#else + struct timer_id_t * timer_id = (struct timer_id_t*)args; +#endif + int i = 0; + printf("ld_routine\n"); + while (i < num_processes) { + struct pcb_t * proc = load(ld_processes.path[i]); +#ifdef MLQ_SCHED + proc->prio = ld_processes.prio[i]; +#endif + while (current_time() < ld_processes.start_time[i]) { + next_slot(timer_id); + } +#ifdef MM_PAGING + proc->mm = malloc(sizeof(struct mm_struct)); +#ifdef MM_PAGING_HEAP_GODOWN + proc->vmemsz = vmemsz; +#endif + init_mm(proc->mm, proc); + proc->mram = mram; + proc->mswp = mswp; + proc->active_mswp = active_mswp; +#endif + printf("\tLoaded a process at %s, PID: %d PRIO: %ld\n", + ld_processes.path[i], proc->pid, ld_processes.prio[i]); + add_proc(proc); + free(ld_processes.path[i]); + i++; + next_slot(timer_id); + } + free(ld_processes.path); + free(ld_processes.start_time); + done = 1; + detach_event(timer_id); + pthread_exit(NULL); +} + +static void read_config(const char * path) { + FILE * file; + if ((file = fopen(path, "r")) == NULL) { + printf("Cannot find configure file at %s\n", path); + exit(1); + } + fscanf(file, "%d %d %d\n", &time_slot, &num_cpus, &num_processes); + + ld_processes.path = (char**)malloc(sizeof(char*) * num_processes); + ld_processes.start_time = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#ifdef MM_PAGING + int sit; +#ifdef MM_FIXED_MEMSZ + /* We provide here a back compatible with legacy OS simulatiom config file + * In which, it have no addition config line for Mema, keep only one line + * for legacy info + * [time slice] [N = Number of CPU] [M = Number of Processes to be run] + */ + memramsz = 0x100000; + memswpsz[0] = 0x1000000; + for(sit = 1; sit < PAGING_MAX_MMSWP; sit++) + memswpsz[sit] = 0; + +#ifdef MM_PAGING_HEAP_GODOWN + vmemsz = 0x300000; +#endif +#else + /* Read input config of memory size: MEMRAM and upto 4 MEMSWP (mem swap) + * Format: (size=0 result non-used memswap, must have RAM and at least 1 SWAP) + * MEM_RAM_SZ MEM_SWP0_SZ MEM_SWP1_SZ MEM_SWP2_SZ MEM_SWP3_SZ + */ + fscanf(file, "%d\n", &memramsz); + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + fscanf(file, "%d", &(memswpsz[sit])); +#ifdef MM_PAGING_HEAP_GODOWN + fscanf(file, "%d\n", &vmemsz); +#endif + fscanf(file, "\n"); /* Final character */ +#endif +#endif + +#ifdef MLQ_SCHED + ld_processes.prio = (unsigned long*) + malloc(sizeof(unsigned long) * num_processes); +#endif + int i; + for (i = 0; i < num_processes; i++) { + ld_processes.path[i] = (char*)malloc(sizeof(char) * 100); + ld_processes.path[i][0] = '\0'; + strcat(ld_processes.path[i], "input/proc/"); + char proc[100]; +#ifdef MLQ_SCHED + fscanf(file, "%lu %s %lu\n", &ld_processes.start_time[i], proc, &ld_processes.prio[i]); +#else + fscanf(file, "%lu %s\n", &ld_processes.start_time[i], proc); +#endif + strcat(ld_processes.path[i], proc); + } +} + +int main(int argc, char * argv[]) { + /* Read config */ + if (argc != 2) { + printf("Usage: os [path to configure file]\n"); + return 1; + } + char path[100]; + path[0] = '\0'; + strcat(path, "input/"); + strcat(path, argv[1]); + + read_config(path); + + pthread_t * cpu = (pthread_t*)malloc(num_cpus * sizeof(pthread_t)); + struct cpu_args * args = + (struct cpu_args*)malloc(sizeof(struct cpu_args) * num_cpus); + pthread_t ld; + + /* Init timer */ + int i; + for (i = 0; i < num_cpus; i++) { + args[i].timer_id = attach_event(); + args[i].id = i; + } + struct timer_id_t * ld_event = attach_event(); + start_timer(); + +#ifdef MM_PAGING + /* Init all MEMPHY include 1 MEMRAM and n of MEMSWP */ + int rdmflag = 1; /* By default memphy is RANDOM ACCESS MEMORY */ + + struct memphy_struct mram; + struct memphy_struct mswp[PAGING_MAX_MMSWP]; + + /* Create MEM RAM */ + init_memphy(&mram, memramsz, rdmflag); + + /* Create all MEM SWAP */ + int sit; + for(sit = 0; sit < PAGING_MAX_MMSWP; sit++) + init_memphy(&mswp[sit], memswpsz[sit], rdmflag); + + /* In Paging mode, it needs passing the system mem to each PCB through loader*/ + struct mmpaging_ld_args *mm_ld_args = malloc(sizeof(struct mmpaging_ld_args)); + + mm_ld_args->timer_id = ld_event; + mm_ld_args->mram = (struct memphy_struct *) &mram; + mm_ld_args->mswp = (struct memphy_struct**) &mswp; +#ifdef MM_PAGING_HEAP_GODOWN + mm_ld_args->vmemsz = vmemsz; +#endif + mm_ld_args->active_mswp = (struct memphy_struct *) &mswp[0]; +#endif + + + /* Init scheduler */ + init_scheduler(); + + /* Run CPU and loader */ +#ifdef MM_PAGING + pthread_create(&ld, NULL, ld_routine, (void*)mm_ld_args); +#else + pthread_create(&ld, NULL, ld_routine, (void*)ld_event); +#endif + for (i = 0; i < num_cpus; i++) { + pthread_create(&cpu[i], NULL, + cpu_routine, (void*)&args[i]); + } + + /* Wait for CPU and loader finishing */ + for (i = 0; i < num_cpus; i++) { + pthread_join(cpu[i], NULL); + } + pthread_join(ld, NULL); + + /* Stop timer */ + stop_timer(); + + return 0; + +} + + + diff --git a/ossim_source_code/src/paging.c b/ossim_source_code/src/paging.c new file mode 100644 index 0000000..b061019 --- /dev/null +++ b/ossim_source_code/src/paging.c @@ -0,0 +1,18 @@ + +#include "mem.h" +#include "cpu.h" +#include "loader.h" +#include + +int main() { + struct pcb_t * ld = load("input/p0"); + struct pcb_t * proc = load("input/p0"); + unsigned int i; + for (i = 0; i < proc->code->size; i++) { + run(proc); + run(ld); + } + dump(); + return 0; +} + diff --git a/ossim_source_code/src/queue.c b/ossim_source_code/src/queue.c new file mode 100644 index 0000000..6273086 --- /dev/null +++ b/ossim_source_code/src/queue.c @@ -0,0 +1,49 @@ +#include +#include +#include "queue.h" + +int empty(struct queue_t * q) { + if (q == NULL) return 1; + return (q->size == 0); +} + +void enqueue(struct queue_t * q, struct pcb_t * proc) { + /* TODO: put a new process to queue [q] */ + if (q->size > MAX_QUEUE_SIZE){ + return; + } + else if (!q->size){ + q->proc[0] = proc; + q->size++; + } + else { + int index = q->size; + while (index > 0 && q->proc[index - 1]->priority > proc->priority){ + q->proc[index] = q->proc[index - 1]; + index--; + } + + q->proc[index] = proc; + q->size++; + } + +} + +struct pcb_t * dequeue(struct queue_t * q) { + /* TODO: return a pcb whose prioprity is the highest + * in the queue [q] and remember to remove it from q + * */ + struct pcb_t * result = NULL; + if (q->proc[0] != NULL){ + result = q->proc[0]; + + for (int i = 0; i < q->size - 1; i++){ + q->proc[i] = q->proc[i + 1]; + } + q->proc[q->size - 1] = NULL; + q->size--; + + } + return result; +} + diff --git a/ossim_source_code/src/sched.c b/ossim_source_code/src/sched.c new file mode 100644 index 0000000..c4d5ce2 --- /dev/null +++ b/ossim_source_code/src/sched.c @@ -0,0 +1,140 @@ + +#include "queue.h" +#include "sched.h" +#include + +#include +#include +static struct queue_t ready_queue; +static struct queue_t run_queue; +static pthread_mutex_t queue_lock; + +#ifdef MLQ_SCHED +static struct queue_t mlq_ready_queue[MAX_PRIO]; +#endif + +int queue_empty(void) { +#ifdef MLQ_SCHED + unsigned long prio; + for (prio = 0; prio < MAX_PRIO; prio++) + if(!empty(&mlq_ready_queue[prio])) + return -1; +#endif + return (empty(&ready_queue) && empty(&run_queue)); +} + +void init_scheduler(void) { +#ifdef MLQ_SCHED + int i ; + + for (i = 0; i < MAX_PRIO; i ++) + mlq_ready_queue[i].size = 0; +#endif + ready_queue.size = 0; + run_queue.size = 0; + pthread_mutex_init(&queue_lock, NULL); +} + +#ifdef MLQ_SCHED +/* + * Stateful design for routine calling + * based on the priority and our MLQ policy + * We implement stateful here using transition technique + * State representation prio = 0 .. MAX_PRIO, curr_slot = 0..(MAX_PRIO - prio) + */ +struct pcb_t * get_mlq_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from PRIORITY [ready_queue]. + * Remember to use lock to protect the queue. + * */ + //int curr_slot = 0; + pthread_mutex_lock(&queue_lock); + int prio; + + for (prio = 0; prio < MAX_PRIO; prio++){ + if (mlq_ready_queue[prio].size != 0 && mlq_ready_queue[prio].count_slot < MAX_PRIO - prio){ + proc = dequeue(&mlq_ready_queue[prio]); + mlq_ready_queue[prio].count_slot++; + break; + } + } + + if (prio == MAX_PRIO) { + for (int i = 0; i < MAX_PRIO; i++){ + mlq_ready_queue[i].count_slot = 0; + } + + for (int i = 0; i < MAX_PRIO; i++){ + if (mlq_ready_queue[i].size != 0 && mlq_ready_queue[i].count_slot < MAX_PRIO - i){ + proc = dequeue(&mlq_ready_queue[i]); + mlq_ready_queue[i].count_slot++; + break; + } + } + } + + // while (prio < MAX_PRIO){ + // curr_slot = MAX_PRIO - prio; + // if (!empty(&mlq_ready_queue[prio]) && mlq_ready_queue[prio].count_slot < curr_slot){ + // proc = dequeue(&mlq_ready_queue[prio]); + // curr_slot--; + // break; + // } + // else{ + // prio = (prio + 1) % MAX_PRIO; + // curr_slot = 0; + // } + // } + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_mlq_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&mlq_ready_queue[proc->prio], proc); + pthread_mutex_unlock(&queue_lock); +} + +struct pcb_t * get_proc(void) { + return get_mlq_proc(); +} + +void put_proc(struct pcb_t * proc) { + return put_mlq_proc(proc); +} + +void add_proc(struct pcb_t * proc) { + return add_mlq_proc(proc); +} +#else +struct pcb_t * get_proc(void) { + struct pcb_t * proc = NULL; + /*TODO: get a process from [ready_queue]. + * Remember to use lock to protect the queue. + * */ + pthread_mutex_lock(&queue_lock); + dequeue(&ready_queue); + pthread_mutex_unlock(&queue_lock); + return proc; +} + +void put_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&run_queue, proc); + pthread_mutex_unlock(&queue_lock); +} + +void add_proc(struct pcb_t * proc) { + pthread_mutex_lock(&queue_lock); + enqueue(&ready_queue, proc); + pthread_mutex_unlock(&queue_lock); +} +#endif + + diff --git a/ossim_source_code/src/timer.c b/ossim_source_code/src/timer.c new file mode 100644 index 0000000..02c4111 --- /dev/null +++ b/ossim_source_code/src/timer.c @@ -0,0 +1,136 @@ + +#include "timer.h" +#include +#include + +static pthread_t _timer; + +struct timer_id_container_t { + struct timer_id_t id; + struct timer_id_container_t * next; +}; + +static struct timer_id_container_t * dev_list = NULL; + +static uint64_t _time; + +static int timer_started = 0; +static int timer_stop = 0; + + +static void * timer_routine(void * args) { + while (!timer_stop) { + printf("Time slot %3lu\n", current_time()); + int fsh = 0; + int event = 0; + /* Wait for all devices have done the job in current + * time slot */ + struct timer_id_container_t * temp; + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.event_lock); + while (!temp->id.done && !temp->id.fsh) { + pthread_cond_wait( + &temp->id.event_cond, + &temp->id.event_lock + ); + } + if (temp->id.fsh) { + fsh++; + } + event++; + pthread_mutex_unlock(&temp->id.event_lock); + } + + /* Increase the time slot */ + _time++; + + /* Let devices continue their job */ + for (temp = dev_list; temp != NULL; temp = temp->next) { + pthread_mutex_lock(&temp->id.timer_lock); + temp->id.done = 0; + pthread_cond_signal(&temp->id.timer_cond); + pthread_mutex_unlock(&temp->id.timer_lock); + } + if (fsh == event) { + break; + } + } + pthread_exit(args); +} + +void next_slot(struct timer_id_t * timer_id) { + /* Tell to timer that we have done our job in current slot */ + pthread_mutex_lock(&timer_id->event_lock); + timer_id->done = 1; + pthread_cond_signal(&timer_id->event_cond); + pthread_mutex_unlock(&timer_id->event_lock); + + /* Wait for going to next slot */ + pthread_mutex_lock(&timer_id->timer_lock); + while (timer_id->done) { + pthread_cond_wait( + &timer_id->timer_cond, + &timer_id->timer_lock + ); + } + pthread_mutex_unlock(&timer_id->timer_lock); +} + +uint64_t current_time() { + return _time; +} + +void start_timer() { + timer_started = 1; + pthread_create(&_timer, NULL, timer_routine, NULL); +} + +void detach_event(struct timer_id_t * event) { + pthread_mutex_lock(&event->event_lock); + event->fsh = 1; + pthread_cond_signal(&event->event_cond); + pthread_mutex_unlock(&event->event_lock); +} + +struct timer_id_t * attach_event() { + if (timer_started) { + return NULL; + }else{ + struct timer_id_container_t * container = + (struct timer_id_container_t*)malloc( + sizeof(struct timer_id_container_t) + ); + container->id.done = 0; + container->id.fsh = 0; + pthread_cond_init(&container->id.event_cond, NULL); + pthread_mutex_init(&container->id.event_lock, NULL); + pthread_cond_init(&container->id.timer_cond, NULL); + pthread_mutex_init(&container->id.timer_lock, NULL); + if (dev_list == NULL) { + dev_list = container; + dev_list->next = NULL; + }else{ + container->next = dev_list; + dev_list = container; + } + return &(container->id); + } +} + +void stop_timer() { + timer_stop = 1; + pthread_join(_timer, NULL); + while (dev_list != NULL) { + struct timer_id_container_t * temp = dev_list; + dev_list = dev_list->next; + pthread_cond_destroy(&temp->id.event_cond); + pthread_mutex_destroy(&temp->id.event_lock); + pthread_cond_destroy(&temp->id.timer_cond); + pthread_mutex_destroy(&temp->id.timer_lock); + free(temp); + } +} + + + +