>백엔드 개발 >C++ >OS 개발 (사실)

OS 개발 (사실)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-09-19 18:17:11520검색

OS Development (The truth)

목차

  • 소개
  • 1. 부트로더: 시작하기
  • 2. 커널 들어가기: 마법이 일어나는 곳
  • 3. 언어 선택
  • 4. 안전: 비행기를 추락시키지 마세요
  • 5. 속도 최적화
  • 6. 기본 드라이버 설정
    • 6.1 비디오 드라이버
    • 6.2 키보드 드라이버
    • 6.3 I/O 드라이버
  • 7. 쉘 작성: 사용자 인터페이스
  • 8. 맞춤형 파일 시스템 구축
  • 9. 마우스 드라이버 추가: 클릭하여 이동
  • 10. 간단한 GUI 구축
  • 11. 창 및 이벤트 처리
  • 12. 메모장 앱 만들기: 클릭부터 입력까지
  • 13. 최종 손질: 마치 OS처럼 느껴지게 만들기

소개

운영 체제를 처음부터 구축하는 것은 개발자로서 가질 수 있는 가장 도전적이고 보람 있는 경험 중 하나입니다. 거의 모든 것에 대한 라이브러리가 존재하는 높은 수준의 애플리케이션 개발과 달리 OS 개발에서는 하드웨어에 직접 접근하고, 메모리를 수동으로 관리하고, 기계 실행 방식의 모든 측면을 제어하면서 작업해야 합니다.

내 경험에 따르면 OS를 구축한다는 것은 어셈블리 언어에 깊이 빠져들고, 하드웨어와 씨름하고, 충돌, 재부팅(특히 재부팅) 및 긴 디버깅 세션을 겪는 것을 의미합니다. 부트로더 디버깅이 어렵다고 생각된다면, 고급스러운 최신 도구 없이 시도해 보십시오. OS 개발은 인생의 선택에 셀 수 없을 만큼 많은 질문을 던지게 만듭니다.

하지만 부트로더부터 마우스를 움직여 텍스트 편집기를 열어 입력할 수 있는 완전한 기능을 갖춘 데스크탑 환경까지 모두 분석해 보겠습니다.


1. 부트로더: 시작하기

부트로더란 무엇입니까?

부트로더는 모든 OS 개발 여정의 첫 번째 단계입니다. 컴퓨터가 켜지면 BIOS가 인계받아 하드웨어를 확인한 다음 부트로더를 디스크에서 메모리로 로드합니다. 이 작은 프로그램의 임무는 CPU를 준비하고 운영 체제의 커널을 메모리에 로드하는 것입니다. 이 단계에서는 하드웨어를 직접 다루기 때문에 부트로더를 어셈블리로 작성해야 합니다.

부트로더가 시작되면 CPU는 16비트 리얼 모드에 있으며 이는 1MB의 메모리만 주소 지정할 수 있음을 의미합니다. 가장 먼저 해야 할 일은 커널을 디스크에서 로드하여 메모리로 옮기는 것입니다. 그 후, 부트로더는 CPU를 32비트 보호 모드로 전환하는데, 여기서부터 재미가 시작됩니다. 모드를 전환하려면 GDT(전역 설명자 테이블)를 설정하여 메모리 세그먼트를 관리하고 CPU 제어 레지스터에서 PE(보호 활성화) 비트를 활성화해야 합니다. 이것이 잘못되면 시스템이 정지되거나 부팅 루프에 충돌하게 되는데, 이러한 상황은 제가 인정하고 싶은 것보다 더 자주 발생했습니다.

리얼 모드와 보호 모드

리얼 모드에서는 16비트 레지스터, 1MB 메모리 액세스, 메모리 보호 없음 등 모든 것이 매우 제한됩니다. 그렇기 때문에 보호 모드로 전환하는 것이 매우 중요합니다. 보호 모드에 들어가면 CPU는 32비트 레지스터, 더 큰 메모리 주소 지정, 멀티태스킹 및 페이징(가상 메모리)과 같은 고급 기능에 액세스할 수 있습니다. 부트로더는 이러한 전환이 원활하게 이루어지도록 도와줍니다.


2. 커널에 들어가기: 마법이 일어나는 곳

CPU가 보호 모드로 전환되면 부트로더는 제어권을 커널으로 넘깁니다. 커널은 운영 체제의 핵심이며 하드웨어, 메모리, 프로세스, 시스템 리소스 등 모든 것을 관리하는 역할을 합니다.

