https://ggamji.tistory.com/109
예전 글에 어셈블 코드 작성하는 내용을 올리긴 했지만 한참 된 내용이라 잘 생각나지는 않았다.
방금 간단하게 어셈블리어에 대해서 공부했지만 여전히 이해되지 않는 부분이있어서 다시 살펴보면
.text
.code 32
.global vector_start
.global vector_end
vector_start:
MOV R0, R1
vector_end:
.space 1024, 0
.end
.code 32 : 명령어크기는 32비트
.global : C언어의 extern 역활. 외부에서 읽을수 있게
MOV R0, R1 : R1의 값을 R0에
.space 1024, 0 : 현위치에서 1024바이트를 0으로 채우기
라고 정리를 했었는데
여전히 '.'이 무엇인지 잘 몰라 찾아보니
다음 글을 참고했다.
https://stackoverflow.com/questions/60403872/what-is-word-data-and-text-in-assembly
.text는 텍스트 세그먼트
.data는 변수 선언부 = 데이터 세그먼트
.word 의 경우 16비트 메모리는 2바이트, 32비트 메모리는 4바이트 할당을
.end는 종료 부분을 나타낸다고 한다.
추가로 아래의 C언어 코드를
int array[] = {0x12121212, 0x23232323, 0x34343434, 0x4, 0x5};
어셈블리로 표현하면 아래와 같다고 한다.
array:
.word 0x12121212, 0x23232323, 0x34343434, 0x4, 0x5
다음 내용은 익셉션 벡터 테이블을 구현하는데
.text
.code 32
.global vector_start
.global vector_end
vector_start:
LDR PC, reset_handler_addr
LDR PC, undef_handler_addr
LDR PC, svc_handler_addr
LDR PC, pftch_abt_handler_addr
LDR PC, data_abt_handler_addr
B .
LDR PC, irq_handler_addr
LDR PC, fiq_handler_addr
reset_hander_addr: .word reset_handler
undef_handler_addr: .word dummy_handler
svc_handler_addr: .word dummy_handler
pftch_abt_handler_addr: .word dummy_handler
data_abt_handler_addr: .word dummy_handler
irq_handler_addr: .word dummy_handler
fiq_handler_addr: .word dummy_handler
vector_end:
reset_handler:
LDR R0, =0x10000000
LDR R1, [R0]
dummy_handler:
B.
.end
여전히 이해 안되는 부분이 몇가지가 있다.
.text에서 시작해서 .end로 끝나는데 .data가 보이지 않는다.
LDR pc, reset_handler_addr 인데 pc에다가 저 주소를 넣는건 알겠지만 저 주소를 입력한 적이없다.
(이건 아직 구현단계가 아니니 넘어가도 될거같고)
다시 앞에서 보니
global _start
_start: 에서 시작한다 했지만
이전에 구현한 링커 내용을 보면
ENTRY(vector_start)
SECTIONS
{
. = 0x0;
.text :
{
*(vector_start)
*(.text .rodata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
ENTRY(vector_start) : 시작점을 vector_start 심벌을 지정해서 _start가 없어도 됬었던거 같다.
'.' 은 위치 카운터인가 역활을 한다 했는데,
. =0x0; : 첫 섹션(.text)의 위치가 0x0에서 시작한다를 알려주기 위한 용도
.text, .data, .bss 순서로 섹션을 메모리에 배치하는데
.text 안에서는 *(vector_start), *(.text .rodata) 순으로 배치된다. 정도로 이해가 된다.
리셋 벡터
ARM 코어에 전원 인가시 리셋 벡터 0x0000 0000의 명령이 실행하는데
아래의 코드와 위 링커에 따르면 vector_start는 0x0로 해당 위치에 배치되서
MOV R0, R1이 인가시 바로 실행되고, 그다음에 .space 1024, 0 명령이 수행된다는 소리로 보인다.
.text
.code 32
.global vector_start
.global vector_end
vector_start:
MOV R0, R1
vector_end:
.space 1024, 0
.end
다시 익셉션 벡터 테이블로 돌아와서 보면
.text
.code 32
.global vector_start
.global vector_end
vector_start:
LDR PC, reset_handler_addr
LDR PC, undef_handler_addr
LDR PC, svc_handler_addr
LDR PC, pftch_abt_handler_addr
LDR PC, data_abt_handler_addr
B .
LDR PC, irq_handler_addr
LDR PC, fiq_handler_addr
reset_hander_addr: .word reset_handler
undef_handler_addr: .word dummy_handler
svc_handler_addr: .word dummy_handler
pftch_abt_handler_addr: .word dummy_handler
data_abt_handler_addr: .word dummy_handler
irq_handler_addr: .word dummy_handler
fiq_handler_addr: .word dummy_handler
vector_end:
reset_handler:
LDR R0, =0x10000000
LDR R1, [R0]
dummy_handler:
B.
.end
vector_start에서 각 핸들러 주소를 담는, 점프하는 내용들이 쭉 있는데
reset_handler_addr: .word reset_handler는 아래 섹션 처럼 구현한다는 말인거 같다.
dummy_handler 는 B.이 전부인데
아래의 링크에 따르면
b는 무조건 분기이며
dummy_handler:
B .
는 결국 dummy_handler로 무조건 점프, 즉 무한루프를 하라는 의미라고한다.
https://stackoverflow.com/questions/48084634/what-does-b-mean-in-this-assembly-code
따로 정리하지 않았는데
RealViewPB의 0x1000 0000의 주소는 ID 레지스터의 역활로 하드웨어에 대한 설명을 하고 있고
여기에는 0x1780500이 들어있어서 위 익셉션 벡터 테이블만 구현한 어셈블리 코드를 빌드해서 실행한걸
디버거로 보면
info register (i r) 명령어 결과 r1에 0x1780500이 코드 대로 들어가 있다.
'컴퓨터과학 > os' 카테고리의 다른 글
navilos - 6. 익셉션 핸들러 구현2, 메인함수 진입 (0) | 2022.08.18 |
---|---|
navilos - 5. 익셉션 핸들러 구현 1 (0) | 2022.08.17 |
navilos - 3. 메모리맵 (0) | 2022.08.17 |
navilos - 2. 펌웨어 만들고, 빌드 자동화 (0) | 2022.07.17 |
navilos - 1. 개요와 개발환경 구축 (0) | 2022.07.17 |