-
페이지 디렉토리, 페이지 오프셋 이용해서 어떻게 찾아가는지???
-
vaddr.h, mmu.h
- pml4 테이블 기준주소 + 선형주소의 PML4offset = pml4 엔트리 (???)
- 해결내용
-
pml4는 디렉토리와 같다
-
임의의 pml4도 n개의 엔트리들로 구성되어있다
-
어떤 임의의 pml4의 시작부분부터 N칸만큼 이동하면, N번째 임의의 pml4에 대해 N번째 엔트리가 나올 것이다
(= 어떤 pml4의 기준주소로부터 offset만큼 이동하면 해당 pml4엔트리를 만날 수 있다 )
-
KERN_BASE = 42 하드코딩의 의미
- 해결내용
- multi-oom 테스트에 한해서였다
- 일반적인 경우 (우리가 알고있듯)핀토스에서 kern_base는 0x8004000000
- 세그폴트 = 유저에서 커널, 페이지폴트 = mapping된 페이지가 없음
- 따라서 KERN_BASE = 42면 유저가 쓸 공간이 없으므로…. page fault 자주발생 및 큰 파일 못올리게 됨
-
유저메모리.. 나는 어디에 저장해(??)
- 해결내용
- (VA기준)커널영역(의 일정 부분)은 1:1로 pysical에 맵핑됨
- (VA기준)유저영역은 페이지테이블에 의해 pysical에 맵핑됨
- 따라서 유저영역의 정보가 직접 변환되는게 아님
- 따라서 mmap과 같은 맵핑함수는 커널영역의 정보에 대해서만 작동한다.
-
PTE(페이지 테이블 엔트리)
- 이거 주인이 누구인지 어떻게 앎?
- PTE는 페이지 테이블의 첫번째 부분인지?
- 해결내용
- 어떤 프로세스가 실행중일 때, 해당 프로세스의 유저스페이스만 pml4_activate함수를 통해 활성화된다
- cr3로도 불리는 이것은, 한 프로세스에 대하여 항상 하나만 활성화되어있다. 따라서 그냥 열려있는 PTE가 해당 프로세스의 주인이다
- PTE는 페이지테이블의 첫번째 부분이 아니라, PT의 요소 하나하나들이다.
-
페이지 테이블, 페이지 디렉토리는 둘다 RAM에있는가?
- 해결내용
- 모두 VA의 커널스페이스에 존재한다. 그리고 이 정보들은 pysical의 어느 부분과 잘 mapping되어있다
- 그리고 이 ‘어느부분’은 kernel base 기준 0부터 pysical에 mapping된다.
-
Linux 커널에서 사용자 공간 메모리에 액세스하는 방법은 무엇입니까?
- 해결내용
- 핀토스의 경우, 쓰레드별로 유저스페이스를 따로 가지고 있다
- 따라서, 어떤 한 포인터의 주소정보만으로는 그 포인터가 속한 pysical의 정보를 얻어올 수 없다
- 왜냐하면!! 유저별로(쓰레드별로) 각기 다른 유저스페이스를 차지하고 있기 때문이다.
- 따라서, 어떤 한 포인터가 속해있는 프로세스를 알아야 한다. (핀토스 경우 쓰레드로 보아도 무방)
- 어떤 쓰레드의 포인터인지 알게되면, pysical의 어디부분에 맵핑되어있는지 알 수 있을테고 해당 VA로 정보를
-
NOT_REACHED() 의 의미??
-
thread 구조체에 All_elem 언제쓰누???
- 해결내용
- ready_list에도, wait_list 등 여기저기 산재되어 있을 수 있음
- 메모리 누수때문에, 산재된 녀석을 한번에 지우기 쉽게 하기 위해서 all_elem으로 관리
-
프로세스 디스크립터, 파일 디스크립터 테이블
- 해결내용
- 프로세스 디스크립터 = 쓰레드라는 의미로 쓰임
- 파일디스크립터 = 모니터, 키보드, 우리가 오픈한 파일… 등
**fdt (File Descriptor Table)
-
PageFault를 이용하여 bad-ptr-attack(string copy)을 방어하려고 할 때, 왜 rax 레지스터를 0Xffffffff로 설정하여 주는지?
-
이번 과제에서 HEAP 영역을 쓰면 안 되는 걸까??
- 해결내용
- HEAP은 malloc해주지 않는이상 사용하지 않는다. 사용해도 무방하다
- 추가적으로…
-
syscall.c의 case문에서 a label can only be part of a statement and a declaration is not a statement 에러가 뜸
- 해결내용
- 중괄호로 묶어주어 해결해주긴 했는데… 이유는 아직까지도 잘 모르겠음;;;
- OPEN()에서는 잘 되던데, EXEC()에서는 왜 저런 에러를 보여줄까????
-
exec에서는… fn_copy에 palloc을 하고, 거기에 strlcpy를 해준다. 왜 할당된 페이지에 해주는가? 거기에 프로그램이 올라가지는 않겠지? 단순 이름이 너무 길까봐 palloc을 해주는건가? malloc으로는?해주면 안되나?
-
우리의 fork가 잘 안되었던 이유?