Tuuna Computer Science

리눅스 메모리에 대해 본문

System programing

리눅스 메모리에 대해

GuTTe 2018. 8. 10. 23:53


일단 위 메모리 구조를 보자 어셈블리로 코딩을 해보면 .section .data에 데이터공간을 선언하고

.section .text에 코드를 적은적이 있을 것이다. 

 그리고 완성된 소스파일을 어셈블하고 링크작업을 한 뒤 프로그램을 실행하면 메모리에 프로그램이 올라가게 될 것이다. 

그럼 이 프로그램이 어떻게 메모리에 올라가느냐 

일단 우리가 적은 코드 즉,  .section .text섹션은 메모리의 0x08048000에 적재될 것이다.  그리고 .section .data영역도 그 다음에 선언된다. 그 다음은 .bss영역이 선언된다. 

또한 그 위엔 LIFO식인 stack영역이 존재하고 stack 영역 위엔 프로그램의 인자가 적재된다. 즉 프로그램의 이름(NULL문자로 끝나는)과 프로그램실행시 넘기는 각종 인자가 메모리에 적재된다. 

아차, 하나 더 말하자면 0xFFFFFFFF ~ 0xBFFFFFFF은 커널 공간이다. 사용자가 직접 접근이 불가능한 공간이다. 

그럼 지금까지 stack과 데이터영역에 대해 설명했는데 설명을 토대로 그림을 그려보면 stack영역과 bss영역이 맞물릴 것이다. 

이 맞물리는 영역이 break영역이다. 또한 이 break영역으로 부터 동적할당을 하여 Heap영역에 대한 메모리 공간을 할당할 수 있다. 

Heap영역은 사용자가 제어하는 메모리공간이다. 즉, 사용자가 원할 때 선언하고 필요하지 않다면 해제시키는 공간이다. 

그럼 이 Heap영역과 Stack영역은 어떻게 봐야할까 같은 세그먼트로 봐야할까? 아니면 다른 세그먼트로 봐야할까 

필자의 생각으로는 같은 세그먼트로 봐야한다고 생각한다. 

처음엔 Stack과 Heap영역에 아무것도 선언하지 않으면 크기가 0인 상태가 된다. 

하지만 스택에 인자를 넘기거나 공간을 할당하면서 Stack이 위에서 아래로 LIFO식으로 확장되는 반면 Heap영역에는 malloc이나 brk 등등 메모리 동적할당을 통해서 

아래에서 위로 확장된다.

위 설명들은 옛날 방식일 수도 있다. ㅇㅅㅇ 

또한, 설명에서 빠졌는데 32bit 시스템에서 2G가의 물리메모리를 갖고 있다고 가정했을 때 3G의 그래픽프로그램을 실행할 수 있을 까? 

결론은 실행할 수 있다. 

어떻게 실행할 수 있을가? 

그 방법은 모든 프로그램은 가상메모리를 지니고 있기 때문이다. 32bit 시스템에서 가질 수 있는 최대 메모리 4G를 가지며 1G가는 커널영역 3G가 유저영역으로 

프로그램마다 이런 하나의 독립적인 가상메모리를 가지고 있고 프로그램이 실행되면 각자의 가상메모리에서 로드가 되고 이 가상메모리는 물리메모리에 매핑이된다. 

하드디스크에 있는 페이징파일 또한 가상메모리로 사용될 수 있는데 이를 SWAP 기법이라고 한다.

 사용 활요은 현재 안쓰는 프로그램은 가상메모리로 사용할려는 프로그램은 물리메모리로 매핑하면 된다. 



두서 없이 적었는데 필자가 공부한 내용을 바탕으로 정리한거라 신경안씀 




















'System programing' 카테고리의 다른 글

system call  (0) 2018.06.11
[ 공유 메모리 ]  (0) 2018.06.09
[ 좀비 프로세스 ]  (0) 2018.06.09
[리눅스] 프로세스에 대해서  (0) 2018.06.09
Comments