2010-05-06 5 views
17

리눅스에서 어셈블리 언어를 사용하고 malloc 및 친구가 아닌 시스템 호출을 사용하여 동적 메모리 할당에 대한 좋은 코드 예제를 찾고 있습니다.리눅스에서 어셈블리 및 시스템 호출을 사용하여 메모리를 동적으로 할당하는 방법

가장 간단하지만 효과적인 방법은 무엇입니까?

Intel 386+ 컴퓨터에서.

+0

http://programmedlessons.org/AssemblyTutorial/Chapter-33/ass33_1.html 여기를 한 번보세요. 헤더에 질문이 있습니다. 클래스처럼 완료된 것 같습니다. 도움이 될 수 있습니다. –

답변

4

brk(2). 그리고 ELF을보십시오.

+0

맨 페이지가 참조하는 "데이터 세그먼트"는 무엇입니까? – mudge

+0

위의 ELF 링크를 참조하십시오. –

1

데이터 세그먼트의 끝을 변경하려면 brk 시스템 호출을 사용하십시오.

여기를보십시오 : http://www.linuxjournal.com/article/6390 당신이하고있는 것을 이해하십시오.

+0

감사합니다. 나는 그 기사를 읽기 시작했다. 그것은 굉장. – mudge

2

brk() 대신 mmap() 시스템 호출 (MAP_ANONYMOUS | MAP_PRIVATE)을 사용하는 것이 좋습니다.

7

Linux의 경우 mmap2은 낮은 수준에서이를 위해 현명한 시스템 호출입니다.

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 

내가 NASM과이를 구축하고 생산하는이, strace를 사용하여 일했다 확인

(매개 변수 전달에 대한 자세한 내용은 relevant kernel source 참조) : 당신이 사용하여 호출 할 수 있습니다 IA32에서 그래서, 6 개 인수를 :

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

수정해야 할 오류 :'(0x02 | 0x20)'은 22가 아니라 34입니다. 또한 'PROT_EXEC'는 메모리를 할당 할 필요가 없습니다. – Hibou57

+0

@ Hibou57 '$ 22'가 (22 진수 22가'(0x02 | 0x20)'에 맞는지 확인하지 않으면). 그것은 exec를 필요로하지 않지만 필자가 작성한 예제 코드는 필요하므로 그대로 두었다. – Flexo

+0

예, 맞습니다. NASM 구문을 사용하고 있습니다 (저는 실수로'가스'문자 그대로). 주 : 파일 기술자가 -1 인 것에 대해서는 amd64 (물론 같은 어셈블리리스트가 아님)를 체크하고, 0을 요구하고, -1을 가지고'-EINVAL'을 리턴합니다. i386에서는 -1과 0이 모두 작동하므로 적어도 i386과 amd64를 고려하면 커널 Linux 2.8 이후 0은 -1보다 더 이식성이 뛰어납니다. – Hibou57

관련 문제