본문 바로가기

Core BSP 분석

(119)
바인더가 깨질 때의 콜 스택 가끔 바인더의 transaction이 깨질 때 커널에서 에러 로그가 뜬다. 유저 스페이스 영역의 바인더에서 어떤 짓을 할 때 이런 에러가 뜰 수 있는 지 알아보자. frameworks/native/libs/binder/BpBinder.cpp:161 status_t BpBinder::transact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { // Once a binder has died, it will never come back to life. if (mAlive) { status_t status = IPCThreadState::self()->transact( mHandle, code, data, reply, flags); ..
아이노드 오퍼레이션 - ext4 파일 시스템 아이노드 오퍼레이션 iput( (register struct inode *) inode = 0xE7017A90 = __bss_stop+0x26161070 -> ((umode_t) i_mode = 33152 = 0x8180 = '..', (short unsigned int) i_opflags = 5 = 0x5 = '..', (register struct inode *) inode = 0xE7017A90 = __bss_stop+0x26161070 -> ( (umode_t) i_mode = 33152 = 0x8180 = '..', (short unsigned int) i_opflags = 5 = 0x5 = '..', (uid_t) i_uid = 1000 = 0x03E8 = '....', // 소유자 사용자 아..
덴트리를 통해 시스템 콜 파일 패스 알아내기 커널 패닉이 발생했다. 우선 콜 스택을 확인해보자. -000|ext4_free_inode(handle = 0xE09382C0, ?) -001|ext4_evict_inode(inode = 0xE7017A90) -002|evict(inode = 0xE7017A90) -003|iput(inode = 0xE7017A90) -004|do_unlinkat(?, ?) -005|sys_unlink(?) -006|ret_fast_syscall(asm) -->|exception -007|NUR:0x3A0:0x40067B78(asm) -008|NUT:0x3A0:0x4005C330(asm) -009|NUT:0x3A0:0x5A559380(asm) -010|NUR:0x3A0:0x4163C550(asm) -011|NUT:0x3A0..
슈퍼블록 객체 - ext4 파일시스템 슈퍼블록 객체를 알아보자. 참고로 ext4 파일시스템이다. iput( (struct list_head) s_list = ((struct list_head *) next = 0xE0E79000 // 슈퍼 블록 리스트. 이 주소를 통해서 다른 파일 시스템의 슈퍼 블록에 접근을 할 수 있을 것 같다. (dev_t) s_dev = 271581186 = 0x10300002 = '.0..', // 식별자임 (unsigned char) s_dirt = 0 = 0x0 = '.', (unsigned char) s_blocksize_bits = 12 = 0x0C = '.' // 비트 단위의 블록 크기: 12, 즉 0x0C 비트를 left shift 연산 해야 블락 사이즈(단위는 바이트)를 얻을 수 있음 (long unsi..
덴트리 캐시 unlink라는 시스템 콜을 따라가면 아래 함수를 볼 수 있다. 여기서 lookup_hash(&nd) 함수를 좀 파고들어가 보자. static long do_unlinkat(int dfd, const char __user *pathname) { int error; char *name; struct dentry *dentry; struct nameidata nd; struct inode *inode = NULL; ... nd.flags &= ~LOOKUP_PARENT; mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT); dentry = lookup_hash(&nd); } 아래와 같은 함수 호출 체인을 볼 수 있는데, 덴트리는 덴트리 ..
GPIO - 리눅스 커널 이번에는 GPIO에 대해 이야기 좀 해보려 합니다. 한 10년 전인가요? 기억이 좀 가물 가물한데요. 대학원 면접을 봤었어요. 그 때 어느 교수님이 했던 질문이 생각납니다. "소프트웨어와 하드웨어의 경계가 어디냐"? 그 당시 너무 얼어 있어 제대로 대답을 못했던 것 같습니다. 결국 대답을 못하고 말았습니다. 지금 생각해 보면 정말 쉬운 질문이었는데 참 안타깝죠. 만약 지금 그 질문을 받으면 전 이렇게 대답할 것입니다. "GPIO와 인터럽트입니다." 물론 하드웨어와 소프트웨어의 경계가 GPIO와 인터럽트만 있는 것은 아닙니다. 메모리 맵드 아이오(memory mapped IO)도 있죠. 특정 메모리 공간에 어떤 값을 쓰면 이에 맞게 하드웨어 디바이스가 동작하는 것입니다. 이제 좀 GPIO에 대해서 조금 더..
wakelock - 안드로이드 파워 관리 관점에서 안드로이드 디바이스는 간단히 두 가지 상태로 분류할 수 있다. 수면(Deep Sleep)과 깨어난(Wake)이다. Sleep은 최소한의 파워 리소스를 사용하여 디바이스를 사용할 수 있는 상태이며, Wake는 프로세서 및 대부분의 파워 리소스가 사용을 하여 어떤 작업을 하고 있는 상태이다. 그런데, Wakelock은 디바이스별로 Sleep상태에서 깨우거나 Sleep상태로 들어가는 것을 막을 수 있는 기능이다. PWL(Partial Wakelock)은 흔히 유저 스패이스에서 구동되고 있는 앱에서 일어나는 wakelock을 의미하며 일어나는 상황 역시 데이터 동기화, 영상 재생 중 화면 꺼짐 방지 등으로 다양하다. 앱을 설치할 때 퍼미션을 살펴보면 시스템 도구 항목 아래 절전 모드로 진입하..