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

📄 page.c

📁 raywill写的操作系统内核
💻 C
字号:
/*		思考方式:我们只有一个进程!他拥有整个内存空间		*/
		typedef struct{ long a; }PDE;
		typedef struct{ long a; }PTE;


		typedef struct __page_list{
			int	isfree;
			PAGE *page;
			struct __page_list *next;
		}PAGE_LIST;
		
#define NULL_PAGE_LIST	(PAGE_LIST *)0;
#define NULL_PAGE				(PAGE *)0;

		void *alloc_page(long linear_addr)/*return a pointer point to the memory*/
		{
				PDE *pde_p;
				PTE	* pte_p;
				/*now let the task page table and page directory know this page*/
				pde_t=(PDE *)(CR0+(linear_addr>>22)*4);
				if(*pde_t==0){			/* in this case, we need a new entry in PD*/
					PAGE *page_table;
					page_table=find_free_page();
					*pde_t=page_table<<12|SYS_PAGE_DIR_BITS;
				}
				pte_p=(PTE*)(*pde_t>>12);
				/*now,let us get a free PAGE, page point to the start of the free memory*/
				page=find_free_page();
				*pte_p=(page<< 12|SYS_PAGE_TABLE_BITS);
				/*so far ,according to the linear address ,we have written the content to the page table*/
				return page;	/*return the page we have got */				
		}
/* We maintained a list ,recorded all pages we have */
		PAGE *find_free_page(void)
		{
				PAGE_LIST *p;
				while(p!=NULL_PAGE_LIST){
					if(p->isfree)
						return p->page;
					p=p->next;
				}
				return NULL_PAGE;
		}
		
/* Do you really think we need this?
		int fill_page(long pte,long *phyaddr);
		{
				(*phyaddr)=pte;
				return	0;
		}
*/



		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -