이것은 GO 프로그래밍 언어에서 OS 커널을 만드는 위치에 대한 작은 실험입니다.
목표는 "완전한"기능적 운영 체제를 만드는 것이 아니라 운영 체제와 이들이 어떻게 만들어지는 방법에 대해 더 많이 배우는 것입니다.
원래 나는 FAT32-filesystem을 구현할 계획이었습니다. 한 번 (C) 한 번 구현했지만 해적이 없어서 프로젝트를 계속할 수는 없습니다. 물론 Linux에서 파일 시스템을 쉽게 구현할 수는 있지만 지루합니다.
대신이 프로젝트에 대해 내 OS를 작성하기 시작했습니다. 또한 학습을 시작하는 방법이기도합니다. 글쎄, 적어도 다소.
운영 체제를 작성하려는 아이디어를 얻었을 때 C에서 OS를 작성한 경험이 이미 있었기 때문에 C를 사용하고 싶지 않다는 것을 알았습니다. Rust를 사용하거나 OS를 작성 해야하는지 여부를 심의했습니다. 결국 결정 요인은 더 큰 도전이 될 것입니다.
이제, 당신은 커널을 쓰는 것이 사용하는 것이 좋지 않다고 생각할 수도 있습니다. 당신은 옳을 것입니다. Go-Runtime은 운영 체제의 사용자 공간에서 사용되도록 설계되었습니다. SyScalls를 호출하는 능력 및 동적 메모리 할당 사용과 같이 이것이 암시하는 많은 가정이 있습니다. 커널에서는 OS와 마찬가지로 OS에 의존 할 수 없습니다. 그러나 조심스러운 프로그래밍 및 특정 go-features를 포기하면 그렇게 할 수 있습니다. 그렇지 않으시겠습니까? 도전입니다.
이 프로젝트의 한 가지 목표는 빨리 물건을 달성하는 것이므로 OS를 설계하는 데 시간을 소비하지 않았습니다. 전체 프로세스 속도를 높이기 위해 Linux의 Syscall 인터페이스를 사용하기로 결정했습니다. 이렇게하면 내 사용자 공간 라이브러리를 작성할 필요가 없으며 사용자 공간에서 원하는 프로그래밍 언어를 사용할 수 있습니다. 그래도 단점이 꽤 있습니다. Linux와 같은 방식으로 SyScalls를 수행하는 동안 Linux의 모든 가정도 사용해야합니다. 예를 들어, 프로세스를 시작하면 Linux와 동일한 방식으로 메모리 공간을 설정하도록 검사하여 SyScalls는 Linux 커널에서 예상되는 값을 반환해야하며 커널 설계는 모 놀등이라고 가정합니다.
이 디자인을 고수하는지 아직 확실하지 않습니다. 내가 가진 또 다른 아이디어는 내 자신의 ABI를 작성하고 Linux Syscalls를 가로 채고 내 OS로 번역하는 Linux-Syscall 래퍼 라이브러리를 작성하는 것입니다.