...
offset = pos & (sb->s_blocksize - 1);
printk("%lld %lld\n",pos, offset);
...
while (num_blocks > 0) {
offset = pos & (nova_inode_blk_size(sih) - 1);
start_blk = pos >> sb->s_blocksize_bits;
printk("start block address: %lu\n",start_blk);
printk("start block address: %llu\n",cpu_to_le64(start_blk));
....
}
Nova file system에서 이론상 write path시에 'offset'은 하나의 block에서 시작 위치를 나타내고, pos는 파일 내에서 file offset을 뜻한다고 배웠다. 또한 start_blk는 block의 #인지 실제 시작 주소 인지도 헷갈렸다. 매번 보고 외우지만 볼 때마다 까먹는다. 아무것도 적혀있지 않은 파일에 write를 반복적으로 호출함으로써 실제 write가 어디에 되고 있는지를 알아보는 간단한 실험을 진행하였다. do_nova_cow_file_write함수 내에서 system call시 받은 offset과 pos를 출력해보았다. 이때, offset은 하나의 data block내에서 offset임으로 4KB(4096byte)를 넘어서는 안된다. 다음은 while문안에서 contiguous block들의 시작 주소를 출력해보았다. 결과는 다음과 같다.
4096byte를 쓰는 순간 offset이 0으로 변하고 block address가 0으로 바뀌는 것을 알 수 있다. 논문에서 이론상 배웠던 것을 눈으로 직접 보니 더 확신이 갔고, 복잡해 보이는 커널 코드들에 신뢰가 쌓였다. 더 이상 탁상공론이 아닌 실체로 다가왔다. 이제 pos값(long long) key값으로 어떻게 설정할 수 있는지 알아봐야겠다.
'실험실 (커널 오류)' 카테고리의 다른 글
[kernel] Opening files inside the Kernelspace (0) | 2021.08.01 |
---|---|
[kernel panic] unable to handle kernel paging request at ~~ (0) | 2021.07.21 |
[kernel build error] VFS: Unable to mount root fs on unknown-block(0,0) (0) | 2021.07.19 |
[NOVA] system call argument 추가 오류(2) (0) | 2021.07.19 |
[NOVA] system call argument 추가 오류(1) (0) | 2021.07.17 |