본문 바로가기

무언가 만들기 위한 지식/SPARC Assembler

SPARC Assembler Memory Map

어셈블러를 수월하기 위해서는 사실 절차적인 면에서,
Register SetMemory Map에 관한 이해가 가장 필수적이다.

지난번에 Register Set에 대해서는 여러번 언급을 하였고,
이번에는 Memory Map에 대하여 이야기 하려 한다.

확실히 이 두가지가 돌아가는 구조를 확실히 알아야, 배열 및 구조체 및 기타 여러 기능들을 구현이 가능하고 쉽게 프로그래밍이 가능하다. 워낙 눈에 보이지 않는 개념적인 구조라 더욱 확실히 알아야 한다.
필자가 읽은 책에도 이러한 자세한 언급은 뒤쪽에 되어 있어, 이제서야 포스팅을 하고 있다 -.,-;

자, 그럼 예전에도 많이 등장했던 Memory Map 그림을 보자.


좌측의 그림은 아래쪽이 높은 주소이고, 위가 낮은 주소로 낮은 주소로 Stack이 자라나는 방향이다. %sp와 %fp와의 관계는 Stack설명시 여러번 언급했다.

여기서 Heap은 Stack과는 달리 단순히 쌓여서 올라가는 구조가 아닌 공간에 할당되는 영역이다. Heap의 경우 Stack과는 다른 방향, 즉 위에서 아래로(낮은주소에서 높은주소로) 증가하게 된다.

그림상에서 가운데 부분에 큰 두께의 선을 기준으로 위의 text, data, bss영역은 Static 영역이다. 이 부분은 컴파일 시간에 할당되는 영역이다.

그리고 아래 방향의 heap과 stack은 dynamic영역으로 실행시간에 할당되는 영역이다. (heap : 실행 시간 임의의 지점에서 메모리를 할당/수거, stack : 함수호출때마다 프레임 할당영역)

그럼 이제 우리가 모르는 것은 바로 text영역과 data영역, bss영역 이다. 이제 이 3가지가 무엇인지에 대하여 알아보자.

먼저 [text]영역
이 부분은 Read-Only변수가 저장되는 공간이다. 우리가 작성하는 코드부분이 바로 text영역이다. 이 부분은 Section ".text"으로 시작된다. 이곳에 저장되는 공간은 프로그램 실행도중 변경 및 수정이 불가능하다. 프로그램상에서 가장 하단부에 존재한다. (일반적으로)



[data]영역
이 부분은 초기화시키는 영역이다. 이 공간은 추후 일정 메모리 접근 공간으로 사용가능하다, 즉 프로그램 실행도중 자유롭게 접근하여 수정 및 변경이 가능하다. Label을 통한 주소로 접근이 가능하다. 레이블 내에서 컴마로 연속되는 공간은 각 단위별로 연결되어 있다.

[bss]영역
bss영역은 data영역과 마찬가지로 초기화 시키는 영역이다. 단 메모리상 공간만 잡아 놓고 실제로 수를 초기화 시키지 않는다. 조금 깊이 들어가면 bss영역에서는 어느정도의 공간의 크기를 저장할 것이라는 정보를 저장한다. 그후 런타임시에 VM에 링크되어 올라간 후 세그먼트로 바뀔때 영역이 확보된다.
즉 data영역과의 차이점은 바로 이부분이다. 즉 data영역은 초기에 사용할 메모리를 확보하는 반면 bss영역에서는 런타임후에야 메모리영역이 확보된다. 즉 메모리 사용면에서 bss영역을 사용하면 효율적이다. 즉 선언시 초기화 할 필요 없는 변수들을 할당할때 사용된다.

코드상에는 보통 상단에 bss 다음 data 다음 text영역으로 선언한다.
.section이 영역부분을 선언하는 것이다. 이를 코드를 통해 알아보자.

[작성환경 : solaris sparc machine  작성툴 : Vi editor   컴파일러 : gcc]


2~3 Line : skip명령어를 통해 bss 영역을 할당한 모습을 볼수 있다. (skip n은 n공간의 byte를 확보한다는 의미이다.)
5~6 Line : asciz와 ascii로 string을 data영역에 일정 값을 초기화시켜 저장하였다. (asciz는 string의 끝이 Zero이고 ascii는 아니다.)
7~End Line : 7번 하단으로는 모두 text Section이다. 즉 우리가 작성하는 일반적인 코드는 컴파일 시간에 할당되는 Static영역내의 text Segment에 저장되게 된다.