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项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现 ...
随机推荐
- python修改植物僵尸
import win32process#进程模块 import win32con#系统定义 import win32api#调用系统模块 import ctypes#C语言类型 import win3 ...
- SnackDown Online Pre-elimination round A
1. 应该n是偶数,就行吧.应该判断1个人,只能出现一次吧. #include<bits/stdc++.h> #define pb push_back typedef long long ...
- doctype声明 过渡transitional 严格strict 框架frameset
DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本. 其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义 ...
- JSON与List之间的转换
jsonString转换为list: JSONArray jsonArray=JSONArray.fromObject(result); List<RentCar> books=(List ...
- Power BI 入门资料
1.官方文档 Power BI Desktop:https://docs.microsoft.com/zh-cn/power-bi/desktop-getting-started Power BI 报 ...
- 《Java编程思想》学习笔记(一)
1——面向对象和JVM基础 1.java中的4种访问制权限: (1).public:最大访问控制权限,对所有的类都可见. (2).protect:同一包可见,不在同一个包的所有子类也可见. (3). ...
- numpy安装失败-小失误
1. 古老的方法: 安装python numpy库AMD64 失败,网上的教程是这样的:http://www.cnblogs.com/zhuyp1015/archive/2012 ...
- Js正则匹配处理时间
<html> <body> <script type="text/javascript"> //将long 型 转换为 日期格式 年-月-日 h ...
- Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解
梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在H ...
- 深度遍历DFS
目录: https://zhipianxuan.github.io/ 一.树的DFS 二.二维矩阵的DFS 三.图的DFS 一.题目一:二维矩阵(输出所有路径数) 思路:从起点开始,DFS,直到走到终 ...