> 백엔드 개발 > C++ > 본문

OS 개발 (사실)

Mary-Kate Olsen
풀어 주다: 2024-09-19 18:17:11
원래의
312명이 탐색했습니다.

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 の最も重要な部分の 1 つです。キーを押すと、キーボードは スキャンコード を CPU に送信します。キーボード ドライバーの仕事は、そのスキャンコードを OS が理解できる文字またはアクションに変換することです。これには、キーボードが生成するハードウェア割り込みである IRQ1 の割り込みハンドラーのセットアップが含まれます。

キーボード ドライバーが動作するようになったら、より複雑なユーザー インターフェイスの構築を開始し、ユーザーからの入力を取得し、コマンドを処理できます。

6.3 I/Oドライバー

I/O ドライバー は、OS がディスクの読み書きを可能にするものです。これは、プログラムのロード、ファイルの保存、データの保存などを行う場合に重要です。最初はおそらく BIOS 割り込みを使用してディスクを操作することになるでしょうが、OS が成熟するにつれて、より多くの機能に移行したくなるでしょう

ディスク コントローラーとの直接通信など、BIOS に依存しない高度な I/O メソッド。


7. シェルの作成: ユーザー インターフェイス

基本的なドライバーが動作するようになったら、シェル、つまりユーザーが OS と対話できるようにするコマンドライン インターフェイス (CLI) を構築します。シェルは、ユーザーがコマンドを入力し、プログラムを実行し、ファイルシステムと対話できる場所です。

シェルの実装は、OS が実際にインタラクティブであると感じ始める最初の場所の 1 つであるため、エキサイティングなステップです。ユーザー入力 (キーボードから) を処理し、コマンドを処理し、プログラムを実行する必要があります。これは、プロセスを効率的にマルチタスク処理し、管理するカーネルの機能の重要性を認識し始める場所でもあります。


8. カスタム ファイルシステムの構築

ファイルシステムは、OS がディスク上でデータを保存および取得できるようにするものです。既存のファイルシステム (FAT や ext4 など) を使用することもできますが、独自のカスタム ファイルシステムを構築すると、より詳細な制御が可能になり、楽しい挑戦になる可能性があります。

基本的なファイルシステムは次のことを行う必要があります:

  • 新しいファイル用にディスク上のスペースを割り当てます
  • ファイル名、ファイル サイズ、メタデータを追跡します
  • ファイルの読み取りと書き込みを効率的に許可します

OS が成長するにつれて、次のようなより高度な機能も処理する必要があります。

  • ディレクトリ: ファイルを階層に編成します。
  • 権限: ファイルの読み取り、書き込み、または実行ができるユーザーを制御します。
  • 断片化: ディスクの複数の領域に分割されたファイルを処理します。

ファイルシステムの設計は、パフォーマンス、信頼性、使いやすさのバランスを考慮する必要があるため、難しいものです。ファイルシステムの設計が適切でないと、データの破損、パフォーマンスの低下、またはディスク上のスペースの無駄が発生する可能性があります。


9. マウスドライバーの追加: クリックして移動

OS に CLI があり、キーボード入力を処理できるようになったので、マウス サポートを追加します。マウス ドライバーは、マウスの動きを追跡し、それをカーソルの移動やボタンのクリックなどの画面上のアクションに変換する役割を果たします。

マウス ドライバーのビルドには、マウスによって生成されるハードウェア割り込みである IRQ12 の処理と、移動データの処理が含まれます。マウス ドライバーを配置したら、グラフィカル ユーザー インターフェイス (GUI) の構築を検討し始めることができます。


10. 簡単な GUI の構築

グラフィカル ユーザー インターフェイス (GUI) は、OS をコマンド ライン インターフェイスから最新のデスクトップ環境に近い外観と操作性を実現します。この段階では、ユーザーがマウスでクリックできるウィンドウ、ボタン、メニュー、その他のインタラクティブな要素を構築します。

GUI の作成には、グラフィック レンダリング (ウィンドウやアイコンの描画) の管理、入力イベント (クリック、キー押下など) の処理、および複数のウィンドウとキー押下を管理するシステムの実装が含まれます。アプリケーション。

最初は、GUI は非常に基本的なもの、つまりユーザーが操作できる 1 つのウィンドウだけかもしれません。ただし、OS が成熟するにつれて、ウィンドウのサイズ変更、ドラッグ アンド ドロップ機能、アニメーションなどのより高度な機能を追加したくなるでしょう。


11. ウィンドウとイベントの処理

GUI の基本を理解したら、次のステップはウィンドウとイベントを管理するシステムを構築することです。これには、複数のウィンドウを同時に処理し、それぞれが異なるアプリケーションを実行する可能性があり、各ウィンドウが正しい入力イベント (マウスのクリックやキーボードの押下など) を確実に受け取るようにすることが含まれます。

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


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

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

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

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


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

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

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

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

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

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!