A VFS inode에 대해서

돌고래너구리 2016.05.08 01:39 조회 수 : 365

안녕하세요. 이희태입니다.
오늘 A조 스터디 도중 어느 한 분이 vfs inode에 대한 질문을 했는데, 제가 질문을 잘못이해해서

엉뚱한 대답을 하고(그냥 inode에 대해서 얘기함), vfs inode는 어떻게 되는지 몰라서 집에가서 궁금해서 찾아봤는데요.

 

우선 이 사이트 참조하시구요.
https://www.win.tue.nl/~aeb/linux/lk/lk-8.html

 

초기 버전에는

 

struct inode 타입은 아래의 union u 멤버 필드를 가졌다고 합니다.

        union {
                struct minix_inode_info         minix_i;
                struct ext2_inode_info          ext2_i;
                struct ext3_inode_info          ext3_i;
                struct hpfs_inode_info          hpfs_i;
                ...
        } u;

즉, inode->u.ext3_i 를 통해서 struct ext3_inode_info 정보를 가질 수 있었습니다. 이 union을 이용한 방식은

파일 시스템을 하나 발명할 때마다 union u의 멤버를 모두 수정해야하고, union u의 사이즈는 여러가지 struct ***_info 중 가장

사이즈가 큰 타입의 사이즈로 설정되는 단점이 있습니다.

 

그래서 리눅스 커널 2.5.3부터는 아예 VFS 부분에 이러한 파일시스템 의존적인 부분들을 따로 빼주었는데, 이 방식은

각각의 파일시스템의 inode 정보를 담는 구조체(struct ext2_inode_info, struct ext3_inode_info ....) 마다 
struct inode vfs_inode; 를 추가적으로 넣어줍니다.

그리고 EXT3_I( ),  EXT4_I( ),  NTFS_I( )와 같은 container_of()함수를 리턴하는

인라인 코드를 통해 vfs_inode에게 해당 파일시스템의 정보를 제공해줍니다.

 

예)

687 static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
688 {
689         return container_of(inode, struct ext3_inode_info, vfs_inode);
690 }
240 static inline ntfs_inode *NTFS_I(struct inode *inode)
241 {
242         return (ntfs_inode *)container_of(inode, big_ntfs_inode, vfs_inode);
243 }

 

container_of 함수는 링크 건 사이트의 설명대로

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

Thus, 

container_of(x, struct inode, i_dentry) returns the address of the inode that has an i_dentry field with address x.

 

따라서 EXT3_I( x ) 의 경우 x를 주소값으로 하는 vfs_inode 필드를 가지는 struct ext3_inode_info의 주소값을 리턴하여

해당 vfs_inode의 실제 파일시스템 정보를 얻어낼 수 있습니다.

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2198
1545 [커널 리눅스 내부구조] load_balance()가 수행되는 원리는? 유니악 2016.05.28 187
1544 [리눅스 커널 내부구조] 그림 3.14 : 태스크 문맥 용어 설명? 유니악 2016.05.28 169
1543 [리눅스 커널 내부구조] 그림 3.16 : 태스트 상태 전이 ? 유니악 2016.05.28 255
1542 안녕하세요. 5월 28일부터 커널 스터디 C조에 참석하는 김진수입니다. killinggun 2016.05.27 196
1541 아키텍쳐 북스터디 관련. [6] woos 2016.05.05 562
1540 x86팀 001주차 - 2016.05.21(토) 장소 및 교재 공지 n5de 2016.05.18 186
1539 천승환님 x86 커널 분석 자료를 우측 메뉴에 추가했습니다. [2] woos 2016.05.15 239
1538 리눅스 커널 강의 추천 [8] 민준홍 2016.05.01 3961
1537 A조 인원 정리 및 오픈채팅 개설 [40] file 김형원 2016.04.26 776
1536 디엔트리 객체에 대한 질문 반짝이는물오름달 2016.05.10 200
1535 3주차 질문내용 [5] heeee 2016.05.08 577
» VFS inode에 대해서 돌고래너구리 2016.05.08 365
1533 혹시 x86 아키텍쳐 스터디를 위해 오신분 계신가요? [10] woos 2016.05.03 504
1532 fork() 함수가 리턴을 두번하는 이유 설명 [2] 커널B조 2016.05.07 30233
1531 A조 5월 7일 참석인원 조사 [29] tjgus5 2016.04.30 440
1530 C조 5월7일 오프라인모임 참석자 조사 [39] file 뒷북 2016.04.30 592
1529 cortex-a 시리즈 PM(자료 좋네요.) file woos 2016.05.06 228
1528 커널 스터디 모임에 참여하고 싶습니다 [1] 꼬마툴 2016.05.05 323
1527 커널 스터디 모임에 참여하고 싶습니다 꼬마툴 2016.05.05 139
1526 Kernel 스터디 모임에 참여하고 싶습니다. 꼬마툴 2016.05.05 153
XE Login