这是一个 OSX 链接器问题。我不认为 OSX(BSD 或 Mach 层)关心零页有多大或者它是否存在。我认为这是一个工具的事情。但这是我的意见,也是我提问的原因。
-pagezero_size 大小:默认情况下,链接器创建一个从地址零开始名为 __PAGEZERO 的不可读段。如果取消引用 NULL 指针,它的存在将导致总线错误。
这很清楚;它用于捕获 NULL 指针。在 32b OSX 系统上,段的大小为 4KB,这是系统页大小。但在当前的 64b 系统上,该段的大小增加到 4GB。为什么它不保持系统页面大小 4KB 或架构的最大页面大小 2MB?这意味着我根本无法使用 32b 绝对寻址。
使用此标志并覆盖默认值是否存在任何问题?苹果商店规定,...?
(此功能特定于 OSX ld64 链接器。该功能至少可以追溯到 2006 年 3 月 ld64-47.2。地址空间布局随机化和 64b 支持于 2007 年 10 月从 Leopard 开始。)
我想阅读 BEAM VM 的指令集并了解其内部结构,但我在 google 上能找到的都已经过时了。
当我阅读RISC-V用户级ISA手册时,我注意到它说:“ OpenRISC具有条件代码和分支延迟时隙,这会使更高性能的实现复杂化。” 因此RISC-V没有分支延迟槽RISC-V用户级ISA手动链接。而且,维基百科表示,大多数新的RISC设计都省略了分支延迟时隙。为什么大多数较新的RISC体系结构逐渐忽略分支延迟时隙?
考虑一个简单的指令,例如
mov RCX, RDI # 48 89 f9
Run Code Online (Sandbox Code Playgroud)
48 是 x86_64 的 REX 前缀。它不是LCP。但请考虑添加 LCP(用于对齐目的):
.byte 0x67
mov RCX, RDI # 67 48 89 f9
Run Code Online (Sandbox Code Playgroud)
67 是地址大小前缀,在本例中用于没有地址的指令。该指令也没有立即数,并且不使用 F7 操作码(假 LCP 停止;F7 将是 TEST、NOT、NEG、MUL、IMUL、DIV + IDIV)。假设它也不跨越 16 字节边界。这些是 Intel优化参考手册中提到的 LCP 停顿情况。
该指令是否会导致 LCP 停顿(在 Skylake、Haswell 等上)?两个 LCP 怎么样?
我日常驾驶的是 MacBook。所以我无法访问 VTune,也无法查看 ILD_STALL 事件。还有其他方法可以知道吗?
performance assembly x86-64 cpu-architecture micro-optimization
根据 Flynn 的瓶颈,由于指令级并行 (ILP) 的加速最多可以达到 2。为什么会这样?
在处理器中,为什么我们不能简单地增加寄存器的数量,而不是拥有一个巨大的重新排序缓冲区并映射寄存器以解决名称依赖关系?
我正在尝试使用LLVM(来自Homebrew)构建 ELF 文件,但我不知道如何链接它。
我的文件:
multiboot2.h:
struct multiboot2_header_t {
// Stub
} multiboot2_header __attribute__((section(".multiboot")));
Run Code Online (Sandbox Code Playgroud)
内核.c:
#include "multiboot2.h"
void _start() {
// Stub
}
Run Code Online (Sandbox Code Playgroud)
链接器.ld:
ENTRY(_start)
SECTIONS
{
.text: {
/* link the multiboot struct here */
. = ALIGN(8);
KEEP(*(.multiboot))
/* place all of your code afterwards */
*(.text)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过命令将它编译为目标文件kernel.o,clang -c -o kernel.o kernel.c --target x86_64-none-gnu但我无法使用我的链接器脚本来链接这个目标文件。
PS在我从未直接使用LLVM和链接器之前,只使用GNU GCC构建简单的 Linux 应用程序。
正如标题中提到的,我在 x86 汇编上遇到了 BEXTR(位提取)指令,但我似乎无法理解它是如何工作的。
在网上查找了一段时间后,我什至找到了一个假定的 C 等效项(src >> start) & ((1 << len) -1),但我似乎也无法真正理解。
谁能向我解释一下 BEXTR 指令是如何工作的?这些位是如何提取的?
我正在内联系统调用。是的,我知道这是有问题的,但我有充分的理由。我已经大量地追踪了我的错误,我只是问为什么__NR_open在这个 arm64 Arch Linux 系统上消失了?
5.0.1-1-ARCH #1 SMP Sun Mar 10 15:08:34 MDT 2019 aarch64 GNU/Linux
同样,我的代码是内联系统调用。这种内联方法适用于另一个X86_64系统,实际上内联mmap() 也适用于该系统。但是,在此 arm64 Arch Linux 上内联open()失败并显示EFAULT。
追踪我的错误,首先,在这个构建环境中甚至没有定义__NR_open。其次,常规open()调用open64()执行一条svc指令,其中 x8 设置为 #56, __NR_openat。第三,__NR_open通常定义为 5 并且该数字已重新用于__NR_setxattr。这解释了EFAULT。
基本上,open()在这个系统的用户库中被转换成openat()并且__NR_open系统调用已经完全消失,由一个新的系统调用接管。我不明白的是__NR_open是在arm64的规范源中定义的,但不是在这个 Arch Linux arm64 系统上定义的。
我的错误修复很简单:内联openat()代替。但我的问题是为什么删除了这个,为什么这不被认为是从 Linux POV 中破坏的?我在想 Linus 说我们不破坏用户空间! …