【发布时间】:2020-07-25 08:24:26
【问题描述】:
为了好玩,我只是想在带有 x86 处理器的笔记本电脑上为 Linux 编写一个汇编程序来获取一些系统信息。所以我试图找到的一件事是我的程序有多少内存可用,以及在哪里,例如堆栈是,如果需要,我是否以及如何分配额外的内存。
很久以前,我在 Atari ST 上做过类似的事情,只有一个系统“malloc”我可以从中请求内存,并且有一些函数可以找到可用内存。
我知道 Linux 的设置有所不同,而且我拥有自己的整个地址空间,但我想有些内存区域我是不允许触摸的。
不知何故,似乎已经设置了默认堆栈。
我对此进行了相当多的研究,但找不到任何“程序集”系统调用。大多数人指向链接 C malloc 进行内存管理,但我不是在寻找内存管理器。我只想知道我的程序的内存边界。
我发现诸如 getrlimit、setrlimit、prlimit 和 brk 和 sbrk 之类的东西,但这些似乎是 C 函数而不是系统调用。
我错过了什么?
【问题讨论】:
-
这些区域在现代系统上并不固定。您可以查看文件
/proc/self/maps以查找堆栈位置和大小。/proc文件系统中可能还有其他文件,以及系统调用,以查找其他事物的映射。 -
您可以在程序的可执行文件中指定初始内存映射。在运行时,您可以使用
mmap和munmap系统调用修改此内存映射。根据经验,UNIX 手册第 2 节中列出的每个 C 函数都是系统调用。所有这些都可以直接从程序集中调用,而无需使用 libc,尽管使用 libc 通常是个好主意。
标签: linux assembly system-calls