问题标签 [address-space]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - x86-64:规范地址和实际可用范围
Intel 和 AMD 文档说,对于 64 位模式,实际上只有 48 位可用于虚拟地址,并且从 48 到 63 的位必须复制第 47 位(符号扩展)。据我所知,目前所有的 CPU 都是以这种方式实现的,但没有(理论上)禁止在未来的实现中扩展可用空间(这不会破坏二进制兼容性)。
是否有一种标准方法来以编程方式确定有意义的位数?(即一些特定的 CPUID,就像物理地址一样)。
我知道实际上 48 位对于任何合理的应用程序和操作系统来说都绰绰有余。我的问题是理论上的。
memory - 为什么 x86_64 内核的内存布局中有这么大的虚拟地址
内核的 Documentation/x86/x86_64/mm.txt 说:
所以我假设在这个区域中不应该有大于实际物理 DRAM 大小的地址映射。但是在具有 16GB DRAM 和内核 v4.2.8 的 x86_64 PC 上,我从 /sys/kernel/debug/kernel_page_tables 得到了这个结果:
您会看到虚拟地址为 0xffff88043dc00000 的页面条目,在此类虚拟地址上使用 virt_to_phys() 将得到 0x43dc00000,这显然是非法的,因为它大于实际的 DRAM 大小(16GB 只是 0x400000000)。
那么这些大型虚拟地址的规则是什么,我怎样才能获得正确的物理地址呢?
多谢!
paging - 如果您有物理地址,是否可以向后遍历分页结构并计算线性地址?
所以,我想我的问题有点荒谬和疯狂。
我不明白为什么你需要从物理地址回到线性地址。
尽管如此,这可能吗?
google-compute-engine - 多台 linux 机器上的 OpenSHMEM
是否可以在多台 Linux 机器上运行 OpenSHMEM?我希望 Google Compute Engine 虚拟机在 OpenSHMEM 中作为 PE 工作。
multithreading - 单线程机器上的异步方法
内存中程序的剖析指出库(DLL 等)映射到Memory-mapped segment
进程中。现在,当一个进程运行并调用一个库的函数时,我相信program counter (PC)
线程的 会更改到函数代码在内存映射段中的位置,然后在执行完成后返回到code-segment
. 如果函数是同步的,这是有道理的,因为我们等待函数调用完成,然后在code segment
.
现在,考虑一个异步编程模型。库说 MySql.dll 已加载,memory-mapped segment
主代码调用 dll 中的异步函数。异步函数是指线程的PC在代码中向前移动,当被调用的异步过程完成时线程得到回调。但是,在这种情况下,异步过程位于线程的地址空间内。一个线程只能有一台 PC 开始执行 DLL 中的函数。因此,代码段中的主程序被停止。
这使我相信异步程序在单线程系统中不好用,因为在异步函数完成之前程序无法继续前进。如果允许多个线程,则 MySql.dll 可以生成一个新线程(它将拥有自己的 PC)并将控制权返回给code-segment
. PC incode-segment
将继续进行,因此我们可以看到一些并行化。
我知道我在某个地方错了,因为在单线程系统(例如:JavaScript)中很可能进行异步编程。因此,我想找出我上述论点中的谬误。我有以下疑问。这些可能/可能不是我困惑的根源:-
- 每个库是否与链接进程共享地址空间或拥有自己的地址空间?
- 如果库有自己的地址空间,这意味着它是一个单独的进程。这是否意味着调用库中的函数和调用库的回调,涉及IPC机制?
编辑: 上面的问题可能令人困惑。所以,我将通过使用一些符号来解释这里的主要场景。
一个线程只能有一台 PC。假设,一个单线程环境。进程 P1 有线程 T1。说 P1,指的是用于异步函数的库 L1。加载期间的 L1 将被映射到 P1 的内存映射段。现在,当 T1 中的代码调用 L1 的 async 函数时,T1 的 PC(程序计数器)移动到 L1 段以执行 async 函数。一台电脑不能在两个地方。因此,T1 在异步函数完成之前不会继续。那么,异步如何在单线程环境中使我们受益?
c - 我可以从当前线程中保存一个值吗?
我在编写 C 程序时遇到了一些困惑。
我的场景有 2 个线程,但它们是串行运行的,所以一次只有一个线程。我想在我的第一个线程中保存一个参数,我想在我的第二个线程中获取它。(这里是线程)
那么有没有办法意识到这一点?公共静态参数在线程结束时会被回收,因为它属于当前线程。我想在当前进程而不是线程中保存一个值或指针,以便我可以将它附加到我的下一个线程中......
有没有可能的方法来实现这一点?
非常感谢!
networking - b2b网络网络地址空间
我是公共部门卫生机构的应用程序架构师。当前的任务是连接一家私立医院,实现健康信息整合。根据网络团队的说法,私立医院都在使用私有 IP 地址(RFC 1918),这意味着私立医院将重新寻址服务器(更改静态 IP 地址),以防止将来发生地址冲突的可能性。
这已成为主要的依赖关系,并且可能会延迟集成项目。
这整个想法对我来说似乎很奇怪。鉴于新的私人合作伙伴的整合将是未来的重复需求,最佳实践是什么,即允许每个机构和医院拥有私人地址空间并使用该空间而不必担心地址冲突。
网络地址转换 (NAT) 是答案(网络人员说这将是低效的)还是我们应该朝着更好的方向发展?
operating-system - 包括 C 中的一个库,它在地址空间中的位置是什么?
我了解地址空间如何划分为:代码、数据、堆栈和堆。但是,我无法将给定 C 代码的内容映射到何处。
我知道:全局变量在数据部分。静态变量在数据部分。局部变量在堆栈部分。动态分配的空间在堆部分。我的问题是,当将库包含到程序中时,它在地址空间中的位置是什么?
我希望这个问题有意义..