Project #2-2. Pintos User Program Operating Systems : Project #2-2. Pintos User Program
Project2 Pintos Project 2. User Program § 파일 시스템 관련 시스템 콜을 구현 § 파일 시스템 관련 시스템 콜을 구현 § 시스템 콜: create, remove, open, close, filesize, read, write, seek, tell Distributed and Cloud Computing Lab.
File System Call Implementation Distributed and Cloud Computing Lab.
Base File System (1) • 파일 시스템 관련 시스템 콜을 구현하기 위해, Pintos의 기본적인 파일 시스템 구조(Base File System)를 이해할 필요가 있다 § 파일 시스템의 내부 구조를 이해하라는 뜻 아님 § 개론적인 내용 내지는 API 사용법 숙지 필요 Base File System (from pintos document) No internal synchronization File size is fixed at creation time File data is allocated as a single extent No subdirectories Filename’s length limitation Distributed and Cloud Computing Lab.
Base File System (2) • Project 2의 파일시스템 사용은 한 개의 파일시스템의 root directory(/) 에서의 연산만을 가정한다 (No subdirectories) • Kernel에서 의 파일 접근 § filesys/file.c에 존재하는 struct file을 통해 가능하다. § (본 프로젝트에서는 inode level에서의 접근은 필요하지 않다) /* An open file */ struct file { struct off_t bool inode *inode; pos; deny_write; /* File’s inode */ /* Current position */ /* Has file_deny_write() been called? */ } Distributed and Cloud Computing Lab.
Base File System (3) • 기본적인 파일 시스템 사용 인터페이스는 다음과 같다 fopen(…) open(…) • 기본적인 파일 시스템 사용 인터페이스는 다음과 같다 n User Level 에서 fopen() 함수 호출 fopen(…) n 0x30 인터럽트 발생->system call handler 호출->open() 호출 open(…) n Open() 내부에서는 filesys_open() 함수를 호출하여 실제 파일을 open (이것이 구현할 부분) filesys_open(…) Distributed and Cloud Computing Lab.
Base File System (4) Example in Pintos Pintos test program에서 open() 호출 Distributed and Cloud Computing Lab.
System Calls about File System write() and read() File Descriptor(표준 C의 FILE*와 비슷하다) open(), create() 등의 return value. • Pintos에서는 각 thread가 독립적인 FD를 가지며, 관리한다. File Descriptors of STDIN, STDOUT STDIN = 0 STDOUT = 1 § read(0)의 구현은 다음 함수를 이용하면 된다. pintos/ src/devices/input.c:uint8_t input_getc(void) § write(1)의 구현은 다음 함수를 이용하면 된다. pintos/src/lib/kernel/console.c:void putbuf(…) Distributed and Cloud Computing Lab.
Useful API (1) • 파일 시스템 관련 시스템 콜 구현 시 사용되는 API. § filesys/filesys.h bool filesys_create (const char *name, off_t initial_size); struct file *filesys_open (const char *name); bool filesys_remove (const char *name); filesys/file.h void file_close (struct file *); off_t file_read (struct file *, void *, off_t); off_t file_write (struct file *, const void *, off_t); void file_deny_write (struct file *); void file_allow_write (struct file *); void file_seek (struct file *, off_t); off_t file_tell (struct file *); off_t file_length (struct file *); • 6, 7페이지 설명 + 이 페이지를 참고하여 구현하도록 한다 (구현할 시스템콜은 file_xxx를 호출해주는 인터페이스 역할) Distributed and Cloud Computing Lab.
Useful API (2) - Example fopen(…) open(…) filesys_open(…) Distributed and Cloud Computing Lab.
Denying Writes to Executables 1. 프로세스는 메모리에 로드된 후 실행되기 때문에 실제 executable file은 지워져도 문제가 없을 수도 있다. 2. 하지만 pintos는 실행중인 프로그램의 executable file이 지 워지지 않기를 원하며, 이것을 구현한다. 3. 다음의 File System 함수가 유용하게 사용될 수 있다. pintos/src/filesys/file.c:void file_deny_write(…) pintos/src/filesys/file.c:void file_allow_write(…) Distributed and Cloud Computing Lab.
Synchronization APIs In ‘pintos/src/threads/synch.c’ void lock_init(struct lock *); void lock_acquire(struct lock *); bool lock_try_acquire(struct lock *); void lock_release(struct lock *); bool lock_held_by_current_thread(const struct lock *); void sema_init(struct semaphore *, unsigned value); void sema_down(struct semaphore *); void sema_try_down(struct semaphore *); void sema_up(struct semaphore *); void sema_self_test(void); Distributed and Cloud Computing Lab.
Protect Critical Section n processes all competing to use some shared data. Each process has a code segment, called critical section, in which the shared data is accessed. Problem – ensure that when one process is executing in its critical section, no other process is allowed to execute in its critical section Test Case에서 Critical Section에 들어가는 영역을 잘 파악 하여 Synchronization API를 활용, 이를 보호해야 한다. ex) syn-read, syn-write Distributed and Cloud Computing Lab.
Test Set l l l l l l l l l l l l l l l l l l l create-normal create-empty create-null create-bad-ptr create-long create-exists create-bound open-normal open-missing open-boundary open-empty open-null open-bad-ptr open-twice close-normal close-twice close-stdin close-stdout close-bad-fd l read-normal bad-read2 read-bad-ptr bad-write2 read-boundary bad-jump read-zero bad-jump2 read-stdout multi-oom read-bad-fd lg-create write-normal lg-full write-bad-ptr g-random write-boundary lg-seq-block write-zero lg-seq-random write-stdin sm-create write-bad-fd sm-full multi-child-fd sm-random rox-simple sm-seq-block rox-child sm-seq-random rox-multichild syn-read bad-read syn-remove syn-write bad-write Total : 56 tests n123
Submission 1. Team project 2. Deadline: 11월 13일(금) 오후 5시 E-mail 제출 pintos/src 에서 make clean 수행한 후, § 조 번호로 디렉토리를 만들고 그 안에 pintos 디렉토리와 document 복사 § 조 번호 디렉토리 전체를 os_prj2_2_조번호.tar.gz 으로 압축 (조번호는 두자리 숫자로) Ex. tar -czvf os_prj2_2_02.tar.gz ./02 § 메일 제목 : [OS_PRJ_#2] 00조 oshw2015@gmail.com 로 제출 • 메일제목, 압축파일명 등이 양식에 어긋날 경우, 제대로 제출처리가 되지 않을 수 있으니 반드시 신경 써서 양식에 맞게 제출해 주시기 바랍니다 Document AS815에 hardcopy 제출 Document deadline도 source code deadline과 같습니다. Distributed and Cloud Computing Lab.