코드가 CPU에 특정한 경우, OS에 특정한 코드 인 이유를 언급합니다. 이것은 실제로 많은 답변이 가정 한 흥미로운 질문입니다.
CPU 보안 모델
대부분의 CPU 아키텍처에서 실행되는 첫 번째 프로그램 은 내부 링 또는 링 0 내부에서 실행됩니다 . 특정 CPU 아치가 링을 구현하는 방법은 다양하지만 거의 모든 최신 CPU에는 최소 2 가지 작동 모드가 있습니다. 하나는 특권이 있고 CPU가 수행 할 수있는 모든 법적 작업을 수행 할 수있는 '베어 메탈'코드를 실행합니다. 신뢰할 수없고 정의 된 안전한 기능 세트 만 수행 할 수있는 보호 된 코드를 실행합니다. 그러나 일부 CPU는 세분성이 훨씬 높고 VM을 안전하게 사용하기 위해서는 최소 1 또는 2 개의 추가 링이 필요하지만 (종종 음수로 표시)이 범위를 벗어납니다.
OS가 들어오는 곳
초기 단일 작업 OS
초창기 DOS 및 기타 초기 단일 작업 기반 시스템에서 모든 코드는 내부 링에서 실행되었으며, 실행 한 모든 프로그램은 전체 컴퓨터를 최대한 활용했으며 모든 데이터를 지우거나 하드웨어 손상을 포함하여 잘못 작동하면 문자 그대로 모든 작업을 수행 할 수 있습니다 아주 오래된 디스플레이 화면에서 유효하지 않은 디스플레이 모드를 설정하는 것과 같은 극단적 인 경우에는 악의가없는 버그가있는 코드로 인해 발생할 수 있습니다.
이 코드는 프로그램을 메모리에로드 할 수있는 로더 (초기 이진 형식의 경우 매우 간단)가 있고 코드가 드라이버에 의존하지 않고 모든 하드웨어 액세스 자체를 구현하는 한 실제로 OS에 구애받지 않습니다. 링 0에서 실행되는 한 모든 OS입니다. 참고 : 이와 같은 매우 간단한 OS 는 단순히 다른 프로그램을 실행하는 데 사용되며 추가 기능을 제공하지 않는 경우 일반적으로 모니터라고 합니다.
최신 멀티 태스킹 OS
UNIX , NT로 시작하는 Windows 버전 및 기타 다양한 OS가 현재 상황을 개선하기로 결정한 최신 운영 체제 는 사용자가 멀티 태스킹과 같은 추가 기능을 원했기 때문에 한 번에 두 개 이상의 응용 프로그램을 실행하고 보호 할 수있는 버그를 추가했습니다. 응용 프로그램의 악성 코드)는 더 이상 컴퓨터와 데이터에 무제한의 피해를 줄 수 없습니다.
이것은 위에서 언급 한 링을 사용하여 수행되었으며 OS는 링 0에서 실행되는 유일한 위치를 차지하고 응용 프로그램은 신뢰할 수없는 외부 링에서 실행되며 OS가 허용 한 제한된 작업 세트 만 수행 할 수 있습니다.
그러나 이렇게 증가 된 유틸리티 및 보호는 비용이 들었고, 프로그램은 이제 스스로 할 수없는 작업을 수행하기 위해 OS와 협력해야했으며 더 이상 예를 들어 메모리에 액세스하여 임의의 하드 디스크를 직접 변경하여 하드 디스크를 직접 제어 할 수 없었습니다. 대신에, 그들은 OS에 요청하지 않은 파일을 변경하지 않고 작업을 수행 할 수 있는지 확인하고 작업이 실제로 유효한지 확인하기 위해 이러한 작업을 수행하도록 OS에 요청해야했습니다. 하드웨어를 정의되지 않은 상태로 두지 않습니다.
각 OS는 이러한 보호에 대해 서로 다른 구현을 결정했습니다. 부분적으로 OS가 설계된 아키텍처와 부분적으로 해당 OS의 디자인과 원칙을 기반으로합니다. 예를 들어 UNIX는 다중 사용자 사용에 적합하고 집중된 머신에 중점을 둡니다. Windows가 더 단순하게 설계되고 단일 사용자로 느린 하드웨어에서 실행되도록이 기능을 사용할 수 있습니다. 사용자 공간 프로그램이 OS와 통신하는 방식은 X86에서 ARM 또는 MIPS와는 완전히 다르므로 멀티 플랫폼 OS가 대상 하드웨어에서 작업해야 할 필요성에 따라 결정을 내려야합니다.
이러한 OS 별 상호 작용을 일반적으로 "시스템 호출"이라고하며 사용자 공간 프로그램이 OS를 통해 하드웨어와 완전히 상호 작용하는 방식을 포함합니다. OS의 기능에 따라 근본적으로 다르므로 시스템 호출을 통해 작동하는 프로그램은 OS에 따라 다릅니다.
프로그램 로더
시스템 호출에 더하여, 각각의 OS는로부터 프로그램을로드하기위한 다양한 방법을 제공하는 보조 저장 매체 및 메모리 는 방법 일 수있는 프로그램이 OS를 설명하는 특수 헤더를 포함해야 특정 OS에 의해 수하물되기 위해서는, 로드하고 실행합니다.
이 헤더 는 다른 형식 의 로더 를 작성하는 것이 거의 사소한 것이었지만 동적 링크 및 약한 선언과 같은 고급 기능을 지원하는 elf와 같은 최신 형식에서는 OS가 바이너리를로드하려고 시도하는 것이 거의 불가능합니다. 이것은 시스템 호출 비 호환성이 없더라도 프로그램을 실행할 수있는 방식으로 램에 배치하는 것은 매우 어렵다는 것을 의미합니다.
도서관
프로그램은 시스템 호출을 거의 사용하지 않지만 시스템 호출을 프로그래밍 언어에 대해 약간 더 친숙한 형식으로 래핑하는 라이브러리를 통해 거의 독점적으로 기능을 얻습니다. Windows NT 이상에서는 대부분의 다른 프로그래밍 언어에도 비슷한 방식으로 시스템 기능을 래핑하는 유사한 라이브러리가 있습니다.
이러한 라이브러리는 위에서 설명한 바와 같이 크로스 플랫폼 문제를 어느 정도 극복 할 수 있으며, SDL과 같은 광범위한 OS에 대한 호출을 내부적으로 관리하면서 애플리케이션에 균일 한 플랫폼을 제공하도록 설계된 다양한 라이브러리가 있습니다 . 프로그램은 이진 호환이 될 수 없으며, 이러한 라이브러리를 사용하는 프로그램은 플랫폼간에 공통 소스를 가질 수 있으므로 재 컴파일처럼 간단하게 이식 할 수 있습니다.
위의 예외
여기에 언급 한 모든 내용에도 불구하고 둘 이상의 운영 체제에서 프로그램을 실행할 수 없다는 한계를 극복하려는 시도가있었습니다. 몇 가지 좋은 예는 Win32 프로그램 로더, 이진 형식 및 Windows 라이브러리가 다양한 UNIX에서 실행될 수 있도록하는 시스템 라이브러리를 성공적으로 에뮬레이트 한 Wine 프로젝트 입니다. 또한 여러 BSD UNIX 운영 체제에서 Linux 소프트웨어를 실행할 수있는 호환성 계층과 물론 MacOS X에서 이전 MacOS 소프트웨어를 실행할 수있는 Apple 자체의 심이 있습니다.
그러나 이러한 프로젝트는 엄청난 수준의 수동 개발 노력을 통해 작동합니다. 두 OS가 얼마나 다른지에 따라 난이도가 비교적 작은 심에서 다른 OS의 거의 완전한 에뮬레이션에 이르기까지 전체 운영 체제 자체를 작성하는 것보다 더 복잡하기 때문에 규칙이 아니라 예외입니다.