Linux Kernel(4.14) Hacks

rousalome.egloos.com

포토로그 Kernel Crash




슈퍼블록 객체 - ext4 파일시스템 Linux Kernel - Core Analysis

슈퍼블록 객체를 알아보자. 참고로 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 unsigned int) s_blocksize = 4096 = 0x1000 = '....',// 바이트 단위의 블록 크기
        (loff_t) s_maxbytes = 2199023251456 = 0x000001FFFFFFF000, // 최대 파일 크기
        (struct file_system_type *) s_type = 0xC0CAAD6C = ext4_fs_type -> ((char *) name = 0xC0A297FC =  -> "ext4", // 파일 시스템 유형 
        (struct super_operations *) s_op = 0xC084E890 = // 슈퍼블록 함수
        (struct dquot_operations *) dq_op = 0x0 =  -> NULL, // 사용량 제한 함수
        (struct quotactl_ops *) s_qcop = 0x0 =  -> NULL, // 사용량 제어 함수
        (struct export_operations *) s_export_op = 0xC084E9B0 = // 파일 시스템 외부 제공 함수
        (long unsigned int) s_flags = 1879113728 = 0x70010000 = 'p...', // 마운트 플래그
        (long unsigned int) s_magic = 61267 = 0xEF53 = '...S', // 파일 시스템 고유 번호
        (struct dentry *) s_root = 0xE09153C0 = // 디렉토리 마운트 지점
        (struct rw_semaphore) s_umount = // 마운트 해제용 세마포어
        (struct mutex) s_lock =         // 슈퍼 블락 세마포어
        (int) s_count = 1 = 0x1 = '....',     // 슈퍼블록 참조 횟수
        (atomic_t) s_active = ((int) counter = 2 = 0x2 = '....'),
        (void *) s_security = 0xDFEC2B80 = __bss_stop+0x1F00C160 -> ,
        (struct xattr_handler * *) s_xattr =     // 확장 속성 핸들러
        (struct list_head) s_inodes = ((struct list_head *) next // 아이노드 리스트
        (struct hlist_bl_head) s_anon = ((struct hlist_bl_node *) first = 0x0 =  -> NULL), //익명 디렉토리 항목
        (struct list_head *) s_files = 0xC0C30ABC = irq_desc[54].depth // 할당된 파일 리스트
        (struct list_head) s_mounts = ((struct list_head *) next = 0xE76E4A74 = __bss_stop+0x2682E054 -> ((struct list_head *) next = 0xDFEA6574 = __bss_stop+0x1EFEFB54
        (struct list_head) s_dentry_lru = ((struct list_head *) next = 0xE7025864 = // 미사용 덴트리 항목 리스트
        (int) s_nr_dentry_unused = 963 = 0x03C3 = '....',
        (spinlock_t) s_inode_lru_lock = ((struct raw_spinlock) rlock = ((arch_spinlock_t) raw_lock = ((unsigned int) lock = 0 = 0x0 = '....'), (unsigned int) break_lock
        (struct list_head) s_inode_lru = ((struct list_head *) next = 0xE0E798C8 = 
        (int) s_nr_inodes_unused = 0 = 0x0 = '....',
        (struct block_device *) s_bdev = 0xE08FFC80 = //관련 블록 디바이스
        (struct backing_dev_info *) s_bdi = 0xE600B3D8 = __bss_stop+0x251549B8 -> ((struct list_head) bdi_list = ((struct list_head *) next = 0xE600AF40 = __bss_stop+0x
        (struct mtd_info *) s_mtd = 0x0 =  -> NULL, // 메모리 디스크 정보
        (struct hlist_node) s_instances = ((struct hlist_node *) next = 0xE76F5CE0 // 같은 파일 시스템 인스턴스
        (struct quota_info) s_dquot = ((unsigned int) flags = 0 //사용량 제한 옵션
        (int) s_frozen = 0 = 0x0 = '....',  // 동결 상태
        (wait_queue_head_t) s_wait_unfrozen = // 동결 상태에 있는 웨이트 큐
        (char [32]) s_id = "mmcblk0p18", // 이름 문자열
        (u8 [16]) s_uuid = "W.....e_.g.o...[",
        (void *) s_fs_info = 0xE0E79C00 = // 파일 시스템 관련 정보
        (unsigned int) s_max_links = 0 = 0x0 = '....',
        (fmode_t) s_mode = 131 = 0x83 = '....',
        (u32) s_time_gran = 1 = 0x1 = '....', //타임 스탬프 정밀도
        (struct mutex) s_vfs_rename_mutex = ((atomic_t) count = ((int) counter = 1 = 0x1 = '....'), (spinlock_t) wait_lock = ((struct raw_spinlock) rlock = ((arch_spinl
        (char *) s_subtype = 0x0 =  -> NULL,// 하부 유형 이름
        (char *) s_options = 0x0 =  -> NULL, // 저장된 마운트 옵션

슈퍼블락 오퍼레이션
       (struct super_operations *) s_op = 0xC084E890 = ext4_sops -> (
          (struct inode * (*)()) alloc_inode = 0xC01F72D4 = ext4_alloc_inode -> ,
          (void (*)()) destroy_inode = 0xC0203074 = ext4_destroy_inode -> ,
          (void (*)()) dirty_inode = 0xC01EC7B0 = ext4_dirty_inode -> ,
          (int (*)()) write_inode = 0xC01E7D9C = ext4_write_inode -> ,
          (int (*)()) drop_inode = 0xC01FDFDC = ext4_drop_inode -> ,
          (void (*)()) evict_inode = 0xC01EC2F0 = ext4_evict_inode -> ,
          (void (*)()) put_super = 0xC0204038 = ext4_put_super -> ,
          (void (*)()) write_super = 0x0 =  -> NULL,
          (int (*)()) sync_fs = 0xC01F71B8 = ext4_sync_fs -> ,
          (int (*)()) freeze_fs = 0xC0202F28 = ext4_freeze -> ,
          (int (*)()) unfreeze_fs = 0xC0202ED0 = ext4_unfreeze -> ,
          (int (*)()) statfs = 0xC01F68A0 = ext4_statfs -> ,
          (int (*)()) remount_fs = 0xC02049A0 = ext4_remount -> ,
          (void (*)()) umount_begin = 0x0 =  -> NULL,
          (int (*)()) show_options = 0xC01F7110 = ext4_show_options -> ,
          (int (*)()) show_devname = 0x0 =  -> NULL,
          (int (*)()) show_path = 0x0 =  -> NULL,
          (int (*)()) show_stats = 0x0 =  -> NULL,
          (int (*)()) bdev_try_to_free_page = 0xC01F6B64 = bdev_try_to_free_page -> ,
          (int (*)()) nr_cached_objects = 0x0 =  -> NULL,
          (void (*)()) free_cached_objects = 0x0 =  -> NULL),
        (struct dquot_operations *) dq_op = 0x0 =  -> NULL,
        (struct quotactl_ops *) s_qcop = 0x0 =  -> NULL,


디렉토리 마운트 지점
       (struct dentry *) s_root = 0xE09153C0 = __bss_stop+0x1FA5E9A0 -> (
          (unsigned int) d_flags = 0 = 0x0 = '....',
          (seqcount_t) d_seq = ((unsigned int) sequence = 2 = 0x2 = '....'),
          (struct hlist_bl_node) d_hash = ((struct hlist_bl_node *) next = 0x0 =  -> NULL, (struct hlist_bl_node * *) pprev = 0x0 =  -> NULL),
          (struct dentry *) d_parent = 0xE09153C0 = __bss_stop+0x1FA5E9A0 -> ((unsigned int) d_flags = 0 = 0x0 = '....', (seqcount_t) d_seq = ((unsigned int) sequence =
          (struct qstr) d_name = ((unsigned int) hash = 0 = 0x0 = '....', (unsigned int) len = 1 = 0x1 = '....', (unsigned char *) name = 0xE09153E4 = __bss_stop+0x1FA5
          (struct inode *) d_inode = 0xE0930D40 = __bss_stop+0x1FA7A320 -> ((umode_t) i_mode = 16889 = 0x41F9 = 'A.', (short unsigned int) i_opflags = 7 = 0x7 = '..', (
          (unsigned char [36]) d_iname = "/",
          (unsigned int) d_count = 42 = 0x2A = '...*',
          (spinlock_t) d_lock = ((struct raw_spinlock) rlock = ((arch_spinlock_t) raw_lock = ((unsigned int) lock = 0 = 0x0 = '....'), (unsigned int) break_lock = 0 = 0
          (struct dentry_operations *) d_op = 0x0 =  -> NULL,
          (struct super_block *) d_sb = 0xE0E79800 = __bss_stop+0x1FFC2DE0 -> ((struct list_head) s_list = ((struct list_head *) next = 0xE0E79000 = __bss_stop+0x1FFC25
          (long unsigned int) d_time = 0 = 0x0 = '....',
          (void *) d_fsdata = 0x0 =  -> NULL,
          (struct list_head) d_lru = ((struct list_head *) next = 0xE0915424 = __bss_stop+0x1FA5EA04 -> ((struct list_head *) next = 0xE0915424 = __bss_stop+0x1FA5EA04,
          (union) d_u = ((struct list_head) d_child = ((struct list_head *) next = 0xE091542C = __bss_stop+0x1FA5EA0C -> ((struct list_head *) next = 0xE091542C = __bss
          (struct list_head) d_subdirs = ((struct list_head *) next = 0xE0997B9C = __bss_stop+0x1FAE117C -> ((struct list_head *) next = 0xE0AD28F4 = __bss_stop+0x1FC1B
          (struct list_head) d_alias = ((struct list_head *) next = 0xE0930DEC = __bss_stop+0x1FA7A3CC -> ((struct list_head *) next = 0xE091543C = __bss_stop+0x1FA5EA1



덧글

  • 살벌한 눈의여왕 2018/06/03 22:08 # 답글

    (unsigned char) s_blocksize_bits = 12 = 0x0C = '.' // 바이트 단위의 블록 크기,
    (long unsigned int) s_blocksize = 4096 = 0x1000 = '....',// 비트 단위의 블록 크기

    서로 뒤바뀐 것은 아닌지요?
  • 살벌한 눈의여왕 2018/06/03 22:22 # 답글

    블락 크기가 4KB라고 가정하면,

    s_blocksize는 "블락이 몇바이트냐?" 이기 때문에 4K, 즉 0x1000 이맞구요.
    s_blocksize_bits는 "몇비트를 left shift 연산 해야 블락 사이즈(단위는 바이트)를 얻냐? 이기 때문에,
    12, 즉 0x0C가 맞습니다.
    표현이 바뀌면 이해가 더 쉬울 것 같습니다. 감사합니다.
  • Guillermo 2018/06/04 23:19 #

    제 글을 심도 있게 읽고 좋은 지적해주셔서 감사합니다. 알려주신 대로 블로그 글을 수정했습니다.
    님과 같은 리눅스 고수가 있는게 기쁠 따릅입니다. 즐거운 한 주 되십시오.
  • 살벌한 눈의여왕 2018/06/10 23:55 #

    이제 막 파일시스템 보는 나부랭이일 뿐입니다 ㅎㅎㅎ
    하찮은 저의 의견이 글에 반영되니 부끄럽습니다.
    앞으로 좋은 글에서 자주 뵙겠습니다.
댓글 입력 영역