gpt4 book ai didi

linux - 内存可用于Linux中的汇编程序

转载 作者:行者123 更新时间:2023-12-03 10:01:13 24 4
gpt4 key购买 nike

为了好玩,我只是想在装有x86处理器的笔记本电脑上为Linux编写汇编程序,以获取一些系统信息。所以我想找到的一件事是我的程序有多少可用内存,例如堆栈是,如果需要,以及如何以及如何分配额外的内存。

很久以前,我在Atari ST上做过这样的事情,并且只有一个系统“malloc”可以向我询问内存,并且有一些函数来查找可用的内存。

我知道Linux的设置有所不同,我对自己来说拥有整个地址空间,但是我想有些内存区域是我不允许接触的。

某种程度上似乎已经设置了默认堆栈。

我为此进行了很多研究,但是找不到任何“汇编”系统调用。大多数人都指向链接C malloc以进行内存管理,但是我并不是在寻找内存管理器。我只想知道程序的内存边界。

我发现诸如getrlimit,setrlimit,prlimit和brk和sbrk之类的东西,但它们似乎是C函数,而不是系统调用。

我想念什么?

最佳答案

Linux使用虚拟内存(和ASLR)。 Atari ST均未使用任何一种,因此它为某些OS数据结构和代码提供了固定的内存映射。 (由于操作系统位于ROM中,无法轻松更新,因此有些人甚至记录了一些内部地址。)

Linux试图通过使用定义明确的文档化API/ABI来保持内核和用户空间之间的界限,以使用户空间能够通过系统调用与内核进行交互。 (例如,在x86-64上,通过 syscall 指令)。用户空间不需要关心那堵墙的另一侧,只要它有指向它们的指针,通常甚至不需要关心其页面在虚拟内存中的位置。

当glibc malloc希望从操作系统中获取更多页面时,它使用mmap(MAP_ANONYMOUS)brk来获取它们,并将其中的一部分分发给malloc的小调用。它将簿记数据结构保留在用户空间中(因此,这当然是每个过程)。

I know Linux is set up differently and I kind of have the whole address space to myself, but I guess there are some memory areas I am not allowed to touch.



是的,每个进程都有自己的虚拟地址空间。您只能触摸分配的部分,否则导致的页面错误将为“无效”(操作系统知道该虚拟页面不应该存在物理页面),并且如果您将其发送给您的过程,则为SIGSEGV信号尝试读或写它。 (“有效”页面错误是由于交换空间或延迟分配/写时复制而发生的;内核更新硬件页面表并返回到用户空间以使其重新运行发生故障的指令。)

同样,内核声称虚拟地址空间的上半部分供自己使用。 ( https://wiki.osdev.org/Higher_Half_Kernel)。有关Linux的x86-64内存映射布局,另请参见 https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt

I can't find any 'assembly' system call.


mmapbrk是真实的系统调用。请参阅 brk(2) man page的“注释”部分。第2节的手册页是系统调用,第3节是libc函数。

当然,在C中,当您调用 mmap(...)时,实际上是在glibc中调用包装函数。 glibc提供包装器功能,而不是直接使用 syscall指令的内联asm宏。

另请参见The Definitive Guide to Linux System Calls ,其中介绍了asm界面以及VDSO页面。 Linux将一些内核内存(只读)映射到您的用户空间进程中,以保存代码和数据,以便 getpid()clock_gettime()可以在用户空间中运行。

关于堆栈溢出的各种问答,包括 What are the calling conventions for UNIX & Linux system calls on i386 and x86-64

So one of the things I am trying to find is how much memory is available to my program



没有系统调用来查询进程的当前内存映射。解析 /proc/self/maps将是您最好的选择。

有关使用系统调用扫描映射页面的虚拟地址空间范围的一些有趣想法,请参见 Finding mapped memory from inside a process。例如像Linux的 mincore(2) syscall如果指定范围包含任何未映射的页面,则返回 -ENOMEM

关于linux - 内存可用于Linux中的汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com