0

내가 생각할 수있는 가장 작은 프로그램은 무기한 반복하는 프로그램입니다. FASM 그것은 다음과 같습니다엑티브 윈도우의 최소 메모리 사용 공간은

format PE console 
entry start 

section '.text' code readable executable 
start: 
    JMP start 

컴파일하고 명령 프롬프트에서 실행, taskmanger는 물리적 메모리의 1백8킬로바이트 소요보고합니다. Explorer에서 실행하면 116kb를보고합니다. 나는 유사한 프로그램을 nasm에서 시도했고 다른 링커 옵션을 시도했지만 108kb는 항상 가장 작은 메모리 풋 프린트였다.

이것은 활성 프로세스가 가질 수있는 절대 최소 메모리 풋 프린트입니까? 더 작게 갈 수 있습니까?

+0

어떤 링커를 사용하고 있습니까? 그리고 링커 옵션이 사용 되었습니까? – Anders

+0

이것은 Windows 버전과 매우 관련이 있습니다. 당신의 프로세스에서'ntdll.dll'과'kernel32.dll' (winbase에서 시작하는'kernelbase.dll')을 읽어 들였습니다. 초기화 된 다른 메모리 구조 ..이 ~ 100kb는 작은 exe가 아니라 시스템 dll, PEB, TEB, 스택 등을 실제 문제가 무엇입니까? – RbMm

+0

@ 틈새를 위해, 나는 단지 곧은 그것을 경련으로 맞췄다. nasm을 사용하여 GoLink와 Microsoft의 링커를 사용했습니다. 나는 힙/스택 크기를 가지고 놀았지만 그 최소값을 줄일 수는 없었다. – ChrisD

답변

1

이것이 실제로 유용한 운동인지는 모르지만 실제로 유용한 기능을 수행하는 응용 프로그램은 적어도 두 개의 Windows .DLL을로드하려고합니다. 그러면 아마도 메모리 사용량이 상당히 증가 할 것입니다.

108kb는 측정 한 응용 프로그램을 말할 때 많이 알려주지 않습니다.

메모리 풋 프린트는 Windows 버전에 따라 다릅니다. Windows 7 이상에는 3 개의 핵심 .DLL이 있습니다. ntdll, kernelbase 및 kernel32 이전 버전에는 ntdll 및 kernel32 만 있습니다. 64 비트 Windows에서 32 비트 응용 프로그램을 실행하는 경우 wow64, wow64cpu 및 wow64win이 프로세스에로드됩니다. Windows 2000을 제외한 모든 버전에서 로더는 자동으로 kernel32 및 종속 항목을로드합니다. 각 .DLL에는 피할 수없는 오버 헤드가 있습니다. PEB에로드 된로드 된 .DLL의 링크 된 목록이 있으며 다른 모든 페이지를 다른 프로세스와 공유 할 수있는 경우에도 로더가 각 .DLL (unless은 새로 설치하지 않은 Windows 설치)의 가져 오기 테이블을 수정합니다. 이론적으로

는 정말 "아무것도하지 않는".EXE에 통제권있는 유일한 것은 SizeOfStackCommitSizeOfHeapCommitoptional header의 회원하지만 스택의 기본은 보통 한 페이지입니다이며,이 값은 너무 설정 올림 그들보다 낮은 사람들은 당신에게 아무 것도주지 못할 것입니다. PEB의 크기와 TEB (s)을 제어 할 수 없으며 기본 프로세스 힙 (heap)을 생성하지 않아도된다고 생각하지 않습니다.

대부분의 사람들은 메모리 풋 프린트가 아닌 smaller file size에 집중하는 경향이 있습니다. 만들 수있는 가장 작은 PE EXE 파일은 32 비트 Windows에서 133 bytes입니다. 아무것도 가져 오지 않으면 97 바이트로 내려받을 수 있지만, kernel32에서 가져온 것으로 가정하기 때문에 Windows 2000에서는 실행되지 않습니다. 이 파일들은 해킹되어서 DOS 헤더 등 위에 PE 헤더를 놓습니다.

목표가 108kb 미만일 경우 Windows 95 또는 NT 4에서 97 바이트 EXE 파일을 시험해 봅니다. Windows 95 모든 주요 시스템 .DLL은 모든 프로세스에서 공유됩니다.

+0

감사합니다. 앞서 언급 한 것처럼 Window의 Task Manager를 사용하여 실제 메모리를 측정했습니다. 이것은 32 비트 Windows 10에 있습니다. – ChrisD

+0

Task Manger는 수년 동안 서로 다른 열의 의미를 변경 했으므로 사용하기에 가장 좋은 도구는 아닙니다. SysInternals/TechNet에서 Process Explorer 및 VMMap을 사용해보십시오. – Anders