본문 바로가기

Programming/ARM

TTBR0_EL1, TTBR1_EL1, TTBR0_EL2, VTTBR_EL2, TTBR1_EL2 헷갈리는 TTBR register들의 역할을 정리해 보았다. 참조 : https://developer.arm.com/docs/100942/latest/hypervisor-software TTBR0_EL1 : EL1에서 동작. 하위 mem (0x00000000_00000000 ~ 0x0000FFFF_FFFFFFFF) user space 는 translation 되고, kernel 은 identical mapping (VA PA) TTBR1_EL1 : EL1에서 동작. 상위 mem (0xFFFF0000_00000000 ~ 0xFFFFFFFF_FFFFFFFF) user space 는 translation 되고, kernel 은 identical mapping (VA PA) TTBR0_EL2 : EL2에서 동작.. 더보기
NMI (nun-maskable interrupt) arm및 arm64에는 NMI를 지원하지 않음. GICv3 + kernel 5.x 에서 pseude-NMI를 구현하였음. 자세한 내용 -> http://jake.dothome.co.kr/ic/ 더보기
ARM core의 feature enable 여부 확인 방법 ID_AA64MMFR0_EL1, ID_AA64MMFR1_EL1 과 ID_AA64MMFR2_EL1 register값을 확인하면, 어떤 feature 들이 현재 ARM core에서 support 되는지 여부를 알 수 있다. developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64mmfr2_el1 developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64mmfr1_el1 예를들어 현재 사용중인 ARMv8.4-NV 기능 지원 여부를 알고 싶은데, register 값이 ID_AA64MMFR2_EL1: 0x1011 이다. 위 링크한 문서에 따르면 ARMv8.4-NV기능은 아래 bit의 값을 읽고 .. 더보기
ARM core architecture version 확인하기 우리가 흔히 ARMv8.0, ARMv8.1 이러한 식으로 ARM architecture version을 이야기 하는데, system 상에서 이를 확인하는 방법에 대해 알아보자. MPIDR_EL1 register의 값을 통해 알 수 있는데, linux kernel 에서는 이 정보를 procfs로 읽을 수 있다. cat /proc/cpuinfo processor : 이 core의 physical number이다. system에 8개의 pCore가 있다면 0~7까지 정보가 출력된다. BogoMIPS : 생략 Features : .... 이 core에 적용된 feature들을 나열한다. CPU implementer : 생략 CPU architecutre : ARM core의 main version number .. 더보기
[arm] EL2 에서 EL1의 virtual address 보기 EL2 mode 에서 동작하는 code 에서 vbar_el1 값을 읽으면 아래와 같이 보인다. VBAR_EL1 FFFFFF8008082000 VBAR_EL2 00000000800BC800 vbar_el2 의 address 값을 d.l 로 보면, 아래와 같이 exception vector table을 볼 수 있으나, vbar_el1의 값을 따라가 보면 아무것도 볼 수 없다. 0x800BC800 _arm64_vectors_base: .global arm_vectors_minimal arm_vectors_minimal: // SPSel == 0 _arm64_fault // Synchronous EL2 _arm64_fault // IRQ EL2 _arm64_fault // FIQ EL2 _arm64_fault .. 더보기
[armv8] ESL_EL2 분석 - stage2 data abort 아래는 stage2 mmu에서 data abort가 발생했을때 확인된 ESR_EL2 를 분석한 내용이다. ESR (Hexadecimal format, 'q' or 'Q' : Terminate): 0x93830006 2 2 2 1 1 8 4 0 6 2 8 4 0 ----------------------------------------- 1001 0011 1000 0011 0000 0000 0000 0110 ----------------------------------------- ============================================================== Exception from a Data Abort from a lower exception level ========.. 더보기
arm asm - ubfs, lsl, orr, cbz, cbnz, stxr, ldxr ubfs x0, x1, #0, #8 해석 : x1 에서 0 부터 8개의 bit 를 취해서 x0 에 복사 즉, 0~7 까지의 bit 가 x0 에 복사됨 lsl w0, w1, w2 -> w0 = w1 w1=w2|w0 CBZ Rn, label CBNZ Rn, label Rn 이 0이면, label 로 jump CMP Rn, #0 BEQ label Rn 이 0이 아니면, label 로 jump CMP Rn, #0 BNE label LDXR reg, [addr] -> load from memory and exclusive monitor set E flag. STXR w0, reg, [addr] -> If excluseve monito.. 더보기
cache - clean, Invalidate, Flush Clean : Cache의 dirty data를 memory에 write. (Cache line은 dirty에서 clean으로 변경 & data는 Cache line에 존재) Invalidate : Cache line의 valid flag를 0으로 change. (Cache line을 버림) Flush : Clean + Invalidate. [출처] Clean, Invalidate, Flush of Cache|작성자 고고빨간양말 더보기
arm interrupt mask / unmask 의 의미 mask -> disable 하겠다. unmask -> enable 하겠다. 더보기
arm sysmmu 와 mmu 의 차이 core ---(mmu stage 1)--> (mmu stage 2)--> DRAM peripheral --(sys mmu stage 1) --> (sysmmu stage 2) --> DRAM 더보기
irq 와 fiq 의 차이점 원문 : http://blog.naver.com/PostView.nhn?blogId=nhi1999&logNo=100036266880&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 원문요약 IRQ : Interrupt ReQuestFIQ : Fast Interrupt reQuest arm 에서 FIQ 가 IRQ 보다 빠른 이유 1) 전용 register 가 많아서 mode 전환시 stack 으로 store 하는 시간 절약 ----------------------------------------------------- User FIQ Super Abort IRQ Undefined -------------------.. 더보기
PMU - Performance Monitoring Unit 원문 : http://cares.snu.ac.kr:8000/courses/emb/2013_1/assignment/2/Assignment2.pdfPMU - Performance Monitoring Unit PMU란 Performance Monitoring Unit으로 시스템 내부에서 발생하는 하드웨어 관련 이벤트 발생을 측정하는 카운터 레지스터를 통해 성능 분석을 지원하는 컴포넌트 더보기
irq 용어 출처 : http://jiming.tistory.com/189 [지밍이 블로그] - 인터럽트 처리 방법 - 중첩을 허용하지 않는 인터럽트 처리 방법(Nonnested Interrupt Handler) - 중첩을 허용한 인터럽트 처리 방법(Nested Interrupt Handler) - 재진입 인터럽트 처리 방법(Reentrant Interrupt Handler) - 우선순위를 적용한 간단한 인터럽트 처리 방법(Prioritized Simple Interrupt Handler) - 우선순위를 적용한 표준 인터럽트 처리 방법(Prioritized Standard Interrupt Handler) - 우선순위를 적용한 다이렉트 인터럽트 처리 방법(Prioritized Direct Interrupt Handl.. 더보기
ARM 의 TLB 운용에 대한 간단 정리 ARM 의 TLB 운용에 대해서 읽어본것들을 정리 하였습니다.내용은 arm 사이트의 있는 내용을 조악하게 번역한 수준입니다.도움이 될것 같아서 사이트에 올립니다. 각 키워드 중심으로 보시면 됩니다. set-associative regionlockdown regionMicroTLBMainTLBpage walkTLB miss 내용은 ARM coretex A9 기준입니다. TLB 에 들어있는 매칭 table 들을 TLB entry 라고 한다.ARM Main TLB 는 set-associative region 과 lockdown region 이 있다. - Invalidate TLB operations 는 set-associative region 에 이는 TLB entry 들만 무효화 한다. - .. 더보기
눈으로 보는 ARM - ASM 해석 저 처럼 User Application 을 시작으로 프로그래밍에 접근한 사람들에게는 ASM 은 꽤 귀찮은 언어입니다. 자주 쓰진 않지만, Powerful한 Low Level Debugging 을 위해서는 꼭 알아야 하는것 중에 하나지요. 물론, Document가 잘 되어 있기는 하지만, 봐도 헷갈리는 상황이 많습니다. 따라서 동작하는 모습들을 Trace32 장비를 이용해서 직접 capture 해서 정리해 보았습니다. 자주 사용하는 asm 위주로 준비하였고, 차후에 좀 더 데이터를 모으는데로 업데이트 하도록 하겠습니다. add r11, r13, #0x1c 더보기
compile 된 binary 가 thumb / thumb-2 인지 check 하기 오늘은 thumb-2 code 가 절 고민하게 만들었습니다. 아시다 시피 ARM 은 기본적으로 두가지 모드(arm code , thumb code) 를 지원합니다. arm 은 32bit instruction 이고 thumb 는 16 bit instruction 이지요. 헌데 thumb-2 와 thumbEE 라는 32 bit instruction 이 나와서 instruction 의 길이만으로 구별하기가 참 애매해 졌습니다. 단순하게 thumb 만으로만 build 된 경우 objdump 로 build 된 영역을 interpret 해 보면 thumb 인지 금방 알 수 있습니다. instruction 이 16bit 로 나오거든요.. thumb mode 로 빌드하려면 컴파일 시 다음 옵션을 추가하면 됩니다. -m.. 더보기
Cache - Flush, clean, Invalidate cache 의 disable 하는 방법을 찾다가 invalidate 와 diable 의 용어의 혼돈이 생겨서 검색하던중 좋은 자료를 발견하였다. 헌데 cache disable 은 어떻게 하는걸까 ㅡㅡ; 찾으면 추가로 정리하겠다. 원문 : http://blog.naver.com/PostView.nhn?blogId=sadbiker&logNo=90016135740&redirect=Dlog&widgetTypeCall=true Cache Flush와 Invalidate… Cache란 뭐 다들 아시다시피.. 저장공간(일반적 메모리와 하드등 저장공간)과 CPU사이에 속도차이를 줄여주기 위하여 있는 소형(비싸서 작은것만 쓰져) 메모리 공간입니다.. 주로 CPU내부에 장착되어 있다지요? ^^ 그래서 CPU는 저장장치에서.. 더보기
L1, L2 cache 와 I cache, D cache 의 관계 전에도 언급한 적이 있듯이 어떠한 instruction set 이나 data 를 읽어올때 부근에 있는 data 들을 cache 로 저장합니다. 이때 L1 cache 를 사용하게 되며 L1 cache 에 없는 내용은 L2 cache 에서 뒤지게 됩니다. L2 cache 에도 없으면 Ram 에서 해당 데이터와 주변의 값들을 읽어오는 것이지요. I cache 는 instruction 이고 D cache 는 data cache 를 말합니다. L1 은 I cache 와 D cache 를 모두 가지고 있으며, L2 는 자주 access 가 이루어 지는 D cache 만으로 이루어져 있습니다. ==> 실제 확인해 본 결과 (Havard Archithecture 의 프로세서에서) L2 cache 에 Data와 Inst.. 더보기
arm - SIGSERV나 SIGILL 이 발생했을때의 asm 동작 ldr r1,[r6,+r3] 만약 이 instruction 에서 문제가 발생했다고 하자. 구문을 해석하자면 r1 = *(r6 + r3) 입니다. r6+r3 에서 나오는 주소에 문제가 있어서 SIGSEGV 가 발생하였는데 이때 r1 에 영향이 없을것 같은데 r1 에는 0 이 대입됩니다. ARM - coretex 입니다. 더보기
arm cache 의 속성과 셋팅 (2) = Cache System = Write strategy 1. Write- through All write are passed to main memory immediately Processor slow down to main memory speed during write cpu ↔ cache ↔ Main memory요 때, Write Through와 Write Back이라는 용어가 난무하는데요, Write Through라는 용어는 쓰루 패스와 마찬가지로 Memory에 뭔가를 쓸 때 그 값이 Cache위에 올라와 있는 값일 경우에 곤란하겠죠. Cache와 Memory값이 다르면 안되니까요. Write Through를 쓰게 되면 Cache와 Memory에 모두 Update를 같이 해버리는 거지요. 간편한 S.. 더보기
MMU 의 section register 의 의미 원문 : http://wabar.tistory.com/tag/TLB MMU의 등장 배경 초창기의 프로그래머는 물리주소를 직접 사용하여 프로그래밍을 하였었죠. 우리가 아는 OS 중에 DOS와 같은 것은 논리주소를 사용하지 않죠. 현재는 대부분의 OS가 가상메모리를 제공하므로 논리주소가 필요합니다. 가상메모리의 개념이 만들어지게 된 과정은 역시 효율적 자원의 활용이라는 인간의 욕구가 시발입니다. 컴퓨터의 프로그램은 결국 CPU에 의해서 순차적으로 실행이 되므로 CPU가 필요로 하는 프로그램의 코드는 한 시점에 일부만 메모리에 존재해도 된다는 것을 인식하게 되었죠. 이는 물리적으로 작은 메모리를 설치한 컴퓨터에서 이 메모리보다 큰 프로그램을 실행시키고 싶은 필요에 의해 나왔죠. 메모리 가상화를 위해 나온 기술.. 더보기
arm cache 의 속성과 셋팅 (1) cache 셋팅에 여러가지 속성중 두가지에 대해 이야기 해보자. #define L_PTE_MT_UNCACHED (0x00 더보기
ARM ASM commond 해석 (LDMDB, LDMEA, STMDB, STMFD) 원문 : http://blog.naver.com/realdani?Redirect=Log&logNo=100007759984 asm 해석에 대한 내용은 볼때마다 까먹는다 ;;; 그나마 arm asm 은 간단해서 다행~ *********************************************************************** Decrement Before : 현제 가리키로 있는 곳에서 상위주소(0번지쪽으로) 가리킨후 실행(STMFD) LDMDB, LDMEA, STMDB, STMFD 는 모두 r13!,{r2-r3}였을 때 만약 r13에 !가 안붙으면 r13의 값은 변하지 않음 LD일 경우, 처음 r13이 #&14일때 마지막은 #&0C를 가리키고, r2에 Ox000000C번지의 word, r.. 더보기