sourcecode

오래된 데스크톱 컴퓨터에 소형 운영체제를 구축하려면 어떻게 해야 하나요?

copyscript 2022. 7. 31. 22:20
반응형

오래된 데스크톱 컴퓨터에 소형 운영체제를 구축하려면 어떻게 해야 하나요?

운영체제를 쓰는 것은 매우 복잡하기 때문에(특히 혼자서) 헛수고일 수 있습니다.

  • 다음 Linux 또는 Windows 구축은 기대하지 않습니다.

  • 끔찍하고, 버그가 심하고, 효과가 없을거란걸 알지만, 그건 괜찮아.

조립체 C와 (일부) C++에 있는 모든 것을 내가 직접 쓰고 싶다.

이것은 장래의 프로젝트입니다.지금 당장은 다른 일로 바쁘고 시간이 없기 때문에 지금 물어봐야겠다고 생각했습니다.그래서 많은 답을 얻을 수 있을 것 같아서 (기존의 부트로를 사용하여 minix를 구축하는 것과 관련된 다른 모든 것을) 이런 접근법에 도움이 될 수 있을 것 같습니다.ader, 가상 부팅 프로그램에 빌드하는 것 등)

모니터, 키보드, 마우스로 오래된 데스크톱 중 하나를 셋업하고 빈 하드 드라이브에서 작업을 시작하고 싶습니다.

나만의 부트로더 쓰는 법을 배우고 싶습니다(많은 자원을 찾았지만, 완성도를 높이기 위해 좋은 것을 추가해 주세요), 자신의 USB 드라이버(필요한 경우), CD 드라이버(필요한 경우) 등).전부 다, 처음부터.

  • 컴퓨터에 코드를 입력하려면 어떻게 해야 하나요?플로피 디스크로 하는 것이 가장 좋습니까?대부분의 컴퓨터는 USB 스틱으로 그것을 할 수 있습니까?

  • 필요한 드라이버는 무엇이며, 그 구축에 참고할 만한 것이 있습니까?

  • 부팅 시퀀스가 끝나면요?보호 모드로 들어가는 방법 등

  • 운영체제의 도움 없이 메모리를 관리하는 방법그냥 아무 주소나 쓰면 되나요?초기화가 필요없습니까?

  • 나를 혼란스럽게 하는 것은 틀림없이 무엇일까?

  • 명령줄 O/S 및 그래픽으로 만들려면 어떻게 해야 합니까?

  • 그래피컬 O/S는 무엇을 기반으로 합니까?예를 들어, 명령줄과 같은 작업을 어떻게 해야 할까요? 글꼴과 그림이 맨 위에 있습니다.

  • 멀티태스킹 환경의 셋업은 어디서 확인할 수 있습니까?(2개의 그래픽과 같은 명령줄이 나란히 실행되고 있는 경우)

  • 어떻게 윈도우 시스템을 설정할 수 있을까요?심플한 멀티태스킹 설정 후 화면에 그래픽을 표시하는 방법

정말이에요, 저는 이것이 매우 복잡한 프로젝트라는 것을 잘 알고 있습니다.그리고 저는 아마 이 프로젝트를 완성하거나 어떤 쓸모 있는 것을 쓸 시간을 갖지 못할 것입니다.

이 밖에도 아직 언급하지 않은 부분이 많이 있습니다.생각나는 부분이 있으면 추가해 주세요.

답변당 하나의 "주제"를 입력하십시오(예: USB 드라이버, 리소스 목록, 주의해야 할 사항 등).

또, 다른 O/S나 기존의 코드를 기반으로 하는 것을 제안하지 말아 주세요.기존 코드(Linux 커널, 리소스, 기존 드라이버 예 등)를 많이 읽지만 최종적으로 모든 작성은 제가 직접 하고 싶습니다.저는 다른 것을 바탕으로 해야 한다는 것을 알고 있고, 마음을 바꿔서 그 길을 가면 읽을 수 있는 다른 질문들이 SO에 많이 있습니다.하지만 이번 건은 모든 걸 처음부터 다시 하는 거야

그래피컬하게 만드는 방법에 대해 제안해 주실 수 있나요?다양한 비디오 모드와 그 조작 방법 등

