Guillermo Austin Kim

Sources

Posts

998 posts

arm32 - Unwind Idx/prolog 소개

Guillermo Austin Kim|2018년 1월 1일

TRACE32는 어떻게 각 함수마다 어떤 register를 stack에 push를 하고 지역 변수를 위해서 얼마 만큼의 공간을 확보하는지를 알까요? 모든 함수의 prolog를 체크하여 위 과정을 수행할까요? 그러기에는 과정들이 매우 복잡하므로, Build 과정에서 위의 prolog 정보를 미리 저장해둬요. Linux Kernel의 Symbol Table중에서 __start_unwind_idx에서부터 __stop_unwind_idx 영역이 있는데요.TRACE32명령창에 symbol.browse *unwind_idx 을 입력하면 해당 Symbol Table을 확인할 수 있어요.symbol___________________|type_____________________|address_______________

ARM64- Stack Push Userspace -> Kernel Space 코드리뷰

Guillermo Austin Kim|2017년 12월 31일

유저 공간에서 실행된 레지스터가 커널 Bottom Stack에 Push 되는 디버깅 정보를 예전 페이지에 업데이트했잖아요.아래와 같은 메모리 덤프를 확인했었죠.(출처:http://rousalome.egloos.com/9966225)NUD:FFFFFFE4DE6A7EB8| 3C 6B 77 2B 46 76 A8 C2 0xC2A876462B776B3CNUD:FFFFFFE4DE6A7EC0| 45 00 00 00 00 00 00 00 0x45 // x0 NUD:FFFFFFE4DE6A7EC8| 80 37 81 AF 7B 00 00 00 0x7BAF813780 // x1NUD:FFFFFFE4DE6A7ED0| 16 00 00 00 00 00 00 00 0x16 // x2NUD:FFFFFF

[ARM64]signal - sa_handler signal handler 실행 (code walk-through)

Guillermo Austin Kim|2017년 12월 30일

signal에 대해서는 리눅스 시스템 프로그램에서 많이 들어본 적이 있을 꺼에요.쓰레드에 특정 시그날이 전달되면 해당 시그널 핸들러 함수가 호출된다는 내용이죠. 아래 시스템 프로그램의 경우에는 SIGINT 시그널을 전달 받으면 sig_handler 함수가 호출되겠지오.#include #include #include void sig_handler(int signo){ if (signo == SIGINT) printf("received SIGINT\n");} int main(void){ if (signal(SIGINT, sig_handler) == SIG_ERR) printf("\ncan't catch SIGINT\

Reboot - Kernel Rebooting(커널 리부팅) Sequence

Guillermo Austin Kim|2017년 12월 29일

보통 시스템이 리부팅될 때 동작에 대해 상세히 다룬 글이 없는 것 같아요.그래서 유저 스페이스에서 reboot 시스템 콜을 수행하면 어떤 흐름으로 시스템이 리셋되는지 살펴볼께요. 가끔 시스템이 리부팅하는 과정에서 락업이나 커널 크래시가 발생하거든요. 이럴 때 어떤 흐름으로 리부팅 되는지에 대한 정보를 알면 어느 포인트에서 디버깅을 해야 할 지 빨리 파악할 수 있어요. sys_reboot이란 함수는 아래 코드로 정의되어 있구요. kernel_restart() 함수가 호출되요. SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg){ struct pid_namespace *pid_ns = task_act

ARM64 - Data Abort Exception(익셉션) Vector 실행

Guillermo Austin Kim|2017년 12월 29일

이번 시간에는 Abort 즉 프로그램에 문제가 생겨서 Exception이 생겼을 때 동작 흐름에 대해점검해보고자 해요. ARM에 대한 자료와 세미나를 통해 Exception에 대해서 엄청나게 많이 들었잖아요.뭐, data abort, prefetch abort, undefined abort 등등이죠. 이제 ARM64 아키텍처에서는 이 Abort를 어떻게 처리하고 있는 지 살펴보도록 할께요 우선 아래 코드와 같이 익셉션 벡터가 정의되어 있구요.그런데 abort가 발생할 때는 el1_sync 벡터로 프로그램 카운터가 이동하게 되어 있어요./* * Exception vectors. */ .align 11ENTRY(vectors) ventry el1_sync_invalid // Synchronous E