Linux의 virtual memory management를 살펴보셔야 할 것 같습니다.
어떻게 memory protection을 지원하는지 그 mechanism을 살펴보세요.
공룡책같은 Operating System 책들의 Virtual memory 챕터를 보세요.
예를들어 그 free한 메모리가
여러개의 memory fragment로 구성된, 그리고 그 해당 프로세스에게 할당 된
1개의 memory page에 속해 있었고, 그 메모리는 단지 그 중 한개의 fragment에만 속해있었고
1. memory protection을 위한 boundary 체크가 fragment단위가 아니라 page단위로 되고 있었고
2. 그 해당 page에 그 프로세스에서 쓰고 있는 다른 메모리와 같은 page에 있었기 땜시 그 page는 해당 프로세스에 계속 부여된 상태였고
3. printf함수에서 %s을 인지하는건 그 해당 시작 메모리 번지부터 '\0'이 나올 때 까지인데, 운이 좋게도 그 부분에 저장 된 값의 very beginning에 \0이 있어서 몇 바이트 읽지도 않고 printf가 메모리를 읽는걸 중지해버버려서 해당 페이지를 넘어서는 access를 안했기 땜시
memory boundary check에 안걸렸지 않을까 싶습니다. ( 완전 추측. 전혀 근거 없음. 저는 리눅스 VM 관리에 대해 전혀 모릅니다. )
free한 메모리는 일반적으로 OS로 바로 반환되지 않습니다. 바로 반환해 버리면 malloc이나 free를 할 때마다 계속 시스템 콜을 불러야 하니 성능이 매우 저하되겠죠.
따라서 (대부분의 경우) free를 했다는 건 heap을 관리하는 C runtime library만 알고 있는 상황이고 OS는 모릅니다. 물론 library는 자기 프로세스의 특정 페이지를 사용 불가로 마킹하는 짓 같은 건 하지 않기 때문에 그 영역을 다시 읽고 써도 SEGV는 뜨지 않습니다.
안죽는 경우는 그야
안죽는 경우는 그야 말로 운 이라고 생각합니다.
해당 메모리 주소를 접근 할 때 다행히도 미리 다른데서 사용중이지 않은 경우지요.
안죽는 일이 계속 벌어진다면, LOST의 주인공으로 자격이 충분하다고 생각됩니다.
같이 Dharma initiative와 관련된 음모를 파해쳐보시지 않겠습니까?
from. LOST에 영혼이 멍~ 해진 일인.
PS> 재미 없으셨죠? 죄송합니다... ToT
-------------------------------------------------
$yes 4 8 15 16 23 42
-------------------------------------------------
$yes 4 8 15 16 23 42
앗, 두번
앗, 두번 포스팅되었네요. 죄송합니다... 아직도 댓글 지우는 방법을 몰라요.
PS> LOST season 5를 기다리며
-------------------------------------------------
$yes 4 8 15 16 23 42
-------------------------------------------------
$yes 4 8 15 16 23 42
kldp에서 웃기도 하네요
님 ~ 재밌었어요.
이런 답 너무 좋아요~ㅋㅋ
free(ptr); ptr=0;
무조건 아무 이유없이 그냥...
노예를 해방했으면 션하게 풀어주지 왜 다시 쓰려고 하심?
인심좋아서 또 해방하면 거만해지기도 함
포탈이는 불사신
-------------
포탈이는 불사신
Linux의 virtual memory
Linux의 virtual memory management를 살펴보셔야 할 것 같습니다.
어떻게 memory protection을 지원하는지 그 mechanism을 살펴보세요.
공룡책같은 Operating System 책들의 Virtual memory 챕터를 보세요.
예를들어 그 free한 메모리가
여러개의 memory fragment로 구성된, 그리고 그 해당 프로세스에게 할당 된
1개의 memory page에 속해 있었고, 그 메모리는 단지 그 중 한개의 fragment에만 속해있었고
1. memory protection을 위한 boundary 체크가 fragment단위가 아니라 page단위로 되고 있었고
2. 그 해당 page에 그 프로세스에서 쓰고 있는 다른 메모리와 같은 page에 있었기 땜시 그 page는 해당 프로세스에 계속 부여된 상태였고
3. printf함수에서 %s을 인지하는건 그 해당 시작 메모리 번지부터 '\0'이 나올 때 까지인데, 운이 좋게도 그 부분에 저장 된 값의 very beginning에 \0이 있어서 몇 바이트 읽지도 않고 printf가 메모리를 읽는걸 중지해버버려서 해당 페이지를 넘어서는 access를 안했기 땜시
memory boundary check에 안걸렸지 않을까 싶습니다. ( 완전 추측. 전혀 근거 없음. 저는 리눅스 VM 관리에 대해 전혀 모릅니다. )
OS VM Management 잘 아시는 분 계시면
리플 달아주세요 ㅋ
free한 메모리는
free한 메모리는 일반적으로 OS로 바로 반환되지 않습니다. 바로 반환해 버리면 malloc이나 free를 할 때마다 계속 시스템 콜을 불러야 하니 성능이 매우 저하되겠죠.
따라서 (대부분의 경우) free를 했다는 건 heap을 관리하는 C runtime library만 알고 있는 상황이고 OS는 모릅니다. 물론 library는 자기 프로세스의 특정 페이지를 사용 불가로 마킹하는 짓 같은 건 하지 않기 때문에 그 영역을 다시 읽고 써도 SEGV는 뜨지 않습니다.
댓글 달기