어셈블리 기초 http://blog.naver.com/PostView.nhn?blogId=gangst11&logNo=145839687

캐시레지스터 http://jake.dothome.co.kr/cache2/

msr : 시스템 레지스터는 MSR, MRS 인스트럭션을 사용하여 접근할 수 있다.
 msr SPsel , #1 // 1을 stack pointer seletor에 1 값을 쓴다.
 . The Processor State, or PSTATE fields, for AArch64 have the following definitions:
   SP : Stack pointer selector, 0 = SP_EL0, 1 = SP_ELn
   (https://developer.arm.com/docs/100878/latest/processor-state)

 mrs : 레지스터에 값을 복사해주는 명령 
 mrs x0, CurrentEL // x0에 CurrentEL(Current Exception Level)을 읽어온다

CPSR : Current Program Status Register
  현재 프로그램 상태 레지스터
  연산결과를 저장하는 CPSR(Current Program Status Register)의 4개 필드

  • N (Negative) : 연산결과가 음수인 경우 1로 SET.
  • Z (Zero) : 연산결과가 0인 경우 1로 SET.
  • C (Carry) : 덧셈 연산의 Carry일 경우 1로 SET. 뺄셈 연산의 Borrow일 경우 0으로 Clear. rotation shift 연산에서는 shift되어 밀린 1 bit를 저장.
  • V (Overflow) : signed 연산의 덧셈, 뺼셈에서 연산 결과로 overflow가 발생한 경우 1로 SET

cmp : x0과 CurrendEL_EL2의 값 비교
 cmp x0, #CurrentEL_EL2 // CurrentEL_EL2의 값은 8
 
b.eq : branch on equal 약어. 같이 같으면 분기, condition 부분에 .eq(매크로일수도)
 b.eq 1f // f = forward, b = backward, 가까운 1: 으로 이동
 
mov_q : 64bit register에 상수를 즉시 move, operand bit가 한정되어있어서 인스트럭션 두개로 나눔
 mov_q x0, (SCTLR_EL1_RES1 | ENDIAN_SET_EL1)

- SCTLRThe System Control Register (SCTLR) is a register that controls standard memory, system facilities and provides status information for functions that are implemented in the core.
(https://developer.arm.com/docs/100878/latest/the-system-control-register)

- mov : 왼쪽에 있는 값을 오른쪽으로 복사한다.
mov w0, #BOOT_CPU_MODE_EL1

isb : Instruction Synchronization Barrier
 isb 명령이 동작하는 순간 파이프라인으로 인해 다음 명령이 뒤 따라 들어오게 되는데 이를 모두 버리게한다. 파이프라인 flush. 우선순위를 확실히 구분해야하는 루틴에서는 두 명령 사이에 isb를 실행시켜 두 명령어의 실행순서를 명확히 보장한다.

- adrpAddress of 4KB page at a PC-relative offset. PC에서부터 _PHYS_OFFSET(0x82000)을 더하여 x23에 저장
adrp x23, __PHYS_OFFSET

- adr_l : macro, adrp/add
adr_l x1, __boot_cpu_mode

- adrp : From PC-relative address to 4KB page. 페이지 시스템에서 사용하기위한?

ADR은 ARM 명령어가 아니라 PC의 상대 주소를 계산하여 주소값을 얻어오는 어셈블러 매크로입니다.
 adr r0, adr_test // r0 = adr_test 함수의 주소를 복사한다?

- str : 저장 명령어
str w0, [x1] : x1의 주소에 w0을 저장한다.
[Rm] = Rd. 메모리 주소에 레지스터 값을 저장합니다.

- ldr : 로드 명령어
 ldr r1, [r2, #16] : r2에 16byte만큼 더한 주소에서 정수형 값을 읽어와 r1에 저장한다.
 Rd = [Rm]. 해당 메모리 주소의 값을 레지스터에 저장합니다.

- dmbhttp://jake.dothome.co.kr/barriers/
dmb sy

- dc
dc ivac, x1

__create_page_tables : head.S line 287

- TTBR : Translation Table Base Register, 페이지 테이블 주소가 저장되는 레지스터

'개발' 카테고리의 다른 글

AArch64 generic timer  (0) 2019.12.09
plot graph color  (0) 2019.10.04
컴파일러  (0) 2019.01.08
[AWS] 스케일업, 스케일다운: 오토스케일링과 클라우드와치  (0) 2018.10.13
AWS dynamodb  (0) 2018.09.04

+ Recent posts