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();
}
IA32 MMU paging初始化代码的更多相关文章
- css初始化代码
最近老有新项目开发,一直在找存留的CSS初始化代码,索性放到这里备份下, @charset "utf-8"; /* -------------------------------- ...
- 0023 Java学习笔记-面向对象-初始化代码块
初始化代码块 在18篇-类的基本要素中说到,类的三大成员:成员变量.构造方法.方法,初始化代码块是类的第4个成员 初始化块用于对类或者对象的初始化, 一个类的初始化块可以有0-多个,按先后顺序执行 跟 ...
- 各大门户网站的css初始化代码
腾讯QQ官网 css样式初始 body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select ...
- css初始化代码方案
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-06-24) 为了消除各浏览器对css默认的设置,保持网页在各浏览器中的外观保持一致,初始化css就显得非常必要了!很多时候 ...
- 一天搞定CSS: 标签样式初始化(CSS reset)及淘宝样式初始化代码--09
样式初始化:是指对HTML中某些标签的默认样式进行清除 样式初始化目的: 不同浏览器的默认样式不一样,若不清理,会导致相同的代码在浏览器中解析结果不一样,为了避免这种情况,所以需要进行样式初始化. 代 ...
- Swift中如何化简标准库中冗长的类实例初始化代码
可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let share ...
- Golang 引用库中含有初始化代码时如何引用
简单点说吧,要在引用库前加'_'符号 给出示例 //foo.go // /usr/local/go/pkg/src/foo/foo.go package foo import "fmt&qu ...
- 该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()。
WebAPI使用属性路由,配置config.MapHttpAttributeRoutes();后出现错误: System.InvalidOperationException: 该对象尚未初始化.请确保 ...
- SpringBoot程序启动时执行初始化代码
因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis. 在SpringBoot项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现 ...
随机推荐
- yii widget使用的3个用法
yii视图中使用的widget方式总结:常用的有3种方式:一.显示详细信息: $this->widget('zii.widgets.CDetailView', array( 'data' =&g ...
- BZOJ 3876 有上下界的网络流
思路: 套用有上下界的网络流 就好了 (这算是裸题吧) 比如 有条 x->y 的边 流量上限为R 下限为L 那么du[x]-=L,du[y]+=L 流量上限变成R-L du[x]>0 ...
- CSS3 3D变换实例 滚动的正方体
笔记: 2D变换 transform 位移 translateX() translateY() 简写:translate(X值,Y值) 正值向右,负值向左 旋转 rotate() rotat ...
- OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
教程转载来自 残芯此生不换 OPPO R9sPlus 目前最简单的刷Recovery root 方法,强烈推荐 新机想要刷第三方卡刷包的最简单过程是: 手机关机-->下载M ...
- C#的WebBrowser操作frame
刚学c#不久,也不太懂什么IHTMLDocument.IHTMLDocument2.IWebBrowser2等等.自己琢磨了好久,终于知道了怎么用WebBrowser操作frame和iframe. 1 ...
- AMQP及RabbitMQ
AMQPAMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程. ...
- OpenCV : 基于切线方向的边缘增强算法
使用切线方法,对切线方向上的边缘进行强化: 参考连接:图像锐化和边缘检测 代码: //在种子点方向上寻找合适的梯度,用于寻找边缘 //对low_Gray, high_gray之间的点寻找边缘 void ...
- Python统计字符串中出现次数最多的人名
人名最多数统计题目摘自https://python123.io 描述编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名. ...
- shell脚本—基础知识,变量
shell脚本本质: 编译型语言 解释型语言 shell编程基本过程 1.建立shell文件 2.赋予shell文件执行权限,使用chmod命令修改权限 3.执行shell文件 shell变量: sh ...
- shell常用语法
for.if条件: https://blog.51cto.com/qiufengsong/1252889 一.for循环: );do echo $i done ###第一行:seq是指1到10,第二行 ...