커널 패닉이 발생했다. 우선 콜 스택을 확인해보자.
-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:0x4166CCA6(asm)
-012|NUR:0x3A0:0x41645964(asm)
---|end of frame
do_unlinkat() stack으로 돌아가서 어느 파일로 접근을 하다가 패닉이 발생하였는 지 확인하자.
각각 덴트리 조각들으 모아서 파일 경로를 확인하면 아래와 같다.
(struct list_head) d_lru = ((struct list_head *) next = 0xE0915424 = __bss_stop+0x1FA5EA04 -> ((struct list_head *) next = 0xE0915424 = __bss_stop+0x1FA5EA04, (struct list_
(union) d_u = ((struct list_head) d_child = ((struct list_head *) next = 0xE091542C = __bss_stop+0x1FA5EA0C -> ((struct list_head *) next = 0xE091542C = __bss_stop+0x1FA5EA
(struct list_head) d_subdirs = ((struct list_head *) next = 0xE0997B9C = __bss_stop+0x1FAE117C -> ((struct list_head *) next = 0xE0AD28F4 = __bss_stop+0x1FC1BED4, (struct l
(struct list_head) d_alias = ((struct list_head *) next = 0xE0930DEC = __bss_stop+0x1FA7A3CC -> ((struct list_head *) next = 0xE091543C = __bss_stop+0x1FA5EA1C, (struct lis
(struct qstr) d_name = ((unsigned int) hash = 3065167468 = 0xB6B2BE6C = '...l', (unsigned int) len = 6 = 0x6 = '....', (unsigned char *) name = 0xE0997B54 = __bss_stop+0x1FAE
(struct inode *) d_inode = 0xE9D2F400 = __bss_stop+0x28E789E0 -> ((umode_t) i_mode = 16832 = 0x41C0 = 'A.', (short unsigned int) i_opflags = 7 = 0x7 = '..', (uid_t) i_uid = 1
(unsigned char [36]) d_iname = "backup",
(unsigned int) d_count = 4 = 0x4 = '....',
(spinlock_t) d_lock = ((struct raw_spinlock) rlock = ((arch_spinlock_t) raw_lock = ((unsigned int) lock = 0 = 0x0 = '....'), (unsigned int) break_lock = 0 = 0x0 = '....')),
...
(struct qstr) d_name = ((unsigned int) hash = 3881559661 = 0xE75BE66D = '.[.m', (unsigned int) len = 7 = 0x7 = '....', (unsigned char *) name = 0xE701E57C = __bss_stop+0x26167B
(struct inode *) d_inode = 0xE9D2F190 = __bss_stop+0x28E78770 -> ((umode_t) i_mode = 16832 = 0x41C0 = 'A.', (short unsigned int) i_opflags = 7 = 0x7 = '..', (uid_t) i_uid = 100
(unsigned char [36]) d_iname = "pending",
(unsigned int) d_count = 3 = 0x3 = '....',
...
(struct list_head) d_alias = ((struct list_head *) next = 0xE9D2F23C = __bss_stop+0x28E7881C -> ((struct list_head *) next = 0xE701E5D4 = __bss_stop+0x26167BB4, (struct list_he
(struct qstr) d_name = ((unsigned int) hash = 3056702157 = 0xB63192CD = '.1..', (unsigned int) len = 20 = 0x14 = '....', (unsigned char *) name = 0xE7025824 = __bss_stop+0x2616EE
(struct inode *) d_inode = 0x0 = -> NULL,
(unsigned char [36]) d_iname = "journal631699301.tmp",
(unsigned int) d_count = 0 = 0x0 = '....',
///data/backup/pendig/journal631699301.tmp 이 파일에 접근하려는 것이었다.
SYSCALL_DEFINE1(unlink, const char __user *, pathname)
{
return do_unlinkat(AT_FDCWD, pathname);
}
'Core BSP 분석 > 리눅스 커널 핵심 분석' 카테고리의 다른 글
바인더가 깨질 때의 콜 스택 (0) | 2023.05.05 |
---|---|
아이노드 오퍼레이션 - ext4 파일 시스템 (0) | 2023.05.05 |
슈퍼블록 객체 - ext4 파일시스템 (0) | 2023.05.05 |
덴트리 캐시 (0) | 2023.05.05 |
GPIO - 리눅스 커널 (0) | 2023.05.05 |