2012-08-23 4 views
4

방금 ​​ARM 아키텍처/어셈블리 학습을 마쳤습니다. SP 레지스터가 데이터를 저장할 다음 메모리 위치의 주소를 보유하고 있다면 힙의 주소는 무엇입니까? 예를 들어 C++에서 힙에 객체를 선언하면 (예 : MyObj example = new MyObj();) 어셈블리의 모양은 무엇이며, 의미에서 어디에서 example인지 알 수 있습니까?어떤 레지스터가 힙을 가리 킵니까?

+0

이것은 컴파일러의 구현 세부 사항입니다. http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf –

+0

레지스터는 CPU가 알아야 할 것에 대한 것입니다.CPU에는 스택을 사용하여 자동으로 작업을 수행하는 특별한 하드웨어가 있기 때문에 (예를 들어 인터럽트 발생시 컨텍스트 저장) SP 레지스터가 있습니다. CPU가 힙에 대해 알지 못하거나 걱정하지 않습니다. – TJD

+0

힙은 하드웨어가 아니라 스택입니다. 힙 내의 힙 및 할당은 언어 및 라이브러리와 관련이 있습니다 (하드웨어와 관련 없음). –

답변

5

이 컨텍스트에서 스택은 OS/EABI에서 제공하는 하위 수준 구조입니다. 그래서 기존의 등록기가 있습니다. 그러나 힙은 OS가 제공하는 상위 레벨 구조입니다. 따라서 앱을 관리하고 게임하는 것은 앱 및 OS와의 계약에 따라 다릅니다. 어셈블리 측면에서 레지스터를 통해 일부 주소의 역 참조와 함께 해당 힙을 사용하게됩니다.

+1

좋아, CPU 레벨에서 정말 힙 개념이 없다고 말하는거야? – Celeritas

+0

예, 정확하게 그 것입니다. 재생중인 모든 메모리 (읽기/쓰기)가 허용되어야합니다. 그것이 OS가 도움이되는 곳입니다. 여러분은 malloc에 ​​의해 어떤 메모리를 할당하거나 이미 실행 가능한 바이너리에서 필요한 메모리 양을 OS에 알려줍니다. 그런 다음 해당 메모리를 사용하면 재생할 수있는 영역의 주소가 들어있는 레지스터를 역 참조하기 시작합니다. – auselen

+0

ARM에는 스택을위한 실제 하드웨어 지원과 같은 것도 없습니다. x86과 매우 다른 점입니다. CPU 자체는 실제로 "스택"이 무엇인지 알지 못합니다. 필요한 경우 커널이 스택을 확장해야하기 때문에 스택 영역에 OS 지원도 필요합니다. –

5

SP 레지스터는 일반적으로 스택 내의 현재 위치를 추적하는 데 사용됩니다. 이것은 스택을 항상 가리킬 필요가 있음을 의미합니다.

힙에 대해서도 마찬가지입니다. 변수에 액세스해야하는 경우 해당 변수의 주소는 포인터 또는 앱의 다른 메모리 참조에 저장됩니다. 주소가 필요할 때 레지스터를 사용하여 참조를 만들 수 있습니다. 그러나 어떤 레지스터가 세부 사항은 컴파일러에 의존적 일뿐만 아니라 동일한 컴파일러에서 코드가 최적화 된 후 사용할 수있는 레지스터에 따라 달라질 수 있습니다.

+0

레지스터 15 (또는 ARM이 무엇이든간에) SP가 왜 그런지 생각해보십시오. 왜 등록하지 않니? 그것은 얼마나 빠릅니다. – Celeritas

+0

왜 SP가 아닌가요? 스택에는 호출 및 반환의 영향을받는 전용 레지스터가 필요하며 해당 레지스터는 SP입니다. –

+0

하지만 차이점은 무엇입니까? 스택에는 전용 레지스터가 필요하지만 힙에는 필요하지 않습니다. – Celeritas

0

ARM의 EABI에서 R13 (SP)은 전체 내림차순 스택에서 마지막으로 푸시 된 데이터를 가리 킵니다. 그러나 항상 그 코드를 가리킬 필요는 없습니다. 그러한 코드는 합법적 일 수 있습니다 :

우리 프로그램에서 액세스 할 수있는 유효한 메모리 위치를 가리 키도록 r0을 고려해야합니다.

stmfd r0!, {r1-r12, sp, lr} 
ldr r1, [r0] 
mov r2, lr 
sub lr, sp, #4 
str sp, [r4] 
add sp, lr, #4 
ldmfd r0!, {r1-r12, sp, pc} 

이 이해가되지 않습니다, 그러나 그것은 단지 포인트가 안전하게 SP, LR를 다시로드 할 수 있으며 다른 모든 수신자가 레지스터를 저장 한 경우 복원 기억하면서, 당신이 원하는만큼을 긁어 수 있었다이다 당연히 호출자에게 반환하기 전에 값.

스택과 힙이 반드시 동일하지 않을 수도 있습니다. 힙은 malloc/자유형 구조에 대한 상위 수준 추상입니다. 반면 스택은 함수 인수를 전달하는 데 충분하지 않거나 사용되지 않을 때 호출 수신자 저장에 사용됩니다 , 데이터 구조와 상상할 수있는 모든 것이 있지만 포인터를 영역에 할당하고 완료 한 후에는 모든 데이터를 직접 추적해야하기 때문에 스택을 관리하기가 조금 더 어렵습니다.

일반적으로 프로그램 및 환경에 따라 의도적으로 비 스크래치 레지스터를 손상시키고 제거하는 등 다양한 해킹 및 최적화 작업을 수행 할 수 있지만 호출자 함수에서이를 관리해야합니다. 후속 함수 호출에서 긁힐 레지스터를 알고 있으므로 EABI는 다른 프로그램으로 컨트롤을 넘겨 주거나 인수 할 때만 의미가 있습니다. CPU 시간에 원하는대로 할 수 있습니다. 다음과 같이 깨끗하게 남겨 두십시오. 네가 그곳에 들어가기 전에 그랬다.

1

때때로 프로세서 하드웨어가 코드를 실행하지 않고 SP를 직접 수정해야하기 때문에 (스택 인터럽트 또는 예외) 스택 포인터에 대한 특수 레지스터가 필요합니다. 힙에는 필요하지 않으므로 힙을 가리 키기 위해 특수 레지스터를 사용할 필요가 없습니다. 런타임시 OS는 특정 코드 덩어리가 힙에 물건을 저장할 수있는 위치를 결정하고, 모든 레지스터를 사용하여 해당 주소를 보유 할 수 있습니다.

관련 문제