2013-04-30 2 views
0

Windows에서 컴파일 된 간단한 C 프로그램을 생각해 봅시다.기계 독립성

Intel CPU 컴퓨터에서 프로그램을 컴파일하고 AMD CPU 하나 (동일한 운영 체제)에서 실행할 수 있습니다. 그렇다면 CPU의 명령어 세트가 동일하다는 의미입니까?

OS가 같고 CPU가 동일한 컴퓨터에서 동일한 프로그램이 실행되지 않는 이유는 무엇입니까?

답변

2

개체 파일의 바이너리 설정은 완전히 다릅니다. 또한 사용할 수있는 라이브러리 또는 호출 방법.

ELF 또는 EXE 파일의 헤더를 비교하면 무슨 뜻인지 알 수 있습니다.

"main() {printf ("Hello \ n "); return 0;}과 같은 간단한 프로그램을 작성하면이 줄이 인쇄되도록 컴파일러에서 다루는 장면이 많이 있습니다. 는 어셈블리 명령어를 실행할 수 있기 때문에 같은 CPU에서 실행은 도움이되지 않지만, 제 1 OS 함수를 호출하는 즉시 끔찍하게 실패

이 조금 정교하게하려면. 그냥 exmaple로

을 우리가 Motorola 68000 CPU로 Amiga OS를 돌리고 있다고 가정 해 보겠습니다.

내가 올바르게 기억한다면, sys tem 라이브러리는 포인터를 CPU의 어드레스 레지스터에 로딩 한 다음 OS 기능을 호출하는 것을 포함한다.

이제 Motorola 68000 CPU를 사용하여 직접 OS를 작성한다고 가정 해 보겠습니다. 그러나 OS를 디자인 할 때 데이터 교환을 위해 스택을 사용하는 것이 훨씬 더 좋은 아이디어라고 생각했기 때문에 내 개인 OS에서 비슷한 기능을 호출하면 주소록에 주소를 전달하지 않습니다. 그것을 스택에 밀어 넣습니다. 실행 파일이 내 OS에서 실행될 때 (동일한 객체 구조를 사용하기 때문에로드 될 수 있다고 가정) 실행 파일은 레지스터에 값을 넣을 것이고 OS는 스택에서 팝하려고 시도 할 것입니다. 찾고 있던 가치가 그 밖의 어떤 것으로 생각되었다는 것을 알아라.

이 내용이 조금 더 자세하게 설명되어 있으므로 이해해 주시면 좋겠지 만 문제는 관련된 문제 중 일부에 지나지 않습니다.

+0

간단한 단어로 설명해주세요. 미리 감사드립니다. –

+0

예를 들어 텍스트를 편집하여 의미를 설명합니다. – Devolus

+0

오 좋은 그림. 컴퓨터 수준 (디지털 논리)에서 컴퓨터가 어떻게 작동하는지 알 수있는 좋은 책을 알고 있습니까? –

2

Intel 및 AMD 모두 x86 (또는 x86-64) 아키텍처를 사용합니다. 그래서 두 소프트웨어 모두에서 동일한 소프트웨어를 실행할 수 있습니다. 그러나 컴파일 된 프로그램에는 아키텍처에 대한 종속성 외에도 기본 운영 체제에 대한 종속성이 포함되어 있습니다. 예를 들어 Linux 실행 파일의 이진 형식조차도 Windows 실행 파일과 다릅니다.

그러나 C 표준 라이브러리를 사용하고 다른 운영 체제와 프로세서 아키텍처에서 컴파일하는 간단한 C 프로그램을 사용할 수 있습니다. 코드에 운영 체제 종속 코드가 포함되어 있지 않으면 운영 체제간에 포트가 연결됩니다. 마찬가지로 코드가 기본 아키텍처의 endianess에 의존하지 않는 경우 아키텍처 전반에 걸쳐 포팅됩니다.

요한.

+0

감사합니다. 런타임에 이식이 어떻게 이루어 집니까? –

+0

"런타임에"은 무엇을 의미합니까? 런타임에서 호환성이 달성된다면 (Linux의 와인은 좋은 예입니다.) 누군가가 실행 파일을로드하는 방법을 알고있는 랩퍼를 작성한 다음 이진에서 호출을 가로 채어 기본 OS로 변환하는 것을 의미합니다. 런타임에는 실행 파일을 이식 할 수 없습니다. 항상 에뮬레이션 레이어가 필요합니다. – Devolus

+0

런타임시 @ShankarNShankar 포트는 OS에 ** foreign ** 실행 파일을 읽고 실행할 수있는 많은 코드가있는 경우에만 제거 할 수 있습니다. 요즘은 ** 가상 머신 ** (VM)입니다. 두 플랫폼 모두 충분히 유사하여 일부 VM에서는 전체 VM이 필요하지 않은 일부 플랫폼에서는 VM없이 제거 할 수 있습니다. ** Linux x86 또는 Mac x86에서 Windows x86을 실행하는 Wine **이 하나의 예입니다. –