IT이야기

운영체제는 어떤 종류의 C로 기술되어 있습니까?

cyworld 2022. 7. 19. 20:49
반응형

운영체제는 어떤 종류의 C로 기술되어 있습니까?

운영 체제와 같은 것이 C로 쓰여지는 것은 당연합니다.하지만 어느 정도, 어떤 종류의 C일까요?C에서는 힙 메모리가 필요하면 malloc에 전화해요하지만 OS에 히프가 있나요?제가 알기로는 malloc은 운영체제에 메모리를 요청하고 링크된 목록이나 바이너리 트리 등에 메모리를 추가합니다.콜 스택은요?OS는 다른 어플리케이션에서 사용하는 이 모든 것을 셋업합니다만, 어떻게 셋업 할 수 있을까요?C에서 파일을 열거나 생성하려는 경우 해당 함수는 운영 체제에 해당 파일을 요청합니다.그 콜의 상대편에는 어떤 종류의 C가 있습니까?아니면 메모리 할당의 다른 쪽 끝?

또, 실제로 어느 정도의 operating system이 C로 작성됩니까?전부요?아키텍처 의존 코드는 어떻습니까?더 높은 수준의 추상화는 어떨까요? C++와 같은 더 높은 수준의 언어로 작성된 적이 있습니까?

그냥 궁금해서 물어보는 거예요저는 지금 최신 Linux 커널을 다운로드하고 있지만 시간이 오래 걸립니다.내가 결국 규칙을 따를 수 있을지, 아니면 내가 전에 본 적이 없는 복잡한 거미줄에 갇힐지 확신할 수 없다.

