我正在尋找一些使用Linux下的彙編語言和使用系統調用,而不是malloc和朋友的動態內存分配的良好代碼示例。如何在Linux下使用匯編和系統調用動態分配內存
什麼是一些最簡單但有效的方法來做到這一點?
在Intel 386+計算機上。
我正在尋找一些使用Linux下的彙編語言和使用系統調用,而不是malloc和朋友的動態內存分配的良好代碼示例。如何在Linux下使用匯編和系統調用動態分配內存
什麼是一些最簡單但有效的方法來做到這一點?
在Intel 386+計算機上。
使用brk系統調用來更改數據段的結尾。
看看這裏:http://www.linuxjournal.com/article/6390瞭解你在做什麼。
謝謝。我開始閱讀那篇文章。這很棒。 – mudge 2010-05-06 15:06:01
brk()
的替代方法是使用mmap()
系統調用,並使用MAP_ANONYMOUS | MAP_PRIVATE
。
在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
需要修正的錯誤:'(0x02 | 0x20)'是34,而不是22.此外,'PROT_EXEC'不需要分配內存。 – Hibou57 2013-05-03 21:23:19
@ Hibou57除非我遺漏了'$ 22',它是十六進制22,對於'(0x02 | 0x20)'是正確的。它不需要exec,但我一直在寫的示例代碼需要它,所以我就這樣離開了它。 – Flexo 2013-05-04 08:53:17
是的,你說得對,那是使用NASM語法(我錯誤地把它當作'gas'文字)。注意:關於文件描述符是-1,我已經檢查過amd64(當然不是相同的程序集列表)需要0,並返回帶有-1的'-EINVAL'。在i386上,-1和0都起作用,所以至少考慮到i386和amd64,0比-1更易於移植,至少從內核Linux 2.8開始。 – Hibou57 2013-05-09 03:40:32
http://programmedlessons.org/AssemblyTutorial/Chapter-33/ass33_1.html看看這裏它有你的問題在頭上,它看起來就像一個類。可能有幫助。 – 2010-05-06 14:56:47