본문 바로가기

arm

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|작성자 고고빨간양말 더보기
trace32 - set conditional breakpoint using arm register value UI 창에서는 입력이 어려우나 아래와 같이 command 로 입력하면 된다. Break.Set function_name /Program /CONDition Register(X0)==699 더보기
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.. 더보기
linux command : stat, fstat, lstat http://s2kiess.blog.me/220139796462 stat : 파일경로를 가지고 파일 속성을 가지고 온다.fstat : 파일 디스크립터를 가지고 파일 속성을 가지고 온다. 심볼릭 링크의 경우 원본 파일의 속성을 가지고 온다.lstat : fstat 과 동일하나, 심볼링 링크일 경우 링크 파일의 속성을 가지고 온다. The usage of "stat" on arm linux # statusage: stat [-f] [-c FORMAT] FILE... Display status of files or filesystems. -f display filesystem status instead of file status-c Output specified FORMAT string instead of d.. 더보기
Program 실행시간(performance time) 측정 방법, IO time 계산 방법 time command #time ./mobibench -p ....#0m2.15s real 0m0.40s user 0m0.31s system 결과는 다음과 같이 해석real : 실제 program 동작 시간user : user area program 동작 시간system : kernel area program 동작 시간 IO time = real - (user + system) 더보기
e2fsprogs arm cross-compile for android e2fsprogs 의 filefrag Tool 을 arm 에서 사용하기 위해 build 시도. 0. 소스코드 다운로드 http://sourceforge.net/projects/e2fsprogs/?source=dlp 1. arm build toolchain 경로를 path 에 추가.이건 .configure 에서 CC 로 지정한 build tool 을 direct 로 호출해 버리기 때문임.export PATH=/home/onegun/2_hdisk/storage/utils_ubuntu/build_toolchains/MOST-build-toolchain/arm-2009q1/bin/:$PATH 2. ./configure 로 make 파일 생성./configure --target=arm-linux --host=ar.. 더보기
use fallocate in Android system Android 4.4 기준으로 /system/lib/libc.so에는 fallocate funcation 을 지원하지 않는다. 여타 다른 gcc build 환경을 사용했을때는 모르지만,(arm-2009q1 build 환경을 사용한 app 은 fallocate 함수를 사용하는데 문제가 없었다.)Android 자체 build system 을 사용할때는 fallocate 함수를 사용할 수 없다. 이 문제를 해결하기 위해/proc/kallsyms 를 확인한 결과kernel 은 sys_fallocate 를 지원하는 것으로 보인다. 따라서 아래와 같이 direct 로 system call 을 호출하였다. #define FALLOC_FL_KEEP_SIZE 0x01return syscall(__NR_fallocate,.. 더보기
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 들만 무효화 한다. - .. 더보기
local_irq_disable(), local_irq_save(flags) 분석 두 함수를 비교하고, local_irq_disable()대신 local_irq_save(flags)를 쓰는 이유를 알아보자. local_irq_disable#define local_irq_disable() \ do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) #define raw_local_irq_disable() arch_local_irq_disable() static inline void arch_local_irq_disable(void) { unsigned long temp; asm volatile( " mrs %0, cpsr @ arch_local_irq_disable\n" // cpsr 을 읽어서 %0 에 저장 " orr %0, %.. 더보기
CPSR 원문 : http://forum.falinux.com/zbxe/index.php?document_srl=575677&mid=lecture_tiparm register 그림 : http://recipes.egloos.com/4986854 오늘은 ARM register 중 하나인 cpsr 에 대해서 좋은 글이 있어서, 필요한 내용을 복사해 왔습니다.이것 외에도 ARM 에 대해서 좋은 강좌가 많은 블로그 이니, 한번씩 들려보세요. CPSR (Current Program Status Register) 프로그램의 상태를 저장하는 레지스터 31비트에서 24까지는 플래그(Flag) 비트, 23비트에서 16까지는 상태(Status) 비트, 15비트에서 8까지는 확장(Extension)비트, 7비트에서 0 비트까지는 제.. 더보기
눈으로 보는 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 입니다. 더보기
linux 병목현상 분석 : latencytop linux 에는 수많은 디버깅 도구들이 있습니다. 그중 제가 이번에 주목한 녀석은 latencytop 입니다. 이녀석은 동작중에 느려지는 병목현상에서 어떤 프로세서가 문제를 일으키는지 분석해 주는 툴입니다. 무려 arm 에도 포팅이 되어 있다는 사실에 무척 기쁘긴 하지만, linux tool 들의 단점을 이녀석도 가지고 있습니다. 한눈에 파악하기 힘들다는 점인데요. 이러한 visiblity 를 향상하는 작업을 해보려고 합니다. 우선 이녀석은 다음 두가지 config 와 관련되어 있습니다. CONFIG_LATENCYTOP CONFIG_HAVE_LATENCYTOP_SUPPORT 그리고 최소한 다음 파일들에 영향을 미치네요. fs/proc/base.c:377:#ifdef CONFIG_LATENCYTOP fs/.. 더보기
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.. 더보기
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.. 더보기
arm 에서 system call 을 호출할때 4개 이상의 파라미터를 어떻게 처리하는가? 다음과 같이 arm 컴파일러를 지정해 주면 arm 용으로 컴파일이 가능하다. /opt/toolchains/arm-linux-4.1.1/bin/arm-linux-gcc -o test test.c 이때 -S 옵션을 주면 어셈형태의 파일이 나와서 직접 asm 파일을 볼 수 있다. /opt/toolchains/arm-linux-4.1.1/bin/arm-linux-gcc -S test.c 다음과 같이 파라미터가 6개인 sendto system call 에 가상으로 파라미터들을 넣어서 추적해 보았다. #include #include #include int main() { int _s=0x11; void *_msg = (void*)0x22; size_t _len = 0x33; int _flags = 0x44; str.. 더보기