来自过去的操作系统final的示例问题,我该如何计算这类问题?
计算机具有64位虚拟地址空间和2048字节页面.页表条目需要4个字节.使用多级页表,因为每个表必须包含在页面中.需要多少级别?
我该如何计算?
remap_pfn_rangefunction(用于mmap调用驱动程序)可用于将内核内存映射到用户空间.怎么做?谁能解释一下精确的步骤?内核模式是特权模式(PM),而用户空间是非特权(NPM).在PM中,CPU可以访问所有内存,而在NPM中,某些内存受到限制 - CPU无法访问.当remap_pfn_range被调用时,用户空间现在可以访问仅限于PM的内存范围?
看remap_pfn_range代码有pgprot_t struct.这是与保护映射相关的结构.什么是保护映射?这是上述问题的答案吗?
kernel-module linux-device-driver linux-kernel virtual-address-space
我正在开发一个C#程序,它将加载文件并获取诸如加载文件创建日期,修改日期,大小等信息.我需要知道的另一件事是加载的文件(executable.exe)是否与LARGEADDRESSAWARE标志链接.FileInfo类不提供此信息.
有谁知道如何在C#中找出给定的execute.exe是否与LARGEADDRESSAWARE标志链接(处理大于2 GB的地址)?
我的代码如下:
#include<stdio.h>
int glob;
int main(void)
{
int a;
printf("&a is : %p \n", &a);
printf("glob is : %p \n", &glob);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出是:首先运行:
&a is : 0x7fff70de91ec
glob is : 0x6008f4
Run Code Online (Sandbox Code Playgroud)
第二轮:
&a is : 0x7fff38c4c7ac
glob is : 0x6008f4
Run Code Online (Sandbox Code Playgroud)
我正在研究虚拟和物理地址.我有以下问题:
在Linux上执行此程序:2.6.18-308.el5 x86_64 GNU/Linux
编译使用:gcc版本4.1.2 20080704(Red Hat 4.1.2-52)
我参加了一个关于操作系统设计和概念的课程,现在我正在努力学习Linux内核.我有一个我无法摆脱的问题.在现代操作系统中,每个进程都有自己的虚拟地址空间(VAS)(例如,在32位系统中为0到2 ^ 32-1).这提供了许多优点.但在实施中,我在某些方面感到困惑.让我通过举个例子来解释一下:
假设我们有两个过程p1,p2; p1和p2有自己的VAS.地址0x023f4a54映射到不同的物理地址(PA),它怎么可能?如何以这种方式完成此翻译.我的意思是我知道翻译机制,但我不明白,当它来到不同进程的地址空间时,相同的地址被映射到不同的物理地址.
0x023f4a54 in p1's VAS => PA 0x12321321
0x023f4a54 in p2's VAS => PA 0x23af2341 # (random addresses)
Run Code Online (Sandbox Code Playgroud) 我读到,"当程序执行如下指令时MOV REG,1000,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式生成地址.
这些程序生成的地址称为虚拟地址,形成虚拟地址空间."
任何人都可以请解释一下,它是什么(这些程序生成的地址称为虚拟地址)是什么意思?
architecture virtual operating-system virtual-address-space memory-address
我在内存中有一个地址,我想找出该内存地址的权限(r/w/x).
例如
char *s = "hello";
Run Code Online (Sandbox Code Playgroud)
这里,字符串文字"hello"存储在只读存储器中.通过gdb运行程序时,是否有可能检查该内存地址的权限(是否只允许读取等)?
我在64位Windows操作系统上看到,可用的用户虚拟地址空间是8个terra字节.但是,如果我们正在执行的程序在32位兼容模式下运行,那么这个用户空间仍然可用吗?或者它的行为类似于普通的32位操作系统,并且只提供2GB的用户地址空间?
对于win32可执行文件(x86),我们可以设置LargeAddressAware标志,以便在x64 Windows上运行时可以访问4 GB(而不是2 GB)的虚拟地址空间.
这看起来非常吸引人.但是,存在风险.
例如,请参阅:对于32位Windows可执行文件使用/ LARGEADDRESSAWARE的缺点?
因此,让我们继续配置正在执行某些单元测试的系统,并将系统范围的注册表开关AllocationPreference设置为MEM_TOP_DOWN.
应该这样做,不应该吗?
它没有!
问题是Visual Studio的x86"测试运行器"(执行引擎)本身没有启用LAA.
这个父进程只能看到"较低"的2 GB VAS,我们的模块也将被测试.
VS2013.1中的示例
mstest.exe 产卵 QTAgent32.exevstest.console.exe 产卵 vstest.executionengine.x86.exe所有这些都没有启用LAA!
那么使用支持LAA的x86测试运行器的推荐方法是什么?
这是一个用于检查LAA执行环境的小代码片段(VS单元测试,csharp).
除非它成功,否则你的测试环境不适合让你的单元测试(也)覆盖与LAA的兼容性:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestCheckEnv32LAA
{
[TestClass]
public class CheckEnv32LAA
{
#region [Native DLL import]
[Flags()]
public enum AllocationType : uint
{
COMMIT = 0x1000,
RESERVE = 0x2000,
RESET = 0x80000,
LARGE_PAGES = 0x20000000,
PHYSICAL = 0x400000,
TOP_DOWN …Run Code Online (Sandbox Code Playgroud) windows unit-testing mstest virtual-address-space visual-studio-2013
在阅读英特尔手册时,我遇到了以下情况:
*在支持Intel 64体系结构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须包含规范地址.
我不明白'规范地址'的含义......?
很想得到一个解释;)找不到任何东西@ google
谢谢