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에 대해서 주저리주저리 해보았습니당~

그럼 수고하세영~