본 포스팅의 내용은 Operating System Concepts 10th의 내용을 토대로 작성되었습니다.
read from file, write to file와 같은 API만 잘 정의한다.
만약, X의 개수(argument의 개수) 가 너무 많다면, 스택 혹은 블록 메모리에 저장하고 다시 뽑아낸다.
한가지 중요한 점은, 이러한 매개변수는 커널에 복사한 후 사용해야 한다.
만약, 유저의 메모리에서 그대로 가져다 쓰게 되면, 커널이 argument를 verify 한 후 유저가 invalid argument로 악의적으로 바꾸는 attack을 할 수가 있기 때문이다.
백그라운드 서비스: 시스템이 정지될 때 까지 계속해서 실행되는 프로세스
데몬, 서비스, 서브시스템 등의 이름으로 불린다.
운영체제의 권한을 이용한 작업을 사용자 공간에서 데몬이 대신 돌려줄 수 있다.
컴파일러가 소스파일을 명령어 집합이며 재배치 가능한, 기계어인 오브젝트 파일로 만든다.
링커는 오브젝트 파일을 엮어 하나의 이진실행파일로 결합한다. 이 과정에서 다른 라이브러리가 포함될 수 있다. EXT파일을 생성한다.
로더는 링커의 결과인 실행파일을 메모리에 올리도록 한다.
fork and exec that ext file..
DLL
윈도우에서 사용, 실행파일에 포함된 게 아니라, 로더에 올릴 때 동적으로 링킹된다.
메모리 절약을 할 수 있다.
ELF(Executable and Linkable Format)
단순히 말하면, 유닉스 실행 파일입니다.
윈도우에서는 PE(Portable Executable)
실행 파일에서는, 프로그램을 시작시키기 위한 주소 등이 있겠지.
모놀리식 구조
단점이 있어도, 속도와 효율성 면에서 따라올 자가 없다. 하드웨어와 시스템 콜 사이에 있는 것이 커널
레이어 인터페이스
디버깅 할 때 생각해 봐라. 낮은 층부터 해 나가면, 어떤 문제가 생겼을 때 아래 층에서는 문제가 없었다고 하면 위 층에서 문제가 있었다는 것을 알 수 있다.
물론, api를 정해야 하는 등의 오버헤드는 있습니다.
마이크로 커널
커널의 기능이 여러 개의 서버로 분할된다.
크래시가 나도 커널이 죽지 않는다.
운영체제의 서비스 대부분이 유저 공간에서 실행된다.
확장성이 용이하다.
이식성도 괜찮다.
일부분만 바꾸면 되기에
커널 내부에서, 메시지를 교환할 때 다른 프로세스로 전환해야 할 수도 있다. 이런 오버헤드가 있긴 하겠다.
모놀리딕 커널, 마이크로 커널
커널의 핵심적인 부분만 구현하고, 이후에는 운영체제를 실행하면서 동적으로 더 많은 서비스를 제공한다. 런타임 중 커널에 모듈을 삽입할 수 있다.
여러 개의 레이어로 나눈다
응용프로그램은 직접 이 모든 기능을 사용할 수 있다.
부트 로더, 부트 스트랩이라고 하는 작은 코드가 커널의 위치를 찾는다.
BIOS(비휘발성 펌웨어)에 부트로더가 존재
컴퓨터를 키면 이 BIOS가 실행된다.
일반적으로, BIOS는 첫 번째 부트로더고, 디스크 블록의 두 번째 부트 로더를 적재하고 실행시킨다.
최근에는 UEFI라고 해서, 부트로더 하나가 모든 거를 정교하게 사용하는 방법이 있다. 이 방법을 사용하면 부팅 시간이 단축되겠네
두 번째 부트로더는, GRUB이라는 게 있는데, 이거 잘 보면 그냥 SHELL같은 느낌.
커널이 메모리에 적재된다.
커널은 하드웨어를 초기화한다.
루트파일시스템이 마운트된다.
리눅스는 그리고, systemmd를 생성한 다음, 다른 서비스를 시작한다.
그리고 로그인 창이 똑
프로세스 실패 시 로그파일 저장 및, 코어 덤프(메모리 덤프)
커널의 실패는 크래시라고 함, 로그와 크래시덤프 저장
proc 파일 시스템
프로세스에 관한 정보를 마치 파일처럼 놓은 것프로세스에 관한 정보를 마치 파일처럼 놓은 것
윈도우에서는 작업관리자로 가능
BCC라는 디버깅 툴을 사용할 수 있다.