Memory Allocation Fault는 현시대의 컴퓨터에서 잘 찾아볼 수 없지만
인위적으로 발생시키는 방법이 딱 한가지 있어영~
for(;;){
pMem = malloc(1024);
if(pMem == NULL){
printf("Memory allocation fault! it maybe causes the heap-broken error!");
break;
}
}
정말 무식합니당~
저렇게 프로그램짜는 새#끼는 명치를 졸#라게 패서
나무에 거꾸로 쳐 매달아야돼여~
그리고 예시 2. 이번엔 자바입니당~
ArrayList<Object> listOfData ......blahblah...;
while(true){
try{ listOfData.push(new MyData("FUCK!")); }
catch(Exception e){
System.out.println("Memory allocation fault!");
break;
}
}
하하핳ㅎㅎㅎ 자바의 gc는 말입니당~ 어떤 개체가 들고 있는(held) 오브젝트는 컬렉팅하지 않아요~
후후ㅜ훟ㅎ.... 결국엔 메모리가 바닦나서 뻗어버리겟져~
예시 3. 씨샵이에영~
List<Form> m_form = new List<Form>();
while(true){
m_form.add(new Form());
}
ㅋㅋㅋ 돌았죵~ C#의 Form 객체는 특히나 메모리를 많이 잡아쳐먹어요~
내부적으로 각 프로퍼티 관리에 사용되는 메모리만 해도 장난이아닙니당~
얼마 못가서 프로그램 죽어버려요~ 자바와는 달리 try, catch로 예외 잡는거도 안대여~
아예 그냥 죽어버려여~
추가. 스택 오버 플로우도 메머리 얼러케이션 펄트의 일종이에여~
x86 시스템에서 스택 스페이스는 가감 할당식으로, push 되면 선두 포인터에서 push한 데이터의 바이트 수만큼 감산하는건데영~
요놈이 한계치 이상 감산되버리면 스택 섹션의 시작 어드레스까지 뻗어나와버려여~
자 그러면 x86, IA-32 Architecture 문서를 잘 살펴보시면 32 Bit Protected Mode에서 Segment 섹션을 살펴보세여~
자 주목하실 것은 다른건 필여없구여~
"허용된 Limit와 Base 밖으로 벗어난 접근을 수행하면 #GP 인터럽트가 발생"
이 문구가 가장 중요해여~
Invalid pointer access, Memory allocation fault, stack over flow 등 메모리 계통 예외, 에러들은 #GP 인터럽트로 부터 기인해여~
#GP란, General protection error라는 놈인뎅 직역하면 일반 보호 오류입니당~
그러니까 CPU가 니까짓게 뭔데 그거 달래? OS한테 일러바친다~하는겁니당~
그러면 OS한테 일러바친 순간 해당 프로세스의 컨텍스트를 살펴볼거고, 마지막으로 수행한 명령어를 읽어들여서 디스어셈블링하면~
요놈! 잡았당!
가 되는거지영~
XOR EAX, EAX
MOV [EAX], 0
하면 #GP가 발생된다는거졍~
R:
PUSH EAX
JMP R
스택을 무한대로 점거하는 이 코드 써도 #GP가 발생된다는 거졍~
내부적으로 PUSH 인스트럭션은~
SUB ESP, 4
MOV [ESP + 4], reg/rm8/16/32
를 수행하니까영~
그러면~
MOV EAX, 1024
PUSH EAX
CALL malloc
PUSH EAX
PUSH 0
PUSH 1024
CALL memset
이걸해봐영~
OS는 메머리 할당에 실패하면 널포인터를 리턴하지용~
자, CALL memset으로 제어가 넘어가는 순간 죽어버려여~
이상 Memory Allocation Fault에 대해서 주저리주저리 해보았습니당~
그럼 수고하세영~
댓글 0