가장 중요한 것부터.읽다, 읽다, 읽다, 읽다, 읽다, 읽다, 읽다.자신의 OS를 실장하기 위해서는 OS의 구조를 확실히 이해해야 합니다.

Andrew Tanenbaum의 운영체제 관련 책 중 하나를 보세요.이것은 대학 OS 수업에서 사용한 것입니다.

최신 운영체제 PDF

Amazon의 최신 운영 체제

우스꽝스러운 표지에도 불구하고, 그것은 특히 교과서로서는 환상적인 읽을거리이다.Tanenbaum은 이 분야의 전문가이며, OS가 후드에서 어떻게 동작하는지에 대한 그의 설명은 명확하고 이해하기 쉽습니다.이 책은 대부분 이론이지만, 나는 그가 실천에 대해 더 많이 논하는 책도 가지고 있다고 생각한다.한 번도 읽어본 적이 없어서 코멘트는 드릴 수 없습니다.

그러면 프로세스 관리, 메모리 관리, 파일 시스템 및 OS 커널이 부팅 가능한 상태로 만들기 위해 수행해야 하는 다른 모든 작업에 집중할 수 있습니다.이 시점부터는 기본적으로 지원해야 할 하드웨어용 디바이스 드라이버를 작성하고 파일 및 디바이스 열기, 읽기 및 쓰기, 프로세스 간 메시지 전달 등의 커널 호출을 하기 위한 C 라이브러리 기능의 구현을 제공합니다.

x86 어셈블리에 대해 자세히 읽어보십시오(x86 머신용으로 설계한다고 가정).프로세서의 동작 모드간의 전환에 관한 많은 질문에 대답할 수 있습니다.

전자제품에 대한 지식이 있다면, 일반적으로 x86 PC보다 간단하기 때문에 충분한 설명서가 있는 임베디드 기기용 운영체제 작성부터 시작하는 것이 더 쉬울 수 있습니다.저도 항상 독자적인 OS를 만들고 싶다고 생각하고 있었습니다.Digilent에서 제공하는 이 개발 보드의 마이크로커널 임베디드 OS를 작성하는 것부터 시작합니다.Xilinx에서 소프트코어 MicroBlaze 프로세서를 실행할 수 있습니다.이 프로세서는 매우 상세하게 문서화되어 있습니다.또한 RAM, 플래시 데이터 스토리지, LED, 스위치, 버튼, VGA 출력 등도 갖추고 있습니다.간단한 드라이버를 쓰면서 많은 것을 즐길 수 있습니다.

임베디드 디바이스의 장점 중 하나는 VGA 드라이버를 장시간 쓸 필요가 없다는 것입니다.내 경우 Digilent 개발 보드는 온보드 UART를 가지고 있기 때문에 시리얼 출력을 콘솔로 효과적으로 사용하여 모든 것을 실행 및 명령줄로 부팅할 수 있습니다.

타겟이 되는 컴파일러는, 곧바로 입수할 수 있어 검증이 끝난 것을 확인해 주세요.OS와 컴파일러를 동시에 쓰는 것은 원치 않습니다.

http://www.osdev.org/ http://www.osdever.net/

OS 개발 세계에 오신 것을 환영합니다.

SO의 x86 태그 Wiki의 다른 x86 문서 링크도 참조하십시오.인텔 및 AMD 매뉴얼, 컴파일러/어셈블러 문서 및 각종 가이드.

또한 BOCHS 또는 기타 가상 환경을 디버깅에 사용할 것을 권장합니다.부트로더를 한 단계씩 수행하여 레지스터를 검사할 수 있기 때문입니다.

