⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paging.h

📁 Jazmyn is a 32-bit, protected mode, multitasking OS which runs on i386 & above CPU`s. Its complete
💻 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 + -