저번 주 꺼 안했던거같다
Difference Between User Mode and Kernel Mode
커널 모드에서는 모든 프로세스가 단일 가상 주소 공간을 공유합니다.
사용자 모드에서는 모든 프로세스가 별도의 가상 주소 공간을 갖습니다.
오, 독특.
그 외에도 커널 모드에서 인터럽트는 운영체제 전체가 꺼져버린다는 건 꽤 인상깊다.
Difference between Register and Memory
레지스터가
프로세서 자체가 접근할 수 있는
가장 작은 데이터 보유자라는 정도.
program counter도 일종의 레지스터라는게 특이.
메모리는 거의 제어할 수 없다,
즉 보조 메모리... 직접적 제어와는 연관이 멀다는 것도.
가상 메모리 공간은 사용자 공간과 커널 공간으로 분리됩니다. 커널 공간은 가상 메모리 주소 공간의 상위 부분입니다.
사용자 공간에서는 낮은 주소로 아래쪽으로 성장하는 사용자 스택을 찾을 수 있는 반면, 동적 할당(힙)은 높은 주소로 위쪽으로 성장합니다. 사용자 스택은 프로세스가 사용자 모드에서 실행되는 동안에만 사용됩니다.
커널 스택은 커널 공간의 일부입니다. 따라서 사용자 프로세스에서 직접 액세스할 수 없습니다. 사용자 프로세스가 syscall을 사용할 때마다 CPU 모드는 커널 모드로 전환됩니다. syscall 중에는 실행 중인 프로세스의 커널 스택이 사용됩니다.
커널 스택의 크기는 컴파일 중에 구성되며 고정된 상태로 유지됩니다. 이는 일반적으로 각 스레드당 2페이지(8KB)입니다. 또한 외부 인터럽트를 처리하기 위해 추가 CPU당 인터럽트 스택이 사용됩니다. 프로세스가 사용자 모드에서 실행되는 동안 이러한 특수 스택에는 유용한 데이터가 없습니다.
사용자 스택도 사용자 스택인데
커널 스택은 프로세스 실행 컨텍스트를 저장하고 관리하는데 쓴다는군.....
(그럼 fork에서 커널 스택에 저장된 것도 되게 당연한거네?)
커널 수준에서 데이터 복사: 커널은 유저 모드 스택의 데이터를 복사하여 커널 메모리에 저장한 다음 필요할 때 유저 모드로 복사하여 전달할 수 있습니다. 이를 통해 커널 스택에 직접 접근하지 않고도 유저 스택의 데이터를 읽거나 쓸 수 있습니다.
흠....
아무튼.
사용자 수준 프로세스가 운영 체제의 서비스를 요청할 수 있도록 프로세스와 운영 체제 간의 인터페이스를 제공합니다.
그 뒤에 syscall 사용시 유의해야하는 점과
사용법을 알려주느게 좋음.
하긴 구현만 했지 써본적은 없지.
그냥 open 등의 명령어로 전달,
syscall 로 인자 담아 전달,
아예 스택에 푸시해버리기.
내가 궁금하던게 이거였나보군
3-2) (Open) File Table (in Kernel)
커널은 모든 열린 파일을 관리하는 파일 테이블을 “하나” 관리한다.
이 테이블은 모든 프로세스가 접근할 수 있게 공유되어 있다.(shared by all processes)
테이블의 각 entry는 각 파일 open마다 할당되는 형태이다.
또 v-node, i-node도 보긴 본듯.
커널이 한 프로세스가 접근하는 파일들을 식별하기 위해 사용한다.
v-node 구조체를 도입하기 이전에는 여러 프로세스가 같은 파일에 접근하려고 하면 프로세스 별로 각각 FCB를 따로 할당 받아서 프로세스가 실행되었다. 만약 두 개의 프로세스가 동일한 파일을 열었을 때 한 프로세스에서 다른 쪽은 권한을 변경하고자 시도한다면 문제가 발생하게 된다.
extra가 v-node고
기본은 이거인듯.
(그래서 깃북에서는 같은 파일이어도 fd를 따로 생성하라고함.)
근데 프로세스간 파일을 공유한다면
fd를 공동으로 쓰는 건가?
그럼 공동으로 쓴다면 자기가 지금 연 필요한 파일의 fd는 어떻게 알지....
잉 아닌가
디스크럽터 테이블 -> 오픈 파일 테이블 -> v-node table인데
내부를 보니까
그냥 원래
오픈 파일 테이블 -> v-node table이 있는거같음
(inode가 두개임.)
메모리 관리용으로 쓰는 파일 그 구조체를
커널 단계에서 하나로 관리한다는 것인듯.
흠 여러 유저가
서버에있는 html에 접근하는 것도
이런식으로 처리되나 궁금하네
파일 디스크립터는 프로세스마다 별개로 관리됩니다. 이는 프로세스 간 격리를 제공하고, 시스템의 보안을 강화합니다.
빨리하기 위해 데이터 간이 저장용.
연달아 해야하는 작업은 세마포어 같은 걸로 묶어줌
3기 데이터인가봄
흠 rax가 그냥 x86-64라 쓰는 레지스터라는 사실이 확실.
호환을 위해 다른 곳에 담을 수 있다는 것도 알게됨.
64비트가 더 쎄다
프로그램이 액세스 권한이 없는 메모리 위치에 액세스하려고 할 때 발생하는 오류
그냥 엄청 많이 할당해서
스택 공간 없어도 뜬다는건 인상깊군.
오버플로우도 일종의 세그멘테이션 폴트고.
내가 이상한 주소로 간다는건
커널 주소 외에도
허용되지 않은 부분으로 넘치거나 기타 등등을 생각하는게좋겠군.
문자열 리터럴을 수정하지말라는건
음...
흠..
문자열은 원래 수정불가이긴한데
아무튼 곧 퀴즈.