我正在读"理解Linux内核".
寻找64位架构
正如我们在前面的章节中看到的那样,32位微处理器通常使用两级分页.但是,两级分页不适用于采用64位架构的计算机.让我们用思想实验来解释原因:
首先假设标准页面大小为4 KB.由于1 KB覆盖2 10个地址范围 ,因此4 KB覆盖2 12个地址,因此偏移字段为12位.这将在表和目录字段之间分配多达52位的线性地址.如果我们现在决定只使用64位中的48位进行寻址(这种限制使我们有一个舒适的256 TB地址空间!),剩余的48-12 = 36位将必须在表和目录字段之间分配.如果我们现在决定为这两个字段中的每一个保留18位,则每个进程的页面目录和页表都应包含2 18个条目,超过256,000个条目.
"如果我们现在决定只使用64位中的48位进行寻址".为什么?为什么只有48位?为什么不是其他一些号码?
好吧,我只是一个普通的PC用户和程序员.我很难相信32位寻址,即4GB(2GB/3GB更正确)每个进程的地址空间是一个限制.如果你真的遇到这个限制.请举个例子.
这个窗口限制是多少?
我知道虚拟内存!=物理内存和处理器地址引脚与虚拟内存无关.这是一个完全不同的问题.如何知道处理器的地址引脚数(=地址总线的大小).http://ark.intel.com处理器的规格不包括此规范.
回答:
请参阅Paul Betts对第一个问题的合理答案的答案.
在C#中,如何使用显着超过UInt64最大值(18,446,744,073,709,551,615)的数字进行存储和计算?
首先,问题是:CLR规范是否保证在同一进程中的多个应用程序域中执行的代码将共享相同的地址空间?通过"共享地址空间",我的意思是指向在一个应用程序域中分配的内存的指针对于在同一进程内托管的所有应用程序域中进行读写是有效的.
请考虑这个自包含的示例来说明问题:程序Worker
在单独的应用程序域中分配对象.该Worker
分配10000个整数一个内存块,并用数据填充进去.然后,程序调用app域边界以获取指向已分配块的指针,并验证它是否可以读取10,000个项目中的每一个.
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace crossapp {
public class Worker : MarshalByRefObject {
private readonly IntPtr myData;
public const int DataLength = 10000;
public Worker() {
Console.Error.WriteLine(
"Memory allocation happens in app domain '{0}'"
, Assembly.GetExecutingAssembly().FullName
);
myData = Marshal.AllocHGlobal(sizeof(int) * DataLength);
unsafe {
var ptr = (int*) myData.ToPointer();
for (var i = 0 ; i != DataLength ; i++) {
ptr[i] = 2*i + 1;
}
}
}
public IntPtr GetData() …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个C#程序,它将加载文件并获取诸如加载文件创建日期,修改日期,大小等信息.我需要知道的另一件事是加载的文件(executable.exe
)是否与LARGEADDRESSAWARE
标志链接.FileInfo类不提供此信息.
有谁知道如何在C#中找出给定的execute.exe是否与LARGEADDRESSAWARE
标志链接(处理大于2 GB的地址)?
我是"fork()"的新手,我随处读到,当调用fork()时,启动当前(调用)进程的精确副本.现在,当我运行以下代码时,应该有两个不同的进程,有两个不同的分配给其变量和函数的内存位置.
#include<stdio.h>
int i=10;
int pid;
int main(){
if((pid=fork())==0){
i++;//somewhere I read that separate memory space for child is created when write is needed
printf("parent address= %p\n",&i);// this should return the address from parent's memory space
}else{
i++;
i++;
printf("child address= %p\n",&i);// this should return the address of child's memory space
}
wait(0);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
Why The output looks like:: child address::804a01c parent address::804a01c
为什么父母和孩子的地址都是一样的?
如何在Ubuntu Linux下使用python写入另一个进程的地址空间?我的尝试:
1)使用虚拟文件/ proc/$ PID/mem并寻找地址.我已成功使用它来读取内存,但尝试写入会导致IOError:
fd=open("/proc/"+pid+"/mem","r+")
fd.seek(address,0)
fd.write("ABC")
Run Code Online (Sandbox Code Playgroud)
输出:
IOError: [Errno 22] Invalid argument
Run Code Online (Sandbox Code Playgroud)
2)尝试使用其他线程中建议的python-ptrace库.但是,我找不到好的文档或示例代码.
注意:这不是权限问题,以root身份运行会产生相同的行为.
在使用 clang++ 的 C++ 中,是否可以根据隐式 \xe2\x80\x98this\xe2\x80\x99 参数上的地址空间限定符重载方法?如果是这样,语法是什么?
\n\n该来源建议我可以将地址空间限定符放在参数列表之后、大括号之前(类似于在 \'this\' 上使用 const 限定符)。我尝试了以下方法,但失败了;clang 认为我正在尝试设置方法的地址空间,而不是“this”:
\n\n // Does not work.\n struct SomeClass\n {\n // method for \'this\' in default address space\n void doit();\n // method for \'this\' in address space 300.\n void doit() __attribute__((address_space(300)); // clang rejects this syntax\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n我发现的最接近的是 clang 让我根据其显式形式参数的地址空间(而不是 \'this\' )重载方法。例如,下面的代码将打印 \xe2\x80\x9c1\\n2\\n\xe2\x80\x9d。
\n\n// Similar, but does not solve my problem:\n#include <cstdio>\n\nstruct SomeClass\n{\n void doit(void *v) { printf("1\\n"); }\n void doit(void …
Run Code Online (Sandbox Code Playgroud) 我有一组文件,其长度都是我操作系统(FreeBSD 10)页面大小的倍数.我想将mmap()
这些文件连接到RAM的连续页面,这使我能够将一组文件视为一个大型数据.
最好使用便携式功能,如何找到一个足够大的未映射地址空间区域,这样我才能确定mmap()
对该区域的一系列调用是否会成功?
英特尔和AMD文档说,对于64位模式,实际上只有48位可用于虚拟地址,并且从48到63的位必须复制第47位(符号扩展)。据我所知,目前所有的CPU都是以这种方式实现的,但从理论上讲,没有任何事情可以扩展以后的实现中的可用空间(这不会破坏二进制兼容性)。
有没有一种标准的方法来以编程方式确定有意义的位数?(即某些特定的CPUID,就像物理地址一样)。
我知道实际上48位对于任何合理的应用程序和OS来说已经绰绰有余;我的问题是理论上的。
首先,我已经找到了 一些可能回答我问题的参考文献.虽然我计划很快(即下班后)阅读它们,但我仍然会在这里询问,以防答案是微不足道的,并且不需要太多的补充知识.
下面是这样的情况:我正在编写一个共享库(让我们称之为libA.so),它需要在同一个进程中维护一个连贯的内部(如在.c文件中声明的静态变量)状态.程序P将使用该库(即P编译-lA
).如果到目前为止我理解了所有内容,P的地址空间将如下所示:
______________
| Program P |
| < |
| variables, |
| functions |
| from P |
| > |
| |
| < |
| libA: |
| variables, |
| functions |
| loaded (ie |
| *copied*) |
| from shared |
| object |
| > |
| < |
| stuff from |
| other |
| libraries |
| > |
|______________|
Run Code Online (Sandbox Code Playgroud)
现在P有时会打电话dlopen("libQ.so", ...)
.libQ.so也使用libA.so(即编译时 …