6월, 2015의 게시물 표시

[리눅스 커널] 리눅스 커널의 블록 디바이스 I/O 과정

리눅스 커널의 블록 디바이스 I/O 과정의 기본적인 흐름 사용자 프로세스 -> 표준 C 라이브러리 -> 시스템콜 인터페이스 -> 가상파일시스템 -> ext4 파일시스템 -> 블록 디바이스 드라이버 -> 블록 디바이스(디스크) 블록 디바이스 -> (인터럽트) -> 블록 디바이스 드라이버 -> ext4 파일시스템 -> ... 역순 1. 사용자 프로세스는 실행 도중 파일을 읽기 위해 fread()라는 표준 C 라이브러리 함수를 호출 2. 이 함수는 read() 시스템콜로 구현되어 있으므로 read() 시스템콜을 호출, 커널에 파일 읽기 동작을 요청 3. 소프트웨어 인터럽트(=시스템콜)가 발생해 커널에 진입하면 호출한 시스템콜 번호에 따라 해당 시스템콜 종류를 판별, 현재는 read() 시스템콜이므로 리눅스 커널의 가상 파일 시스템(Virtual File System, VFS)에 파일(디스크) 읽기 요청을 하게 된다. 4. VFS가 ext4 파일시스템에게 읽기 동작을 요청 5. ext4 파일시스템의 read() operation은 파일시스템 관련 처리를 한 뒤 블록 디바이스 드라이버에 읽기 요청 6. 읽기 요청 받은 블록 디바이스 드라이버는 읽을 파일에 해당하는 블록 디바이스의 블록 단위 데이터를 메모리로 읽어오려고 하드웨어를 제어. 따라서 현재 프로세스는 블록 디바이스의 I/O 동작을 완료하기 전까지 sleep하게 됨. 즉 현재 프로세스 상태를 대기 상태(wait state)로 변경하고 스케줄러를 호출해 다른 프로세스를 실행함 7. 하드디스크가 읽기 요청을 받으면 메모리에 있는 리눅스 커널의 캐시 영역에 요청받은 데이터를 전송. 블록 I/O 연산은 대부분 DMA로 이루어짐. 8. 데이터 전송 완료하면 인터럽트 발생시켜 디바이스 드라이버에게 읽기 동작이 끝났음을 알려줌 9. 디바이스 드라이버에 등록된 인터럽트 핸들러 실행 10. 인터럽트 핸들러가 읽기 동작을 완료하면 대기하던 프로세...