커널 mmap 작업을 위한 메모리 크기

커널 mmap 작업을 위한 메모리 크기

나는 Linux가 파일을 주 메모리에 mmap하는 방식(제 맥락에서는 실행을 위한 것이지만 mmap 프로세스는 쓰기 및 읽기에도 동일하다고 생각합니다)과 그것이 사용하는 크기에 관심이 있습니다.

그래서 나는 Linux가 일반적인 4kB 페이지 크기의 페이징을 사용한다는 것을 알고 있습니다(커널에서 이 크기를 어디에서 찾을 수 있습니까?). 그러나 이것이 할당된 메모리에 대해 정확히 무엇을 의미하는가: 몇 킬로바이트 크기의 바이너리 파일(예: 5812B)이 있다고 가정하고 이를 실행합니다. 커널에서는 어떤 일이 발생합니까? 2*4kB를 할당한 다음 5812B를 해당 공간에 복사하여 페이지 2에서 3KB 이상의 주 메모리를 낭비합니까?

페이지 크기를 정의하는 커널 소스 코드의 파일을 아는 사람이 있다면 좋을 것입니다.

두 번째 질문도 간단합니다. 파일 크기를 5812B로 가정합니다. 이 크기는 인덱스 노드에서 직접 얻은 것입니까?

답변1

실행 파일 크기와 메모리 크기 사이에는 직접적인 관계가 없습니다. 바이너리가 실행될 때 어떤 일이 발생하는지에 대한 간략한 개요는 다음과 같습니다.

  1. 커널은 파일을 구문 분석하고 여러 부분으로 나눕니다. 일부 섹션은 메모리의 별도 페이지에 직접 로드됩니다. 일부 부분은 전혀 로드되지 않습니다(예: 디버깅 기호).
  2. 실행 파일이 동적으로 링크되면 커널은 동적 로더를 호출하고 필요한 공유 라이브러리를 로드하며 필요에 따라 링크 편집을 수행합니다.
  3. 프로그램은 코드 실행을 시작하며 일반적으로 데이터를 저장하기 위해 더 많은 메모리를 요청합니다.

실행 파일 형식, 연결 및 실행 파일 로드에 대한 자세한 내용은 다음을 참조하세요.링커 및 로더저자: 존 R. 레빈.

5kB 실행 파일에서는 헤더를 제외한 모든 것이 메모리에 로드되어야 하는 코드나 데이터일 가능성이 높습니다. 적어도 한 페이지, 어쩌면 두 페이지의 실행 가능한 코드가 있고, 스택을 위한 적어도 한 페이지, 아마도 한 페이지 또는 힙(기타 데이터)을 위한 한 페이지, 그리고 공유 라이브러리에서 사용하는 메모리가 있을 것입니다.

Linux에서는 실행 파일의 메모리 맵을 확인할 수 있습니다 cat /proc/$pid/maps. 이 형식은 다음 문서에 설명되어 있습니다.proc(5)맨페이지도 참조하세요.Linux /proc/id/maps 이해.

답변2

예: 결국 두 개의 4K 페이지가 생성됩니다. 데이터는 요청 시 로드되므로 두 번째 페이지를 참조하는 항목이 없으면 메모리에 로드되지 않습니다.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

이 값을 변경하지 말고 아무 것도 작동할 것으로 기대하지 마십시오.

예, 파일 크기는 ext2/3 inode에 저장됩니다.

답변3

정의 부분의 경우 Intel 아키텍처 2.6.38~ish 커널에서:

아치/x86/include/asm/page_types.h:

/* PAGE_SHIFT는 페이지 크기를 결정합니다 */

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)

관련 정보