목표: 2번 directory의 89파일과 98파일 찾기
1. Root Directory에서 찾을 File이 속한 Directory의 Inode Number를 찾는다.
1단계에서 이루어진 내용 정리: 찾고자하는 파일이 속한 directory의 위치를 알 수 없다. Root directory에서 찾고자 하는 파일이 속한 directory이 Inode number를 찾는다. Inode number를 찾으면 Inode table에서 Inode의 위치를 찾을 수 있다. Superblock을 분석하여 Inode table의 위치를 찾을 수 있다.(Supberblock은 file system에 대한 Meta-data를 관리한다.) Inode table에서 Root directory의 Inode number를 통해서 Inode의 위치를 찾을 수 있었고, Inode가 가리키는 block pointer로 이동하여 User data를 읽을 수 있었다. 이 과정을 통해서 2번 Directory의 Inode는 1번 Block Group의 Inode Table에서 0번째(index=0)에 위치함을 알 수 있었다. |
1. make a ramdisk and insmod it
ls 명령어로 모든 파일이 있는지 확인한 후, sudo su로 root 권한으로 변경한다. make한 후, ramdisk.ko 파일이 존재하지는지 확인한다.
모듈 적재 후 확인한다.
2. mkfs and mount
mnt 디렉토리를 만들고, mnt에 마운트한다.
3. make the file hierarchy by running script
./create.sh 스크립트 실행 후 mnt에 0~9번 디렉터리가 생성된 것을 확인할 수 있다. 각 디렉터리 안에는 파일이 0~99번까지 생성되어 있다. 파일에 한 블록을 추가한다.
4. Explore file system layout
파일의 superblock을 분석한 결과는 다음과 같다.
-inode count: 0x8000 -block count: 0x20000 -log block size: 0x2 -blocks per group: 0x8000 -inode per group: 0x2000 -block group number: 0x0 |
Group Descriptor Table영역을 분석한 결과는 다음과 같다.
첫번째 Group Descriptor Table은 램디스크의 1블록 이후부터 시작한다.
-Group 0
-block bitmap: 0x21블록부터 시작
-Inode bitmap: 0x22블록부터 시작
-Inode table: 0x23블록부터 시작
이때 단위는 블록이다.
-inode가 속한 그룹은 (inode number-1)/inodes per group번 Block Group이다.
-Ext2에서 Root inode number는 2번이다.
예시에서 inodes per group은 0x2000이므로
-root’s block group: (2-1)/0x2000=0
-root’s index: (2-1)%0x2000=1
-0번 Block Group의 Inode Table의 1번째(index=1)에 위치한다.
※이해가 안된다면 다음의 게시글 참고
https://stonesy927.tistory.com/193
위 게시글에서 inode number는 inode table에서 원하는 inode를 찾아가기 위한 index로 사용된다고 하였다. 이 과정을 거쳐 inode를 찾으면, 아래와 같은 과정으로 data를 찾을 수 있다.
User data를 찾아가기 위한 과정은 다음과 같다.
1. 현재 inode를 찾는다
2. 파일의 현재 offset을 disk size로 나눈다.
3. 몫은 inode를 찾기 위한 pointer로 사용된다.
4. 나머지는 disk block에서의 offset으로 사용된다.
Inode Table 영역을 분석한 결과는 다음과 같다.
-Inode의 크기는 0x100 byte이다.(inode+padding)
-Root가 속한 Block Group은 0번이고 Index는 1이다.
-0번 Block Group의 Inode Table의 0x100부터가 Root Inode이다.
mode: 0x41ed=drwxr-xr-x
block pointer: 0x223 block
Data 영역을 분석한 결과는 다음과 같다.
2번 Directory
-Inode number: 0x2001
-file type: 0x2=directory
-속한 Block group: (0x2001-1)/2000=1번 Block Group
-Inode Table Index: (0x6=2001-1)%2000=0
-2번 Directory의 Inode는 1번 Block Group의 Inode Table에서 0번째(index=0)에 위치함을 알 수 있다.
2. Directory가 속한 Block Group의 Inode Table에서 Inode를 찾는다.
Group Descriptor Table영역에서 1번 Block Group의 Inode table의 시작 위치를 알아내었다. |
앞서 2번 Directory의 Inode는 1번 Block Group의 Inode Table에서 0번째에 위치함을 알았다. 1번 Block Group의 Inode table의 시작 위치를 알아내야 한다.
Group Descriptor Table영역에서 Group 1의 Inode table은 0x8023부터 시작함으로 알 수 있고, 이때 단위는 블럭(4KB)임을 감안해야 한다.
Block pointer: 0x8223
3. 찾은 Directory Entry에서 File의 Inode Number를 찾는다.
Directory Entry에는 <File name, Inode number>의 쌍을 저장하고 있다. 파일의 inode number를 찾자. |
89파일의 Inode number는 0x205a이고, 98파일의 Inode number는 0x2063이다.
*89파일 -block group: (0x205a-1)/2000=1 -Index: (0x205a-1)%2000=16*5+10-1=89 -1번째 Block group의 89번째에 위치한다. |
*98파일 -block group: (0x2063-1)/2000=1 -Index: (0x2063-1)%2000=16*6+3-1=98 -1번째 Block group의 98번째에 위치한다. |
4. File이 속한 Block Group의 Inode Table에서 Inode를 찾는다.
2단계에서 Group 1의 Inode table은 0x8023부터 시작함을 알아내었다. 3단계에서 파일의 Inode number를 알아내었다. Inode table과 Inode number를 통해서 파일의 Inode를 찾을 수 있다. |
*89파일
학번의 끝이 298이므로 0x8023000에서 Index만큼 뒤로 이동을 한다.
1번째 Block group의 89번째에 위치한다.
89파일의 Inode를 찾았다. |
위에서 2/89-1, 2/89-2, 2/89-3, 2/89-4는 direct pointer로, 2/89-13은 single indirect pointer로 접근할 수 있음을 확인할 수 있다.
2/89-13은 single indirect pointer로 접근할 수 있으므로, 다음과 같이 2단계를 거쳐서 접근할 수 있다.
*98파일
학번의 끝이 298이므로 0x8023000에서 Index만큼 뒤로 이동을 한다.
1번째 Block group의 98번째에 위치한다.
98파일의 Inode를 찾았다. |
위에서 2/98-1, 2/98-2, 2/98-3, 2/98-4는 direct pointer로, 2/98-13은 single indirect pointer로 접근할 수 있음을 확인할 수 있다.
2/98-13은 single indirect pointer로 접근할 수 있으므로, 다음과 같이 2단계를 거쳐서 접근할 수 있다.
'기타 > 운영체제' 카테고리의 다른 글
[운영체제]Advanced File System (0) | 2022.06.04 |
---|---|
[운영체제]Paging (0) | 2022.06.03 |
[운영체제]Memory Virtualization (0) | 2022.05.23 |
[운영체제]File System (0) | 2022.05.23 |
[운영체제]Hard Disk Drives (0) | 2022.05.23 |