커널이 시작되면 몇 가지 중요한 시스템을 설정해야 합니다.

  1. 페이징: 이는 OS가 각 프로세스에 고유한 가상 메모리 공간을 제공할 수 있도록 하는 메모리 관리 체계입니다. 그렇지 않으면 모든 프로세스가 동일한 메모리를 공유하게 되며 이는 재앙이 될 수 있습니다.
  2. 인터럽트 처리: 커널은 즉각적인 주의가 필요한 하드웨어(예: 키보드 또는 디스크 드라이브)의 신호인 인터럽트를 처리해야 합니다. 이렇게 하려면 인터럽트를 커널의 특정 핸들러 함수에 매핑하는 인터럽트 설명자 테이블(IDT)을 정의해야 합니다.
  3. 작업 스케줄링: 여러 프로세스를 실행하는 모든 OS에서 커널에는 CPU 시간을 관리하는 방법이 필요합니다. 스케줄러는 어떤 프로세스가 CPU 시간을 확보할지, 언제 확보할지 결정하여 시스템의 반응성과 효율성을 보장합니다.

커널 구축은 길고 복잡한 작업이지만 가장 보람 있는 작업 중 하나이기도 합니다. 여기에서 운영 체제의 내부 작동 방식을 확인하고 기계 작동 방식에 대한 모든 세부 사항을 제어할 수 있습니다.


3. 언어 선택

OS를 구축할 때는 각 작업에 적합한 프로그래밍 언어를 선택해야 합니다. 부트로더는 하드웨어를 직접 제어해야 하기 때문에 일반적으로 어셈블리로 작성됩니다. 그러나 일단 보호 모드에서 커널 작업을 하고 나면 대부분의 개발자는 C로 전환합니다. 왜냐하면 모든 것을 어셈블리로 작성해야 하는 번거로움 없이 낮은 수준의 제어를 제공하기 때문입니다.

일부 개발자는 복잡한 시스템을 더 쉽게 관리할 수 있는 객체 지향 기능을 제공하는 C 를 커널 개발에 사용합니다. 그러나 C에는 추가 오버헤드가 발생하며 C의 메모리 관리는 OS 환경에서 더 까다로울 수 있습니다. C는 시스템 프로그래밍에 필요한 강력한 기능과 단순성을 제공합니다.


4. 안전: 비행기를 추락시키지 마세요

OS 개발에서는 안전이 중요합니다. 충돌이 단지 오류 메시지나 앱 종료를 의미할 수 있는 고급 프로그래밍과 달리, OS 개발에서 충돌은 일반적으로 전체 시스템 재부팅을 의미합니다. 메모리를 직접 사용하여 작업하게 됩니다. 즉, 메모리 관리를 망칠 경우 시스템 데이터가 손상되거나 중요한 구조를 덮어쓰거나 커널 패닉이 발생할 수 있습니다.

커널은 한 프로세스가 다른 프로세스의 메모리를 덮어쓰는 것을 방지하기 위해 메모리 보호를 구현해야 합니다. 이는 각 프로세스를 자체 가상 메모리 공간에 매핑하는 페이징을 사용하여 수행됩니다. 이것을 잘못하면 전체 시스템이 불안정해지고 며칠 동안 메모리 버그를 추적해야 합니다. 저를 믿으세요. 저는 거기에 가봤습니다.


5. 속도 최적화

속도는 OS의 반응성을 높이는 핵심 요소입니다. 느린 커널은 느린 시스템을 의미하므로 성능 최적화가 중요합니다. 속도가 중요한 몇 가지 주요 영역은 다음과 같습니다.

  • 인터럽트 처리: 입력을 지속적으로 폴링하는 대신(CPU 사이클을 낭비함) 하드웨어 인터럽트를 설정해야 합니다. 이렇게 하면 CPU는 키 누르기 또는 네트워크 패킷 도착과 같은 실제 입력이 있을 때만 응답합니다.
  • 작업 스케줄링: 좋은 스케줄러는 프로세스 간에 CPU 시간의 균형을 효율적으로 조정하여 다른 프로세스가 굶어 죽는 동안 CPU 시간을 모두 잡아먹는 프로세스가 없도록 합니다. 라운드 로빈 또는 우선순위 기반 스케줄링
  • 과 같이 선택할 수 있는 다양한 스케줄링 알고리즘이 있습니다.
  • 지연 로딩: 모든 것을 한 번에 메모리에 로드하지 마세요. 실제로 사용되는 프로그램의 일부만 메모리에 로드되는 요구 페이징을 구현하세요. 이렇게 하면 메모리를 절약하고 시스템 성능을 높이는 데 도움이 됩니다.