무엇보다 실제 하드웨어에서 이 기능을 실행하려면 프로세서 매뉴얼이 필요합니다.인텔 매뉴얼(http://www.intel.com/products/processor/manuals/)은 매우 중요합니다.스위칭 모드(실제/보호)에서 가상 메모리 관리(이 정도까지 선택했을 경우)부터 시스템 콜(사용자 모드 실행이 되었을 경우)까지 모든 것을 검토합니다.가장 중요한 것은 TSS나 세그먼트레지스터 등 기능하기 위해 셋업할 필요가 있는 몇 가지 사항을 상세하게 설명하고 있는 것입니다.는 대부분의 OS 텍스트가 프로세서 고유의 세부사항보다 높은 수준의 개념을 중시하기 때문입니다.

적어도 처음에는 Bochs나 다른 가상 머신에서 작업할 것을 권장합니다.왜냐하면 디버깅이 더 쉽고(하드웨어의 정확한 상태를 확인할 수 있습니다), 외부 도움말 디버깅이 필요한 경우 Bochs나 다른 가상 머신에서도 동일한 '하드웨어'를 사용할 수 있기 때문입니다.

가장 유용한 조언은 가능한 한 빨리 C 코드를 실행할 수 있는 상태로 만드는 것입니다.예를 들어 부팅, 디스크립터 테이블 설정 및 컴파일된 C를 실행하는 것이 안전합니다.만약 당신이 제정신을 유지하고 그것을 계속 작업하고 싶다면, 모든 커널이 C에 있어야 한다.조립은 필요한 장소도 있지만 지루하고 디버깅이 어려운 경우가 있습니다.

OS 개발 사이트에 대한 좋은 레퍼런스가 많이 있기 때문에, 다른 어프로치에 대해 설명하겠습니다.

베어메탈로 OS를 구현하는 경험을 원한다면 오래된 PC보다 훨씬 더 나은 하드웨어 선택지가 있습니다.PC 아키텍처에서는 30년 설계 역사의 재미없는 아티팩트를 코딩하는 데 많은 시간을 소비하게 됩니다.예를 들어, 프로젝트의 부트로더 부분만으로도 많은 용감한 프로그래머가 지쳤을 것입니다.

예를 들어 디스크 및/또는 네트워크에서 커널을 읽으려면 드라이버 세트가 필요합니다.그러면 보호 모드로 들어가려면 코드가 필요합니다.이 시점에서, 다른 드라이버 세트가 필요합니다.이 시점 이후 칩을 보호 모드로 만들기 위한 작업은 거의 수행되지 않습니다.다른 PC에서 4년 이상 가동하고 싶다면 다른 드라이버 세트가 필요합니다.

ARM 또는 기타 32비트 내장 칩 부트스트래핑에 대해 조사합니다.저렴한 개발 보드를 이용할 수도 있고, 직접 납땜할 수도 있습니다!이더넷과 USB가 내장되어 있는 것도 있습니다.건전하고 딱딱하지 않은 아키텍처로 작업하는 것이 더 즐겁고, 재사용 가능한 기술을 습득할 수 있을 것이라고 생각합니다.

MikeOS와 같은 작고 기본적인 오픈 소스 OS의 코드를 읽어 보십시오.

또는, 다음의 순서를 추천합니다(재미있어야 합니다).

  1. 가상 시스템을 씁니다.프로세서의 모든 명령어를 정의하여 시스템의 내부와 외부를 파악할 수 있도록 합니다.키보드, 마우스, 화면, 오디오 액세스용으로 SDL과 인터페이스 할 수 있습니다.머리 속에 있는 모든 것을 한 번에 넣을 수 있도록 심플하게 유지하세요.최첨단 가상 머신일 필요는 없습니다.실제 컴퓨터의 기능을 에뮬레이트할 수 있는 머신뿐입니다.
  2. 가상 시스템의 프로세서에 대한 어셈블러를 작성합니다.이 어셈블러는 가상 시스템의 언어로 작성된 프로그램이 아니라 어셈블리 언어를 시스템 코드로 변환할 수 있는 프로그램이어야 합니다.
  3. 실행 가능한 형식을 정의하고 간단한 링커를 작성합니다.
  4. 이제 운영체제를 작성하기 위한 모든 부품을 준비했습니다.조립 언어로 쓰고 조립하고...etc. 이렇게 복잡한 부트 로딩 프로세스는 필요 없습니다.먼저 OS를 실행할 수 있도록 머신을 준비하기만 하면 됩니다.

위의 절차들은 간단한 OS를 쓰는 것에 대해 다소 어리석게 보일 수 있지만, 이봐, 정말 재밌어.

MikeOS를 확인해 주세요.이 OS는 매우 심플하게 기술되어 있어 (댓글과 같이) 어셈블리가 판독 가능합니다.매우 간단하지만 GUI를 갖추고 있으며 네트워킹과 멀티미디어를 지원합니다.

편집: 메뉴 세트OS는 그래픽스입니다.스트레이트 ASM으로 되어 있지만, MikeOS보다 세련되어 있습니다.

많은 학교에는 당신이 설명하는 것 대부분을 하는 OS 수업이 있습니다.저희 학교(CMU)는 C에서 OS를 가르치고 커널, 파일 시스템, 셸을 작성했으며 부트 로더용 코드를 제공받았습니다.

안타깝게도 웹에서는 이 코스(15~412)에 대한 명확한 자료를 찾을 수 없었고, 시간이 지남에 따라 발전하고 있습니다.하지만 아마도 사람들은 좋은 자원을 가진 학교들을 위한 소스나 과제들에 대한 링크를 웹에 올릴 수 있을 것이다.

최소한 운영체제가 할 수 있는 일은 어떤 방식으로든 시스템의 하드웨어를 구동하고 어떤 식으로든 "사용자 코드"를 로드하는 것입니다.PC로 시작하는 경우 PC에 의해 로드될 수 있는 코드를 어떤 기기에서 작성해야 합니다.오래된 PC의 펌웨어에는 하드웨어가 어떤 초기화(최소한 비디오, 키보드 및 스토리지 또는 부트로더)를 실행하는 방법을 결정하는 BIOS가 있습니다.(2017년 10월 업데이트: EFI 또는 UEFI 펌웨어를 탑재한 새로운 PC...이는 대체로 현학적인 차이입니다.는 이 논의에서도 같은 목적을 달성합니다.)

우선 대상 시스템에서 BIOS 또는 기타 펌웨어를 사용하는 방법에 대한 간단한 세부사항을 학습합니다.즉, BIOS 로딩 및 실행할 수 있는 프로그램을 작성하는 방법을 학습합니다.최종적으로는 부트로더로 변형됩니다.작은 것부터 시작하다.펌웨어 부팅 프로세스에서 직접 "Hello, Linus"라고 인쇄하는 프로그램만 있으면 됩니다(플로피 또는 USB 썸 드라이브).또는 하드 드라이브(원하는 경우)에 있습니다.

거기서부터, 매우 간단한 시리얼 드라이버를 쓰는 것을 추천합니다.일부 시리얼 포트를 초기화하도록 부트 로더를 업데이트하고 다운로드를 시작합니다.그런 다음 코드를 실행할 수 있습니다.여기서부터 다른 블록 세트에 쓸 수 있는 부트스트랩을 작성합니다(파일 시스템은 아직 구현하지 않았습니다).파티션 테이블 해석도 할 수 없기 때문에 처음에는 디스크상의 원시 블록 범위만 취급했습니다).

