Can you solve the following question for me:

===============================================

Question 3: Big Files in xv6
Currently xv6 files are limited to 140 sectors, or 71,680 bytes. This limit comes
from the fact that an xv6 inode contains 12 "direct" block numbers and one
"singly-indirect" block number, which refers to a block that holds up to 128 more
block numbers, for a total of 12+128=140. You'll change the xv6 file system
code to support a "doubly-indirect" block in each inode, containing 128
addresses of singly-indirect blocks, each of which can contain up to 128
addresses of data blocks. The result will be that a file will be able to consist of up
to 16523 sectors (or about 8.5 megabytes).
See big-notes.txt for outline code.
See Appendix 1 for more details.

===============================================

Code inside big-notes.txt:

if (bn < NINDIRECT\*NINDIRECT) {
printf("double indirect block");
 if((addr = ip->addrs[NDIRECT + 1]) == 0)
 // double-indirect block itself not yet allocated
 ip->addrs[NDIRECT + 1] = addr = balloc(ip->dev);

 // Read+lock double-indirect block
 bp = bread(ip->dev, addr);
 a = (uint\*)bp->data;

see https://www.youtube.com/watch?v=hZpom8ouYD8&t=1476s

now we have the double-indirect block in the array a. So we look for the correct indirect block whose address is given by
a[bn/ NINDIRECT]. 
if the pointer is not yet allocated to the indirect block then
 we allocate a new block with balloc for the indirect block.
 we write the double indirect block back to the disk with log\_write
endif

release the double indirect block with brelse(bp);
now we read and lock the indirect block and get the indirect block data in the array a. So we look for the 
correct data block whose address is given by a[bn% NINDIRECT]. 
if the pointer is not yet allocated to the data block then
 we allocate the data block with balloc
 we write the indirect block back to the disk with log\_write
endif
 
 
 brelse(bp);
 return addr;
 }
}
 
===============================================

Appendix 1:

Appendix 1 – Big Files xv6
Modify your Makefile's CPUS definition so that it reads:
CPUS := 1
Add
QEMUEXTRA = -snapshot
right before QEMUOPTS
The above two steps speed up qemu tremendously when xv6 creates large files.
mkfs initializes the file system to have fewer than 1000 free data blocks, too few
to show off the changes you'll make. Modify param.h to set FSSIZE to:
#define FSSIZE 20000 // size of file system in blocks
Download big.c into your xv6 directory, add it to the UPROGS list, start up xv6,
and run big. It creates as big a file as xv6 will let it, and reports the resulting
size. It should say 140 sectors.
What to Look At
The format of an on-disk inode is defined by struct dinode in fs.h. You're
particularly interested in NDIRECT, NINDIRECT, MAXFILE, and the addrs[]
element of struct dinode. Look here for a diagram of the standard xv6
inode.
The code that finds a file's data on disk is in bmap() in fs.c. Have a look at it and
make sure you understand what it's doing. bmap() is called both when reading
and writing a file. When writing, bmap() allocates new blocks as needed to hold
file content, as well as allocating an indirect block if needed to hold block
addresses.
bmap() deals with two kinds of block numbers. The bn argument is a "logical
block" -- a block number relative to the start of the file. The block numbers in ip-
>addrs[], and the argument to bread(), are disk block numbers. You can view
bmap() as mapping a file's logical block numbers into disk block numbers.
Your Job
Modify bmap() so that it implements a doubly-indirect block, in addition to direct
blocks and a singly-indirect block. You'll have to have only 11 direct blocks,
rather than 12, to make room for your new doubly-indirect block; you're not
allowed to change the size of an on-disk inode. The first 11 elements of ip-
>addrs[] should be direct blocks; the 12th should be a singly-indirect block (just
like the current one); the 13th should be your new doubly-indirect block.
5 | P a g e
You don't have to modify xv6 to handle deletion of files with doubly-indirect
blocks.
If all goes well, big will now report that it can write 16523 sectors. It will take big
a few dozen seconds to finish.
Hints
Make sure you understand bmap(). Write out a diagram of the relationships
between ip->addrs[], the indirect block, the doubly-indirect block and the
singly-indirect blocks it points to, and data blocks. Make sure you understand
why adding a doubly-indirect block increases the maximum file size by 16,384
blocks (really 16383, since you have to decrease the number of direct blocks by
one).
Think about how you'll index the doubly-indirect block, and the indirect blocks it
points to, with the logical block number.
If you change the definition of NDIRECT, you'll probably have to change the size
of addrs[] in struct inode in file.h. Make sure that struct inode and
struct dinode have the same number of elements in their addrs[] arrays.
If you change the definition of NDIRECT, make sure to create a new fs.img, since
mkfs uses NDIRECT too to build the initial file systems. If you delete fs.img, make
on Unix (not xv6) will build a new one for you.
If your file system gets into a bad state, perhaps by crashing, delete fs.img (do
this from Unix, not xv6). make will build a new clean file system image for you.
Don't forget to brelse() each block that you bread().
You should allocate indirect blocks and doubly-indirect blocks only as needed,
like the original bmap().