6. 기본 드라이버 설정

이제 커널이 실행되었으므로 하드웨어와 상호 작용할 드라이버를 빌드할 차례입니다. 드라이버는 OS와 하드웨어 사이의 다리 역할을 하며 OS가 키보드, 디스플레이, 디스크 드라이브와 통신할 수 있도록 해줍니다.

6.1 비디오 드라이버

처음에는 OS가 비디오 메모리(보통 주소 0xB8000)에 직접 문자를 인쇄하는 텍스트 모드에서 시작될 것입니다. 디버깅 및 기본 출력에는 괜찮지만 결국에는 그래픽 사용자 인터페이스(GUI)로 이동하고 싶을 것입니다. 이를 위해서는 픽셀 수준 제어, 화면 해상도 및 색 농도를 관리할 수 있는 비디오 드라이버가 필요합니다.

비디오 드라이버 설정은 그래픽 OS를 만드는 데 있어 큰 진전이지만, 디스플레이 하드웨어 작동 방식을 이해하고 각 프레임에 대해 많은 양의 데이터를 관리해야 하기 때문에 더 복잡한 작업 중 하나이기도 합니다.

6.2 키보드 드라이버

키보드 드라이버는 대화형 OS에서 가장 중요한 부분 중 하나입니다. 키를 누르면 키보드는 스캔코드를 CPU로 보냅니다. 키보드 드라이버의 임무는 해당 스캔코드를 OS가 이해할 수 있는 문자나 동작으로 변환하는 것입니다. 여기에는 키보드가 생성하는 하드웨어 인터럽트인 IRQ1에 대한 인터럽트 핸들러를 설정하는 작업이 포함됩니다.

키보드 드라이버가 작동하게 되면 더 복잡한 사용자 인터페이스 구축을 시작하고 사용자 입력을 받아 명령을 처리할 수 있습니다.

6.3 I/O 드라이버

I/O 드라이버는 OS가 디스크를 읽고 쓸 수 있도록 해줍니다. 이는 프로그램 로드, 파일 저장, 데이터 저장과 같은 작업에 매우 중요합니다. 처음에는 BIOS 인터럽트를 사용하여 디스크와 상호 작용할 것이지만 OS가 성숙해짐에 따라 더 많은 인터럽트를 사용하고 싶을 것입니다.

디스크 컨트롤러와 직접 통신하는 등 BIOS에 의존하지 않는 고급 I/O 방법


7. 셸 작성: 사용자 인터페이스

기본 드라이버가 작동하고 나면 이제 사용자가 OS와 상호 작용할 수 있는 명령줄 인터페이스(CLI)인 을 구축할 차례입니다. 셸은 사용자가 명령을 입력하고, 프로그램을 실행하고, 파일 시스템과 상호 작용할 수 있는 곳입니다.

셸 구현은 OS가 실제로 대화형을 느끼기 시작하는 첫 번째 장소 중 하나이기 때문에 흥미로운 단계입니다. 키보드를 통한 사용자 입력을 처리하고, 명령을 처리하고, 프로그램을 실행해야 합니다. 이는 또한 프로세스를 효율적으로 멀티태스킹하고 관리하는 커널 능력의 중요성을 깨닫기 시작하는 지점이기도 합니다.


8. 사용자 정의 파일 시스템 구축

파일 시스템은 OS가 디스크에 데이터를 저장하고 검색할 수 있도록 해줍니다. 기존 파일 시스템(예: FAT 또는 ext4)을 사용할 수도 있지만 자신만의 사용자 정의 파일 시스템을 구축하면 더 많은 제어력을 제공하고 재미있는 도전이 될 수 있습니다.

기본 파일 시스템은 다음을 충족해야 합니다.

  • 새 파일을 위한 디스크 공간을 할당
  • 파일 이름, 파일 크기 및 메타데이터를 추적하세요.
  • 파일을 효율적으로 읽고 쓸 수 있습니다.

OS가 성장함에 따라 다음과 같은 고급 기능도 처리해야 합니다.

  • 디렉터리: 파일을 계층 구조로 정리합니다.
  • 권한: 파일을 읽고, 쓰고, 실행할 수 있는 사람을 제어합니다.
  • 조각화: 디스크의 여러 영역에 걸쳐 분할되는 파일을 처리합니다.

