Linux下如何使用汇编和系统调用动态分配内存

发布于 2024-08-31 09:22:47 字数 124 浏览 10 评论 0 原文

我正在寻找一些在 Linux 下使用汇编语言和使用系统调用(而不是 malloc 和朋友)进行动态内存分配的良好代码示例。

有哪些最简单但有效的方法可以做到这一点?

在 Intel 386+ 计算机上。

I'm looking for some good code examples of dynamic memory allocation using an assembly language under Linux and using system calls, not malloc and friends.

What are some of the simplest but effective ways to do this?

On Intel 386+ computers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你穿错了嫁妆 2024-09-07 09:22:47

在 Linux 上,mmap2 是一个在低级别上用于此目的的合理系统调用。它需要 6 个参数,因此在 IA32 中您可以使用以下方式调用它:(

    mov eax, 192    ; mmap2
    xor ebx, ebx    ; addr = NULL
    mov ecx, 4096   ; len = 4096
    mov edx, $7     ; prot = PROT_READ|PROT_WRITE|PROT_EXEC
    mov esi, $22    ; flags = MAP_PRIVATE|MAP_ANONYMOUS
    mov edi, -1     ; fd = -1
    xor ebp, ebp    ; offset = 0 (4096*0)
    int $80         ; make call

请参阅 相关内核源代码了解参数传递的详细信息)

我使用 NASM 构建了它,并使用 strace 验证了它的工作原理,它产生了:

mmap2(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf77ae000

On Linux mmap2 is a sensible system call to use for this at a low level. It takes 6 arguments, so in IA32 you can call it using:

    mov eax, 192    ; mmap2
    xor ebx, ebx    ; addr = NULL
    mov ecx, 4096   ; len = 4096
    mov edx, $7     ; prot = PROT_READ|PROT_WRITE|PROT_EXEC
    mov esi, $22    ; flags = MAP_PRIVATE|MAP_ANONYMOUS
    mov edi, -1     ; fd = -1
    xor ebp, ebp    ; offset = 0 (4096*0)
    int $80         ; make call

(See the relevant kernel source for details on the parameter passing)

I built this with NASM and verified it worked using strace, which produced:

mmap2(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf77ae000
蓝颜夕 2024-09-07 09:22:47

brk(2)。并查看 ELF

brk(2). And take a look at ELF.

寂寞笑我太脆弱 2024-09-07 09:22:47

brk() 的替代方法是使用 mmap() 系统调用,以及 MAP_ANONYMOUS | MAP_PRIVATE

An alternative to brk() is to use the mmap() system call, with MAP_ANONYMOUS | MAP_PRIVATE.

两仪 2024-09-07 09:22:47

使用 brk 系统调用来更改数据段的末尾。

看一下这里:http://www.linuxjournal.com/article/6390 来了解你在做什么。

Use the brk system call to change the end of your data segment.

Take a look here: http://www.linuxjournal.com/article/6390 to understand what you're doing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文