지난 글에서는 set 합성 명령어의 구조와 작동 원리를 알아보았다.
set 명령어는 sethi 명령어와 or 명령어의 조합으로 이루어져 있으며, sethi 명령어는 피연산자로 들어온 메모리 주소값의 상위 22비트를 마찬가지 피연산자로 들어온 레지스터의 상위 22비트에 쓰는 명령어이다.
or 명령어로는 나머지 하위 10 비트의 데이터를 레지스터의 하위 10비트에 쓴다.
(32비트의 주소값 데이터를 2번에 걸쳐 레지스터에 쓴다.)
이번 글에서는 SPARC의 메모리 맵을 다시 한번 살펴보면서 지난번에 정리하지 못했던 정적 메모리 영역 중 bss 영역에 대해 추가적으로 정리하고자 하려고 했으나...
강의록에 bss 부분에 대한 내용이 너무 없어서 그냥 SPARC 메모리 맵을 복습하는 느낌으로 작성하려고 한다.
SPARC 메모리 맵
SPARC의 메모리 맵은 크게 Static / Heap / Stack 으로 나뉜다.
오늘 정리할 내용은 Static 영역에 속하므로, 먼저 Heap과 Stack을 간단하게 정리해보자.
Heap 영역
Heap 은 런타임에 동적으로 할당되는 메모리공간이다.
SPARC의 ld 계열 명령어로 할당한 메모리는 모두 동적 할당된 메모리로 Heap 영역에 데이터가 저장된다.(?)
(동적 할당이 맞는 것 같기는 한데, Heap 영역 할당이 맞는지 확신이 없다. stack 영역은 save 명령어로 할당하니까 ld 명령어는 heap 영역이 아닐까 예상중... Data 영역 정리하다보니 생각난건데, Data 영역은 라벨로 메모리 위치를 표시해서 접근할 수 있는데, Heap 영역은 애초에 어떻게 접근하는 건지 궁금하다.) 그러면 Data 영역도 ld 명령어로 쓰는 거니까 Heap 영역에 반드시 저장된다고는 할 수 없겠군...
(그리고 또 궁금한 점. 스택 영역은 정말 '스택' 자료구조가 동작하는 방식으로 메모리가 할당되고 해제되는데, Heap 영역은 Heap 자료구조가 동작하는 방식으로 할당되고 해제되어서 Heap 으로 불리는 걸까..?
나중에 자료구조 수업시간에 따로 질문해봐야겠다.)
Stack 영역
Stack 역시 런타임에 동적으로 할당되는 메모리 공간이다.
(다른 블로그 글에서 컴파일 타임에 사이즈가 결정된다고 하는데, 역시 추가 공부가 필요할 것 같다.)
스택 영역은 함수와 관련된 메모리 공간이다.
SPARC에서 서브루틴(함수)을 호출 할 때마다 Stack 영역에 여러가지 목적을 위해 메모리를 할당하는데, 이때 사용하는 메모리가 Stack 영역이다. 나중에 서브루틴을 정리할 때 더 자세히 적을 예정이다.
이 스택 영역의 메모리가 부족하여 함수를 실행할 수 없는 경우를 '스택 오버플로우' 라고 한다.
Static 영역
Static 은 정적 메모리 공간으로, 컴파일 (어셈블?) 하는 동안 할당되는 영역이다.
말 그대로 '정적' 이므로 실행중에 새로 추가되거나 사라지는 일 없이 영역의 크기가 고정되어 있다.
Text 영역
Static 영역 중 text 영역은 프로그램의 소스코드와 같이 값이 변하지 않는 데이터를 저장하는 메모리 공간이다.
프로그램 소스코드 뿐만 아니라 값이 변하지 않을 '읽기 전용' 데이터를 저장하는 용도로도 사용할 수 있다.
(중간고사 문제에 나왔는데, 헷갈려서 data 영역으로 썼었다...ㅎ)
즉, Text 영역은 그 영역의 사이즈도, 영역의 데이터도 컴파일(어셈블) 타임에 결정되어 변하지 않는다.
Data 영역
Static 영역 중 data 영역은 static 변수와 전역 변수를 저장하는 공간이다.
Read-Only 데이터가 아니므로 중간에 수정이 가능하다.
데이터를 수정할 때는 수정할 데이터를 저장하는 위치에 라벨을 이용해 표시해두고, 라벨을 통해 메모리 주소값을 계산해 접근하여 수정할 수 있다. (지난 글에서 정리한 set 명령어를 통해 라벨로 표시한 메모리 주소를 레지스터에 저장할 수 있다.)
Bss 영역
다른 static 영역과 동일하게 아래와 같이 영역을 선언하고 사용한다.
.section ".bss"
또는
.bss
bss 영역의 특징은, 이 곳에 할당된 모든 데이터가 0으로 초기화 된다는 점이다.
아래와 같은 코드를 통해 bss 영역에 0으로 초기화된 변수를 선언할 수 있다.
.bss
i_m: .skip 4
ary: .skip 4*100
i_m 이라는 라벨로 0으로 초기화된 4바이트 (1워드) 메모리 공간을 가리켜 할당할 수 있다.
ary 라는 라벨로 0으로 초기화된 4바이트 (1워드) 사이즈의 연속된 메모리 공간 100 개를 할당할 수 있다.
이는 마치 배열과 같이 동작할 수 있다. (연속된 공간이므로)
참고
https://all-young.tistory.com/17
'CS > 어셈블리' 카테고리의 다른 글
[SPARC] 26. Stack Frame 사용 예제 (0) | 2023.11.19 |
---|---|
[SPARC] 25. Stack Frame (0) | 2023.11.17 |
[SPARC] 23. label로 data 영역의 메모리주소 가져오기 (set, sethi) (0) | 2023.11.09 |
[SPARC] 22. 정적 메모리와 경계정렬 (0) | 2023.10.20 |
[SPARC] 21. 메모리 (0) | 2023.10.19 |