- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了几个小时尝试更改存储在 CR3
寄存器中的方向,用我加载的新方向替换 Pure64 加载的方向。
我正在做的是从 8 Mib 内存上方的方向获取 4 KiB 页面,以确保我不会踩踏任何内核、用户区或 Pure64 模块,并将其用作新的PML4 的方向。
我用我需要的东西加载新的 PML4,但是当我执行该行
mov cr3,rdi
其中rdi
存储新的PML4方向,然后qemu不断地无限重启。
现在,如果我硬编码 Pure64 PML4 方向(0x2008
)并执行与以前相同的操作,则调用指令时不会有问题
mov cr3,rdi
并且操作系统正确执行。
发生这种情况是否是因为 Pure64 仍然需要使用 CR3
寄存器加载的表?
在这里,我留下加载 pml4 方向的代码:
(请注意,我一直将一些注释行用于调试目的。)
/* Ideas and Code extracted and modified from Wyrm OS.
Project Repository: https://bitbucket.org/RowDaBoat/wyrm/wiki/Home */
#include <virtualMemoryManager.h>
#include <mem.h>
#include <libc.h>
#include <terminal.h>
#include <own_cpu.h>
static const uint32_t presentBit = 0;
static const uint32_t writeBit = 1;
static const uint32_t userBit = 2;
static const uint32_t pageWriteThroughBit = 3;
static const uint32_t pageCacheDisableBit = 4;
static const uint32_t accessedBit = 5;
static const uint32_t dirtyBit = 6;
static const uint32_t pageSizeBit = 7;
static const uint32_t globalBit = 8;
static const uint32_t pageAttributeTableBit = 12;
static const uint32_t addressBit = 30;
static const uint64_t addressMask4KiB = 0x0000000FFFFFFFFF000;
static const uint64_t addressMask2MiB = 0x0000000FFFFFFE00000;
static const uint64_t addressMask1GiB = 0x0000000FFFFC0000000;
static const uint32_t executeDisableBit = 63;
// static const uint64_t pageSize = 4092; /* no entiendo xqq setea este tamaño de página */
static inline void setBit(uint64_t * bits, uint32_t n, bool value) {
if (value)
*bits |= (1 << n);
else
*bits &= ~(1 << n);
}
static inline bool getBit(uint64_t bits, uint32_t n) {
return bits & (1 << n);
}
static PageTableEntry* createTable() {
PageTableEntry * table = (PageTableEntry*) mt_mem_alloc(1);
memset(table, 0, PAGESIZE); /* defined at libc.h */
return table;
}
static inline PageTableEntry * clear(PageTableEntry * page) {
for (uint64_t i = 0; i < PAGESIZE / sizeof(PageTableEntry); i++)
page[i].contents = 0;
return page;
}
int initializeVirtualMemory()
{
PageTableEntry * pml4 = createTable();
/* +++xdebug */
if (pml4 == NULL) {
print("\nCANNOT SET PML4.\n");
return false;
}
PageTableEntry * pageDirectoryPointerTable = createTable();
/* +++xdebug */
if (pml4 == NULL) {
print("\nCANNOT SET PML4.\n");
return false;
}
/* +++xdebug */
// pml4 = 0x00002000;
// pml4 = 0;
pml4 = 0x00804008;
// pml4 = (uint64_t pml4) & 0x8;
//Set up the pml4, this table will be used by all mappings, kernel and user
PageTableEntry *currentEntry = &(pml4[0]);
print("\ncurrentEntry: ");
printHex(pml4);
println();
/* +++xdebug */
print("\nAntes de setar Presente: ");
printHex(currentEntry->contents);
//printInt(PageTableEntry_getPresent(currentEntry));
PageTableEntry_setPresent(currentEntry, false);
PageTableEntry_setWritable(currentEntry, false);
PageTableEntry_setUser(currentEntry, false);
PageTableEntry_setPageWriteThrough(currentEntry, true);
PageTableEntry_setPageCacheDisable(currentEntry, false);
PageTableEntry_setAccessed(currentEntry, false);
PageTableEntry_setPageSize(currentEntry, false);
PageTableEntry_setExecuteDisable(currentEntry, false);
PageTableEntry_set4KiBPageAddress(currentEntry, pageDirectoryPointerTable);
print("\nDespues de setar Presente: ");
printHex(currentEntry->contents);
//printInt(PageTableEntry_getPresent(currentEntry));
char * page1GiB = (char*)0x0;
//Identity map first 512 GiB (that should be all memory)
for (int i = 0; i < 512; i++, page1GiB += oneGiB) {
currentEntry = &(pageDirectoryPointerTable[i]);
PageTableEntry_setPresent(currentEntry, true);
PageTableEntry_setWritable(currentEntry, true);
PageTableEntry_setUser(currentEntry, true);
PageTableEntry_setPageWriteThrough(currentEntry, false);
PageTableEntry_setPageCacheDisable(currentEntry, false);
PageTableEntry_setAccessed(currentEntry, false);
PageTableEntry_setPageSize(currentEntry, true);
PageTableEntry_set1GiBPageAddress(currentEntry, page1GiB);
/* +++xdebug */
if (i < 5) {
print("\nPage Start at: ");
printHex(currentEntry->contents);
println();
}
}
//Update CR3 with the new mapping
_writeCR3((uint64_t)pml4);
return true;
}
PageTableEntry * PageTableEntry_setPresent(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), presentBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setWritable(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), writeBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setUser(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), userBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setPageWriteThrough(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), pageWriteThroughBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setPageCacheDisable(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), pageCacheDisableBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setAccessed(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), accessedBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setDirty(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), dirtyBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setPageSize(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), pageSizeBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setGlobal(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), globalBit, value);
return entry;
}
PageTableEntry * PageTableEntry_setPageAttribueTable(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), pageAttributeTableBit, value);
return entry;
}
PageTableEntry * PageTableEntry_set4KiBPageAddress(PageTableEntry * entry, void * address) {
entry->contents = ((uint64_t)address & addressMask4KiB) | (entry->contents & ~addressMask4KiB);
return entry;
}
PageTableEntry * PageTableEntry_set2MiBPageAddress(PageTableEntry * entry, void * address) {
entry->contents = ((uint64_t)address & addressMask2MiB) | (entry->contents & ~addressMask2MiB);
return entry;
}
PageTableEntry * PageTableEntry_set1GiBPageAddress(PageTableEntry * entry, void * address) {
entry->contents = ((uint64_t)address & addressMask1GiB) | (entry->contents & ~addressMask1GiB);
return entry;
}
PageTableEntry * PageTableEntry_setExecuteDisable(PageTableEntry * entry, bool value) {
setBit(&(entry->contents), executeDisableBit, value);
return entry;
}
bool PageTableEntry_getPresent(PageTableEntry * entry) {
return getBit(entry->contents, presentBit);
}
bool PageTableEntry_getWritable(PageTableEntry * entry) {
return getBit(entry->contents, writeBit);
}
bool PageTableEntry_getUser(PageTableEntry * entry) {
return getBit(entry->contents, userBit);
}
bool PageTableEntry_getPageWriteThrough(PageTableEntry * entry) {
return getBit(entry->contents, pageWriteThroughBit);
}
bool PageTableEntry_getPageCacheDisable(PageTableEntry * entry) {
return getBit(entry->contents, pageCacheDisableBit);
}
bool PageTableEntry_getAccessed(PageTableEntry * entry) {
return getBit(entry->contents, accessedBit);
}
bool PageTableEntry_getDirty(PageTableEntry * entry) {
return getBit(entry->contents, dirtyBit);
}
bool PageTableEntry_getPageSize(PageTableEntry * entry) {
return getBit(entry->contents, pageSizeBit);
}
bool PageTableEntry_getGlobal(PageTableEntry * entry) {
return getBit(entry->contents, globalBit);
}
bool PageTableEntry_getPageAttribueTable(PageTableEntry * entry) {
return getBit(entry->contents, pageAttributeTableBit);
}
void * PageTableEntry_get4KiBPageAddress(PageTableEntry * entry) {
return (void*)(entry->contents & addressMask4KiB);
}
void * PageTableEntry_get2MiBPageAddress(PageTableEntry * entry) {
return (void*)(entry->contents & addressMask2MiB);
}
void * PageTableEntry_get1GiBPageAddress(PageTableEntry * entry) {
return (void*)(entry->contents & addressMask1GiB);
}
bool PageTableEntry_getExecuteDisable(PageTableEntry * entry) {
return getBit(entry->contents, executeDisableBit);
}
最佳答案
问题是我试图直接映射 1GB 物理内存,而 qemu 2.0.0.0 没有为此做好准备。我所要做的就是安装 qemu 2.4.0.1 并在禁用 kvm 的情况下运行 VM。
我希望没有其他人遇到这个问题。
关于无法使用 pure64 更改 cr3 寄存器以指向新的 pml4 方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33394237/
我正在使用 Ubuntu 15.04 和 vim-gnome 7.4。 当我运行时: vim --version | grep -i +ruby 它返回: +ruby 基于:Vim Ruby Supp
我正在编写一个测试脚本,它将简单地运行带有几个参数的 *.EXE 文件,然后将结果输出到一个文件。我有一个 *.sh 测试脚本可以正确运行测试(但需要手动更新更多测试)。此脚本中的行如下所示: bla
我想知道之间的区别(如果可能的话提供示例)CR LF (Windows)、LF (Unix) 和 CR (Macintosh) 换行符类型。 最佳答案 CR和LF是控制字符,分别编码为0x0D(十进制
我正在尝试使用 PHP 正则表达式来查找 CR 3492161 或 cr 3492161。我尝试使用以下正则表达式,但它不起作用。请求你的帮助。 :-) 'CR\s/^\d{7}$/' 'CR\h/^
交换换行符(例如通过某些文本编辑器)是否会破坏 javascript 代码? 最佳答案 两个控制字符都是valid line breaks .事实上你甚至不需要换行符。这只是为了更好的可读性。除了在字
这个问题已经有答案了: How to correct variable overwriting misbehavior when parsing output? (3 个回答) 已关闭 5 年前。 我
好的,我计划创建一个文件来存储我将导入到程序中的数据。该程序将为 Linux、Windows 和可能的 Mac 编译。 现在我真正想知道的是,由于这些文件中的换行符,我是否需要这些数据文件略有不同,或
建议以下计划: import java.io.StringReader; import javax.xml.transform.OutputKeys; import javax
我正在尝试将“,”和“\n”放入文件中。所有值都是 0 ,除了 4, 9, 14, 19, 23...我放置 ',' 和 '\n' 但是输出即将到来: 0000,0000,0000,0000,0000
我一直在尝试通过 Python 学习 Open ERP 模块开发。我想出了一个我认为我不理解的源代码。我在浏览时尝试了几个互联网链接,但找不到有用的链接。我非常需要理解这一点。 cr.execute(
我目前正在使用 JSP 生成一些 vCard。我发现一些平台无法识别这些生成的 vCard,除非它们的行由回车符 (CR) 分隔,而 JSP 似乎默认只使用换行符 (LF) 来分隔行。 你们知道有什么
验证用户时出现以下错误:purchase_user@purchase 失败。 MongoDB-CR 身份验证失败。当我通过浏览器访问网络服务时,用户文档中缺少凭据。 但我能够从 mongo 验证 pu
首先我想说我已经阅读了 this post但是我仍然对 CR line terminators 有问题. 有一个文件叫build_test.sh , 我编辑在 leafpad它可以直接显示在 Vim
我最近才开始使用 vim,并且在添加大量有用的插件时玩得很开心。问题是,在设置所有插件期间的某个时候,我没有注意到 enter 键的映射停止正常工作。在插入模式下,当我按下 Enter 键时,如果当前
我正在寻找一种在 vim 中突出显示 ^M(CR) 的方法。 最佳答案 确保文件格式设置为 unix 或 mac 我的是: set fileformats=unix,mac 如果是 DOS,您将看不到
假设我有一个程序(例如在Perl中),将这样的内容写入STDOUT: print "123\t- 456"; print "\r+\n"; 在我的屏幕上,我看到以下结果: 123 + 456
我正在编写一个在特定条件下自动插入一些文本的函数。当我尝试模拟 Enter press 时,我卡在了某个部分。我想出了这个(显而易见的)代码: execute "normal! a\" 问题是它破坏了
我有一个 HTML 页面中的元素。我正在用 JavaScript 向其中写入数据,并想稍后检查用户是否更改了文本。但是,如果数据包含任何回车符,它们似乎会被悄悄删除,因此将从文本区域读取的文本与应该存
各位正则表达式专家, 我有一个充满表达式的平面文件,例如: SELECT * FROM CONVENIENT_ONE_LINE_QUERY "SELECT * FROM THIS_QUERY WHER
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我是一名优秀的程序员,十分优秀!