add lab answers
This commit is contained in:
65
labcodes_answer/lab5_result/kern/mm/swap.h
Normal file
65
labcodes_answer/lab5_result/kern/mm/swap.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#ifndef __KERN_MM_SWAP_H__
|
||||
#define __KERN_MM_SWAP_H__
|
||||
|
||||
#include <defs.h>
|
||||
#include <memlayout.h>
|
||||
#include <pmm.h>
|
||||
#include <vmm.h>
|
||||
|
||||
/* *
|
||||
* swap_entry_t
|
||||
* --------------------------------------------
|
||||
* | offset | reserved | 0 |
|
||||
* --------------------------------------------
|
||||
* 24 bits 7 bits 1 bit
|
||||
* */
|
||||
|
||||
#define MAX_SWAP_OFFSET_LIMIT (1 << 24)
|
||||
|
||||
extern size_t max_swap_offset;
|
||||
|
||||
/* *
|
||||
* swap_offset - takes a swap_entry (saved in pte), and returns
|
||||
* the corresponding offset in swap mem_map.
|
||||
* */
|
||||
#define swap_offset(entry) ({ \
|
||||
size_t __offset = (entry >> 8); \
|
||||
if (!(__offset > 0 && __offset < max_swap_offset)) { \
|
||||
panic("invalid swap_entry_t = %08x.\n", entry); \
|
||||
} \
|
||||
__offset; \
|
||||
})
|
||||
|
||||
struct swap_manager
|
||||
{
|
||||
const char *name;
|
||||
/* Global initialization for the swap manager */
|
||||
int (*init) (void);
|
||||
/* Initialize the priv data inside mm_struct */
|
||||
int (*init_mm) (struct mm_struct *mm);
|
||||
/* Called when tick interrupt occured */
|
||||
int (*tick_event) (struct mm_struct *mm);
|
||||
/* Called when map a swappable page into the mm_struct */
|
||||
int (*map_swappable) (struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in);
|
||||
/* When a page is marked as shared, this routine is called to
|
||||
* delete the addr entry from the swap manager */
|
||||
int (*set_unswappable) (struct mm_struct *mm, uintptr_t addr);
|
||||
/* Try to swap out a page, return then victim */
|
||||
int (*swap_out_victim) (struct mm_struct *mm, struct Page **ptr_page, int in_tick);
|
||||
/* check the page relpacement algorithm */
|
||||
int (*check_swap)(void);
|
||||
};
|
||||
|
||||
extern volatile int swap_init_ok;
|
||||
int swap_init(void);
|
||||
int swap_init_mm(struct mm_struct *mm);
|
||||
int swap_tick_event(struct mm_struct *mm);
|
||||
int swap_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in);
|
||||
int swap_set_unswappable(struct mm_struct *mm, uintptr_t addr);
|
||||
int swap_out(struct mm_struct *mm, int n, int in_tick);
|
||||
int swap_in(struct mm_struct *mm, uintptr_t addr, struct Page **ptr_result);
|
||||
|
||||
//#define MEMBER_OFFSET(m,t) ((int)(&((t *)0)->m))
|
||||
//#define FROM_MEMBER(m,t,a) ((t *)((char *)(a) - MEMBER_OFFSET(m,t)))
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user