繁体   English   中英

(WSL2) x86_64 Unix 中的编程汇编不能进行 32 位系统调用?

[英]Programming Assembly in (WSL2) x86_64 Unix can't make 32-bit syscall?

我正在尝试在 Windows 上设置汇编编程环境。 我确实安装了 Linux,但出于好奇,以及学习 WSL 的目的,我试图让它在 Windows 10 上通过 WSL2 运行。

我尝试设置 Alpine 和 Ubuntu(基础),仅安装以下工具:

bash bash-doc bash-completion
util-linux pciutils usbutils coreutils binutils findutils grep

它是使用apk addapt install的。

然后我从Programming Ground Up中编写了以下示例:

.section .data

.section .text
.globl _start

_start:
  movl $1, %eax
  movl $0, %ebx
  int $0x80

我在没有任何花哨的标志的情况下进行了编译和链接,就像书中示例中的最小值一样。

as exit.s -o exit.o
ld exit.o -o exit

我知道像int $0x80这样的调用取决于架构、操作系统等。

当我尝试在 WSL 图像上运行它时,它返回Segmentation fault

四处搜索我必须知道分段错误可能与程序未退出执行有关,例如当一个部分没有ret语句时。 (在这种情况下, int $0x80应该足以激活 kernel 并通过调用在 ax 寄存器上设置的值 1 返回/退出)

我认为这是因为我试图在 64 位机器上编译和运行 32 位 ASM 代码。 但是,我做了一个 ssh 连接到一个酒吧 unix 服务器,这也是一个 Ubuntu x86_64,相同的代码可以毫无问题地运行。

这是 WSL2 的限制吗? 或者这个 pubnix 是否安装或配置了一些东西来接受 32 位代码而没有任何额外的标志?

WSL2 确实支持 32 位库和系统调用。

因此,这是在 Windows 上编程汇编的好方法,无需双引导和汇编仿真器。

但是假设由于安装了 WSL2,它也在被使用是错误的。

  • 如果您没有安装 WSL2,则需要安装它

如果您已经安装了 WSL2,则可以将 WSL1 图像转换为 WSL2,或者将 WSL 版本设置为您希望在创建/导入下一个图像时使用的版本 (WSL2)。

(就我而言,Docker Desktop for Windows 自动为我安装了 WSL2)

  • 您可以使用以下方法检查您的图像是 WSL1 还是 WSL2:
wsl -l -v
  • 您可以通过设置要使用的 WSL2 来创建 WSL2 图像。
wsl --set-default-version 2

每次创建新图像或导入时,它都会设置为 WSL2。 如果你想 go 回到 WSL1 你可以wsl --set-default-version 1

现在您可以像往常一样创建新图像。

  • 如果您的图像已经是版本 1,您可以使用以下命令将其转换为版本 2:
wsl --set-version image_name 2

(转换图像可能需要很长时间)

  • 相反,您可以导出当前图像,然后将其作为 WSL2 版本再次导入/创建,因此您可以在需要时保留这两个版本。
wsl --export current-image image-backup.tar
mkdir new-folder
wsl --import newimg new-folder image-backup.tar

(导出和导入将保留您的 $HOME 和文件,就像备份整个图像一样)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM