在撰写本文时(2024 年 11 月),是否仍有任何当前维护的 64 位 Linux 发行版可以在 x86_64-v1 微架构级硬件上成功安装和运行?
或者所有当前维护的 64 位发行版是否都需要至少支持 x86_64-v2 指令集的 CPU?
在撰写本文时(2024 年 11 月),是否仍有任何当前维护的 64 位 Linux 发行版可以在 x86_64-v1 微架构级硬件上成功安装和运行?
或者所有当前维护的 64 位发行版是否都需要至少支持 x86_64-v2 指令集的 CPU?
我的笔记本电脑上有一个 64 位的 Debian 系统。我想 chroot 到一个 RasPiOS 系统(Raspberry Pi OS),但这个操作系统只有 32 位。当我尝试 chroot 时,出现以下错误:
# chroot /media/rpi /bin/bash
chroot: failed to run command ‘/bin/bash’: Exec format error
# ls -al /media/rpi/bin/bash
-rwxr-xr-x 1 root root 925124 2019-04-18 06:12:36 /media/rpi/bin/bash*
有人说这是因为 64 位和 32 位拱门不匹配。
那么有没有办法从 64 位主机 chroot 进入 32 位系统?
我需要在 debootstrap 中设置 arch 选项。所以我做了一些研究并阅读了手册。
阅读手册后,我看到选项部分只是说 --arch=ARCH 暗示我应该知道我需要的架构的正确语法。我不。我需要 64 位架构。我知道“i386”可用于 32 位架构。如果我想要 64 位架构,我应该将 --arch 选项设置为什么?或者更一般地说,选择的范围是什么?
我可以猜测(但不知道也无法确定)范围或拱门选项可能取决于正在启动的操作系统。就我而言,它是我知道应该在 64 位上工作的 ubuntu 版本。所以问题变成了我将如何确定 64 位架构选项语法?
我可以进一步猜测(但同样不知道也无法确定)选项语法实际上是由引导的操作系统提供的,如果我知道在哪里看,我可以弄清楚。在这种情况下,我会去哪里看?
在 Linux 和 Windows 上,我已经习惯了需要 64 位内核才能拥有一个具有多架构/WoW 的系统的情况,我可以在其中并行运行 32 位和 64 位软件。
然后,几年前,当有人向我展示 MacOS 10.6 Snow Leopard 可以使用 32 位模式的内核运行 64 位应用程序时,这让我大吃一惊。这现在可能在很大程度上被遗忘了,因为它是一次性的技术转型。据我所知,由于硬件在移动领域处于领先地位,因此在 iOS 和 Android 向 64 位迁移过程中从来不需要这样做。
我的问题:在 32 位 Linux 内核(i386 或 armhf)中获得相同的功能需要什么?
我知道这可能不是微不足道的。如果是这样,Microsoft 可以将该功能放入 Windows XP 32 位。但一般要求是什么?是否曾经提出过补丁或概念验证?
在嵌入式世界中,我认为这将特别有用,因为 64 位支持在设备驱动程序中可能会落后很长时间。
一位朋友为我构建了一个 EPUB 转换器,它依赖于lib64png16_16
. lib64png16_16
依赖于libz.so.1(ZLIB_1.2.9)(64bit)
. 我下拉并编译ZLIB_1.2.11
,但它没有被识别为解决方案(并且 make install 没有将它放入/usr/lib64
)。
有谁可以(a)获得libz.so.1(ZLIB_1.2.9)(64bit)
x86_64/CentOS7 的 RPM,或者(b)告诉我如何编译libz.so.1(ZLIB_1.2.11)(64bit)
?愚蠢的我,我认为在 64 位系统上编译它会产生 64 位版本。
PS,CentOS ZLIB 包是 1.2.7。我找不到 1.2.9 或更高版本的。
在内核 4.16.7 的 Ubuntu 上,我正在编写一个自定义系统调用,并且我想设置特定页表条目的 NX 位。到目前为止,我有这段代码,我正在执行页表遍历以获得我想要的 PTE,然后尝试设置它的 NX 位:
pgd = pgd_offset(mm, addr);
if (pgd_none(*pgd) || pgd_bad(*pgd)){
printk("Invalid pgd");
return -1;
}
p4d = p4d_offset(pgd, addr);
if (p4d_none(*p4d) || p4d_bad(*p4d)){
printk("Invalid p4d");
return -1;
}
pud = pud_offset(p4d, addr);
if (pud_none(*pud) || pud_bad(*pud)){
printk("Invalid pud");
return -1;
}
pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd) || pmd_bad(*pmd)){
printk("Invalid pmd");
return -1;
}
ptep = pte_offset_map(pmd, addr);
if (!ptep){
printk("Invalid ptep");
return -1;
}
pte = *ptep;
if (pte_present(pte)){
printk("pte_set_flags");
printk("NX bit before: %d", pte_exec(pte));
// pte_set_flags(pte, _PAGE_NX);
// printk("NX bit after : %d", pte_exec(pte));
printk("pte_clear_flags");
// pte_clear_flags(pte, _PAGE_NX); // Same as pte_mkexec()
pte_mkexec(pte);
printk("NX bit after : %d", pte_exec(pte));
page = pte_page(pte);
if (page){
printk("Page frame struct is @ %p", page);
}
pte_unmap(ptep);
}
但它不起作用。所有printk
命令都显示相同的结果。有什么见解吗?
我只是好奇:是否有任何 64 位 Linux 系统支持 32 位版本的 Apache?据我所知,64 位 Linux 系统只支持 Apache 64 位,而 32 位 Linux 系统只支持 Apache 32 位。
编辑
我的动机只是想知道,是否以及哪个 Linux 发行版还为应用程序和/或库提供 32 位软件包。