스택에 대한 메모리 페이지가 얼마나 정확하게 할당되고 할당되는지 이해하려고합니다.ESP 또는 RSP 레지스터를 뺄 때 어떤 예외가 생성 될 수 있습니까? (stack stacking)
#include <string.h>
int main()
{
char a;
memset((&a - 4444444), 0, 3333333);
return 0;
}
(& T 구문 AT) 어셈블리 코드의 다음 단편 GCC에 의해 생성된다 :
는 I 분명 (x86_64에 리눅스) 세그먼트 오류의 원인은 다음의 개념 증명 C 코드를 작성 C 프로그램 위에서 :subq $16, %rsp
leaq -1(%rbp), %rax
subq $4444444, %rax
movl $3333333, %edx
movl $0, %esi
movq %rax, %rdi
call memset
내가 subq $5555555, %rsp
를 추가 할 경우 수동으로 memset
를 호출하기 전에 :
subq $16, %rsp
leaq -1(%rbp), %rax
subq $4444444, %rax
movl $3333333, %edx
movl $0, %esi
movq %rax, %rdi
subq $5555555, %rsp /* added manually */
call memset
rsp
레지스터를 뺀 후 스택의 가상 메모리 페이지가 할당되어 일부 하드웨어 예외가 발생하고 할당 된 예외 핸들러가 호출 되었기 때문에 세그먼트 오류가 사라집니다 (물론 커널 공간에서 호출 됨).
여기서 memset
을 호출하면 "부 페이지 오류"예외가 발생한다는 것을 알고 있습니다. 하지만 이는 물리적 메모리 페이지를 할당하는 것과는 다른 이야기입니다.
제 질문은 subq $5555555, %rsp
을 호출 할 때 어떤 예외가 생성 되었습니까? 나는 그것이 "스택 결함"예외가 될 것이라고 제안하지만 정확한 증거를 찾지 못했습니다.
x86에도 이러한 레지스터가 없습니다 ... 아마도 잘못된 아키텍처 태그를 사용 했습니까? –
@Ben Voigt 저는'인텔 ® 코어 ™ i3-2328M CPU @ 2.20GHz × 4'를 가지고 있으므로 x86 레지스터입니다. –
RSP는 x86 레지스터가 아닙니다 ... x86에서는 사용할 수없는 긴 모드에서만 CPU에서 사용할 수 있습니다. –