이것은 내가 만든 최초의 운영 체제입니다. C 언어와 어셈블리라는 두 가지 언어로 작성되었습니다.
이 프로젝트는 2017 년 12 월 15 일부터 활성화되었습니다

작업 계획
부트 로더
관습
부츠 섹터
2 단계
애벌레
핵심
메모리 관리
페이지 프레임 할당 자
동적 메모리 할당
건물 시스템
VGA에 텍스트를 작성하십시오
CPU 인터럽트 (IDT, ISRS, IRQ 등)
PS/2 키보드에서 문자를 읽으십시오
PS/2 키보드에서 문자열을 읽으십시오
가상 메모리 (페이징, 프레임 등)
페이지 프레임 할당 및 할당량
동적 메모리 할당 (liballoc)
CPU 타이머
CPU 정보를 얻으십시오
실시간 시계 : 그래서 우리는 영화가 시작되는지 알 수 있습니다.
커널 스택 추적
멀티 태스킹
사용자 모드 프로세스
하드 디스크 드라이버
플로피 디스크 드라이버
파일 시스템
그래픽 사용자 인터페이스
이 OS는 2 단계 부트 로더를 사용합니다. 두 번째 단계가 보호 모드를 입력하고 커널을 호출하는 경우입니다.
플로피 이미지의 처음 512 바이트에는 보호 모드가 할 수없는 많은 작업을 수행하는 부팅 섹터가 포함되어 있습니다. (예 : 디스크에서 물건을 로딩). 그런 다음 0x7E00 (부팅 섹터 직후)에로드 된 두 번째 단계로 이동합니다.
이 단계는 GDT를로드하고 보호 모드 로 들어간 다음 부팅 섹터로로드 한 커널을 0x1000 ~ 0x100000 (1MB)로 복사합니다. 마지막으로 점프!
커널의 크기는 항상 커지고 있지만 항상 부문을 증가시킬 수는 없습니다. 해결책으로. 나는 그루브를 사용하기로 결정했습니다. 커널은 ISO 9660 파일 시스템으로 사용하는 CD에 ELF 이미지 ( kernel.img )로 저장됩니다. Grub은 또한 Multiboot를 지원하므로 운영 체제 (Windows, Linux 등)와 함께 작동 할 수 있습니다.
우리는 보호 모드에 들어갔습니다. 즉, BIOS 기능에 액세스 할 수 없습니다. 따라서이 커널은 하드웨어를 제어하기위한 기능을 다시 구현해야합니다.
이제 표준 장치 인 화면 및 키보드를 다시 구현했습니다. 추가 개발에서. 디스크 드라이버를 구현하려고합니다.
이 운영 체제는 세분화와 페이징을 모두 사용하여 메모리 보호를 제공합니다. 글로벌 디스크립터 테이블 에 5 개의 세그먼트 설명자를 넣었습니다.
널 세그먼트
커널의 코드 세그먼트 : 내 커널 코드가 속한 세그먼트
커널의 데이터 세그먼트 : 내 커널 글로벌 변수가 속한 세그먼트
사용자 용 코드 세그먼트 : 현재 사용하지 않습니다
사용자의 데이터 세그먼트 : 4와 동일합니다
나는 또한 페이징을 활성화합니다. 이제 첫 페이지 테이블의 네 번째 페이지를 제 1 페이지 테이블의 네 번째 not-present read-only 으로 맵핑하므로 OS의 명령 줄에서 bsod 입력하여 페이지 결함을 생성 할 수 있습니다.

이 커널은 페이지 프레임 할당자를 제공하므로 메모리 관리가 더 편리하고 멀티 태스킹에 더 쉽게 접근 할 수 있습니다.
Jamesm의 튜토리얼에서 알 수 있듯이 비트 세트를 사용하여 프레임이 무료인지 아닌지를 결정합니다.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
커널에서 사용하는 모든 변수는 전원이 꺼질 때까지 해제 될 필요가 없기 때문에 현재 무료 없이 배치 malloc을 구현했습니다.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
나는 게으르기 때문에 liballoc 이라는 제 3 자 메모리 할당을 포트로 제공하여 OS에서 몇 가지 기능 만 필요했습니다.
이 프로젝트는 GNU Make를 사용하여 빌드합니다. 따라서 빌드하는 방법은 make 중에 문제가 발생하면 make 전에 make dep 입력하는 것입니다. 아직 붙어 있으면 문제를여십시오.
Linux 또는 WSL (Linux 용 Windows 서브 시스템)을 사용하지 않는 경우 여기에서 크로스 컴파일러를 다운로드해야합니다. 그런 다음 config.mk 에서 CC 및 LD 수정하십시오.