코스모스(운영체제)

Cosmos (operating system)
코스모스
Cosmos logo.png
AuraOS.png
COSMOS로 만든 OS 스크린샷으로 GUI 작성 가능성 표시
개발자코스모스 프로젝트
기입처C#, X#
동작 상태활동적인
소스 모델오픈 소스
최신 릴리즈릴리즈 20220209 / 2022년 2월 9일, 5개월 전(2022-02-09)
저장소github.com/CosmosOS
이용가능기간:영어
플랫폼x86
커널 타입모노리식
면허증.BSD
공식 웹사이트www.gocosmos.org

C# 오픈소스 매니지드 운영체제(Cosmos)는 운영체제 구축을 위한 툴킷으로 주로 프로그래밍 언어 C#과 소량의 고급 어셈블리 언어 X#으로 기술되어 있습니다.Cosmos[1]의미보다 머리글자가 먼저 선택되었다는 점에서 역어이다.BSD 라이선스로 출시된 오픈소스 소프트웨어입니다.

코스모스에는 IL2CPU라는 이름의 선행(AOT) 컴파일러가 포함되어 있어 CIL(Common Intermediate Language)을 네이티브 명령어로 변환합니다.코스모스는 IL2CPU를 사용하여 사용자가 만든 프로그램과 관련 라이브러리를 컴파일하여 지원 없이 실행할 수 있는 부팅 가능한 네이티브 실행 파일을 만듭니다.결과 출력은 USB 플래시 드라이브, CD-ROM, PXE(Preboot Execution Environment)를 통해 네트워크를 통해 또는 가상 시스템 내에서 부팅할 수 있습니다.또한 최신 릴리스에서는 USB(Universal Serial Bus)를 통해 특정 x86 임베디드 장치에 배포할 수 있습니다.C#은 개발자(백엔드 및 Cosmos 최종 사용자 모두)가 사용하는 주요 언어이지만 Platform Invocation Services(P/Invokes)를 사용하지 않고 순수 CIL로 컴파일할 경우 많은 CLI 언어를 사용할 수 있습니다.Cosmos는 주로 와 함께 사용하는 것을 목적으로 합니다.NET 코어

2021년 현재 코스모스는 완전한 운영체제가 되는 것을 목표로 하지 않고 다른 개발자들이 를 사용하여 간단하고 쉽게 그들만의 운영체제를 만들 수 있도록 하는 툴킷을 목표로 하고 있습니다.NET 코어또한 추상화 계층으로 기능하여 하드웨어의 내부 작동 대부분을 최종 개발자에게 숨깁니다.

이전 버전의 코스모스는 마일스톤에서 출시되었으며, 마지막 버전은 마일스톤 5(2010년 8월 출시)입니다.최근 프로젝트는 단순히 최신 커밋 번호의 이름을 따 새로운 릴리스에 이름을 붙이는 것으로 전환했습니다.Cosmos의 릴리즈Userkit과 Devkit 두 가지 유형으로 나뉩니다.Userkit은 새로운 기능과 개선된 기능이 추가됨에 따라 정기적으로 업데이트되는 사전 패키지 릴리스입니다.사용자 키트는 일반적으로 안정된 것으로 간주되지만 최근의 변경은 포함되지 않으며 기능이 부족할 수 있습니다.Devkit은 Cosmos의 소스 코드를 참조하며 수동으로 빌드해야 합니다.데브킷은 보통 어느 정도 안정적이지만 버그가 있을 수 있습니다.Devkit은 GitHub에서[1] 취득할 수 있으며 소스 제어 관리로 Git을 사용합니다.Cosmos에 대한 대부분의 작업은 현재 디버거 기능과 Microsoft Visual Studio 통합을 개선하는 것을 목표로 하고 있습니다.커널 작업은 파일 시스템 구현, 메모리 관리 및 신뢰성 높은 네트워크 인터페이스 개발에 중점을 두고 있습니다.Syslinux는 프로젝트부트로더 역할을 합니다.

코스모스와의 개발

