많은 주제가있는 열린 질문입니다.
일반적인 컴파일러 -> 어셈블러 -> 링커 툴체인을 가정합니다. 컴파일러는 전체적으로 많이 알지 못합니다. 단순히 스택 관련 항목을 인코딩합니다. 스택이 얼마나 많은지 또는 어디에 있는지 신경 쓰지 않습니다. 스택의 목적/아름다움입니다. 당신이
gcc hello.c -o hello
바이너리 유틸리티의 설치가있을 때 컴파일러는 어셈블러가 객체로 조립 어셈블러를 생성 한 후 링커는, 그것을 메모리 공간의 세부 사항을 말해 어떤 맛 또는 명령 행 인수의 정보 링커 스크립트 소요 타겟 (윈도우, 맥, 리눅스, 당신이 무엇을하고 있든간에)에 맞춘 기본 링커 스크립트. 그리고 그 스크립트는 프로그램 공간이 시작되는 곳에 대한 정보를 포함하고 거기에서부터 힙 (텍스트, 데이터 및 bss 다음)을 어디에서 시작해야 하는지를 알고 있습니다. 스택 포인터는 해당 링커 스크립트에 의해 설정되거나 os가 다른 방식으로 관리합니다. 그리고 그것은 스택을 정의합니다.
windows와 linux, mac 및 bsd 랩톱 또는 데스크탑 컴퓨터가 가지고있는 mmu가있는 운영 체제의 경우 0x0000부터 시작하는 자체 주소 공간이 있다고 가정하면 각 프로그램이 컴파일됩니다. 프로그램은 0x0000에서 실행을 시작하기 위해 링크되어 있으며 운영 체제 규칙에 따라 운영 체제에 따라 다르며 일부는 예를 들어 0x8000에서 시작합니다.
프로그램의 관점에서 보면 하나의 선형 주소 공간이있는 응용 프로그램의 경우 .text와 .data 또는 .bss 중 하나 일 가능성이 높습니다. 그런 다음 힙이 어느 시점에서 정렬됩니다 그 후. 그러나 스택은 일반적으로 높게 설정되어 작동하지만 프로세서 및 운영 체제에 따라 다를 수 있습니다. 그 스택은 일반적으로 세계의 프로그램보기 내에서 메모리의 최상위에 있습니다.
가상 메모리는 응용 프로그램이 일반적으로 알지 못하거나 가상 메모리를 신경 쓰지 않는 모든 것에 보이지 않습니다. 응용 프로그램이 명령어를 가져 오거나 데이터 전송을 수행하는 경우 운영 체제에 의해 구성되고 가상과 실제간에 변환되는 하드웨어를 통과합니다.mmu가 공간을 물리적 주소로 매핑하지 않았 음을 의미하는 오류가 표시되면 때때로 의도적이어서 "가상 메모리"라는 용어를 다른 용도로 사용할 수 있습니다. 이 두 번째 정의는 예를 들어 운영 체제가 메모리의 다른 부분을 가져갈 수 있습니다. 예를 들어 다른 부분을 하드 디스크로 옮기고 그곳에 다른 부분을 표시 한 다음 청크에 일부 RAM이있는 것으로 표시합니다 당신은 당신이 당신이 다른 누군가에게서 가지고 가야 한 ㄴ다는 것을 당신이 모른 약간 숫양으로 중단되었다는 것을 모르는 상태에서 실행합니다. 귀하의 응용 프로그램은 디자인에 의해이 사실을 알기를 원하지 않으며, 단지 실행하고 싶어합니다. 운영 체제는 물리적 메모리 관리와 가상 주소 공간을 제공하는 mmu를 처리합니다 ...
처음에는 나중에 마이크로 컨트롤러, qemu, raspberry pi, beaglebone 등으로 mmu를 사용하지 않고 베어 메탈 프로그래밍을 조금 할 수있었습니다. 컴파일러, 링커 스크립트 및 mmu 구성 모두로 손을 더럽힐 수있었습니다. x86이 아닌 팔이나 밉스 (mips)를 사용하면 삶을 편하게 할 수 있습니다. 전반적인 큰 그림은 모두 대상을 가로 질러 직접 변환됩니다.
신속한 후속 조치를 요청할 수 있습니까? 함수를 호출하고, 로컬 변수를 만들고, 컴파일 할 때 프로그램에 포함 된 스택에 추가하는 기본 기계류입니까? 또는 기계가 운영 체제의 일부입니까? –