운영체제 기본/Linux의 파일 메모리 매핑/mmap과 주소 공간: 두 판 사이의 차이
mmap의 파일 연산과 공통 페이지 캐시 설명 연결 |
용어 통일: 시스템 콜, 컨텍스트 스위치와 첫 등장 영문 병기 |
||
| 27번째 줄: | 27번째 줄: | ||
<code>MAP_PRIVATE</code>라는 이름도 이 시점에 파일 전체의 사본을 만든다는 뜻은 아니다. 이 예제는 <code>PROT_READ</code>만 요청하므로 이 주소를 통한 쓰기를 허용하지 않는다. 파일 수정과 쓰기 시 복사에 관한 이야기는 이 읽기 경로에서 제외한다. | <code>MAP_PRIVATE</code>라는 이름도 이 시점에 파일 전체의 사본을 만든다는 뜻은 아니다. 이 예제는 <code>PROT_READ</code>만 요청하므로 이 주소를 통한 쓰기를 허용하지 않는다. 파일 수정과 쓰기 시 복사에 관한 이야기는 이 읽기 경로에서 제외한다. | ||
== 시스템 | <span id="시스템_호출은_파일과_주소_공간을_연결한다"></span> | ||
== 시스템 콜은 파일과 주소 공간을 연결한다 == | |||
사용자 라이브러리를 거쳐 x86-64의 <code>mmap</code> 시스템 | 사용자 라이브러리를 거쳐 x86-64의 <code>mmap</code> 시스템 콜(System Call)에 들어가면, 커널은 먼저 바이트 단위 파일 오프셋이 페이지 경계에 맞는지 확인한다. 이후 <code>off >> PAGE_SHIFT</code>로 페이지 단위 오프셋을 만들어 <code>ksys_mmap_pgoff()</code>를 부른다. 예제에서는 둘 다 0이다.<ref name="mmap-x86">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kernel/sys_x86_64.c?h=v6.12 Linux v6.12, arch/x86/kernel/sys_x86_64.c: SYSCALL_DEFINE6(mmap)].</ref> | ||
<code>ksys_mmap_pgoff()</code>는 파일 디스크립터를 <code>fget()</code>으로 커널의 <code>struct file</code> 객체에 연결한다. 이어 <code>vm_mmap_pgoff()</code>가 보안 검사를 거치고 프로세스 주소 공간의 쓰기 잠금을 잡아 <code>do_mmap()</code>을 호출한다. 파일 디스크립터 번호만 저장해 두는 것이 아니라, 실제 열린 파일 객체를 바탕으로 매핑을 구성하는 것이다.<ref name="mmap-mm">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/mmap.c?h=v6.12 Linux v6.12, mm/mmap.c: ksys_mmap_pgoff, do_mmap, mmap_region, __mmap_region].</ref><ref name="mmap-util">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/util.c?h=v6.12 Linux v6.12, mm/util.c: vm_mmap_pgoff].</ref> | <code>ksys_mmap_pgoff()</code>는 파일 디스크립터를 <code>fget()</code>으로 커널의 <code>struct file</code> 객체에 연결한다. 이어 <code>vm_mmap_pgoff()</code>가 보안 검사를 거치고 프로세스 주소 공간의 쓰기 잠금을 잡아 <code>do_mmap()</code>을 호출한다. 파일 디스크립터 번호만 저장해 두는 것이 아니라, 실제 열린 파일 객체를 바탕으로 매핑을 구성하는 것이다.<ref name="mmap-mm">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/mmap.c?h=v6.12 Linux v6.12, mm/mmap.c: ksys_mmap_pgoff, do_mmap, mmap_region, __mmap_region].</ref><ref name="mmap-util">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/util.c?h=v6.12 Linux v6.12, mm/util.c: vm_mmap_pgoff].</ref> | ||
| 42번째 줄: | 43번째 줄: | ||
<pre> | <pre> | ||
mmap 시스템 | mmap 시스템 콜 → ksys_mmap_pgoff → vm_mmap_pgoff → do_mmap | ||
→ mmap_region → __mmap_region → mmap_file → call_mmap | → mmap_region → __mmap_region → mmap_file → call_mmap | ||
→ file->f_op->mmap → ext4_file_mmap | → file->f_op->mmap → ext4_file_mmap | ||