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项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现 ...
随机推荐
- E20170816-mk
deque 即双端队列.是一种具有队列和栈的性质的数据结构. revert vi. 恢复; 重提; 回到…上; <律>归还; n. 归属; 恢复原来信仰的人; Indicator ...
- 前端常见面试题总结part2
今天总结了几道,感觉非常有意思的题,有感兴趣的可以看下,有疑问请留言~ (答案在最后) 考察自执行函数的this指向 审题要细心 var n = 2, obj = { n:2, fn:(functio ...
- String和八种基本数据类型互相转换
//String转换为对应的八种基本数据类型 String str="100"; //Value out of range. Value:"200" Radix ...
- SVN 报错 sqlite[S11]: database disk image is malformed
svn 提示数据库损坏 SVN 报错 sqlite[S11]: database disk image is malformed 解决办法:网上说的打开wc.db删除lock表 不管用.我发现这样可以 ...
- MVC简单的解释
MVC (Model-View-Controller,模型视图控制器)是一种软件的设计模式,它最早是由 20 世纪 70 年代的 Smalltalk 语言提出的,即把一个复杂的软件工程分解为三个层 ...
- node函数buf.readDoubleBE详解
offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readDoubleBE() 返回一个较 ...
- DeltaFish 校园物资共享平台 第五次小组会议
软工第五次小组会议 记录人:娄雨禛 会议地点:三教讨论区 会议时间:9:00-10:00 与会人员:软工小组成员 一.前端会议提要 前端分为“2+2”组合进行开发. 底层设计:齐天扬,刘鼎乾 界面美化 ...
- 获取XML里指定的节点内容信息
HttpContent bw = new StringContent(StrXml, Encoding.UTF8, "application/Xml"); var Msg = aw ...
- XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常
因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 XML ...
- APICloud 获取缓存以及清除缓存(常用第三方方法)
一.app中经常会有缓存的清除这个操作,具体如下 1.获取缓存大小 apiready = function() { api.getCacheSize(function(ret, err) { //si ...