TRACE32
Posts
30 postsARM64- 스택 푸쉬(Stack Push) Userspace -> Kernel Space
유저 스페이스에서 커널 스페이스로 전환하려면 시스템 콜을 호출해야 한다 것은 마르고 닳도록 들었죠?이번에는 ARM64 Architecture에서 EL0 ->EL1로 변환될 시, Stack을 어떻게 Push하는 지 살펴볼께요. "rild"란 프로세스의 콜스택을 예를 들어 볼 께요. 잘 보면, 유저 공간에서 sendto란 시스템 콜을 호출했다는 걸 알 수 있네요.-000|do_mem_abort()-001|el1_da(asm) -->|exception-002|ch_pop_remote_rx_intent()-003|glink_tx_common()-004|glink_txv()-005|ipc_router_glink_xprt_write()-006|msm_ipc_router_write_pkt(inline)-00
ARM64 - Exception 시 Stack Push
유저 공간에서 시스템 콜을 호출할 때 유저 공간에서 돌던 레지스터를 커널 공간 스택 Bottom Address 근처에 Push하거든요. 이번에는 Exception(Data abort)이 발생했을 때 스택에 어떤 값들을 Push하는 지 점검해 볼께요. 아래는 ch_pop_remote_rx_intent() 함수에서 exception이 발생한 콜스택인데요. Trace32로 잡았어요. 이 때 Stack 정보 좀 살펴볼께요.-000|do_mem_abort()-001|el1_da(asm) -->|exception-002|ch_pop_remote_rx_intent()-003|glink_tx_common()-004|glink_txv()-005|ipc_router_glink_xprt_write()-006|msm_
ARM64(Aarch64) - Special Register 설정(Trace32)
AArch64 64비트 아키텍쳐에서 설정해야 할 Special Register에 대해서 잠깐 살펴볼께요.우선 커널이 구동될 때의 Exception Level이 1이니까 EL1 모드만 점검하죠. TTBR1_EL1약자는 Translation Table Base Register인데, 가상주소와 물리주소를 변환할 때 쓰이죠. Trace32로 이 레지스터를 설정하고 싶으면 아래 커맨드를 써야 하지오.Data.Set SPR:0x30201 %Quad 0x82ba1000 // TTBR1_EL1 TCR_EL1Translation Control Register의 약자인데 Stage 1 가상 주소 Translation 시 필요한 Translation 베이스 레지스터 정보를포함하고 있어요.Trace32로 이 레지스터를
Trace32 - Memory Class 메모리 클래스
Trace32 메모리 클래스(Memory Class)에 대해서 좀 알아 볼까요?cpu_up이란 리눅스 커널 API를 확인해보면요. "d.l cpu_up", "d.dump cpu_up"로 코드를 확인해보았어요.그런데 왼쪽에 NSX, NSP란 뭘 의미할까요? NSX:FFFFFF9F996A7678|A9BC7BFD cpu_up: stp x29,x30,[SP,#-0x40]! ; x29,x30,[SP,#-64]!NSX:FFFFFF9F996A767C|910003FD mov x29,SPNSX:FFFFFF9F996A7680|A90153F3 stp x19,x20,[SP,#0x10] ; x19,x20,[SP,#16]NSX:FFFFFF9F996A7684