파일 시스템을 설계하는 것은 성능, 안정성, 사용 편의성의 균형을 유지해야 하기 때문에 까다롭습니다. 잘못 설계된 파일 시스템은 데이터 손상, 성능 저하 또는 디스크 공간 낭비로 이어질 수 있습니다.


9. 마우스 드라이버 추가: 클릭하여 이동

이제 OS에 CLI가 있고 키보드 입력을 처리할 수 있으므로 마우스 지원을 추가할 차례입니다. 마우스 드라이버는 마우스의 움직임을 추적하고 이를 커서 이동이나 버튼 클릭과 같은 화면상의 동작으로 변환하는 역할을 담당합니다.

마우스 드라이버를 구축하려면 마우스에서 발생하는 하드웨어 인터럽트인 IRQ12를 처리하고 이동 데이터를 처리해야 합니다. 마우스 드라이버가 설치되면 그래픽 사용자 인터페이스(GUI) 구축에 대해 생각해 볼 수 있습니다.


10. 간단한 GUI 구축

그래픽 사용자 인터페이스(GUI)는 OS를 명령줄 인터페이스에서 최신 데스크탑 환경에 더 가까운 모습과 느낌으로 바꿔줍니다. 이 단계에서는 사용자가 마우스로 클릭할 수 있는 창, 버튼, 메뉴 및 기타 대화형 요소를 구축해야 합니다.

GUI 생성에는 그래픽 렌더링(창 및 아이콘 그리기) 관리, 입력 이벤트(클릭, 키 누르기 등) 처리, 여러 창과 키 누르기 등을 관리하는 시스템 구현이 포함됩니다. 응용 프로그램입니다.

처음에는 GUI가 매우 기본적일 수 있습니다. 사용자가 상호 작용할 수 있는 단일 창일 뿐입니다. 그러나 OS가 성숙해짐에 따라 창 크기 조정, 드래그 앤 드롭 기능, 애니메이션과 같은 고급 기능을 추가하고 싶을 것입니다.


11. 창 및 이벤트 처리

GUI의 기본 사항을 마련했다면 다음 단계는 창 및 이벤트 관리 시스템을 구축하는 것입니다. 여기에는 여러 창을 동시에 처리하는 작업이 포함됩니다. 각 창은 잠재적으로 서로 다른 애플리케이션을 실행하며 각 창이 올바른 입력 이벤트(예: 마우스 클릭 또는 키보드 누르기)를 수신하는지 확인합니다.

또한 창 z 순서(창이 맨 위에 있음), 최소화/최대화드래그를 구현해야 합니다. 이제 전통적인 데스크톱 환경과 같은 느낌이 들기 시작합니다.


12. 메모장 앱 만들기: 클릭부터 입력까지

GUI를 더욱 기능적으로 만들려면 메모장 앱과 같은 기본 애플리케이션을 구축해야 합니다. 메모장 앱은 사용자가 파일을 입력, 편집, 저장할 수 있는 간단한 텍스트 편집기입니다. 이와 같은 앱을 구축하려면 다음이 필요합니다.

  • 키보드에서 텍스트 입력을 처리합니다.
  • 텍스트를 화면에 렌더링합니다.
  • 열기, 저장, 닫기 등 기본 파일 작업을 허용합니다.

이것은 GUI, 파일 시스템 및 입력 처리가 모두 여기에 적용되므로 모든 것을 하나로 모으는 훌륭한 연습입니다. 메모장 앱이 작동하게 되면 완벽하게 작동하는 OS의 기본 사항을 갖추게 됩니다.


13. 최종 손질: OS처럼 느껴지도록 만들기

이 시점에서는 OS가 작동하지만 더 세련된 느낌을 주는 세부 사항은 항상 거의 없습니다. 다음과 같은 것:

  • 사용자 계정 및 권한: 여러 사용자가 자신의 설정과 파일을 가질 수 있도록 허용합니다.
  • 네트워킹: OS가 인터넷에 연결할 수 있도록 TCP/IP에 대한 지원을 추가합니다.
  • 시스템 호출: 애플리케이션이 커널과 상호 작용하는 데 사용할 수 있는 인터페이스를 만듭니다.

추가하는 작은 세부 사항 하나하나가 OS를 완전한 시스템처럼 느끼게 해줍니다. 길고 어려운 과정이지만 결국에는 정말 독특한 것, 즉 처음부터 새로 구축된 운영 체제를 만들게 될 것입니다.

위 내용은 OS 개발 (사실)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Linux 기반 OS 코딩다음 기사:Linux 기반 OS 코딩