Linux / Windows에서 실행 파일 실행 방법 분석 (복제) (20210202)

이 기사는 향후 참조를 위해 아이디어를 분류하기위한 것입니다. 이제 실행 파일 a.out의 실행에서 시작하여 Linux가 실행 파일을 위에서 아래로 실행하는 방법을 분석하십시오.

1. 먼저 대상 파일 a.out을 이해해야합니다. a.out은 Linux에서 ELF (Executable Linkable Format) 파일 형식입니다. 대상 파일은 다음과 같이 파일 헤더, 코드 세그먼트, 데이터 세그먼트 (초기화), 슬레이브 위치 정보 영역, 심볼 테이블 및 심볼 이름 문자열로 구성됩니다. left 그림과 같이 링크 후 아래 오른쪽 그림과 같이 실행 파일이 생성됩니다. 설명해야 할 것은 1) .bss 섹션이 대상 파일의 파일 공간을 차지하지 않고 2) 링크 후 가상 공간의 각 세그먼트의 주소를 결정하고 Linux에서는 기본적으로 0x080480000 주소에서 ELF 실행 파일을 할당합니다.

               

Linux에서 프로그램을 실행하려면 셸에서 ./a.out 명령을 실행하기 만하면됩니다. 그러면 운영 체제가 나머지 작업을 수행합니다. 하지만 운영 체제가 정확히 무엇을하고 어떻게 수행하는지 다음에 분석해 보겠습니다.

2. Linux 시스템의 모든 프로그램은 자체 가상 주소 공간이있는 프로세스 컨텍스트에서 실행됩니다. 셸이 프로그램을 실행할 때 부모 셸 프로세스는 부모 프로세스의 복사 본인 자식 프로세스를 생성합니다. 자식 프로세스는 execve 시스템 호출을 통해 로더를 시작합니다. 로더는 하위 프로세스의 기존 가상 스토리지 세그먼트를 삭제하고 새 코드, 데이터, 힙 및 스택 세그먼트 세트를 생성합니다. 새 힙 및 스택은 0으로 초기화됩니다. 가상 주소 공간의 페이지를 실행 파일의 페이지 크기 청크에 매핑하면 새 코드 및 데이터 세그먼트가 실행 파일의 내용으로 초기화되고 마지막으로 CUP 명령 레지스터가 시작될 실행 파일 항목으로 설정됩니다. 작업.

위의 작업을 수행 한 후 실제로 실행 파일의 실제 명령과 데이터는 메모리에로드되지 않습니다. 운영 체제는 실행 파일의 헤더에있는 정보를 통해서만 실행 파일과 프로세스의 가상 메모리 간의 매핑 관계를 설정합니다. 이제 프로그램의 입력 주소는 코드 세그먼트의 시작 주소 인 0x08048000입니다. CPU가이 주소에서 명령을 실행하려고 할 때 페이지 0x8048000 ~ 0x08049000 (페이지는 일반적으로 4K)이 빈 페이지임을 발견하여 페이지 오류로 간주합니다. 이때 운영 체제는 가상 주소 공간과 실행 파일 간의 매핑 관계에 따라 실행 파일에서 페이지의 오프셋을 찾은 다음 물리적 메모리에 물리적 페이지를 할당하고 가상 주소 간의 매핑을 설정합니다. 페이지와 실제 페이지, 마지막으로 파일의 페이지를 실제 페이지에 복사하면 프로세스가 다시 시작됩니다. 프로세스는 아래 그림에 나와 있습니다.

MMU는 Memory Management Unit의 약자입니다. 중국어 이름은 Memory Management Unit입니다. 중앙 처리 장치 (CPU) 에서 가상 메모리 및 물리적 메모리 를 관리하는 데 사용되는 제어 회로 입니다. 가상 주소물리적 주소매핑하는 역할도 담당 합니다. 하드웨어 메커니즘 제공 메모리 액세스 권한, 다중 사용자 및 다중 프로세스 운영 체제.

 

3.이 페이징 메커니즘은 여기서 이해하기가 더 어렵고 페이징 메커니즘에 관해서는이 기사의 초점이기도 한 Linux의 세분화 및 페이징 메커니즘을 언급해야합니다. 우리가 먼저

사진을보세요 :

이 그림은 분할 및 페이징 메커니즘을 거친 후 가상 주소를 물리적 주소로 변환하는 간단한 프로세스를 보여줍니다. 사실, 분할 메커니즘은 이전 제품과의 호환성을 위해 인텔 칩에 의해 유지되며,이 메커니즘은 Linux에서 약화됩니다. 아래에서 세분화 메커니즘을 간략하게 소개합니다.

