프로세스로딩후메모리및 stack 구조이해
학습목표 실제프로그램이 CPU 에의해메모리에상주되었을때메모리구조에대하여숙지한다. 논리적스택에대한개념과작동원리를이해한다. 논리적스택구조에대하여자세히각부분별기능이무슨역할을하는지를파악한다.
메모리구조모습 (1) 메모리구조 ( 코드영역 ) 논리적스택개념논리적스택구조논리적스택구조특징 more 프로그램실행후메모리구조모습 (1) 개념 프로그램이 CPU 에의해메모리에탑재되었을시실제메모리와프로세서와의관계를기준으로메모리와스택의구조를표현한것이다. 프로세스프로세스 A A 물리적물리적메모리메모리 프로세스프로세스 B B data data bss bss data data text text Text( Text( 실행코드실행코드 ) ) O/S O/S bss bss data data text text
메모리구조모습 (2) 메모리구조 ( 코드영역 ) 논리적스택개념논리적스택구조논리적스택구조특징 more 프로그램실행후메모리구조모습 (2) 개념 특정프로세서가메모리에로딩한후해당프로세서에서사용하고있는각기능별내용이 segment 레지스터를이용하여실제메모리에탑재된모습을자세히표현한것이다. 하위하위상위상위 Code Code zone zone Data Data zone zone Heap Heap zone zone 또는또는BSS zone zone Return Return addr addr 프로그램프로그램명령명령 변수변수영역영역 (public, (public, private, private, static) static) 프로그래머가프로그래머가임의로임의로정한정한메모리메모리 (malloc,alloc,calloc (malloc,alloc,calloc 등시스템시스템콜에콜에의해의해 ) ) 변수나변수나함수의함수의인자가인자가저장저장 데이터를데이터를일시적으로일시적으로보관하는보관하는영역영역 프로그램의프로그램의종료종료
메모리구조모습 (2) 메모리구조 ( 코드영역 ) 논리적스택개념논리적스택구조논리적스택구조특징 more 메모리구조 ( 코드영역 ) 개요 프로그램작성시사용하는 Instruction( 명령어 ) 들이메모리에로드되는지역으로포인터가 CS 레지스터와연결되어있는구조를가지고있다. 특징 실행파일의텍스트영역과대응하는읽기전용의실행코드가삽입되는지역이다. 이영역의크기는프로그램구동시크기가결정되는특징을가지고있다. 이영역에데이터를기록하려고하면 segment fault 가발생할수있다.
메모리구조모습 (2) 메모리구조 ( 데이터영역 ) 논리적스택개념논리적스택구조논리적스택구조특징 more 메모리구조 ( 데이터영역 ) 개요 이지역은프로그램작성시각종변수를모아두는지역으로 DS 레지스터와연결하여변수포인터를지정하고통제할수있다. 특징 초기화되었거나되어있지않은변수들을저장한다. 정적유형의변수들이나문자열들이이영역에저장되고코드영역에존재하는각종실행명령파일들이이영역과함께참조하여사용한다. Unix 시스템에서초기시스템콜 (0x80) 에의해크기가조정될수있다. 메모리가소진되면프로세스는다시스케줄링되어더큰영역의메모리를할당받게되며이때새로운메모리가데이터영역과스택영역사이를자동삽입하게되어있다.
메모리구조모습 (2) 메모리구조 (Bss 또는 Heap) 논리적스택개념논리적스택구조논리적스택구조특징 more 메모리구조 ( Bss(Block Started by symbol) 또는 Heap ) 개요 프로그램로딩시메모리를동적으로할당되는지역을의미한다. 특징 초기화되지않은동적데이터를저장하는세그먼트로써유닉스링커에의해생성된다. 이름과크기는가질수있지만초기값은 NULL 을저장한다. 프로그래머에의해임의로정한메모리영역 (malloc,alloc,calloc) 등의시스템콜에의해할당된다.
메모리구조모습 (2) 메모리구조 (Bss 또는 Heap) 논리적스택개념논리적스택구조논리적스택구조특징 more 논리적스택개념과작동원리 개념 데이터를잠시보관할메모리영역으로프로그램상에서배열로선언된값이정적으로할당받은지역을의미한다. 작동원리 LIFO : 후입선출법으로가장나중에추가된데이터가가장먼저추출되는방식을의미한다. Push : 스택에새로운데이터요소를추가할때사용. POP : 스택으로부터데이터추출할때사용. SP( Pointer) : CPU 에의해스택을가르키는레지스터를지적하는것을의미한다. 논리적스택구조 buf (0) buf (1) buf (2) buf (3) EBP Return addr a b c EBP Return addr buf (0) buf (0) 로컬변수 saved stack pointer Sub (a, b, c)
메모리구조모습 (2) 메모리구조 (Bss 또는 Heap) 논리적스택개념논리적스택구조논리적스택구조특징 more 개념 논리적스택구조 스택은실제동작하기위해서는반드시논리적으로구분되어진다. 데이터데이터저장저장상위상위 - - 하위로하위로저장저장 : : : : : : 4 4 3 3 2 2 1 0 1 0 limit limit SP( SP( pointer) pointer) top top frame frame base base 스택은 base 로부터데이터항목을차례로쌓아올린모양을가진다. 삽입과삭제는현재저장된최상위항목이위치한 top 에서만일어나며 Top 위치는 sp 라는지시자를가르킨다. 스택포인터는스택 base 에서시작하여항목이삽입되면증가되고삭제되면감소한다. 스택은한계가있어서그한계를초과할수없도록구성되어있다.
메모리구조모습 (2) 메모리구조 (Bss 또는 Heap) 논리적스택개념논리적스택구조논리적스택구조특징 more 논리적스택구조특징 (1) 스택구조특징 SP 는스택을가르키는 CPU 레지스터이며스택의출발지를나타내는베이스주소는항상고정되어있다. 스택의크기는실행시커널에의해서정적으로결정된다. 스택은여러개의스택프래임으로구성되어있다. 스택프래임은 push 와 pop 에의해데이터저장 / 삭제시경계선으로사용되어진다. Intel, Motorola, SPARC, MIPS 등의 CPU 는상위메모리에서하위메모리쪽으로데이터를저장한다.
메모리구조모습 (2) 메모리구조 (Bss 또는 Heap) 논리적스택개념논리적스택구조논리적스택구조특징 more 논리적스택구조특징 (2) SP 외에 FP(Frame pointer) 나 LB(Local pointer) 를사용하는시스템들이존재할수있다. FP 역할 처음함수가불렀을때스택의위치를가리키는역할을한다. 인텔에서는 BP(EBP) 를사용하며모토로라는 A7 레지스터를제외한아무레지스터를사용하여 FP 역할을수행할수있다. 함수사용시 FP 와 SP 작용원리 함수사용전사용하던 FP 를저장 FP 에현재 SP 를대입후지역변수크기만큼증가 (procedure prelude) 함수종료시 SP 와 FP 를원상복귀 (procedure epilogue) Procedure 종류 Procedure prelude Procedure epilogue 인텔 Enter leave 모토롤라 link uplink
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 끝 스택생성적용예제 상황 예제 스택의크기를 10 바이트로생성한후스택이름을 buf 라명명하고 function 함수를이용숫자 12345 string haha 를스택에 push 하는예제이다. 컴파일방법 : # gcc o o test test.c 실행 : #./test
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 끝 스택동작원리 개요 특정프로그램이메모리에상주후정적으로선언한배열은스택의구조를갖게되며다음과같은동작원리에의해동작하게된다. 동작원리순서 Base pointer Push 점검 IS Full POP 점검 IS Empty
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 스택의초기구조 끝 스택동작 스택의초기구조 SP 가처음 Base 주소를가르키고있는것을의미하며이곳으로부터 stack 이초기화되면서 stack 을사용할수있는첫번째지점이된다. PUSH PUSH POP POP Isfull Isfull Isempty Isempty sp sp 지점지점
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 (2) push 끝 스택동작 (2) - push 개념 Cpu 에의해정적으로선언된배열에특정데이터값을삽입, 추가하고자할때사용한다. 만일이명령이사용되어지면 stack pointer 가상위주소로한개씩이동하면서데이터값을저장하게되는특성을가지고있다. 특징 데이터항목을삽입하려면 sp 값을하나씩증가시켜두고스택의 top 에데이터값을저장한다. 데이터항목을삽입하기전에는새로운항목을저장할빈공간이있는지반드시검사한다. D D C C B A B A E E D D C C B A B A E E sp sp 지점지점 sp sp 지점지점
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 (3) 스택의 full checking 끝 스택동작 (3) 스택의 full checking 개요 특징 스택포인터에의해 push 가작동할때반드시선언된배열의최대값을점검하여야하는데이것을스택의 full checking 이라고표현하며만일점검하지않는다면 segmentation fault 가발생한다. 다음그림처럼스택이데이터로가득차면새로운데이터항목을삽입할수없다. 데이터항목삽입전에는먼저스택포인터가스택의한계에도달해있는지를검사해야한다. 만일스택포인터가스택의한계를검사하지못하면 bufferoverflow 가발생한다. G F E D C B A 한계 sp 지점
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 (4) POP 끝 스택동작 (4) - POP 개요 특징 POP 를실제스택내저장된데이터값을추출하거나삭제할때사용하는명령어이며추출시스택포인터는반드시가장나중에추가된값부터추출해야한다. 데이터항목을삭제또는추출하려면스택의 top 에있는데이터항목을제거하고 sp 값을하나씩감소한다. 데이터항목을삭제하기전에스택이비어있는지를검사해야한다. 만일스택이비어있는지를점검하지않으면 segmentation fault 에러가발생할수있다 E D C B A D C B A sp 지점 E sp 지점
논리적스택구조특징 스택생성적용예제 스택동작원리 스택동작 (5) 스택 Empty 값검사 끝 스택동작 (5) 스택 Empty 값검사 개념 스택포인터에의해특정데이터를추출, 삭제시반드시스택의 empty 값을검사하여야하며검사하지않을시에는 segmentation fault 오류가발생한다. 특징 다음의그림처럼스택이비어있으면, 데이터항목을삭제할수없다. 데이터항목을삭제하기전에스택포인터가 base 에도달했는지를반드시확인한다. Empty Empty sp sp 지점지점
요점정리 특정프로그램이 cpu 에의해메모리에상주되었을때구조는다음과같다. Code zone Data zone Heap zone zone ebp Return 스택이란특정프로그램에서배열을선언하였을시 cpu 에의해일시적으로특정데이터값을저장하기위한메모리공간을의미하며정적메모리공간을할당받는다. 스택의동작원리는 Isfull, Isempty, push, pop 등이 stack pointer 의해서이동하면서알맞은역할을하게된다. 스택의구조는다음과같이되어있다. Base frame pointer top limit