first commit
This commit is contained in:
commit
3db69946b4
9 changed files with 420 additions and 0 deletions
41
projects/bus/bus-02-memory/mmem.h
Normal file
41
projects/bus/bus-02-memory/mmem.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#ifndef MMEM_H__
|
||||
#define MMEM_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define NO_PAGE_FRAMES 20
|
||||
#define LRU_AGING_BITS 8
|
||||
|
||||
// The page_frame struct contains everything that is related to a page_frame
|
||||
typedef struct page_frame {
|
||||
// the virtual page that is in this page frame
|
||||
uint64_t virtual_address;
|
||||
|
||||
bool referenced;
|
||||
uint8_t age;
|
||||
} page_frame;
|
||||
|
||||
// The memory struct manages all page frames of a given system
|
||||
// You may organize your pages in the array of page_frames however you like
|
||||
// (as long as you evict and load the right pages for the strategy of course :) )
|
||||
typedef struct memory {
|
||||
struct page_frame pages[NO_PAGE_FRAMES];
|
||||
bool is_full;
|
||||
uint8_t first;
|
||||
uint8_t last;
|
||||
} memory;
|
||||
|
||||
|
||||
// Evicts a page with the virtual address virtual_address
|
||||
// You do not need to implement this function,
|
||||
// you should however call this function, whenever you evict a page in your code.
|
||||
void evict_page(uint64_t virtual_address);
|
||||
|
||||
// Loads a page with the virtual address virtual_address
|
||||
// You do not need to implement this function,
|
||||
// you should however call this function, whenever you load a page in your code.
|
||||
void load_page(uint64_t virtual_address);
|
||||
|
||||
|
||||
#endif
|
||||
33
projects/bus/bus-02-memory/mmem_clock.c
Normal file
33
projects/bus/bus-02-memory/mmem_clock.c
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#include "mmem_clock.h"
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_clock_init_list(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_clock_map_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_clock_access_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
37
projects/bus/bus-02-memory/mmem_clock.h
Normal file
37
projects/bus/bus-02-memory/mmem_clock.h
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#ifndef MMEM_CLOCK_H__
|
||||
#define MMEM_CLOCK_H__
|
||||
|
||||
// You do not need to change anything here
|
||||
|
||||
#include "mmem.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_clock_init_list();
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_clock_map_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_clock_access_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
33
projects/bus/bus-02-memory/mmem_fifo.c
Normal file
33
projects/bus/bus-02-memory/mmem_fifo.c
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#include "mmem_fifo.h"
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_fifo_init_list(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_fifo_map_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_fifo_access_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
35
projects/bus/bus-02-memory/mmem_fifo.h
Normal file
35
projects/bus/bus-02-memory/mmem_fifo.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#ifndef MMEM_FIFO_H__
|
||||
#define MMEM_FIFO_H__
|
||||
|
||||
// You do not need to change anything here
|
||||
|
||||
#include "mmem.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_fifo_init_list();
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_fifo_map_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_fifo_access_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
#endif
|
||||
42
projects/bus/bus-02-memory/mmem_lru_aging.c
Normal file
42
projects/bus/bus-02-memory/mmem_lru_aging.c
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#include "mmem_lru_aging.h"
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_lrua_init_list(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_lrua_map_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_lrua_access_page(memory* mem, uint64_t virtual_address){
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief function is called, when the clock is advanced
|
||||
*
|
||||
* \param mem - the memory struct on which the algorithm operates on
|
||||
*/
|
||||
void stud_lrua_clock_tick(memory* mem){
|
||||
return;
|
||||
}
|
||||
45
projects/bus/bus-02-memory/mmem_lru_aging.h
Normal file
45
projects/bus/bus-02-memory/mmem_lru_aging.h
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
#ifndef MMEM_LRU_AGING_H__
|
||||
#define MMEM_LRU_AGING_H__
|
||||
|
||||
// You do not need to change anything here
|
||||
|
||||
#include "mmem.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* \brief Initializes the list with the page frames
|
||||
*
|
||||
* \return Returns a pointer to the created memory struct
|
||||
*/
|
||||
memory* stud_lrua_init_list();
|
||||
|
||||
|
||||
/**
|
||||
* \brief maps a page to a page frame
|
||||
*
|
||||
* \param mem - the memory struct in which the page should be mapped in
|
||||
* \param virtual_address - the virtual address of the page
|
||||
*/
|
||||
void stud_lrua_map_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when a page is accessed
|
||||
* The page that is accessed may or may not be in a page frame
|
||||
*
|
||||
* \param virtual_address - the virtual address of the page
|
||||
* \param mem - the memory struct in which the page should be accessed
|
||||
*/
|
||||
void stud_lrua_access_page(memory* mem, uint64_t virtual_address);
|
||||
|
||||
|
||||
/**
|
||||
* \brief function is called, when the clock is advanced
|
||||
*
|
||||
* \param mem - the memory struct on which the algorithm operates on
|
||||
*/
|
||||
void stud_lrua_clock_tick(memory* mem);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
69
projects/bus/bus-02-memory/page_walk.c
Normal file
69
projects/bus/bus-02-memory/page_walk.c
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
#include "page_walk.h"
|
||||
|
||||
/**
|
||||
* \brief Sets the nth bit (flag) to 1 in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to modify.
|
||||
* \param flag The bit position to set (0-63).
|
||||
*
|
||||
* \returns The modified 64-bit integer with the nth bit set to 1.
|
||||
*/
|
||||
uint64_t stud_set_bit(uint64_t value, unsigned int flag){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Tests the nth (flag) bit in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to test.
|
||||
* \param flag The bit position to test (0-63).
|
||||
*
|
||||
* \returns true if the nth bit is set to 1, false otherwise.
|
||||
*/
|
||||
bool stud_test_bit(uint64_t value, unsigned int flag){
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Clears the nth (flag) bit in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to modify.
|
||||
* \param flag The bit position to clear (0-63).
|
||||
*
|
||||
* \returns The modified 64-bit integer with the nth bit cleared.
|
||||
*/
|
||||
uint64_t stud_clear_bit(uint64_t value, unsigned int flag){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Calculates the offset of the levels in the page table
|
||||
*
|
||||
* @param virtual_address: virtual address associated
|
||||
*
|
||||
* @return offset of the levels in the page table
|
||||
*/
|
||||
uint64_t stud_index_page_level_1(uint64_t virtual_address){
|
||||
return 0;
|
||||
}
|
||||
uint64_t stud_index_page_level_2(uint64_t virtual_address){
|
||||
return 0;
|
||||
}
|
||||
uint64_t stud_index_page_level_3(uint64_t virtual_address){
|
||||
return 0;
|
||||
}
|
||||
uint64_t stud_index_page_level_4(uint64_t virtual_address){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Converts a PTE to physical address
|
||||
*
|
||||
* @param pte: page table entry
|
||||
* @param virtual_address: virtual address associated with the PTE
|
||||
*
|
||||
* @return the physical address
|
||||
*/
|
||||
uint64_t stud_pte_to_physical(uint64_t pte, uint64_t virtual_address){
|
||||
return 0;
|
||||
}
|
||||
85
projects/bus/bus-02-memory/page_walk.h
Normal file
85
projects/bus/bus-02-memory/page_walk.h
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
#ifndef PAGE_WALK_H__
|
||||
#define PAGE_WALK_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// The number of bits used to represent the level index in a page table entry.
|
||||
#define LEVEL_INDEX_BITS 9
|
||||
|
||||
// The number of bits used to represent the page offset in a virtual address.
|
||||
#define OFFSET_BITS 12
|
||||
|
||||
|
||||
// Define the possible flags for a page table entry
|
||||
enum flags {
|
||||
PRESENT, // 1 if page frame present in memory
|
||||
READWRITE, // 1 if read/write, 0 if readonly
|
||||
USERSUPERVISOR, // 1 if accessible in user/supervisor, 0 if only supervisor mode
|
||||
};
|
||||
|
||||
enum operation {
|
||||
READ,
|
||||
WRITE,
|
||||
};
|
||||
|
||||
enum mode {
|
||||
USER,
|
||||
SUPERVISOR,
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Sets the nth bit (flag) to 1 in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to modify.
|
||||
* \param flag The bit position to set (0-63).
|
||||
*
|
||||
* \returns The modified 64-bit integer with the nth bit set to 1.
|
||||
*/
|
||||
uint64_t stud_set_bit(uint64_t value, unsigned int flag);
|
||||
|
||||
/**
|
||||
* \brief Tests the nth (flag) bit in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to test.
|
||||
* \param flag The bit position to test (0-63).
|
||||
*
|
||||
* \returns true if the nth bit is set to 1, false otherwise.
|
||||
*/
|
||||
bool stud_test_bit(uint64_t value, unsigned int flag);
|
||||
|
||||
/**
|
||||
* \brief Clears the nth (flag) bit in a 64-bit integer.
|
||||
*
|
||||
* \param value The 64-bit integer to modify.
|
||||
* \param flag The bit position to clear (0-63).
|
||||
*
|
||||
* \returns The modified 64-bit integer with the nth bit cleared.
|
||||
*/
|
||||
uint64_t stud_clear_bit(uint64_t value, unsigned int flag);
|
||||
|
||||
/**
|
||||
* \brief Calculates the offset of the levels in the page table
|
||||
*
|
||||
* @param virtual_address: virtual address associated
|
||||
*
|
||||
* @return offset of the levels in the page table
|
||||
*/
|
||||
uint64_t stud_index_page_level_1(uint64_t virtual_address);
|
||||
uint64_t stud_index_page_level_2(uint64_t virtual_address);
|
||||
uint64_t stud_index_page_level_3(uint64_t virtual_address);
|
||||
uint64_t stud_index_page_level_4(uint64_t virtual_address);
|
||||
|
||||
/**
|
||||
* \brief Converts a PTE to physical address
|
||||
*
|
||||
* @param pte: page table entry
|
||||
* @param virtual_address: virtual address associated with the PTE
|
||||
*
|
||||
* @return the physical address
|
||||
*/
|
||||
uint64_t stud_pte_to_physical(uint64_t pte, uint64_t virtual_address);
|
||||
|
||||
|
||||
#endif // PAGE_WALK_H__
|
||||
Loading…
Reference in a new issue