https://ggamji.tistory.com/109

 

navilos - 2. 펌웨어 만들고, 빌드 자동화

ARM 아키텍처의 동작 시작 - 전원 인가시 리셋 벡터 메모리 주소 0x00000000의 명령 실행 시작점 만들기 - boot 폴더에 Entry.S 파일 만들고 다음과 같이 작성 - .text는 .end까지 텍스트 섹션을 의미 - .code

ggamji.tistory.com

 

예전 글에 어셈블 코드 작성하는 내용을 올리긴 했지만 한참 된 내용이라 잘 생각나지는 않았다.

방금 간단하게 어셈블리어에 대해서 공부했지만 여전히 이해되지 않는 부분이있어서 다시 살펴보면

 

 

 

.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

 

What is .word, .data and .text in assembly?

I am trying to learn to get a better understanding with assembler Could someone explain what .data, .word and .text means does in the following code?? I don't get what this is for and what it doe...

stackoverflow.com

 

.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

 

What does `b .` mean in this ASSEMBLY code?

So I'm looking into the source code for Redox OS (An operating system made with Rust) just to see if I can learn something. I'm reading the assembly file start.s in the bootloader folder. In the

stackoverflow.com

 

 

 

따로 정리하지 않았는데

RealViewPB의 0x1000 0000의 주소는 ID 레지스터의 역활로 하드웨어에 대한 설명을 하고 있고

여기에는 0x1780500이 들어있어서 위 익셉션 벡터 테이블만 구현한 어셈블리 코드를 빌드해서 실행한걸

디버거로 보면

 

info register (i r) 명령어 결과 r1에 0x1780500이 코드 대로 들어가 있다.

 

 

+ Recent posts