본문 바로가기

Core BSP 분석/리눅스 커널 핵심 분석

(90)
copy_mm()함수 do_fork p = copy_process(clone_flags, stack_start, regs, stack_size, child_tidptr, NULL, trace); retval = copy_signal(clone_flags, p); if (retval) goto bad_fork_cleanup_sighand; retval = copy_mm(clone_flags, p); if (retval) goto bad_fork_cleanup_signal; retval = copy_namespaces(clone_flags, p); if (retval) goto bad_fork_cleanup_mm; retval = copy_io(clone_flags, p); if (retval) goto bad_fork_clea..
커널 에러 로그(1) page allocation failure This log indicates that total chunk memory is starved. [480188.689067 04-22 03:32:58.097] m.lge.launcher2: page allocation failure: order:1, mode:0xd0 [480188.689123 04-22 03:32:58.097] [] (unwind_backtrace+0x0/0x144) from [] (dump_stack+0x20/0x24) [480188.689148 04-22 03:32:58.097] [] (dump_stack+0x20/0x24) from [] (warn_alloc_failed+0xd0/0x110) [480188.689170 04-22 03:3..
hrtimer_restart, alarm timer This is a good chance to look into timer mechanism ofkernel timer. /** * alarmtimer_fired - Handles alarm hrtimer being fired. * @timer: pointer to hrtimer being run * * When a alarm timer fires, this runs through the timerqueue to * see which alarms expired, and runs those. If there are more alarm * timers queued for the future, we set the hrtimer to fire when * when the next future alarm timer..
바인더가 깨질 때의 콜 스택 가끔 바인더의 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); } 아래와 같은 함수 호출 체인을 볼 수 있는데, 덴트리는 덴트리 ..