标签: virtual-address-space

多级页表 - 分层分页

来自过去的操作系统final的示例问题,我该如何计算这类问题?

计算机具有64位虚拟地址空间和2048字节页面.页表条目需要4个字节.使用多级页表,因为每个表必须包含在页面中.需要多少级别?

我该如何计算?

paging operating-system virtual-address-space

17
推荐指数
2
解决办法
2万
查看次数

remap_pfn_range如何将内核内存重新映射到用户空间?

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

15
推荐指数
2
解决办法
2万
查看次数

如何检查exe是否设置为LARGEADDRESSAWARE

我正在开发一个C#程序,它将加载文件并获取诸如加载文件创建日期,修改日期,大小等信息.我需要知道的另一件事是加载的文件(executable.exe)是否与LARGEADDRESSAWARE标志链接.FileInfo类不提供此信息.

有谁知道如何在C#中找出给定的execute.exe是否与LARGEADDRESSAWARE标志链接(处理大于2 GB的地址)?

c# memory virtual-address-space address-space

15
推荐指数
2
解决办法
1万
查看次数

printf()在c中以%p格式打印的地址是哪个?

我的代码如下:

#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)

我正在研究虚拟和物理地址.我有以下问题:

  1. 哪个是变量"a"的打印地址(物理/虚拟)?
  2. 如果它是虚拟的那么,它在同一程序的每次运行中如何变化?据我所知,编译器在编译时为变量提供虚拟地址?
  3. 为什么全局变量的地址在每次运行程序中都是常量?

在Linux上执行此程序:2.6.18-308.el5 x86_64 GNU/Linux

编译使用:gcc版本4.1.2 20080704(Red Hat 4.1.2-52)

c linux gcc virtual-address-space

15
推荐指数
3
解决办法
3482
查看次数

如何将不同进程的虚拟地址映射到不同的物理地址

我参加了一个关于操作系统设计和概念的课程,现在我正在努力学习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)

kernel linux-kernel virtual-address-space

14
推荐指数
4
解决办法
6289
查看次数

了解虚拟地址和虚拟地址空间

我读到,"当程序执行如下指令时MOV REG,1000,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式生成地址.

这些程序生成的地址称为虚拟地址,形成虚拟地址空间."

任何人都可以请解释一下,它是什么(这些程序生成的地址称为虚拟地址)是什么意思?

architecture virtual operating-system virtual-address-space memory-address

10
推荐指数
1
解决办法
9316
查看次数

GDB检查内存权限

我在内存中有一个地址,我想找出该内存地址的权限(r/w/x).

例如

char *s = "hello";
Run Code Online (Sandbox Code Playgroud)

这里,字符串文字"hello"存储在只读存储器中.通过gdb运行程序时,是否有可能检查该内存地址的权限(是否只允许读取等)?

c linux gcc gdb virtual-address-space

10
推荐指数
1
解决办法
1万
查看次数

64位系统中以兼容模式运行的虚拟地址空间

我在64位Windows操作系统上看到,可用的用户虚拟地址空间是8个terra字节.但是,如果我们正在执行的程序在32位兼容模式下运行,那么这个用户空间仍然可用吗?或者它的行为类似于普通的32位操作系统,并且只提供2GB的用户地址空间?

64-bit compatibility virtual-address-space

9
推荐指数
1
解决办法
9323
查看次数

单元测试x86 LargeAddressAware兼容性

对于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.exe
  • vstest.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

8
推荐指数
1
解决办法
1794
查看次数

典型地址

在阅读英特尔手册时,我遇到了以下情况:

*在支持Intel 64体系结构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须包含规范地址.

我不明白'规范地址'的含义......?

很想得到一个解释;)找不到任何东西@ google

谢谢

assembly x86-64 intel virtual-address-space memory-address

7
推荐指数
3
解决办法
1687
查看次数