Boot Sector의 크기는 2 Sector = 1KB(0x400)이므로 Super Block의 위치는 0x400부터 시작한다.
해당위치로 이동하면,
Log Block Size( 블록 크기 ) = 0x2000, Inode Per Group( 각 블록그룹에 속한 inode 수 ) = 0xef53, Block Per Group( 각 블록 그룹에 속한 block 수 ) = 0x8000을 얻을 수 있다.
Ext2에서 Root의 inode number는 2이다. 따라서 (inode number – 1)/block per group을 하면 Root의 inode가 속한 그룹은 0번임을 알 수 있다. 그리고 (inode number -1)%block per group을 하여 Root의 index가 1임을 알 수 있다.
그리고 Root안의 데이터를 보기위해 Group Descriptor Table을 보아 Group 0의 inode Table 시작위치를 얻는다.
첫 번째 Group Descriptor Table은 ramdisk의 1블록(4KB = 0x1000) 이후부터 시작하므로 해당 위치로 이동하면
각 그룹의 inode Table을 구하면
(단위 : block)
Group 0 = 0x23
Group 1 = 0x8023
Group 2 = 0x10002
Group 3 = 0x18023
이다.
Root가 속한 Group 0의 inode Table에서 1번째 inode를 찾는다. ( Inode의 크기는 0x100byte, index = 1 )
첫번째 블록 포인터인 0x223000을 찾아서 데이터 영역으로 이동을 한다.
Record len으로 디렉토리 엔트리의 크기를 알아내고, file type으로 디렉토리를 찾고, 이름을 얻는다. 그중 32153”6/82”에 해당하는 6번 디렉토리의 inode를 찾는다.
6번 디렉토리 inode number = 0x6066
속한 Block Group = (0x6066 – 1)/0x2000 = 3
Inode Table Index = (0x6066 – 1)%0x2000 = 101
6번 디렉토리가 Block Group 3의 inode Table의 101번째에 있음을 알 수 있다.
Block Group 3의 inode Table에서 101번째 inode로 이동을 한다.
=>0x18029600
Block pointer 0번을 얻고 이동을 한다.
=>0x8458000
6번 디렉토리가 있음을 확인할 수 있다.
학번의 끝이 682이므로 0x18029600에서 82번 뒤로 이동을 한다.
=>0x1802e800
Block Pointer 0 = 0x84aa000
Block Pointer 1 = 0x107ba000
Block Pointer 2 = 0x107d2000
Indirect Block Pointer 0 = 0x10204000
을 얻을 수 있다.
해당 블록의 위치로 이동을 하면 다음의 그림과 같이 데이터를 찾을 수 잇다.
마지막 indirect block pointer로 13번째 block의 inode를 찾아내고 이동하여 데이터를 찾았다.
'공부 > 운영체제&시스템프로그래밍' 카테고리의 다른 글
New Architectural state structure (0) | 2021.06.21 |
---|---|
myshell (0) | 2020.07.16 |
mycp (0) | 2020.07.16 |