#: Train-OS 운영 체제를 구축하기위한 교육 세션. 처음부터 시작하여 AMD 와 Intel 의 리소스 만 사용합니다.
여전히 알파 단계에 있습니다
이 저장소는 아직 연마되지 않았으며 여전히 알파 단계에서 여겨 져야합니다. 코드는 컴파일하고 작동해야하지만 문자 메시지는 코딩하고 연구하는 동안 제가 언급 한 첫 번째 초안입니다.
다른 튜토리얼과 다른 점은 무엇입니까?
많은 튜토리얼이 있으며 제가 제시 한 자료의 상당 부분도 거기에 다룹니다. 그래서 왜 귀찮게합니까? 나는 특히 이것들에서 영감을 얻었고 영감을 얻었습니다.
- Phil Todo : 링크
- intermezzos : todo : 링크
이 버전에서 다른 점은 무엇입니까? 내가 새로운 것을 배울 때, 나는 종종 다음에 내가 스스로 한 일을 어떻게 할 수 있는지 모르거나 배우는 느낌을받습니다. 그것이 내가 배우는 방식인지 또는 튜토리얼을 쓸 때 쉽게 생략 할 수 있는지 모르겠습니다. 다음은 규칙적으로 궁금하고 해결하고 싶은 몇 가지 요점입니다 (아마도 다른 필수 사항을 놓칠 것입니다).
- 합의 된 규칙 , 표준, 아키텍처에 따라 간단한 규칙 에 대한 자세한 내용을 제공하십시오. 십대 시절에 프로그래밍을 처음 배우기 시작했을 때 나는 아직도 "Uuhh ... 컴퓨터가 메인을 먼저 불러야한다는 것을 어떻게 알 수 있습니까?" 그것은 단지 "마법"이었다. 이런 것들이 나를 괴롭 히고 , 나는 일이 어디에서 왔는지 ...
- 표준을 가리키고 거기에서 일하십시오. 복사하는 완성 된 솔루션을 제시하지 않습니다. 우리는 표준을 취하고 실제로 물건을 찾습니다 . 코드를 실행하고 싶다면 x86_64 기계 대신 팔 피질을 가정 해 봅시다. 또는 다르게 프레임, 우리가 튜토리얼을 가장 먼저 작성하는 사람이라면 어떻게 부트 로더를 얻을 수 있습니까?
- 두 번 일하십시오. 나는 먼저 베어 본을 가고, 이것은 무슨 일이 일어나고 있는지 이해하는 데 도움이 된 다음, 우리는 매번 접지 작업을 피하기 위해 툴링을 사용합니다.
- 중간 단계 및 "체크 포인트"
- 먼저 개요 제공 -> 더 큰 그림을 보려면
- 실제 코드에 대한 예제 제공 -> 예 : 첫 번째 커널 빈은 실제로 Linux가 구축되는 방식입니다.
- 우리가 사용하기 시작한 각
dependency 에 대한 대안/선택을 제시하십시오. 나에게 튜토리얼을 따르고 싶다면 많은 외부 도서관이 내가 실제로 배우고 싶었던 마술을한다면 그것은 엉망입니다.
개요
내가하고 싶은 일에 대한 대략적인 개요. 바라건대, 다소 연대순으로. 요점은 우리가 할 수있는 일이 너무 많아서 실제로 경로를 선택하기가 매우 어렵다는 것입니다.
먼저, 부팅 프로세스를 더 잘 이해하고 싶습니다. 부트 로더가 시작되기 전에 일어난 일. 실제로 자신의 부트 로더 (OSDEV 링크)를 굴리는 것은 그 자체로 큰 작업입니다.
내 계획은 부팅 프로세스의 초기 단계를 약간 탐색하는 것입니다. 그 목표는 부트 로더가 우리를 위해 무엇을하고 있는지 이해하고 감사하는 것입니다. 결국, 나는 다양한 프로세서 모드, 그들이 제공하는 내용 및 32 비트 보호 모드로 전환하는 방법을 대략적으로 이해하고 싶습니다. 구체적인 목표는 보호 모드로 전환하고 Hello World! 화면에. 부트 로더를 사용하지 않고 어셈블리에서 구현되었습니다.
그 후, 나는 Grub을 부트 로더로 전환하고 사용할 계획입니다. 그리고 거기에서 계속하십시오.
tl; dr
- 최소한의 부팅 가능한 이미지를 작성하십시오.
- 16 비트 실제 모드로
Hello World 인쇄하는 Bootloader. - 수동으로 32 뼈 보호 모드로 전환하고
Hello World 인쇄하십시오. - 수동으로 64 번의 긴 모드로 전환하십시오
- Grub을 부트 로더로 사용하고
Hello World 인쇄하십시오. - 긴 모드로 전환하십시오 (다시).
-
C 로 뛰어 들어 Hello World 인쇄하십시오. - 스택
- VGA 비디오 드라이버를 구현하십시오.
- 인터럽트 (1 부) - ASM에서 핸들러를 찾을 위치 CPU에게 알리십시오.
- 인터럽트 (2 부) - 코드 이동 10에서 C로 이동
- 더 나은 핸들러를 구현하십시오
- 디버깅
- 인터럽트/예외를 처리합니다
- 메모리 페이징을 구현하십시오.
- 커널을 다시 옮깁니다
지정되지 않은 :
나중에 ...
- 파일 시스템
- 프로세스
- 일정
- 시스템 호출
- 스택을 탐색하고 스택 오버플로와 예외를 유발하십시오
- UART를 통해 GDB와 연결 (디버깅 및 임베디드 미리보기)
- 일부 (또는 많은) 부품을 ARM 프로세서에 크로스 컴파일합니다. (나는 STM과 Infineon 보드가 사용되지 않은 주위에 놓여 있습니다)
전제 조건?
없음. 진지하게, 무서워하지 마십시오. 이 튜토리얼의 요점은 처음부터 필요한 모든 지식을 개발하는 것입니다. 내가 가정하는 조건은 단 하나 뿐이며, 당신이 괜찮게 프로그래밍 할 수 있다는 것입니다. 괜찮은 것은 당신이 적어도 스택과 힙에 대해 들었고 어떤 언어로 생산적 일 수 있다는 것을 의미합니다. 충분해야한다고 생각합니다. 결국, 우리는 여기서 차세대 주류 OS를 개발하려고하지 않고 취미 수준에서 땜질하고 있습니다.
그리고 내가 당신을 확신 할 수있는 한 가지 :이 코드를 다시는 건드리지 않고 OS를 작성하지 않더라도. 경험은 당신이 일하는 시스템에 대한 이해를 깊이 변화시킬 것입니다 . 커널 수준에서 발전함으로써 얻은 지식은 경력 전반에 걸쳐 씨앗처럼 퍼지고 통찰력은 가장 예상치 못한 순간에 유용 할 것입니다.
ScratchPad (여기서부터 조직화되지 않은 아이디어)
아이디어
- 처음 512 바이트 이후에 지침을 넣으면 CPU는 무엇을합니까? 그들은 처형 되었습니까? (CPU는 16 비트 실제 모드입니다)
개요
- bootload-> 두 가지 선택은 자신만의 롤을 굴리거나 기존 (예 : 그루브)을 사용합니다.
- 16 비트 모드
- 32 비트 보호 모드로 들어갑니다
- 64 비트 롱 모드로 들어갑니다
- 입력 c
- 메모리 관리자 모듈을 작성하십시오
사이클 0- 환경 및 교차 컴파일 툴체인
- 일부 단계를 건너 뛸 수 있습니다. C 코드를 작성하기 전에 크로스 컴파일 툴체인이 필요하지 않습니다.
- $ 홈 이하의 어딘가에 도구 체인을 구축하십시오
- 환경 변수의 범위가 올바른지 확인하십시오
- "디렉토리
/usr/lib/i686-elf 만들 수있는 권한이 없음"과 같은 오류는 $PREFIX 올바르게 설정되지 않았 음을 나타냅니다. - 우리는 "실제"베어 본 CPU를 얻지 못하고 있으며 여전히 BIOS가 있습니다. 그것은 CPU를 초기화하고 실제 모드에서 CPU를 사용하여 우리에게 넘겨줍니다.
사이클 0- 부트 로더
자원
- NASM 문서화 https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- 인텔 매뉴얼