Cosmos는 운영체제 개발경험을 향상시키기 위해 많은 설비를 갖추고 있으며 프로세스를 최대한 빠르고 쉽게 할 수 있도록 설계되어 있으며, Cosmos를 사용하기 위해 어셈블리 언어에 대한 지식이 필요하지 않습니다.

Visual Studio 통합

Cosmos의 주요 특징은 Microsoft Visual Studio와의 긴밀한 통합입니다.코드를 작성, 컴파일, 디버깅 및 Visual Studio를 통해 실행할 수 있습니다.키를 몇 번 누르기만 하면 됩니다.코스모스는 더 이상 Visual Studio 2015, Visual Studio 2017 또는 Visual Studio 2019를 지원하지 않습니다.현재는 Visual Studio 2022만 지원합니다.

디버깅

Cosmos는 PXE를 통해 실행하거나 가상 시스템에서 실행할 때 Visual Studio를 통해 심리스하게 디버깅할 수 있습니다.브레이크 포인트, 트레이스, 로깅 등 많은 표준 디버깅 기능이 있습니다.또, 물리 하드웨어로 동작하고 있는 경우는, 시리얼 케이블을 개입시켜 디버깅을 실시할 수도 있습니다.VMWare에서 실행할 경우 Cosmos는 운영 체제가 실행 중인 경우에도 스테핑 및 중단점을 지원합니다.

입니다.

Cosmos는 가상화를 사용하여 개발자가 컴퓨터를 자주 재부팅하지 않고도 운영체제를 테스트할 수 있도록 함으로써 개발 속도를 높입니다.기본적으로는 프로젝트와의 통합 측면에서 사용하기 쉽기 때문에 VMWare Player가 사용됩니다.Bochs 및 Virtual PC와 같은 다른 가상화 환경도 지원됩니다.USB 플래시 드라이브, CD-ROM 또는 유사한 미디어에 쓸 수 있는 ISO 디스크 이미지를 생성할 수도 있습니다.

PXE 부팅도 지원되므로 원격 시스템에서 네트워크 연결을 통해 Cosmos를 실행할 수 있습니다.

컴파일 프로세스

IL2CPU

컴파일하다NET CIL을 어셈블리 언어로 변환하여 Cosmos 개발자들은 CIL을 해석하고 x86 opcode를 출력하도록 설계된 IL2CPU라는 이름의 선행 컴파일러를 만들었습니다.(IL To CPU)는 Common Intermediate Language(C#) 준거 언어를 사용하여 기술된 AOT 컴파일러입니다.공통 중간 언어기계어변환합니다.

X#

X#은 운영체제 개발을 용이하게 하기 위해 Cosmos 운영체제의 일부로 x86 프로세서 아키텍처용으로 개발된 저수준 프로그래밍 언어입니다.X#은 어셈블리 언어에 C와 유사언어 구문의 일부를 가져오도록 설계되었습니다.처음에 X#은 Cosmos의 서비스를 디버깅하기 위한 보조 도구였습니다.X# 컴파일러는 비정형 아키텍처를 갖춘 오픈소스 명령줄 인터페이스(콘솔) 프로그램입니다.코드 행을 토큰으로 해석하여 패턴과 비교합니다.마지막으로 일치하는 X# 코드 패턴은 보통 Netwide Assembler(NASM)용 인텔 구문 x86 어셈블리로 변환됩니다.첫 번째 버전에서는 X#의 조작은 어셈블리 코드를 사용한1:1의 조작이 대부분이었지만, 그렇지 않았기 때문에 X# 컴파일러가 [clarification needed]작성되었습니다.

구문

X#의 구문은 간단합니다.C와 유사하지만 X# 구문은 다르며 더 엄격합니다.

평.

X#은 C++ 스타일의 한 줄 댓글만 지원합니다.한 줄 댓글은 더블포워드 슬래시로 시작합니다.//.

상수

X#은 함수 외부에서 선언된 명명된 상수의 정의를 지원합니다.숫자 상수의 정의는 C++와 비슷합니다.다음은 예를 제시하겠습니다.

컨스턴트 i = 0 

다른 곳에서 상수를 참조하려면#예를 들어 다음과 같이 입력합니다."#i".

  • 문자열 상수를 정의하려면 작은 따옴표를 사용합니다('')가 사용됩니다.문자열 상수에 단일 따옴표를 사용하려면 따옴표 앞에 백슬래시를 배치하여 이스케이프해야 합니다.'I\'m so happy'. X# 문자열은 null로 끝납니다.
  • 16진수 상수 앞에는 달러 기호( )가 붙습니다.$)에 이어 상수가 계속됩니다.($B8000).
  • 소수 상수는 장식되지 않지만 다음 문자로 시작할 수 없습니다.0.
  • 이진수 및 8진수 상수는 아직 지원되지 않습니다.

