簡體   English   中英

Memory 可用於 Linux 中的裝配程序

[英]Memory available to assembly program in Linux

為了好玩,我只是想在帶有 x86 處理器的筆記本電腦上為 Linux 編寫一個匯編程序,以獲取一些系統信息。 所以我試圖找到的一件事是我的程序有多少 memory 可用,例如堆棧在哪里,如果需要,我是否以及如何分配額外的 memory。

很久以前,我在 Atari ST 上做過這樣的事情,只有一個系統“malloc”,我可以從中詢問 memory,並且有功能可以找到可用的 memory。

我知道 Linux 的設置不同,而且我擁有自己的整個地址空間,但我想有一些 memory 區域我不允許觸摸。

不知何故,似乎已經設置了默認堆棧。

我為此進行了很多研究,但找不到任何“程序集”系統調用。 大多數人都指向為 memory 管理鏈接 C malloc 管理,但我不是在尋找 ZCD69B7ZBF367F06CD8D29D1 管理器。 我只想知道我的程序的 memory 邊界。

我發現諸如 getrlimit、setrlimit、prlimit 和 brk 和 sbrk 之類的東西,但這些似乎是 C 函數而不是系統調用。

我錯過了什么?

Linux 使用虛擬 memory (和ASLR )。 Atari ST 不使用任何一種,因此它確實為某些操作系統數據結構和代碼提供了固定的 memory map。 (由於操作系統在ROM中,不易更新,甚至有人記錄了一些內部地址。)

Linux tries to keep the boundary between kernel and user-space rigid, with a well-defined documented API / ABI for user-space to interact with the kernel via system calls. (例如在 x86-64 上,通過syscall指令)。 用戶空間不需要關心那堵牆的另一邊有什么,通常甚至不需要關心它的頁面在虛擬 memory 中的位置,只要它有指向它們的指針。

當 glibc malloc想要來自操作系統的更多頁面時,它使用mmap(MAP_ANONYMOUS)brk來獲取它們,並將它們的塊分發給malloc的小調用。 它將簿記數據結構保存在用戶空間中(當然這是每個進程)。

我知道 Linux 的設置不同,而且我擁有自己的整個地址空間,但我想有一些 memory 區域我不允許觸摸。

是的,每個進程都有自己的虛擬地址空間。 您只能觸摸已分配的部分,否則導致的頁面錯誤將是“無效的”(操作系統知道該虛擬頁面不應該有物理頁面)並且如果您將 SIGSEGV 信號傳遞給您的進程試着讀或寫它。 (由於交換空間或延遲分配/寫時復制而發生“有效”頁面錯誤;kernel 更新硬件頁表並返回用戶空間以重新運行出錯的指令。)

此外,kernel 聲稱虛擬地址空間的高半部分供自己使用。 https://wiki.osdev.org/Higher_Half_Kernel )。 See also https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt for Linux's x86-64 memory map layout.

我找不到任何“程序集”系統調用。

mmapbrk是真正的系統調用。 請參閱brk(2)手冊頁的“注釋”部分。 第 2 節手冊頁是系統調用,第 3 節是 libc 函數。

當然,在 C 中,當您調用mmap(...)時,您實際上是在 glibc 中調用包裝器 function。 glibc 提供包裝函數,而不是直接使用syscall指令的內聯 asm 宏。

另請參閱解釋 asm 接口的Linux 系統調用的權威指南,以及 VDSO 頁面。 Linux 將一些 kernel memory(只讀)映射到您的用戶空間進程中,保存代碼和數據,以便getpid()clock_gettime()可以在用戶空間中運行。

還有關於 Stack Overflow 的各種問答,包括I386 和 x86-64 上 UNIX 和 Linux 系統調用的調用約定是什么


所以我想要找到的一件事是我的程序可以使用多少 memory

沒有系統調用來查詢您的進程的當前 memory map。 解析/proc/self/maps將是您最好的選擇。

有關使用系統調用掃描映射頁面的虛擬地址空間范圍的一些有趣想法,請參閱從進程內部查找映射的 memory 例如,如果指定范圍包含任何未映射的頁面,則類似於 Linux 的mincore(2)系統調用返回-ENOMEM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM