Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

yapOS

An OS simulator project to help me learn about the shell interface and basic OS functionalities like process management, memory management, and file system operations. It demonstrates core systems programming concepts including:

  • Variable storage and key-value substitution
  • Round-robin process scheduling with paging
  • Demand-paged memory management with LRU eviction
  • A persistent, FAT-style virtual file system
  • Script execution, command parsing, and a shell REPL

The design mimics a simplified OS kernel layered over a block device simulator (blank.dsk).

Architecture Overview

LayerFilesResponsibilities
Shell & Interpretershell.c, interpreter.cTokenize user input, dispatch commands, stage scripts.
Kernelkernel.cHandle ready queue, scheduling, paging, and file operations.
CPU Emulatorcpu.cFetch and execute script lines per time slice.
PCB & Schedulingpcb.c, linked_list.cMaintain PCBs with program counters, file tables, and page metadata.
Shell Memoryshellmemory.cSimple variable store with frame allocation.
File Systemblank.dsk, kernel.cSimulate block-based file storage using a FAT and sector map.

Backing Store & Paging

When scripts are loaded via run or exec, they are copied into a temporary backing_store/ directory.
Each script becomes a private file used for demand paging. The system supports a small fixed number of memory frames and uses 3-line pages with LRU replacement. This structure mimics real-world virtual memory backed by secondary storage.

Requirements

  • GCC compiler
  • Make build system

Building

To build the project, use the make command in the root directory:

make

This will compile all the necessary components and create the myshell executable.

Running

To run yapOS, use the following command:

./myshell blank.dsk

The blank.dsk file serves as the disk image for the operating system.

Configuration

The build process supports the following optional parameters:

  • framesize: Size of the frame store (default: 21)
  • varmemsize: Size of the variable memory store (default: 10)

You can specify these parameters when running make:

make framesize=30 varmemsize=15

Cleaning

To clean the build artifacts:

make clean

Command Reference

CommandSyntaxDescription
helphelpLists all available commands.
quit, exitquit / exitCleanly shuts down the shell and syncs the disk.
setset <var> <value...>Stores a variable with the given value (spaces included).
printprint <var>Prints the value of a variable.
echoecho <text> / echo $<var>Prints text or a substituted variable.
resetmemresetmemClears all stored variables.
runrun <script.txt>Loads and executes a script sequentially.
execexec <s1> [s2] [s3] [s4]Loads and schedules multiple scripts in round-robin.
lslsLists files in the virtual root directory.
catcat <file>Prints contents of a file from the beginning.
createcreate <file> <bytes>Creates a new file of given size.
writewrite <file> <data...>Writes data at the current file pointer.
readread <file> <n>Reads n bytes from current pointer.
seekseek <file> <offset>Sets the current pointer position.
sizesize <file>Shows the file size in bytes.
rmrm <file>Deletes a file and frees its blocks.
find_filefind_file <substring...>Searches for filenames containing the substring.
copy_incopy_in <host_path>Imports a file from the host system.
copy_outcopy_out <file>Exports a virtual file to the host system.
freespacefreespaceShows free sectors and total free space.
fragmentation_degreefragmentation_degreeCalculates fragmentation for each file.
defragmentdefragmentRewrites files to be stored contiguously.
recoverrecover <0 or 1>Attempts file system repair (0 = thorough, 1 = fast).

Unknown or malformed commands return standardized error messages prefixed with Bad command:.

About

An OS simulator project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages