학습 목적을 위해 처음부터 구축 된 x86 기반 운영 체제
int 64 통해 발생합니다. 이는 특권 에스컬레이션을 위해 게이트 설명자가 필요했습니다.운영 체제 구축 (GCC, NASM 설치 가정),
makeQEMU에서 실행합니다
make qemu실행하려면 (Bochs, Bochs-SDL 설치),
make run디버깅 지원 (GDB)과 함께 QEMU에서 실행하려면
make qemu_gdb(GDB 첨부, 최상위 층의 .gdbinit 파일에 이미 제공된 필수 명령)
BIOS는 16 비트 실제 모드에서 프로세서를 시작하고 Grub은 32 비트 보호 모드를 시작합니다. 커널 엘프 이미지는 그루브 사양에 따라 멀티 봇 헤더가 제공됩니다. 그럽이 처음 512 바이트의 이미지 에서이 헤더를 찾으면 0x100000 위치에 ELF를로드하고, 메모리가 BIOS 및 VGA와 같은 다른 하드웨어/IO 매핑에 속합니다. Kernel의 _start Entry Point에서 실행 된 Bootup Code (참고 BSS는 이미 Grub에 의해 초기화되었습니다),
간단한 first-fit 전략 메모리 할당자는 커널 공간에서 메모리를 할당하며, free 로 인접한 자유 블록의 압축을 관리합니다.
사용자 공간의 경우 Malloc/Free는 내부적으로 사용한 sbrk 시스템 호출을 위해 시스템 브레이크를 늘리기 위해 제공됩니다 (필요한 경우). 커널에는 필요한 페이지 테이블 설정이 필요하며 시스템 중단 제한이 증가합니다.
이것은 커널 공간 메모리 매핑 및 사용자 공간 메모리 매핑으로 나뉩니다. 커널 공간 매핑은 일정하게 유지되며 모든 프로세스 주소 공간의 일부이며, 커널 공간의 한 프로세스의 변경 사항도 다른 프로세스에도 보이도록해야하므로 클로닝되지 않아도 연결되지 않습니다.
사용자 공간 매핑은 exec 호출에 따라 다르며 모든 프로세스에는 사용자 스택뿐만 아니라 자체 커널이 있습니다.
Context Switch에서 CR3 레지스터에는 현재 프로세스 페이지 디렉토리 기본 주소가로드되고 내부적으로 TLB (Translation Lookaside Buffer)를 무효화합니다.
사용자 공간 애플리케이션은 표준 ELF 형식의 CPIO 형식 아치형 인 initramfs 에 저장됩니다. exec 커널 동안 엘프 이미지를 찾아서 구문 분석하는 동안 그에 따라 페이지 테이블을 설정합니다. Init 프로세스는 shell 만 시작한 다음 영원히 거기에 매달려 있습니다.
스케줄러는 현재 실행중인 프로세스를 대신하여 주로 두 가지 경우에 실행됩니다.
커널 모드 코드/데이터 세그먼트는 그에 따라 프로그래밍 된 권한 레벨이있는 사용자 모드 코드/데이터 세그먼트와 별도로 분리되어 있습니다. 예외에서 돌아 오는 동안 하드웨어는 스택에서 CS (코드 세그먼트) 및 SS (스택 세그먼트)를 팝업하여 권한 수준이 낮아집니다.
새로운 작업을 작성하는 동안이 스택 프레임을 그에 따라 프로그램하고
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86 하드웨어에는 기본적으로 사용자 스택에서 커널 스택으로 전환하는 작업 스위칭을 지원합니다. 이를 위해 모든 작업은 자체 TSS로 설정해야하며 컨텍스트 전환 중에 수정됩니다. 하드웨어 작업 전환을 사용하지는 않지만 소프트웨어 자체에서도 동일하게 수행 할 것입니다. 어쨌든 현재 작업을 위해 유효한 커널 모드 SS (스택 세그먼트) 및 ESP (스택 포인터)가있는 TSS를 제한 할 때까지 설정해야합니다.
무작위 FAQ
자유롭게 포크하고 병합 요청을 보내십시오