이 시점에서 부트 로더는 시리얼 회선을 넘어 새로운 코드를 꺼내 파티션에 덤프할 수 있습니다(예, 파티션 테이블 처리를 구현합니다).표준 PC 규약에 준거하고 있는지는, 현시점에서는 유저에게 달려 있습니다).

거기서부터, 한층 더 고도의 기능을 사용할 수 있게 됩니다.이 베이스로부터, 새로운 「커널」을 써 컴파일 할 수 있습니다.테스트베드를 재기동해, 새로운 커널을 도입할 수 있습니다.

(부트로더는 다운로드를 건너뛰고 기존 이미지를 부트하는 명령어로서 시리얼 핸드쉐이크 라인상의 BREAK 등의 신호를 수신합니다.이 방법으로 타임아웃도 처리할 수 있습니다).

여기서부터 매우 간단한 터미널 계층과 명령 셸을 작성합니다.파일 시스템?커널 이외의 새로운 실행 가능 콘텐츠(파일 또는 객체)를 다운로드하는 명령을 구현합니다.기타 등등.

당연히 PC 키보드와 비디오를 사용하는 콘솔 드라이버로 시작할 수 있었습니다(BIOS INT 0x16h 및 INT 0x10H 각각을 기억한다면).단, 시리얼 드라이버부터 시작하는 것이 좋습니다.그러면 기존 (기능하는) 시스템에서 빌드/도입/테스트 사이클을 자동화할 수 있기 때문입니다.새로운 OS는 크로스 컴파일된 프로젝트로 시작되므로 이를 효율적으로 처리하는 것이 중요합니다.