라벨

X#의 라벨은 대부분 다른 어셈블리 언어의 라벨과 동일합니다.라벨로 점프하는 명령에는goto전통적인 것과 반대로 기억력 있는jump또는jmp니모닉

코드 라벨 1:     에 가다 코드 라벨 2: 

네임스페이스

X# 프로그램 파일은 네임스페이스 지시문으로 시작해야 합니다.X#에는 네임스페이스 계층이 없으므로 지시문은 다시 변경되거나 파일이 종료될 때까지 현재 네임스페이스를 변경합니다.다른 네임스페이스에 있는 변수 또는 상수는 어셈블리 출력의 멤버 이름 앞에 네임스페이스가 붙어 있는 것과 같은 이름을 가질 수 있습니다.네임스페이스는 네이티브 어셈블리 수준 연산을 사용하는 "치트"를 통해서만 서로 참조할 수 있습니다.

네임스페이스 첫번째 // 모든 변수 또는 상수 이름 앞에 FIRST와 밑줄이 붙습니다.따라서 아래 변수의 실제 전체 이름 // 는 FIRST_aVar 입니다. 변화하다 aVar  네임스페이스 둘째 // 다른 변수의 이름을 aVar로 지정하는 것은 문제가 되지 않습니다.실제 이름은 SECond_aVar입니다. 변화하다 aVar  네임스페이스 첫번째 // 이 코드는 파일이 끝날 때까지 FIRST 네임스페이스로 돌아갑니다. 

기능들

모든 X# 이그제큐티브 코드는 'function' 키워드로 정의된 함수에 배치해야 합니다.C와 달리 X#은 함수 헤더에서 형식 파라미터 선언을 지원하지 않기 때문에 함수 이름 뒤에 있는 기존 괄호는 생략됩니다.행 고정 패턴은 코드 파서로 구현된 구문에서 지정되기 때문에 다른 많은 C 스타일 언어와는 달리 시작 괄호는 다음 행에 배치할 수 없습니다.

기능. xSharp 기능 {     // 함수 코드 } 

X#은 저레벨 언어이기 때문에 스택프레임은 삽입되지 않습니다.따라서 디폴트로는 스택 상부에 반환EIP 주소가 있습니다.X# 함수 호출에는 함수 헤더와 달리 괄호로 둘러싸인 인수가 포함됩니다.함수에 전달되는 인수는 레지스터, 주소 또는 상수일 수 있습니다.이러한 인수는 역순으로 스택에 푸시됩니다.x86 플랫폼의 스택은 1바이트 레지스터를 푸시 또는 팝할 수 없습니다.

기능. xSharp 기능 {     EAX = $10     다른 기능(EAX);     돌아가다 }  기능. 다른 기능 {     //함수 코드 } 

return키워드는 스택에 저장된 반환EIP 주소로 실행을 되돌립니다.

산술 연산 및 비트 연산

X# 는, 레지스터, 스택, 메모리의 3 개의 저레벨 데이터 구조(다른 포토상의)로 동작할 수 있습니다.레지스터는 X#의 모든 정상 연산의 기초가 됩니다.레지스터를 다른 레지스터로 복사할 수 있습니다.DST = SRC와는 반대로mov또는 지침을 로드/저장합니다.레지스터는 쉽게 증감할 수 있습니다.산술 연산(더하기, 빼기, 곱하기, 나누기)은 다음과 같이 기술됩니다.dest op src어디에src상수, 변수 또는 레지스터입니다.dest는 오퍼랜드와 결과가 저장되는 위치입니다.

할당 및 산술 연산의 예를 다음에 나타냅니다.

ESI = 12345              // ESI에 12345 할당 EDX = #상수:EDX    // #ConstantFor 할당EDX에서 EDX로 EAX = EBX                // EBX를 EAX로 이동 => eax, ebx로 이동 EAX--                    // EAX 감소 => dec eax EAX++                    // EAX => inc eax 증가 EAX + 2                  // eax에 2 추가 => eax 추가, 2 EAX - $80                // eax = > sub eax, 0x80에서 0x80 빼기 BX * CX                  // BX에 CX = > mul cx를 곱합니다.- 나눗셈, 곱셈 및 모듈로는 레지스터를 유지합니다. CX / BX                  // CX를 BX = > div bx로 나눕니다. CX 모드 BX                // CX/BX에서 BX로의 나머지 => div bx 

레지스터의 이동 및 굴림은 C와 유사합니다.

DX << > 10  // 10비트 왼쪽으로 이동 CX >> 8   // 8비트 오른쪽으로 이동 EAX <~ 6  // 왼쪽으로 6비트 회전 EAX ~> 4  // 4비트 오른쪽으로 회전 

다른 비트 연산도 산술 연산과 유사합니다.

DL & $08     // 0x08의 DL에서 AND 비트를 실행하고 결과를 DL에 저장합니다. CX   1       // CX의 최저 비트를 1로 설정(홀수) EAX = ~ECX   // ECX에서 비트를 실행하고 결과를 EAX에 저장합니다. EAX ^ EAX    // EAX를 XOR하여 지우기 

스택

X# 의 스택 조작은, 다음의 방법으로 실행됩니다.+그리고.-프리픽스, 여기서+레지스터, 값, 상수 또는 모든 레지스터를 스택에 푸시하고-는 어떤 레지스터에 값을 팝합니다.특별히 명기되어 있지 않는 한 모든 상수는 이중 단어로 스택에 푸시됩니다(단일 바이트 푸시는 지원되지 않습니다).

+ESI                   // 푸시 esi -EDI                   // edi에 팝업 표시 +모든.                   // 모든 레지스터 저장 => pushad -모든.                   // 모든 레지스터 로드 => popad +$1badboo             // 스택에 0x1 badboo2 푸시 +$카페 ~하듯이 단어         //          \/ +$아기 ~하듯이 단어         // 0xcafebe를 누른다. +#비디오 메모리          // 고정 비디오 메모리의 푸시 값 

변수

변수는 네임스페이스 내에서 정의됩니다(스택프레임이 없기 때문에 로컬 변수는 지원되지 않습니다).var키워드를 지정합니다.선언 끝에 어레이의 유형과 크기를 추가하여 어레이를 정의할 수 있습니다.변수 및 배열은 기본적으로 0으로 설정됩니다.변수 값을 참조하려면 변수 앞에 점을 붙여야 합니다.prefix에 prefix를 붙입니다.@는 변수의 주소를 참조합니다.

네임스페이스 XSharp 변수 변화하다 제로 Var                      // 변수에 0이 할당됩니다. 변화하다 myVar1 = $f000의           // 변수에 0 "000" 이 할당됩니다. 변화하다 일부 문자열 = '안녕 XSarp!' // 변수에 'Hello XSharp!\0'이 할당됩니다. 변화하다 완충 장치 바이트[1024]            // 크기가 1024바이트인 변수에는 1024개의 0바이트가 할당됩니다. ... EAX = .myVar1                    // myVar1(0xf000beef)의 값을 EAX로 이동합니다. ESI = @.일부 문자열               // someString 주소를 ESI로 이동 CL = .일부 문자열                 // someString('H')의 첫 번째 문자를 CL로 이동합니다. .제로 Var = EAX                   // EAX 값에 0Var 할당 

X# 는, 대괄호를 사용해 지정된 오프셋을 가지는 주소에 액세스 할 수 있습니다.

변화하다 일부 문자열 = '안녕 XSarp!' //변수가 'Hello XSharp!'에 할당됩니다.\0' ... ESI = @.일부 문자열       // ESI에 대한 someString의 로드 주소 CL = 'B'                 // CL을 'B'로 설정합니다(시작 시 'H' 다시 쓰기). CH = ESI[1]              // 문자열에서 CH로 두 번째 문자('E') 이동 ESI[4] = $00             // 끝 문자열 //someString 값은 'Bell'(또는 'Bell\0 XSharp!\0')이 됩니다. 

비교

값을 비교하는 방법에는 순수 비교와 if-comparison 두 가지가 있습니다.

  • 순수 비교는 결과를 FLAGS에 남겨두기 때문에 네이티브어셈블리 또는 FLAGE를 사용할 수 있습니다.if비교 멤버를 지정하지 않고 키워드를 지정합니다.
  • 비교 후 직접 두 멤버를 비교한 경우if키워드를 지정합니다.

다음으로 (느린) X# 문자열 길이를 쓰는 두 가지 방법을 나타냅니다.strlen)의 기능:

// 방법 1: 순수 비교 사용 기능. 스트렌 {     ESI = ESP[4] // 첫 번째 인수로 전달된 문자열 포인터 가져오기     ECX ^ ECX    // ECX 클리어 고리:     AL = ESI[ECX]// 다음 문자 가져오기     AL ?= 0      // 0 인가요? 플래그에 저장     한다면 = 돌아가다  // ZF가 설정되어 있으면 반환     ECX++        // 그렇지 않으면 ECX가 증가합니다.     에 가다 고리    // 루프...  //Way 2: 사용: 기능. 스트렌 {     ESI = ESP[4]    // 첫 번째 인수로 전달된 문자열 포인터 가져오기     ECX ^ ECX       // ECX 클리어 고리:     AL = ESI[ECX]     한다면 AL = 0 돌아가다// AL = 0? 반환     ECX++     에 가다 고리       // 루프... } 

6개의 비교 연산자를 사용할 수 있습니다.< > = <= >= !=이들 연산자는 비교와 루프 모두에서 사용할 수 있습니다.비트를 테스트하는 비트 단위 AND 연산자도 있습니다.

AL ?& $80      // AL MSB 테스트 한다면 = 돌아가다    // ZF가 0이면 테스트 명령이 0이 되고 MSB가 설정되지 않습니다. 

Cosmos 코드

코스모스로 만든 운영체제는 여느 운영체제와 비슷한 방식으로 개발된다.NET C# 콘솔 프로그램Cosmos 라이브러리에 액세스할 수 있는 프로그램 시작 부분에서 추가 참조가 이루어집니다.이러한 라이브러리는 C# 콘솔 프로그램에서 일반적으로 사용되는 시스템 라이브러리를 덮어씁니다.이는 Microsoft Windows 설치에서는 바이너리가 실행되지 않기 때문입니다.

사용자 키트 및 Visual Studio

코스모스 사용자 키트는 마이크로소프트 비주얼 스튜디오를 사용하는 개발자들이 코스모스를 더 쉽게 사용할 수 있도록 설계된 코스모스의 일부입니다.설치되면 사용자 키트는 코스모스 프로젝트라는 새 프로젝트 유형을 Visual Studio에 추가합니다.콘솔 애플리케이션의 수정 버전으로 Cosmos 컴파일러와 부트업 스터브 코드가 이미 추가되었습니다.

프로젝트 컴파일

코드가 완료되면 를 사용하여 컴파일할 수 있습니다.NET 컴파일러이것에 의해, 애플리케이션이 원래의 소스 코드(C#등)로부터, 의 네이티브 언어인 Common Intermediate Language(CIL; 공통 중간 언어)로 변환됩니다.NET 프레임워크다음으로 어플리케이션이 실행되어 Cosmos Builder 창이 나타납니다.이 창은 개발자에게 프로젝트의 컴파일 방법을 정확하게 결정하는 옵션을 제공합니다.이러한 옵션에는 Quick Emulator(QEMU), Virtual PC, VMWare 등의 에뮬레이터를 통한 프로젝트 부팅 방법, 나중에 CD-ROM에 쓸 수 있는 디스크 이미지(ISO) 파일 쓰기 또는 PXE(Preboot Execution Environment) 네트워크 부팅 및 코스모스 내장 디버거를 사용한 디버깅 옵션이 포함됩니다.

사용자가 원하는 옵션을 선택하면 빌드 버튼을 누릅니다.이것에 의해, IL2CPU 컴파일러가 기동해, 모든 애플리케이션 CIL 코드(코스모스 컴파일러 코드 제외)를 체계적으로 스캔 해, 선택한 프로세서아키텍처의 어셈블리 언어로 변환합니다.2016년 현재 x86만 지원됩니다.다음으로 Cosmos는 선택한 어셈블러를 호출하여 이 어셈블리 언어 코드를 네이티브 중앙 처리 장치(CPU) 운영 코드로 변환합니다.마지막으로 에뮬레이터 기동, PXE 엔진 기동, 바이너리 코드 opcode로부터의 ISO 디스크 이미지 파일 생성 중 원하는 출력 옵션이 활성화된다.

디버깅 옵션

Cosmos는 결과 OS를 도입하는 방법과 출력을 디버깅하는 방법에 대해 몇 가지 옵션을 제공합니다.

가상화

QEMU에 표시되는 기본 Cosmos 부트 화면.

코스모스를 사용하면 가상 머신을 사용하여 에뮬레이트된 환경에서 운영 체제를 부팅할 수 있습니다.이것에 의해, 개발자는 재기동하지 않고 자신의 컴퓨터로 시스템을 테스트할 수 있게 되어, 추가의 하드웨어가 필요 없게 되거나, 개발자가 통합 개발 환경을 종료할 수 있는 메리트가 있습니다.현재 지원되는 것은 VMWare뿐입니다.Bochs 지원이 진행 중입니다.QEMU 및 Virtual Box는 공식적으로 지원되지 않습니다.

디스크 이미지

이 옵션은 운영체제를 디스크이미지(ISO 이미지) 파일에 씁니다.이 파일은 일부 에뮬레이터(Bochs, QEMU 또는 보다 일반적인 VMware 등)에 로드하거나 CD-ROM에 쓰고 실제 하드웨어에서 부팅할 수 있습니다.또한 이 옵션을 사용하면 USB 플래시 드라이브와 같은 USB 대용량 저장 장치로 배포하여 광학 디스크 드라이브가 없는 장치에서 부팅할 수 있습니다.네트워킹이 아직 구축되지 않았기 때문에 이 배포 옵션에서는 디버깅이 지원되지 않습니다.

PXE 네트워크 부팅

이 옵션을 사용하면 운영 체제를 실제 하드웨어에서 부팅할 수 있습니다.데이터는 LAN(Local Area Network)을 통해 클라이언트머신에 송신됩니다.이를 위해서는 2대의 컴퓨터가 필요합니다.하나는 클라이언트 머신(OS가 기동하는 것)과 다른 하나는 서버(통상 개발 머신)입니다.또한 두 시스템을 연결하는 네트워크, 네트워크 카드가 있는 클라이언트 시스템 및 PXE 부팅이 가능한 BIOS(Basic Input/Output System)가 필요합니다.2016년 현재 네트워크를 통한 디버깅은 지원되지 않습니다.

코스모스 조립자

Cosmos Project 팀은 최종적으로 Cosmos 시스템의 메인 어셈블러가 되도록 설계된 어셈블러도 만들었습니다.그러나 어셈블러는 여전히 비효율적이고 느리기 때문에 Netwide Assembler(NASM)가 대신 사용됩니다.

「 」를 참조해 주세요.

레퍼런스

외부 링크

뉴스 보도