리눅스 커널 파일 시스템 [5] Write

리눅스 커널 파일 시스템 Read [1]

리눅스 커널 파일 시스템 Read [2]

리눅스 커널 파일 시스템 Read [3]

리눅스 커널 파일 시스템 Read [4]


Now, let's take a look at the write process. We'll examine what happens when a write system call is invoked and which kernel functions are called along the way.

나중에 영어로 바꾸는 작업을 해야겠다. 자 이제 write 시스템콜이 불렸을 때 커널의 어떤 함수들이 호출되는지 알아보자. 여전히 ext4 기준으로 살펴볼 것이다.


SYSCALL_DEFINE3(write, ...)

--> ksys_write()

--> vfs_write()

--> rw_verify_area() (유저 포인터 유효성, 파일 모드 검사)

-- file->f_op->write_iter 가 있는지 검사

여기서 잠깐 write()가 있고 write_iter()가 있다. 무슨 차이일까?

write()는 전통적인 방식이며 write_iter()는 보다 일반화되고 유연한 인터페이스이다. 비동기 I/O (AIO, 즉 write가 끝날 때까지 기다리지 않고 다음 작업 수행하도록 함), vectored I/O (scatter/gather I/O) 등을 지원한다. ext4에서는 write에 해당하는 함수가 없기 때문에 write_iter()가 불릴 것이다. 하지만 그 전에 다양한 I/O를 지원하기 위해 new_sync_write() 함수가 먼저 불려 AIO, vectored I/O 등을 위한 준비를 한다.

-- new_sync_write() (중간 레이어)

--> file->f_op->write_iter() == ext4_file_write_iter()

--> ext4_buffered_write_iter()

--> generic_perform_write() (fsync와 같이 들어왔다면 이 이후에 generic_write_sync() 내부 코드가 동작하게 된다.

--> a_ops->write_begin() == ext4_write_begin() (block 할당 및 페이지 락 확보)

    --> ext4_block_write_begin()

-- copy_folio_from_iter_atomic() (page cache에 저장한다. 페이지 락이 걸린 상태임.)

    --> copy_page_from_iter_atomic()

-- a_ops->write_end() == ext4_write_end() (dirty page 마크, 저널 처리)

댓글