📄 paging.h
字号:
#ifndef _PAGING_H
#define _PAGING_H
/*constants related page table/directory entry*/
#define PRESENT 0x01
#define RD_WR 0x02
#define USR_SUP 0x04
#define ACCESSED 0x20
#define DIRTY 0x40
#define MARKED 0x200
#define LAST_PAGE 0x400
#define GET_PAGE_ADDRS(entry) (entry & 0xfffff000)
#define IS_MARKED(entry) (entry & MARKED)
#define PAGE_SIZE 4096
#define NUM_PAGE_ENTRIES 1024
#define GET_PAGE_NUM(tab,ent) (NUM_PAGE_ENTRIES*tab+ent)
#define GET_TAB_NO(page) ((page) / NUM_PAGE_ENTRIES)
#define GET_ENT_NO(page) ((page) % NUM_PAGE_ENTRIES)
class paging
{
private:
uint *page_dir;
int num_tables;
int alloc_start;
public:
paging();
~paging();
inline uint get_pde(int entry_no)
{
return page_dir[entry_no];
}
inline uint get_pte(int ptn,int entry_no)
{
if(ptn<0 || ptn>num_tables) return 0;
uint pde = get_pde(ptn);
uint *pta = (uint*)GET_PAGE_ADDRS(pde);
return pta[entry_no];
}
inline void set_pde(int entry_no,uint entry)
{
page_dir[entry_no] = entry;
}
inline void set_pte(int ptn,int entry_no,uint entry)
{
if(ptn<0 || ptn>num_tables) return;
uint pde = get_pde(ptn);
uint *pta = (uint*)GET_PAGE_ADDRS(pde);
pta[entry_no] = entry;
}
inline void mark_page(int page)
{
uint ptn = GET_TAB_NO(page);
uint pen = GET_ENT_NO(page);
uint entry = get_pte(ptn,pen);
entry = entry | MARKED;
set_pte(ptn,pen,entry);
}
inline void unmark_page(int page)
{
uint ptn = GET_TAB_NO(page);
uint pen = GET_ENT_NO(page);
uint entry = get_pte(ptn,pen);
entry = entry & ~MARKED;
set_pte(ptn,pen,entry);
}
inline void mark_last_page(int page)
{
uint ptn = GET_TAB_NO(page);
uint pen = GET_ENT_NO(page);
uint entry = get_pte(ptn,pen);
entry = entry | LAST_PAGE;
set_pte(ptn,pen,entry);
}
inline void set_alloc_start(int a_start)
{
alloc_start = a_start;
}
void* init_paging(uint *dir_base);
void* alloc_pages(int num_pages);
void free_pages(void *addr);
int get_free_pages(int num_pages);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -