2010-05-06 32 views
17

我正在尋找一些使用Linux下的彙編語言和使用系統調用,而不是malloc和朋友的動態內存分配的良好代碼示例。如何在Linux下使用匯編和系統調用動態分配內存

什麼是一些最簡單但有效的方法來做到這一點?

在Intel 386+計算機上。

+0

http://programmedlessons.org/AssemblyTutorial/Chapter-33/ass33_1.html看看這裏它有你的問題在頭上,它看起來就像一個類。可能有幫助。 – 2010-05-06 14:56:47

回答

4

brk(2)。並看看ELF

+0

手冊頁指的是什麼「數據段」? – mudge 2010-05-06 15:09:27

+0

請參閱上面的ELF鏈接。 – 2010-05-06 15:14:30

2

brk()的替代方法是使用mmap()系統調用,並使用MAP_ANONYMOUS | MAP_PRIVATE

7

在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 

(見relevant kernel source有關參數傳遞的詳細信息)

我建立這個與NASM並驗證它的工作使用strace,產生:

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

需要修正的錯誤:'(0x02 | 0x20)'是34,而不是22.此外,'PROT_EXEC'不需要分配內存。 – Hibou57 2013-05-03 21:23:19

+0

@ Hibou57除非我遺漏了'$ 22',它是十六進制22,對於'(0x02 | 0x20)'是正確的。它不需要exec,但我一直在寫的示例代碼需要它,所以我就這樣離開了它。 – Flexo 2013-05-04 08:53:17

+0

是的,你說得對,那是使用NASM語法(我錯誤地把它當作'gas'文字)。注意:關於文件描述符是-1,我已經檢查過amd64(當然不是相同的程序集列表)需要0,並返回帶有-1的'-EINVAL'。在i386上,-1和0都起作用,所以至少考慮到i386和amd64,0比-1更易於移植,至少從內核Linux 2.8開始。 – Hibou57 2013-05-09 03:40:32