From 37e3fa27841cf8e4868d3a4b37e9b33f26e7316b Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 28 Apr 2025 20:40:22 +0000 Subject: [PATCH] initial --- .devcontainer/devcontainer.json | 22 +++++ Back.bin | Bin 0 -> 65536 bytes Code.update.txt | 80 +++++++-------- README.md | 14 +-- a.out | Bin 0 -> 19040 bytes hw4.c | 169 ++++++++++++++++++++++++++++++++ 6 files changed, 238 insertions(+), 47 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 Back.bin create mode 100644 a.out create mode 100644 hw4.c diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..b9862e1 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/alpine +{ + "name": "Alpine", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:alpine-3.20" + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/Back.bin b/Back.bin new file mode 100644 index 0000000000000000000000000000000000000000..9f442b092d4eec5c07087f507aef024c031658c2 GIT binary patch literal 65536 zcmeI*1Djn}7zWUpiEZ0vW7}5K*lA-mNn_i#%?3>yn{AxNHX1k1%;bk;{e=76d(YYX z!@B|kgTjOj7d}G7NRgvNjTSvd%viDG#Elm}LBd3dlO#=+JVnY>sneuQmp((rOqsJ} z&6Yh!&Rn^F$dfl;{sILH6)sY=Sn(1iOO-BDwp{rN6)RP)Qngz38Z~Rxu2Z+(kM)0Q z(6CYCCQX|)Z_%<<>o#qF{-s^}4jnsn?$Whe_a49Y?A80XK7IT3A24vx;2}eY4IeRb z)aWr|$Bmybanj@|Q>RUzF>}`JIdkXDU$Ah|;w4L$Enl&6)#^2C*R9{M@%K%ew`~1m z+n;}J-?4Mo?mc_=?LTnv(BUITj~zep_dh33oj!B+-1!UtUc7Yq%GGPvZ`{0f`_A2a z_a8ib^!UlsXa7Ba@$%K{H*f!c_x{7jPoKYh4Gswn@cDiJe*gaeo`0VI-hbZz&Ogq7 z&cDw8?mzB-?!WH;>L2Pq>R;-A>YwVr>fh@B`XBl~`d|8g`k(s0`rrEh<{!*|n13<< zWB$qfm-#pIf94;}f0} z|JnYx{dfES@(<)c$iI;PA^$}Fi~Jk;Kk|>{Kgqw6|0VxS{+s+e`G4{caIJ zRQ{{{Tlv58kL5qhzn1?k|6KmN{CoNT`~&_2|APO)KjFXdZ}>m_BmNWrivPtwk&VT2>^WXXJ{CEC4|DFHNf9JpR-}&$Scm6y7o&U~%=fCsc`S1L9{yYDj z|IUBszw_Vu@BDZEJO7>k&VT2>^WXXJ{CEC4|DFHNf9JpR-}&$Scm6y7o&U~%=fCsc z`S1L9{yYDj|IUBszw_Vu@BDZEJO7>k&VT2>^WXXJ{CEC4|DFHNf9JpR-}&$Scm6y7 zo&U~%=fCsc`S1L9{yYDj|IUBszw_Vu@BDZEJO7>k&VT2>^WXXJ{CEC4|DFHNf9JpR Z-}&$Scm6y7o&O#h5Ev9D?04+He*?R^hjIV_ literal 0 HcmV?d00001 diff --git a/Code.update.txt b/Code.update.txt index 0467b19..fef11f0 100644 --- a/Code.update.txt +++ b/Code.update.txt @@ -1,40 +1,40 @@ -#include -#include - -int main(int argc, char *argv[]) -{ FILE *fp, *fp1 ; - int i ; - unsigned char buf [256] ; //this will hold contents of a page - unsigned short int Addresses[512] ; //these are the randomly generated logical //addresses //against which you will run your code - unsigned short int Current ; //current logical address generated by "CPU" - - srand(9) ; // all get same addresses - - for(i = 0; i < 512 ; i++) //generate/print addresses. Print not necessary - { - Addresses[i] = rand() % 65535 ; - printf("Address is %u \n", Addresses[i]) ; - } - - //declare RAM and init to 0s - - unsigned char RAM [64][256] = { [0 ... 63] = { [0 ... 255] = 0 } }; - - // initialize contents of page - - for (i = 0 ; i < 256 ; i++) - buf[i] = (unsigned char) i ; - - // fill in backing store ('disk'), implemented as a binary external file, with 256 pages - - fp = fopen("Back.bin", "wb") ; - for (i = 0; i < 256 ; i++) - fwrite(buf,256, 1, fp) ; - - fclose(fp) ; - fp = fopen("Back.bin", "rb") ; - - // do your thing!! - - for(i = 0 ; i < 512 ; i++) - { Current = Addresses[I] ; //rest of program +#include +#include + +int main(int argc, char *argv[]) +{ FILE *fp, *fp1 ; + int i ; + unsigned char buf [256] ; //this will hold contents of a page + unsigned short int Addresses[512] ; //these are the randomly generated logical //addresses //against which you will run your code + unsigned short int Current ; //current logical address generated by "CPU" + + srand(9) ; // all get same addresses + + for(i = 0; i < 512 ; i++) //generate/print addresses. Print not necessary + { + Addresses[i] = rand() % 65535 ; + printf("Address is %u \n", Addresses[i]) ; + } + + //declare RAM and init to 0s + + unsigned char RAM [64][256] = { [0 ... 63] = { [0 ... 255] = 0 } }; + + // initialize contents of page + + for (i = 0 ; i < 256 ; i++) + buf[i] = (unsigned char) i ; + + // fill in backing store ('disk'), implemented as a binary external file, with 256 pages + + fp = fopen("Back.bin", "wb") ; + for (i = 0; i < 256 ; i++) + fwrite(buf,256, 1, fp) ; + + fclose(fp) ; + fp = fopen("Back.bin", "rb") ; + + // do your thing!! + + for(i = 0 ; i < 512 ; i++) + { Current = Addresses[I] ; //rest of program diff --git a/README.md b/README.md index c92a924..8eb6f98 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -## cos331-hw4 ## - -[![](https://gitea-actions.nicholaspease.com/actions/umaine-npease/cos331-hw4/badge?label=build&style=flat&branch=main)](https://gitea-actions.nicholaspease.com/latest-log?branch=main) -[![](https://drone.nicholaspease.com/api/badges/umaine-npease/cos331-hw4/status.svg)](https://drone.nicholaspease.com/umaine-npease/cos331-hw4) -[![](https://wakaapi.nicholaspease.com/api/badge/LAX18/interval:any/project:cos331-hw4)](https://wakaapi.nicholaspease.com/summary?interval=any&project=cos331-hw4) -![](https://server1.nicholaspease.com/badges/cloc/npease/cos331-hw4.svg) -
+## cos331-hw4 ## + +[![](https://gitea-actions.nicholaspease.com/actions/umaine-npease/cos331-hw4/badge?label=build&style=flat&branch=main)](https://gitea-actions.nicholaspease.com/latest-log?branch=main) +[![](https://drone.nicholaspease.com/api/badges/umaine-npease/cos331-hw4/status.svg)](https://drone.nicholaspease.com/umaine-npease/cos331-hw4) +[![](https://wakaapi.nicholaspease.com/api/badge/LAX18/interval:any/project:cos331-hw4)](https://wakaapi.nicholaspease.com/summary?interval=any&project=cos331-hw4) +![](https://server1.nicholaspease.com/badges/cloc/npease/cos331-hw4.svg) +
diff --git a/a.out b/a.out new file mode 100644 index 0000000000000000000000000000000000000000..c3bb6024b324a7afa0014ece0dd1a09156a5bb8a GIT binary patch literal 19040 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 literal 0 HcmV?d00001 diff --git a/hw4.c b/hw4.c new file mode 100644 index 0000000..087445d --- /dev/null +++ b/hw4.c @@ -0,0 +1,169 @@ +// HW4 +// Nicholas Pease +#include +#include + +//Globals +#define PAGE_SIZE 256 +#define PHYSICAL_PAGE_COUNT 64 +#define LOGICAL_PAGE_COUNT 256 + +#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n" +#define BYTE_TO_BINARY(byte) \ + ((byte) & 32768 ? '1' : '0'), \ + ((byte) & 16384 ? '1' : '0'), \ + ((byte) & 8192 ? '1' : '0'), \ + ((byte) & 4096 ? '1' : '0'), \ + ((byte) & 2048 ? '1' : '0'), \ + ((byte) & 1024 ? '1' : '0'), \ + ((byte) & 512 ? '1' : '0'), \ + ((byte) & 256 ? '1' : '0'), \ + ((byte) & 0x80 ? '1' : '0'), \ + ((byte) & 0x40 ? '1' : '0'), \ + ((byte) & 0x20 ? '1' : '0'), \ + ((byte) & 0x10 ? '1' : '0'), \ + ((byte) & 0x08 ? '1' : '0'), \ + ((byte) & 0x04 ? '1' : '0'), \ + ((byte) & 0x02 ? '1' : '0'), \ + ((byte) & 0x01 ? '1' : '0') + +typedef enum { false, true } bool; + +int numPageFaults = 0; + +struct MemoryAddress { + unsigned short int address; + unsigned int pageNumber; + unsigned int offset; + unsigned int runNumber; // Run Number +}; + +struct PageTableEntry { + int pageNumber; // Physical Page Number + bool valid; // Valid bit defaults to false (page not loaded) +}; + +struct PageTableEntry RAMTracker[PHYSICAL_PAGE_COUNT]; // Physical RAM Tracker +struct PageTableEntry LogicalRAMTracker[LOGICAL_PAGE_COUNT]; // Logical RAM Tracker +unsigned char RAM[PHYSICAL_PAGE_COUNT][PAGE_SIZE] = {[0 ... 63] = {[0 ... 255] = 0}}; // RAM initialized to 0s +unsigned short int addresses[512]; // Randomly generated logical addresses +int leastRecentlyUsedCalculation[PHYSICAL_PAGE_COUNT] = { [0 ... 63] = 0 }; // LRU calculation array + +// Methods for VirtualMemory + +struct MemoryAddress generateAddress(unsigned short int logicalAddress, unsigned int runNumber) { + unsigned short int offsetbitMask = 0b0000000011111111; + struct MemoryAddress generatedAddress; + // 16 bits for address ( 8 page, 8 offset) + generatedAddress.address = logicalAddress; // Set the logical address + generatedAddress.pageNumber = logicalAddress >> 8; // Moves 8 to the left (leaving page) + generatedAddress.offset = logicalAddress & offsetbitMask; // Applies the bitmask to get the offset + generatedAddress.runNumber = runNumber; // Set the run number + + return generatedAddress; +} + +int LRU() { + printf("No Free Page Frame. Invoking LRU Page Replacement Algorithm\n"); + for (int j = 0; j < 64, j++;) { + printf("Testing"); + }; + return 1; + // // Find the least recently used page + // int oldestPage = 0; + // for (int i = 1; i < PHYSICAL_PAGE_COUNT; i++) { + // if (leastRecentlyUsedCalculation[i] < oldestPage && oldestPage == 0) { + // oldestPage = i; // Update the oldest page + // } else if (oldestPage == 0 && leastRecentlyUsedCalculation[i] != 0) { + // oldestPage = i; // If zero, set to the current if not also 0 + // } + // } + // printf("Victim Physical Page is %d\n", oldestPage); + // printf("LP %d is currently mapped to victim page frame\n", RAMTracker[oldestPage].pageNumber); + // return oldestPage; // Return the page number of the least recently used page +} + +void loadIntoRAM(unsigned int logicalPageNumber) { + // Determine if there is a free page in RAM + int physicalPageNumber = -1; + for (int i = 0; i < PHYSICAL_PAGE_COUNT; i++) { + if (RAMTracker[i].valid == false) { + physicalPageNumber = i; // Found a free page + printf("Found Free Frame %d in memory\n", physicalPageNumber); + break; + } + } + + // If no free page, find "victim" page using LRU algorithm + if (physicalPageNumber == -1) physicalPageNumber = LRU(); + + // Load from file into RAM using the free page number + FILE *fp = fopen("Back.bin", "rb"); // Open file for reading + unsigned char buf[256][PAGE_SIZE]; + for (int i = 0; i < 256; i++) fread(buf[i], PAGE_SIZE, 1, fp); // Write 256 pages + + fclose(fp); // Close file + + // Update RAM and RAMTracker + for (int i = 0; i < PAGE_SIZE; i++) { + RAM[physicalPageNumber][i] = buf[logicalPageNumber][i]; // Load the page into RAM + } + + RAMTracker[physicalPageNumber].valid = true; // Set the page as valid + RAMTracker[physicalPageNumber].pageNumber = logicalPageNumber; + LogicalRAMTracker[logicalPageNumber].valid = true; // Set the logical page as valid + LogicalRAMTracker[logicalPageNumber].pageNumber = physicalPageNumber; + + printf("Logical Page %d Now Mapped to Physical Page %d\n", logicalPageNumber, physicalPageNumber); +} + +void readFromAddress(struct MemoryAddress logicalAddress) { + // Check if page is already loaded into RAM + if (LogicalRAMTracker[logicalAddress.pageNumber].valid != true) { + // Page is not loaded into RAM, so we need to calculate and load it + numPageFaults++; + printf("Page Not Mapped. Page Fault Number %d.\n", numPageFaults); + loadIntoRAM(logicalAddress.pageNumber); // Load the page into RAM + } + + int physicalPageNumber = LogicalRAMTracker[logicalAddress.pageNumber].pageNumber; // Get the physical page number + + // Add to LRU list + leastRecentlyUsedCalculation[physicalPageNumber] = logicalAddress.runNumber; // Update the LRU calculation with the current run number + + // Page confirmed to be in RAM, so we can read from it + printf("Final address is Physical Page: %d Offset: %d\n", physicalPageNumber, logicalAddress.offset); // Print the final address + char data = RAM[physicalPageNumber][logicalAddress.offset]; // Read the data from RAM + printf("The value at that address: %d\n", data); // Print the data +} + +main(int argc, char *argv[]) +{ + srand(9); // all get same addresses + struct MemoryAddress logicalAddress; + + for (int i = 0; i < 512; i++) addresses[i] = rand() % 65535; // Logical Address Generation + + //Generate File Contents + unsigned char buf[256]; // Contents of a page + for (int i = 0; i < 256; i++) buf[i] = (unsigned char)i; // Fill with 0-255 + FILE *fp = fopen("Back.bin", "wb"); // Open file for writing + for (int i = 0; i < 256; i++) fwrite(buf, 256, 1, fp); // Write 256 pages + fclose(fp); // Close file + //End Generate File Contents + + for (int i = 0; i < 100; i++) + { + logicalAddress = generateAddress(addresses[i], i); // Generate the address via the struct + printf("Reference %d. Logical Address %d\n", i, logicalAddress.address); // Print the logical address + printf("Logical Page %d, Offset %d\n", logicalAddress.pageNumber, logicalAddress.offset); // Print the page number and offset + // printf("Address: "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(logicalAddress.address)); + // printf("Page Bits: "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(logicalAddress.pageNumber)); + // printf("Offset Bits: "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(logicalAddress.offset)); + + readFromAddress(logicalAddress); // Read from the address (and perform memory operations if required)) + printf("\n"); + } + + return 0; +} \ No newline at end of file