세분화는 각 코드, 데이터 및 스택 영역을 분리하는 메커니즘을 제공하며 프로세서의 주소 지정 가능한 선형 주소 공간을 세그먼트라고하는 더 작은 보호 된 주소 공간 영역으로 나눕니다. 프로세서에서 실행중인 여러 프로그램이있는 경우 각 프로그램에 고유 한 세그먼트 세트를 할당 할 수 있습니다. 이때 프로세서는 이러한 세그먼트 간의 경계를 강화하고 프로그램이 다른 프로그램의 세그먼트에 액세스하여 프로그램 실행을 방해하지 않도록 할 수 있습니다. 지정된 세그먼트에서 바이트를 찾으려면 프로그램은 세그먼트 선택기와 오프셋을 포함하는 논리 주소를 제공해야합니다. 리얼 모드에서 세그먼트 값은 여전히 ​​주소의 일부로 간주 될 수 있으며 세그먼트 값 비트 XXXXh는 XXXX0h로 시작하는 메모리 세그먼트를 나타냅니다. 보호 모드에서는 세그먼트 값만 인덱스가되며 데이터 구조의 테이블 항목은 하나만 정의되며 테이블 항목은 세그먼트의 시작 주소, 제한, 속성 및 기타 내용을 정의합니다. 이 세그먼트 선택기는 cs 및 ds와 같은 레지스터에 저장됩니다.

세그먼트 선택기의 세그먼트 인덱스를 사용하여 GDT 또는 LDT 테이블에서 해당 세그먼트 설명자를 찾고 세그먼트 설명자에서 얻은 세그먼트 기본 주소를 오프셋에 추가하여 선형 주소를 형성합니다.

       선형 주소를 얻은 후 페이징 메커니즘이이를 물리적 주소로 변환하는 방법을 살펴 보겠습니다. 프로세서 페이징 메커니즘은 선형 주소 공간 (세그먼트가 여기에 매핑 됨)을 페이지로 분할 한 다음 이러한 선형 주소 공간 페이지가 물리적 주소 공간의 페이지에 매핑됩니다. 페이징과 세그먼트 화의 가장 큰 차이점은 페이징이 고정 길이 페이지 (일반적으로 4KB)에 사용된다는 것입니다. 세그먼트 화 된 주소 변환 만 사용되는 경우 물리적 메모리에 저장된 데이터 구조에는 장치의 모든 부분이 포함됩니다. 그러나 페이징이 적용되면 데이터 구조의 일부는 물리적 메모리에 저장되고 다른 부분은 디스크에 저장 될 수 있습니다.
      프로세서는 선형 주소를 물리적 주소로 변환하고 페이지 오류 예외를 생성하는 데 사용되는 정보는 스토리지 및 메모리의 페이지 디렉토리와 페이지 테이블에 포함됩니다. 또한 단순한 4K 물리적 주소 배열로 간주 될 수도 있습니다. 선형 주소의 상위 20 비트는 해당 페이지의 물리적 기본 주소를 선택하는 데 사용되는이 배열의 인덱스 값을 구성합니다. 선형 주소의 하위 12 비트는 페이지의 오프셋을 제공합니다. 페이지 테이블의 페이지 테이블 항목 크기는 32 비트입니다. 페이지의 물리적 기본 주소를 저장하는 데 20 비트 만 필요하므로 나머지 12 비트는 페이지 존재 여부와 같은 속성 정보를 저장하는 데 사용할 수 있습니다. 선형 주소가 참조하는 페이지 테이블 항목이 기존으로 표시되면 페이지에서 실제 주소를 가져옵니다. 항목이 없으면 해당 물리적 ​​페이지에 액세스 할 때 예외가 발생합니다.
       페이지 테이블은 2 ^ 20 (1M) 항목을 포함하고 각 항목은 4 바이트를 차지합니다. 테이블로 저장하면 최대 4MB의 메모리를 차지합니다. 따라서 메모리 사용량을 줄이기 위해 80x86은 2 단계 테이블을 적용합니다. 결과적으로 상위 20 비트 선형 주소에서 물리적 주소로의 변환도 각각 10 비트를 적용하는 두 단계로 나뉩니다.
       첫 번째 레벨 테이블을 페이지 디렉토리라고합니다. 4 바이트 길이의 2 ^ 10 (1k) 항목이있는 4k 페이지에 저장됩니다. 이러한 항목은 보조 테이블을 가리 킵니다. 선형 주소의 가장 높은 10 비트에 의해 인덱싱됩니다.
두 번째 레벨 테이블을 페이지 테이블이라고하며 길이도 1 페이지입니다. 선형 주소의 상위 10 비트는 두 번째 레벨 페이지 테이블에 대한 포인터를 얻고, 중간 10 비트는 해당 페이지 테이블에서 물리 주소의 상위 20 비트를 얻기 위해 추가됩니다. 주소의 하위 12 비트는 완전한 32 비트 물리적 주소를 구성하는 선형 주소의 하위 12 비트입니다. 세분화 및 페이징의 전체 프로세스는 다음 그림에서 볼 수 있습니다.

출처 : http://blog.csdn.net/yu132563/article/details/79446351

추천

출처blog.csdn.net/ccpit2b2c/article/details/113567103