IA32 MMU paging初始化代码

写了一段IA32 paging通用构造代码。有须要的。能够拿去

#define PDE_FLG_RW (1<<1)
#define PDE_FLG_US (1<<2)
#define PDE_FLG_RWT (1<<3)
#define PDE_FLG_PCD (1<<4)
/*
 * initialize to be zero for page directory and page table
*/
static __SECTION_ZERO_INIT("PAGE_DIR") __align(4096) U32 paging_pde[1<<10];
static __SECTION_ZERO_INIT("PAGE_TABLE") __align(4096) U32 paging_pte_4k[1<<10][1<<10];
/*
 * viraddr: virtual address/linear address (must be 4KB align)
 * phyaddr: physical address (must be 4KB align)
 * size: in bytes
*/
static void paging_4k(U32 viraddr, U32 phyaddr, U32 flags)
{
	U32 viraddr_pd = viraddr>>22;
	U32 viraddr_pt = (viraddr>>12) & 0x3FF;
	/*page directory*/
	paging_pde[viraddr_pd] = (U32)(&(paging_pte_4k[viraddr_pd][viraddr_pt])) & 0xFFFFF000;
	paging_pde[viraddr_pd] |= flags;
	paging_pde[viraddr_pd] |= 1;
	paging_pde[viraddr_pd] &= (~(1<<7));

	/*page table*/
	paging_pte_4k[viraddr_pd][viraddr_pt] = phyaddr & 0xFFFFF000;
	paging_pte_4k[viraddr_pd][viraddr_pt] |= flags;
	paging_pte_4k[viraddr_pd][viraddr_pt] |= 1;
}

static void paging_4k_frames(U32 viraddr, U32 phyaddr, U32 size, U32 flags)
{
	U32 i, count = size >> 12;
	for(i=0; i<count; i++)
	{
		paging_4k(viraddr+((1<<12)*i), phyaddr+((1<<12)*i), flags);
	}
}

/*
 * viraddr: virtual address/linear address (must be 4MB align)
 * phyaddr: physical address (must be 4MB align)
 * size: in bytes
*/
static void paging_4m(U32 viraddr, U32 phyaddr, U32 flags)
{
	U32 viraddr_pd = viraddr>>22;

	/*page directory*/
	paging_pde[viraddr_pd] = phyaddr & 0xFFC00000;
	paging_pde[viraddr_pd] |= flags;
	paging_pde[viraddr_pd] |= 1;
	paging_pde[viraddr_pd] |= (1<<7);
}

static void paging_4m_frames(U32 viraddr, U32 phyaddr, U32 size, U32 flags)
{
	U32 i, count = size >> 22;
	for(i=0; i<count; i++)
	{
		paging_4m(viraddr+((1<<22)*i), phyaddr+((1<<22)*i), flags);
	}
}

static void paging_frames(U32 viraddr, U32 phyaddr, U32 size, U32 flags)
{
	/* direct mapping */
	if(size & 0x3FFFFF)
	{
		paging_4k_frames(phyaddr, phyaddr, size, flags);
	}
	else
	{
		paging_4m_frames(phyaddr, phyaddr, size, flags);
	}
}

void paging_uncache(U32 phyaddr, U32 size)
{
	/* direct mapping */
	paging_frames(phyaddr, phyaddr, size, PDE_FLG_PCD|PDE_FLG_US|PDE_FLG_RW);
}

void paging_code(U32 phyaddr, U32 size)
{
	/* direct mapping */
	paging_frames(phyaddr, phyaddr, size, PDE_FLG_US);
}

void paging_data(U32 phyaddr, U32 size)
{
	/* direct mapping */
	paging_frames(phyaddr, phyaddr, size, PDE_FLG_US|PDE_FLG_RW);
}
void * paging_pde_addr()
{
	return (void *)paging_pde;
}

void paging_enable(void)
{
	U32 cr0;
	asm volatile("mov %%cr0, %0": "=r"(cr0));
	cr0 |= (1<<31);
	asm volatile("mov %0, %%cr0":: "r"(cr0));
}

void paging_setup()
{
	/* peripherial registers */
	paging_uncache(0xE0000000, 0x20000000);
	/* code & data areas */
	paging_uncache(0x00000000, 0x40000000);

	paging_enable();
}
时间: 2024-10-19 09:36:35

IA32 MMU paging初始化代码的相关文章

该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用

WebAPI使用属性路由,配置config.MapHttpAttributeRoutes();后出现错误: System.InvalidOperationException: 该对象尚未初始化.请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized(). 在 System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() 在 System.Web.Http.Routi

Swift中如何化简标准库中冗长的类实例初始化代码

可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let sharedInstance = CFoo() } struct SFoo{ static let sharedInstance = SFoo() } let foo:CFoo = .sharedInstance let f:SFoo = .sharedInstance 以上代码中可以看到,foo类型为CFo

css初始化代码方案 ——转

为什么要初始化CSS? CSS初始化是指重设浏览器的样式(即reset.css).不同的浏览器默认的样式可能不尽相同,所以开发时的第一件事可能就是如何把它们统一.如果没对CSS初始化往往会出现浏览器之间的页面差异.每次新开发网站或新网页时候通过初始化CSS样式的属性,为我们将用到的CSS或html标签更加方便准确,使得我们开发网页内容时更加方便简洁,同时减少CSS代码量,节约网页下载时间. 为了消除各浏览器对css默认的设置,保持网页在各浏览器中的外观保持一致,初始化css就显得非常必要了!很多

css初始化代码方案

为了消除各浏览器对css默认的设置,保持网页在各浏览器中的外观保持一致,初始化css就显得非常必要了!很多时候出现的样式不兼容问题,都可以通过css初始化代码来解决.下面列举常用的一些方案: 1.最耗资源的,最简单的 * { padding: 0; margin: 0; border: 0; } 2.选择性初始化举例(综合) body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,legend,button form,fieldset,inpu

初始化代码块和构造器的执行顺序

1 package Lab5; 2 3 4 class Root{ 5 static{ 6 System.out.println("Root的静态初始化"); 7 } 8 { 9 System.out.println("Root普通初始化代码"); 10 } 11 public Root(){ 12 System.out.println("root 无参数构造方法"); 13 }; 14 } 15 16 class Mid extends Roo

第二阶段:修改初始化代码

代码运行到了第二阶段代码lib_arm/board.c中的start_armboot函数,开始了系统的全面初始化. 1.修改lib_arm/board.c 这个文件的修改主要是关闭AT9200写的代码,增加LED的点亮,在初始化console后和进入命令行之前各点亮一个LED(第二个的点亮在其中的board_init函数中),增加打印信息(for LED console).#include <common.h> #include <command.h> #include <m

android 布局 View初始化代码自动生成

在android开发过程中,界面布局是及其重要的,但同时也是复杂.有的时候我们急于实际运行查看布局效果.但是android的编译速度我实在不想吐槽啥,尤其在布局越来越复杂,项目越来越大,资源文件越来越多的情况下. 尤其是是android的view的初始化,findViewbyId 完全是体力活,我们完全可以根据布局文件自动生成View的初始化代码. 首先声明: 1.这是及其容易做到的,实用性性一般,但是在复杂布局和首次写初始化View代码的时候及其好用. 2.只能生成有id标签的view的初始化

SpringBoot程序启动时执行初始化代码

因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis. 在SpringBoot项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现ApplicationListener接口的类 package com.stone; import com.stone.service.IPermissionService; import org.springframework.context.ApplicationListener; import

样式初始化代码

淘宝的样式初始化代码: body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; } body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53;