I am using the 86x version of xv6 on a linux system
다음 질문을 해결해 주실 수 있나요?===============================================질문 3: xv6의 대용량 파일현재 xv6 파일은 140개 섹터, 즉 71,680바이트로 제한됩니다. 이 제한은xv6 아이노드에 12개의 "직접" 블록 번호와 하나의 "단일 간접" 블록 번호가 포함되어 있기 때문입니다."단일 간접" 블록 번호(최대 128개까지 더 보유하는 블록을 의미함)가 포함되어 있기 때문입니다.블록 번호, 즉 총 12+128=140입니다. "이중 간접" 블록을 지원하도록 xv6 파일 시스템코드를 변경하여 각 이노드에 128개의 단일 간접 블록 주소가 포함된단일 간접 블록의 주소, 각 블록은 최대 128개까지 포함할 수 있습니다.데이터 블록의 주소를 포함할 수 있습니다. 그 결과 파일은 최대 16523개의 섹터로 구성될 수 있습니다.최대 16523개 섹터(또는 약 8.5메가바이트)로 구성될 수 있습니다.개요 코드는 big-notes.txt를 참조하세요.자세한 내용은 부록 1을 참조하세요.===============================================big-notes.txt 내부 코드:if (bn < NINDIRECT\*NINDIRECT) {printf("이중 간접 블록"); if((addr = ip->addrs[NDIRECT + 1]) == 0) // 더블 간접 블록 자체가 아직 할당되지 않음 ip->addrs[NDIRECT + 1] = addr = balloc(ip->dev); // 이중 간접 블록 읽기+잠금 bp = bread(ip->dev, addr); a = (uint\*)bp->데이터;https://www.youtube.com/watch?v=hZpom8ouYD8&t=1476s 참조이제 배열 a에 이중 간접 블록이 있습니다. 따라서 주소가 다음과 같이 주어진 올바른 간접 블록을 찾습니다.a[bn/ NINDIRECT]. 만약 포인터가 아직 간접 블록에 할당되지 않았다면 간접 블록을 위해 balloc으로 새 블록을 할당합니다. 이중 간접 블록을 로그\_write로 디스크에 다시 씁니다.endif를 사용하여 이중 간접 블록을 해제합니다;이제 간접 블록을 읽고 잠그고 배열 a에 있는 간접 블록 데이터를 가져옵니다. 주소를 가진 올바른 데이터 블록을 찾습니다. 포인터가 아직 데이터 블록에 할당되지 않은 경우 데이터 블록을 balloc으로 할당합니다. 로 간접 블록을 디스크에 다시 씁니다.endif   brelse(bp); return addr; }} ===============================================부록 1:부록 1 - 빅 파일 xv6메이크파일의 CPUS 정의가 다음과 같이 표시되도록 수정하세요:CPUS := 1추가QEMUEXTRA = -스냅샷를 추가합니다.위의 두 단계는 xv6가 대용량 파일을 생성할 때 qemu의 속도를 엄청나게 높여줍니다.mkfs는 파일 시스템을 1000개 미만의 사용 가능한 데이터 블록으로 초기화합니다.로 초기화합니다. param.h를 수정하여 FSSIZE를 다음과 같이 설정합니다:#define FSSIZE 20000 // 블록 단위의 파일 시스템 크기big.c를 xv6 디렉터리에 다운로드하고, UPROGS 목록에 추가하고, xv6을 시작하세요,그리고 big을 실행합니다. xv6가 허용하는 만큼 큰 파일을 생성하고 그 결과인size. 140개의 섹터가 표시됩니다.살펴볼 내용온디스크 이노드의 형식은 fs.h의 구조체 dinode에 의해 정의됩니다.특히 NDIRECT, NINDIRECT, MAXFILE 및 addrs[]요소에 특히 관심이 있습니다. 표준 xv6의 다이어그램은 여기에서 확인하세요.inode.디스크에서 파일의 데이터를 찾는 코드는 fs.c의 bmap()에 있습니다.bmap()은 파일을 읽을 때와 쓸 때 모두 호출됩니다.파일을 읽을 때와 쓸 때 모두 호출됩니다. 쓸 때, bmap()은 필요에 따라 새 블록을 할당합니다.파일 내용을 보유하기 위해 필요에 따라 새 블록을 할당하고, 블록을 보유하기 위해 필요한 경우 간접 블록을 할당합니다.주소를 할당합니다.bmap()은 두 가지 종류의 블록 번호를 처리합니다. bn 인자는 "논리적블록"으로, 파일의 시작 부분을 기준으로 한 블록 번호입니다. >addrs[]의 블록 번호와 bread()의 인수는 디스크 블록 번호입니다. 여러분은bmap()은 파일의 논리적 블록 번호를 디스크 블록 번호로 매핑하는 것으로 볼 수 있습니다.작업직접 블록과 단일 간접 블록 외에 이중 간접 블록을 구현하도록 bmap()을 수정합니다.블록과 단일 간접 블록 외에 이중 간접 블록을 구현하도록 수정합니다. 직접 블록은 11개만 있어야 합니다,새로운 이중 간접 블록을 위한 공간을 확보하려면 직접 블록이 12개가 아닌 11개만 있어야 합니다.온디스크 아이노드의 크기를 변경할 수 없습니다. ip->addrs[]의 첫 11개 요소는 직접 블록이어야 하고, 12번째 요소는 단일 간접 블록이어야 합니다(현재 블록과 마찬가지로처럼), 13번째는 새로운 이중 간접 블록이어야 합니다.5 | P a g e이중 간접 블록이 있는 파일의 삭제를 처리하기 위해 xv6를 수정할 필요는 없습니다.블록으로 파일을 삭제할 수 있습니다.모든 것이 순조롭게 진행되면, 이제 big은 16523 섹터를 쓸 수 있다고 보고합니다. 완료하는 데완료하는 데 수십 초 정도 걸립니다.힌트bmap()을 이해했는지 확인하세요. 간접 블록, 이중 간접 블록, 그리고 그것이 가리키는단일 간접 블록과 데이터 블록 사이의 관계를 도표로 작성합니다. 다음 사항을 이해해야 합니다.이중 간접 블록을 추가하면 최대 파일 크기가 16,384개 증가하는 이유블록(직접 블록의 수를 1만큼 줄여야 하므로 실제로는 16383개입니다.하나).이중 간접 블록과 이중 간접 블록이 가리키는 간접 블록을 어떻게 색인할지 생각해 보세요.논리적 블록 번호로 가리키는 간접 블록을 어떻게 색인할지 생각해 보세요.NDIRECT의 정의를 변경하면 아마도 구조체에서 addrs[]의 크기를의 크기를 변경해야 할 것입니다. 구조체 inode와구조체 디노드의 addrs[] 배열에 같은 수의 엘리먼트가 있는지 확인하세요.만약 