Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

493
557
422263


[리눅스커널][가상파일시스템] 파일 객체: write 연산 세부 동작 분석 13. 가상 파일 시스템

파일 객체: write 연산 세부 동작 분석

유저 공간에서 write() 함수를 호출할 때 가상 파일시스템에서 어떤 흐름으로 파일 별 write 오퍼레이션을 수행하는지 살펴보겠습니다.

유저 공간에서 리눅스 저수준 함수로 write() 함수를 호출하면 시스템 콜을 발생시켜 커널 공간으로 실행 흐름을 스위칭합니다. 이 후 write()에 해당하는 시스템 콜 핸들러인 sys_write() 함수를 호출합니다.

먼저 sys_write() 함수 선언부와 인자와 반환값을 확인하겠습니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/syscalls.h]
asmlinkage long sys_write(unsigned int fd, const char __user *buf,
  size_t count);

 
"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


Reference(가상 파일시스템)

가상 파일시스템 소개
파일 객체
파일 객체 함수 오퍼레이션 동작
프로세스는 파일객체 자료구조를 어떻게 관리할까?
슈퍼블록 객체
아이노드 객체
덴트리 객체
가상 파일시스템 디버깅


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


repository:
http://rousalome.egloos.com/10026102

핑백

덧글

  • 나그네 2020/02/18 12:45 # 삭제 답글

    안녕하세요 좋은 글 감사합니다.
    올려주신 글을 읽다보니 궁금한게 하나 생겼는데

    파일 f1을 서로 다른 프로세스 a, b에서
    fd = open(append)함수로 연 후에
    write 함수로 4kbyte 이상의 내용한 한번의 호출로 동시에 쓰게 되면 신기하게 중간에 섞인다거나 내용이 사라지지 않더라구요

    서로 다른 프로세스에서 f1파일을 열었으니 fd가 가르키는
    시스템 파일 테이블의 파일이 다를텐데

    어떻게 내용이 삭제되거나 섞이지도 않는지 알수 있을까요?

    write 함수가 inode테이블에서 lock 건다는 글을 본건 같은데...

    세부적인 내용은 알수가 없겠더라구요...







  • AustinKim 2020/02/18 13:29 #

    답글이 길어질 것 같아 새로운 포스팅을 올렸습니다.
    링크는 다음과 같습니다.
    http://rousalome.egloos.com/10011465

    감사합니다.

    Thanks,
    Austin Kim
  • 나그네2 2020/04/02 19:48 # 삭제 답글

    안녕하세요.
    VFS를 공부하는데 많은 도움을 받고 있습니다. 감사합니다.

    질문이 하나 있습니다.
    파일 오퍼레이션 함수를 실행하는 코드를 보면
    file->f_op->write 멤버가 유효한 함수 주소를 가리키고 있지 않을때
    file->f_op->write_iter 멤버가 유효한 함수 주소를 가리키고 있다면 write_iter를 수행하게 되어있는데요

    이건 어떤 케이스에서 발생할 수 있는 일인가요?
    왜 write멤버에 함수 주소를 넣어주지 않고 굳이 write_iter라는 친구가 등장한것인지,
    _iter라는 것이 어떤 의미인지 궁금합니다.

  • AustinKim 2020/04/03 09:12 #

    write_iter 필드는 AIO(Asynchnorous I/O)를 인터페이스를 지원하기 위해 추가됐으며, 관련 커밋과 링크는 다음과 같습니다.

    https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=293bc9822fa9b3c9d4b7893bcb241e085580771a
    http://git.emacinc.com/Linux-Kernel/linux-emac/commit/293bc9822fa9b3c9d4b7893bcb241e085580771a

    참고로, ext4 파일 시스템에서 write 필드 대신 write_iter 필드에 ext4_file_write_iter() 함수를 지정하는 커밋 정보는 아래와 같습니다.
    https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=9b884164d59707216840159d45f6be68073fac6e

    AIO는 유저 공간의 POSIX와 연계 되어 저장매체에 데이터를 저장하는 파일 시스템을 위한 가상 파일 시스템의 인터페이스입니다.
    쉽게 설명을 드리면, 저장 매체에 데이터는 비동기적(Asynchnorous)으로 저장됩니다. 이를 지원하는 파일 시스템을 위해 가상 파일 시스템에서 write_iter/read_iter를 지원한다고 볼 수 있습니다.
댓글 입력 영역