
2025.05.27
rox : Read-Only Executable → Deny Write on Executables 처리
bad : page fault가 발생 → exit(-1)로 종료되도록
syn : synchronization 구현 → filesys_lock 사용
static void
page_fault(struct intr_frame *f)
{
.....
/* Determine cause. */
not_present = (f->error_code & PF_P) == 0;
write = (f->error_code & PF_W) != 0;
user = (f->error_code & PF_U) != 0;
---------------------------------------------------------------------
/* 유저 모드에서의 페이지 폴트라면, 즉시 종료 */
if (user)
{
/* sys_exit()는 프로세스를 exit(-1)하고 thread_exit까지 해 줌 */
sys_exit(-1);
NOT_REACHED();
}
------------------------------------------------------------------------
....
}
kill(f) 호출은 커널 모드 폴트에만 실행thread 구조체
struct thread{
...
/* rox를 위한 자신이 실행한 프로그램을 가짐 */
struct file *exec_prog;
}
load() 함수 내부 deny 추가
load()
{
...
file = filesys_open(argv[0]);
if (file == NULL)
{
printf("load: %s: open failed\n", argv[0]);
goto done;
}
/* rox를 위한 deny 추가*/
file_deny_write(file);
t->exec_prog = file;
...
done:
// load 이후에 file_close 해버리면 안되고, exit()가 되었을 때 파일을 닫아야 함
/* We arrive here whether the load is successful or not. */
// if (file != NULL)
// {
// file_close(file);
// }
return success;
}
filesys_open()이 반환한 struct file *file은, 곧바로 file_deny_write(file) 호출로 inode->deny_write_cnt++ 를 당함.write(fd, …)), file_write() 내부의 때문에 “0바이트 써지고 실패”가 보장됨.if (file->deny_write)
return 0;exit() 시 쓰기 금지 해제·파일 닫기
case SYS_EXIT:
sys_exit(status);
-----------------------
void sys_exit(int status)
{
struct thread *curr = thread_current();
/* 추가한 부분
*/
if (curr->exec_prog!= NULL)
{
file_allow_write(curr->exec_prog);
file_close(curr->exec_prog);
}
curr->exit_status = status;
thread_exit(); // curr->status -> THREAD_DYING
}
file_allow_write() 호출로 inode->deny_write_cnt-- 되어 쓰기 카운터가 원래대로 돌아가고,file_close() 는 내부에서 inode_close() 까지 해 주므로,rox 정리
filesys_open() → file_deny_write() 를 호출해서deny_write_cnt > 0 이므로write() 시스템콜을 통해 수정할 수 없음.file_close() 를 해 버리면file_close() 내부에서 자동으로 inode_allow_write() 가 호출되어deny_write_cnt 가 0이 되고,exit() 핸들러에서 file_allow_write() → deny_write_cnt--file_close() → 실제 핸들 해제 로 순서대로 처리해야,따라서 “로드 시 바로 닫지 않고, 프로세스가 끝날 때까지 열어 두어야 한다”는 설계가 반드시 필요함.
filesys.c, file.c 에 있는 모든 파일 관련 함수에도create, remove, open, read, wirte함수에 lock 걸어주기lock_acquire(&filesys_lock);
…;
lock_release(&filesys_lock);

dup까지 해보자 화이팅