C는 매우 낮은 수준의 언어이며 많은 것을 직접 할 수 있습니다.C 라이브러리 메서드(malloc, printf, crlscr 등) 중 하나를 C에서 호출하려면 먼저 구현해야 합니다(예를 들어 libc 개념을 확인하십시오.아래에 예를 들어 보겠습니다.

C 라이브러리 방법이 어떻게 구현되는지 보자.clrscr의 예를 들어보겠습니다.이러한 방법을 구현하면 시스템 디바이스에 직접 액세스할 수 있습니다.예를 들어 clrscr(화면 클리어)의 경우 비디오 메모리가 0xB8000에 있는 것을 알 수 있습니다.따라서 화면에 쓰거나 지우려면 먼저 포인터를 해당 위치에 할당합니다.

Video.c의 경우

void clrscr()
{

   unsigned char *vidmem = (unsigned char *)0xB8000;
   const long size = 80*25;
   long loop;

   for (loop=0; loop<size; loop++) {
      *vidmem++ = 0;
      *vidmem++ = 0xF;
   }
}

이제 미니 커널을 쓰겠습니다.이렇게 하면 부트로더에서 '커널'로 제어권이 넘겨지면 화면이 지워집니다.메인.c

void main()
{
   clrscr();
   for(;;);
}

커널을 컴파일하려면 gcc를 사용하여 순수 bin 형식으로 컴파일할 수 있습니다.

gcc -ffreestanding -c main.c -o main.o
gcc -c video.c -o video.o
ld -e _main -Ttext 0x1000 -o kernel.o main.o video.o
ld -i -e _main -Ttext 0x1000 -o kernel.o main.o video.o
objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin

위의 ld 파라미터에 주목한 경우 커널의 기본 로드 위치를 0x1000으로 지정하고 있습니다.이제 부트 로더를 작성해야 합니다.부트 로더 로직에서 다음과 같이 커널에 제어를 넘길 수 있습니다.

jump 08h:01000h

부트로더 로직은 보통 Asm으로 씁니다.그 전에 PC의 기동 방법을 확인할 필요가 있는 경우가 있습니다.여기를 클릭해 주세요.

보다 작은 운영체제부터 살펴보는 것이 좋습니다.이 Roll Your Own OS 튜토리얼을 참조하십시오.

http://www.acm.uiuc.edu/sigops/roll_your_own/

훌륭한 질문입니다, 여러분.정답은 운영체제 작성에 사용되는 C의 "변호사"에서 표준 C 라이브러리를 거의 또는 전혀 사용할 수 없다는 것입니다.예를 들어 Linux 커널에서는 표준 메모리 할당 함수 malloc, nmalloc, free 등은 특별한 커널 내부 메모리 할당 함수 kmalloc 및 kfree로 대체되며 특별한 사용이 제한됩니다.operating system은 독자적인 「히프」를 제공할 필요가 있습니다.Linux 커널에서는 커널용으로 할당되어 있는 물리 메모리 페이지는 페이지를 작성할 수 없고, 많은 경우 물리적으로 대응해야 합니다.kmalloc kfree에 대한 이 Linux 저널 기사를 참조하십시오.마찬가지로 운영체제 커널은 독자적인 특별한 콜스택을 유지하며, 이를 사용하려면 GCC 컴파일러로부터의 특별한 지원이 필요합니다.

또, 실제로 어느 정도의 operating system이 C로 작성됩니까?전부요?

제가 알기로는 운영체제는 대부분 C로 되어 있습니다.일부 아키텍처 고유의 기능은 어셈블러에 코드화되어 있지만, 일반적으로 휴대성과 유지보수를 향상시키는 것은 거의 없습니다.Linux 커널에는 어셈블러가 몇 개 있지만 가능한 한 최소화하려고 합니다.

아키텍처 의존 코드는 어떻습니까?더 높은 수준의 추상화는 어떨까요? C++와 같은 더 높은 수준의 언어로 작성된 적이 있습니까?

보통 커널은 순수 C로 작성되지만, 때로는 상위 수준의 프레임워크와 API가 상위 수준의 언어로 작성되기도 합니다.예를 들어, MacOS의 코코아 프레임워크/API는 목표 C에, BeOS의 상위 레벨 API는 C++에 기재되어 있습니다.Microsoft의 많은 부분NET 프레임워크는 C#로 작성되었으며 "Common Language Runtime"은 C++와 어셈블러가 혼재하여 작성되었습니다.Linux에서 가장 많이 사용되는 QT 위젯 세트는 C++로 작성됩니다.물론, 이것은 무엇이 "운영 체제"로 간주되는지에 대한 철학적인 질문을 야기합니다.

Linux 커널은 확실히 이것을 볼 가치가 있지만, 그것은 누구나 처음부터 읽기에는 거대하고 위협적이라고 말할 수 있다.

어떤 종류의 C?

대부분 ANSI C이며 생성되는 머신 코드를 확인하는 데 많은 시간이 소요됩니다.

하지만 OS에 히프가 있나요?

Malloc은 OS에 사용할 수 있는 메모리에 대한 포인터를 요구합니다.OS(사용자 모드)에서 실행되고 있는 프로그램이 소유하고 있지 않은 메모리에 액세스하려고 하면 세그멘테이션 장애가 발생합니다.OS는 시스템상의 모든 물리 메모리에 직접 액세스 할 수 있습니다.malloc는 필요 없습니다.또, 존재하는 주소의 세그먼트 폴트는 없습니다.

콜 스택은요?

실제로 콜 스택은 링크 레지스터를 사용하여 하드웨어 수준에서 동작하는 경우가 많습니다.

파일 액세스를 위해서는 OS가 디스크 드라이버에 액세스 할 필요가 있습니다.디스크에 있는 파일 시스템의 판독 방법을 알아야 합니다(다양한 종류가 있습니다).OS에 내장되어 있는 것이 있습니다만, 부트 로더에 의해서 처음부터 다른 (더 큰) 드라이버가 로드되는 것이 일반적이라고 생각합니다.디스크 드라이버는 물리 디스크의 하드웨어 IO에 액세스 할 수 있으며, 이를 기반으로 구축됩니다.

하지만 어느 정도, 어떤 종류의 C일까요?

일부 부품은 어셈블리에서 작성해야 합니다.

C에서는 힙 메모리가 필요하면 malloc에 전화해요하지만 OS에 히프가 있나요?제가 알기로는 malloc은 운영체제에 메모리를 요청하고 링크된 목록이나 바이너리 트리 등에 메모리를 추가합니다.

OS에 따라서는 히프가 있습니다.가장 낮은 레벨에서는, 페이지라고 불리는 메모리 슬래브입니다.그런 다음 C 라이브러리는 malloc을 사용하여 가변 크기 방식으로 자체 스킴으로 파티션을 분할합니다.최신 OS의 일반적인 메모리 구성표인 가상 메모리에 대해 배울 필요가 있습니다.

C에서 파일을 열거나 생성하려는 경우 해당 함수는 운영 체제에 해당 파일을 요청합니다.그 콜의 상대편에는 어떤 종류의 C가 있습니까?

IN 및 OUT과 같은 명령을 사용하여 하드웨어를 쿼리하는 어셈블리 루틴을 호출합니다.raw memory access를 사용하면 하드웨어와의 통신 전용 메모리 영역을 가질 수 있습니다.이것은 DMA라고 불립니다.

내가 결국 규칙을 따를 수 있을지, 아니면 내가 전에 본 적이 없는 복잡한 거미줄에 갇힐지 확신할 수 없다.

네, 그럴 겁니다.먼저 하드웨어와 OS에 관한 책을 골라야 합니다.

C에서는 힙 메모리가 필요하면 malloc에 전화해요하지만 OS에 히프가 있나요?제가 알기로는 malloc은 운영체제에 메모리를 요청하고 링크된 목록이나 바이너리 트리 등에 메모리를 추가합니다.콜 스택은요?

질문의 대부분은 실제로 사용자 공간의 런타임 라이브러리에 의해 수행됩니다.

OS가 해야 할 일은 프로그램을 메모리에 로드하고 시작점으로 이동하기만 하면 됩니다. 그 이후의 대부분의 세부 사항은 사용자 공간 프로그램에서 수행할 수 있습니다.힙과 스택은 프로세스 가상 메모리의 영역일 뿐입니다.스택은 CPU 내의 포인터 레지스터일 뿐입니다.

물리 메모리의 할당은 OS 레벨에서 이루어집니다.OS는 보통 고정 크기의 페이지를 할당하고, 이 페이지는 사용자 공간 프로세스에 매핑됩니다.

리눅스 장치 드라이버 3을 읽어야 합니다.Linux 커널의 내부 기능에 대해 충분히 설명하고 있습니다.

리눅스 커널을 읽기 시작하진 않을 거야. 처음엔 너무 복잡해.

Osdev는 독서를 시작하기 좋은 장소입니다.학교 과목을 위해 Osdev에서 정보를 가지고 약간의 os를 했습니다.VMware, Bochs 및 Qemu에서 실행되므로 테스트하기가 쉽습니다.여기 소스코드가 있습니다.

전통적으로 C는 하드웨어와의 상호작용으로 인해 커널 및 디바이스 드라이버에 가장 많이 필요합니다.다만, C++나 Java등의 언어를 operating system 전체에 사용할 수 있습니다.

자세한 것은, Andrew Tannenbaum의 operating systems Design and Implementation을 참조해 주세요.

malloc 및 메모리 관리 기능은 C의 키워드가 아닙니다.이것은 표준 OS 라이브러리의 기능입니다.이 표준의 이름은 모릅니다(POSIX 표준이 아닌 것 같습니다만, 기재되어 있지 않습니다).하지만 존재합니다.대부분의 플랫폼에서는 C 어플리케이션에서 malloc을 사용하고 있습니다.

Linux 커널이 어떻게 동작하는지 알고 싶다면 이 책 http://oreilly.com/catalog/9780596005658/을 추천합니다.C코드를 삽입하면 좋은 설명이 될 것 같습니다.

언급URL : https://stackoverflow.com/questions/1096682/what-kind-of-c-is-an-operating-system-written-in

반응형