나는 네가 너의 프로젝트를 어디까지 진행하길 원하는지 모르겠다.꽤 인상적인 목표는 "셀프 호스팅"을 달성하는 것입니다.심플한 어셈블러/컴파일러를 작성하여 새로운 OS의 실제 버전으로의 빌드, 링크, 부팅을 가능하게 하는 것으로, 그 목적을 달성할 수 있습니다.(이것은 요건이 아닙니다.많은 임베디드 시스템은 셀프 호스팅을 하지 않으며 문제될 것이 없습니다.)

당신은 야심찬 목표를 가지고 있습니다.하지만 실행이 관건입니다.

구조화된 접근법(교과서 또는 대학 수업)의 대부분은 프로세스를 설명하지만, 선택한 플랫폼의 상세한 내용을 명확하게 하고 프로세스 스케줄링, 메모리 관리, 교착 방지, I/O 등 전체적인 아이디어에 집중할 수 있는 중요한 코드를 많이 제공합니다.

제 조언은 이렇습니다: 당신의 예상을 크게 뒤엎고 기본적인 질문부터 시작하세요.

운영체제란?

컴퓨터 사이언티스트는 OS가 그래픽 사용자 인터페이스, 웹 브라우저, USB 디바이스 연결 방법 또는 사용자가 실제로 보거나 만질 수 있는 방법이라고 (바람직하게) 말하지 않습니다.그 대신에, 가장 기본적인 레벨의 OS는 위에서 말한 것입니다.이들은 모두 자원 관리라는 하나의 큰 우산 아래 놓여 있습니다.

운영체제는 컴퓨터의 하드웨어 자원(메모리, CPU, 주변기기)을 관리하는 프로그램에 지나지 않습니다.

여기 간단한 운영체제가 있습니다.사용자는 시리얼 접속을 사용하여 프로그램(16진수 또는 2진수)을 입력할 수 있습니다.프로그램을 입력하면 프로그램이 실행됩니다.프로그램이 완료되면 제어가 사용자에게 반환되고 사용자는 프로그램을 다시 실행하거나 새 프로그램을 입력할 수 있습니다.

64K 정도의 메모리를 탑재한 임베디드 ARM 프로세서등의 「깨끗한」아키텍처에서는, 이 작업을 실시합니다.ARM의 자세한 내용을 학습한 후 조립 시 코드화할 수 있습니다.그리고 넌 운영체제를 가지고 있어.

OS가 해야 할 모든 것을 합니다.

  • 사용자가 OS 자체를 덮어쓰지 않도록 함으로써 메모리를 관리합니다.
  • 단일 프로세스를 실행하도록 예약합니다.
  • 단일 시리얼 페리페럴에 대한 I/O를 처리합니다.

이렇게 하면 처음부터 구성 요소를 만들 수 있습니다.이제 선택의 여지가 많으시네요.그 중 하나는 2개의 프로그램을 메모리에 로드하여 사용자가 다음에 실행할 프로그램을 결정하는 것입니다.

또는 사용자가 한 프로그램의 실행을 일시 중지하거나 다른 프로그램으로 전환하거나 일시 중단했다가 다시 전환하도록 할 수 있습니다.이것은 완전히 수동이지만 기본적인 멀티태스킹입니다.

선택지는 무제한이지만, 각각은 이전에 비해 아직 걸음마 단계입니다.

목표를 너무 높게 설정하지 않으면 즐겁다!

OS Development Series @ BrokenThorn에 관심이 있을 것입니다.

하드웨어 가상화를 사용해도 괜찮으시다면 'Nand에서 Tetris까지'를 수강할 수 있는 과정(책 + 강의 + 소프트웨어)이 있습니다.사용자는 (이러한 목적을 위해) 전기 NAND 게이트에서 OS, 언어, 그리고 마지막으로 개인용 머신에서 간단한 게임을 코딩할 때까지 완전한 컴퓨터 시스템을 직접 만들 수 있습니다.

좋은 생각이고 조만간 꼭 착수할 생각인 것 같아요.이 책은 놀라울 정도로 저렴하고 MIT에서 수업을 받은 것 같습니다. 당신이 처음부터 스스로 구축한 시스템 전체에 대한 완전하고 완전한 지식을 가지고 있는 것보다 더 큰 느낌은 없을 것입니다.

