시스템 호출 경계

read() 사용자/커널 경계

시스템 콜은 함수 호출처럼 보이지만, CPU 권한 모드 전환과 커널의 파일 객체 검사를 반드시 거친다.

glibc

인자 배치

파일 디스크립터, 사용자 버퍼 주소, 바이트 수를 ABI가 정한 레지스터에 둔다.

trap

모드 전환

syscall 명령으로 사용자 모드에서 커널 모드로 들어가며 커널 진입점이 실행된다.

fd table

열린 파일 확인

현재 프로세스의 파일 디스크립터 테이블에서 open file description을 찾는다.

VFS

파일 구현 호출

VFS가 ext4, pipe, socket처럼 실제 객체 종류에 맞는 read 연산으로 보낸다.

return

복사와 반환

커널이 copy_to_user()로 데이터를 넘기고 읽은 바이트 수나 errno를 사용자 코드에 돌려준다.

사용자 포인터는 신뢰하지 않는다

커널은 전달받은 주소가 접근 가능한 사용자 공간인지 확인하고, 잘못된 주소에는 EFAULT를 반환한다.

라이브러리 함수와 시스템 콜은 분리된다

printf()는 버퍼링을 할 수 있지만, 실제 파일이나 터미널 접근은 결국 write() 같은 시스템 콜로 내려간다.