내가 뉴비임;; 여하튼 tcort 덕분에 과제의 실마리를 찾았다.
대략적인 과정은 이렇다.
open()함수가 syscall을 내부에서 호출한다.
syscall이 메시지를 준비해서 커널에게 보낸다.
커널이 메세지를 vfs 서버에게 보낸다.servers/vfs/main.c
vfs서버가 mfs(미닉스 파일 시스템)에게 파일을 오픈하라는 메시지를 보낼것이다.
그러면 mfs 서버가 메시지를 디스크 드라이버(디스크드라이버 디렉토리)에게 보낼것이다.
참고자료:
http://www.minix3.org/doc/gerofi_thesis.pdf
http://wiki.minix3.org/en/DevelopersGuide/VfsFsProtocol
위 자료들 대충 간추려서 번역
응답과 요청
fs(파일서버가) FS_READY 리퀘스트를 VFS에게 날린다. 이에 의해서 VFS에게 파일서버의 부재를 알린다,
그 이후에 VFS는 오직 답변만을 보낸다 모든 요청은 반드시 한번의 답변만 받는다.
VFS가 FS가 날린 FS_READY에 대한 첫번째 응답을 FS에게 날리는데 이를 REQ_READSUPER라 한다. 마지막 요청은 REQ_UNMOUNT이다.
vfsif.h파일에 보면 리퀘스트, 응답, 메시지 필드에 대한 정의가 있다. vfs 는 요청 코드를 리퀘스트 메시지안에 넣는다. 리퀘스트 코드는 언제나 VFS_BAS부터 VFS_BAS+NREQS 범위 사이에 있다.
FS(파일서버)는 요청에 대한 응답 코드를 응답 메시지 필드 안에 넣는다. 언제나 OK(0)이나 또는 - 코드다.
FS가 VFS에게 요청을 보내는것이 가능한데 이러한 요청은 언제나 0이아닌 양수값을 가지고있고 다시말해 요청은 응답과 구분될 수 있다.
시스템 상호작용
REQ_UNMOUNT 는 종결 요청이 아니다 파일시스템이 언마운트 되면, 파일서버는 신호받자마자 종료되야한다.
PM은 파일서버에 시그널을 보내는데, 언마운트된 다음에는 REQ_READSUPER가 필요없다.
아이노드
VFS 요청은 주로 아이노드 접근일것이다. VFS_FS 프로토콜 속에서 아이노드는 오픈 파일(디렉토리를 포함한 어떤 타입의)을 가리키는 포인터다.
아이노드는 아이노드 넘버에 의해 접근가능하고 결정된다. FS는 파일접근을 위해 아이노드 넘버를 픽킹할 의무가 있다.
VFS 캐쉬는 아이노드를 VNODE 형식속에서 연다. 아이노드가 포함하고 있는 정보: UID(유저아이디), GID(그룹아이디) 장치번호. VFS는 오직 응답이 있을때만 아이노드를 열기떄문에
아이노드 넘버가 VFS 요청과 함께 넘어간다면 연관된 아이노드는 파일서버에서 0번 참조를 가질것이다.
REQ_CREATE 에 의해 아이노드가 오픈되는 콜은 또한 허용한다 파일서버가 아이노드 인덱스 값을 제공하도록. 이것은 랜덤 넘버이다.
승인
VFS와 FS 사이에서 전송되는 데이터는 메시지 속에있는것이 아니다. 이것은 메모리 승인. FS는 sys_safecopyfrom(읽기_이나 sys_safecopyto(쓰기) 를 쓸수있다
디렉토리 엔트리들
어떤 시스템콜은 디렉토리 엔트리를 조작한다. 하나의 디렉토리는 언제나 여러게의 아이노드 넘버를 포함하고 VFS에 의해 승인받은것들이다.그리고 요소들의 최신 path dhk
VFS는 일반적으로
중략
장치 드라이버들
모든 FS 들은 REQ_BREAD와 REQ_BWRITE에 의한 전송들을 책임진다. (이미 마운트 된 장치에 한해서)
이것은 캐쉬 동기화를 책임진다. 전송 시작되기전에 VFS는 REQ_NEW_DRIVER 메시지를 FS에게 보낸다.
중략
메시지 프로토콜
이 프로토콜 유형은 아이노드에 접근하는 패스 스트링을 포함한다. 패스는 REQ_DIR_INO에 의해 주어지는 아이노드에서 시작하고 이것은 언제나 디렉토리이다.
path 요소들은 / 로 구분되고 (usr/include/sss...)
중략
pdf 파일 번역
2장
VFS가 맨 상위에 있고
FS들이 그 하위에 있다
Fs란 쉽게 말해서 디렉토리 들이다
/ 라던지 /usr 이라던지 /mnt 같은것들
VNODE:
추상화된 노드인데 FS 위의 한 종류이다.
파일의 식별 넘버를 저장하고(inode 넘버) FS 의 엔드포인트 넘버 저장.
파일 객체: 열려진 파일을 말한다. 이 필드의 중요부분은 vnode 와 일치하는 곳인다. 이는 파일속의 현재 위치를 가리킨다.
파일 디스크립터: 파일 디스크립터란 파일 디스크립터 테이블의 offset 값이다. 모든 파일디스크립터 테이블의 슬롯은 파일 오브젝트들을 가리키거나
또는 비어있다. 모든 프로세서는 파일 데스크립터 테이블을 가지고 있다.
중략
3장(핵심)
vnode 객체는 inode 를 참조한다. vnode는 디스크 아이노드 넘버를 가지고있고 FS의 엔드포인트도 가지고 있다. (파일의 형식과 파일 크기를 가리키는)
vnode 객체는 고정된 배열에 장된다.
vmnt 객체는 마운트된 FS를 대표하고 이것은 장치 번호와 flags, 파일 최대크기를 저장하고 또한 마운트된 FS의 root vnode를 저장한다.
VFS와 FS간의 통신은 메시지 스트럭처에 의해 이루어진다. 메시지는 호출자의 주소,요청에따른 추가인자를 포함한다.
요청은 참조된 파일의 아이노드 넘버를 포함해야한다. 요청 중 데이터가 전송된다면, 유저 프로세서커널의 엔드포인터 넘버도 같이 전송된다.
'컴퓨터 공학 자료(학부) > Linux' 카테고리의 다른 글
MINIX(미니 리눅스) 함수 호출시 루틴 (0) | 2010.05.06 |
---|---|
리눅스 (1) | 2010.04.23 |