링크: http://www1.idc.ac.il/tecs/

작은 규모로 시작하여 8086 임베디드 개발 키트를 구입하여 멀티태스킹 OS를 개발하고 싶습니다.커널이 있고 하드웨어 레벨에서의 작업에 익숙해지면 보다 어려운 작업을 할 준비가 됩니다.

VGA 디스플레이 DOS 클론을 구축하는 것조차 매우 어려운 일입니다.디테일이 엄청나네요. :-)

특정 토픽을 참조해 주세요.

컴퓨터에 코드를 입력하려면 어떻게 해야 하나요?플로피 디스크로 하는 것이 가장 좋습니까?대부분의 컴퓨터는 USB 스틱으로 그것을 할 수 있습니까?

BIOS는 기본적인 부트스트랩을 실행합니다.


필요한 드라이버는 무엇이며, 그 구축에 참고할 만한 것이 있습니까?

CPU/메모리 직접 조작이 아닌 모든 것을 실행할 수 있습니다.CPU 레퍼런스 매뉴얼에 직접 기재되어 있지 않은 것.


부팅 시퀀스가 끝나면요?보호 모드로 들어가는 방법 등

보호 모드는 부트 시퀀스의 일부가 됩니다.

멀티태스킹을 시작하고 프로세스를 시작하는 방법을 알아냅니다.


운영체제의 도움 없이 메모리를 관리하는 방법그냥 아무 주소나 쓰면 되나요?초기화가 필요없습니까?

맞아요.가상 메모리 시스템을 최종적으로 분류할 수 있습니다.


나를 혼란스럽게 하는 것은 틀림없이 무엇일까?

not having debugging tools, not having IO


How can I make it either a command line O/S, and a graphical one?

With grief. Look up Windows 3.1 and Linux, in particular X windows.


What is a graphical O/S built on? Like, how would I do something like, a command line, with a font, and a picture at the top?

Look up X windows.


final advice: study linux/x windows. It's not perfect, but it provides an understanding of one approach. Also study embedded systems.

I maintain a list of resources on StackOverflow: How to get started in operating system development. Please add new resources to it as you begin you're adventure (I'm about to begin :) )

You might enjoy this tutorial named "Roll your own toy UNIX-clone OS", its very insightful and should help you on your way.

Good luck.

Study the A2 System (formerly called the Oberon system) for ideas you can steal. It is a graphical OS built by just two people, although admittedly one is Niklaus Wirth. First released around 1990 and the speed is astonishingly good. There is a book by Gutknecht.

About low-level graphics programming, this will give you a lot of information: http://www.osdever.net/FreeVGA/home.htm. (It's very interesting for text mode as well.)

What will I undoubtedly run into that will confuse me?

You will realize that on PC there's an awful lot of stuff that is unclear: the x86 instruction set itself is complicated, and when you get direct access to hardware, it can take quite a while before you understand how to write a single character on screen.

Don't worry about floppy disk and such, most of the time you will use an emulator such as Bochs or QEmu.

You might want to consider taking a look at Operating Systems Concepts, by Abraham Silberschatz - Understanding Systems Programming concepts is a fundamental requirement, take a peek into F/OSS kernel internals of OSes linux *BSD and GNU/Linux, especially earlier versions, which are probably a bit more documented.alt text alt text

Take a look at Minix. Study the source code along with "Operating Systems Design and Implementation". Consider making contributions to the project. I think Minix is a really good and promising OS in the making. It is also well funded project. That means, you might even get paid for your contributions!

It is very easy thanks to the fact that the BIOS already have many input/output functions built into it for changing screen mode, changing pixel color, writing text to the screen and many other things. However, it does not include support for file systems, that is one of very few things you must incorporate in your OS.

The BIOS loads the first sector on the hard drive and starts executing the code from there, so your OS must be placed with the first instruction in the first sector on the hard drive.

This Wikipedia article should get you started on BIOS interrupts for writing text to the screen, receiving keys from the keyboard and other stuff. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Even if you plan to use c++ I would strongly recommend reading up on assembly programming, as it is vital to understanding how the hardware works.

ReferenceURL : https://stackoverflow.com/questions/1224617/how-can-i-build-a-small-operating-system-on-an-old-desktop-computer

반응형