리눅스 커널 디자인의 기술을 읽으면서 책 내용 정리하기 (티스토리부터 이전 된 자료 입니다.)
파일 시스템 설치로 하드디스크 파일 시스템을 루트 파일 시스템으로 만드는 작업이다. 이 작업을 마치면 OS는 루트 디바이스와 데이터를 주고 받을 수 있게 된다.
하드디스크는 파티션으로 나누어져 있다. 각 파티션은 각각 디바이스로 취급된다.
파일 열기는 open()함수를 사용한다.
OS는 유저 프로세스의 요청에 따라 파일에 액세스한다. 커널을 통하면 한 파일을 여러 번 오픈 하는것이나 많은 파일을 오픈하는 것을 제어 할 수 있다. 일단 파일이 오픈되면 파일의 포인터를 저장해 둔다.
OS에서 파일 테이블은 데이터 구조체로 모든 프로세스들이 오픈한 파일들을 관리한다. 이 구조체에서 관리하는 정보들을 다음과 같은 것들이다. 가각의 프로세들이 각각 다른 파일을 오픈 했다는 정보, 프로세스들이 같은 파일을 오픈한 정보, 그리고 한 프로세스가 다양한 파일들을 여러 번 오픈했는지에 대한 정보들이 파일 테이블에서 관리하는 정보들이다.
파일을 읽는 다는 것은 유저 프로세스가 오픈한 파일에서 데이터를 읽어 들이는 것을 말한다.
파일 읽기는 read() 함수를 사용한다.
read()함수는 시스템 콜 sys_read()함수를 호출한다. 주요 동작이 실행되기 전에 시스템은 먼저 이 함수가 실행 될 수 있는지를 파악한다. 이때 유저 프로세스가 소유한 핸들이 있는지, 혹은 읽으려는 데이터의 크기가 허용된 범위 내인지 확인한다. 또 읽는 데이터를 저장한 유저 프로세스의 버퍼가 읽기 전용인지 알아본다. 이런 확인 작업을 거치고 나서야 읽기 작업을 시작한다.
read()함수를 호출해서 파일의 첫 데이터 블록을 하드디스크에서 지정된 버퍼로 읽어 들인다.
버퍼로 데이터 블록을 로드하고 나서 시스템은 이 데이터를 다시 유저 프로세스의 데이터 메모리로 복사한다.
이것으로 파일을 읽는 과정은 끝났다.
첫번째는 쉘 프로세스가 처음 수행될 때, 업데이트 프로세스가 시작된다. 이 프로세스는 메모리에 상주하면서 실행된다. 업데이트 프로세스의 임무는 데이터를 버퍼에서 저장 장치로 데이터 동기화하는 것이다.
이 프로세스는 pause()함수를 실행시키게 되는데, 이 함수는 시스템 콜인 sys_pause()함수로 맵핑되어 있어 결과적으로 프로세스가 인터럽트 가능한 대기상태가 된다. OS는 업데이트 프로세스를 주기적으로 대기 상태에서 깨워서 sync()함수를 호출하게 하고 버퍼의 데이터를 저장 장치로 동기화시킨다.