방금 ARM 아키텍처/어셈블리 학습을 마쳤습니다. SP 레지스터가 데이터를 저장할 다음 메모리 위치의 주소를 보유하고 있다면 힙의 주소는 무엇입니까? 예를 들어 C++에서 힙에 객체를 선언하면 (예 : MyObj example = new MyObj();
) 어셈블리의 모양은 무엇이며, 의미에서 어디에서 example
인지 알 수 있습니까?어떤 레지스터가 힙을 가리 킵니까?
답변
이 컨텍스트에서 스택은 OS/EABI에서 제공하는 하위 수준 구조입니다. 그래서 기존의 등록기가 있습니다. 그러나 힙은 OS가 제공하는 상위 레벨 구조입니다. 따라서 앱을 관리하고 게임하는 것은 앱 및 OS와의 계약에 따라 다릅니다. 어셈블리 측면에서 레지스터를 통해 일부 주소의 역 참조와 함께 해당 힙을 사용하게됩니다.
좋아, CPU 레벨에서 정말 힙 개념이 없다고 말하는거야? – Celeritas
예, 정확하게 그 것입니다. 재생중인 모든 메모리 (읽기/쓰기)가 허용되어야합니다. 그것이 OS가 도움이되는 곳입니다. 여러분은 malloc에 의해 어떤 메모리를 할당하거나 이미 실행 가능한 바이너리에서 필요한 메모리 양을 OS에 알려줍니다. 그런 다음 해당 메모리를 사용하면 재생할 수있는 영역의 주소가 들어있는 레지스터를 역 참조하기 시작합니다. – auselen
ARM에는 스택을위한 실제 하드웨어 지원과 같은 것도 없습니다. x86과 매우 다른 점입니다. CPU 자체는 실제로 "스택"이 무엇인지 알지 못합니다. 필요한 경우 커널이 스택을 확장해야하기 때문에 스택 영역에 OS 지원도 필요합니다. –
SP 레지스터는 일반적으로 스택 내의 현재 위치를 추적하는 데 사용됩니다. 이것은 스택을 항상 가리킬 필요가 있음을 의미합니다.
힙에 대해서도 마찬가지입니다. 변수에 액세스해야하는 경우 해당 변수의 주소는 포인터 또는 앱의 다른 메모리 참조에 저장됩니다. 주소가 필요할 때 레지스터를 사용하여 참조를 만들 수 있습니다. 그러나 어떤 레지스터가 세부 사항은 컴파일러에 의존적 일뿐만 아니라 동일한 컴파일러에서 코드가 최적화 된 후 사용할 수있는 레지스터에 따라 달라질 수 있습니다.
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 시간에 원하는대로 할 수 있습니다. 다음과 같이 깨끗하게 남겨 두십시오. 네가 그곳에 들어가기 전에 그랬다.
때때로 프로세서 하드웨어가 코드를 실행하지 않고 SP를 직접 수정해야하기 때문에 (스택 인터럽트 또는 예외) 스택 포인터에 대한 특수 레지스터가 필요합니다. 힙에는 필요하지 않으므로 힙을 가리 키기 위해 특수 레지스터를 사용할 필요가 없습니다. 런타임시 OS는 특정 코드 덩어리가 힙에 물건을 저장할 수있는 위치를 결정하고, 모든 레지스터를 사용하여 해당 주소를 보유 할 수 있습니다.
- 1. Creediting이 iTunes 계정을 가리 킵니까?
- 2. Visio의 서버 연결 다이어그램 - 화살표는 어떤 방향을 가리 킵니까?
- 3. 삭제를 사용한 후 포인터가 스택 또는 힙을 가리 킵니까? C++ 코드 줄에서
- 4. 어떻게 도메인 이름을 장고 URL로 가리 킵니까?
- 5. 문자열 변수 방향으로 datarow를 가리 킵니까?
- 6. 이 줄은 파일 구조에서 무엇을 가리 킵니까?
- 7. mod_rewrite를 사용하여 특정 디렉토리를 어떻게 가리 킵니까?
- 8. 헤드가 항상 리모컨에서 마스터를 가리 킵니까?
- 9. 목록에서 Scheme의 마지막 요소는 무엇을 가리 킵니까?
- 10. 왜 아파치는/var/www를 가리 킵니까?
- 11. cloudbees & ESAPI - 어떻게 ESAPI 디렉토리를 가리 킵니까?
- 12. 시트를 복사하고 자체 링크를 가리 킵니까?
- 13. solrj에서 다른 데이터 디렉토리를 가리 킵니까?
- 14. 동일한 힙을 공유하는 두 프로세스
- 15. 가상 메소드에 대한 위임은 어디에서 (기본/파생)을 가리 킵니까?
- 16. 301 리디렉션 여기서 2 개의 도메인은 동일한 IP를 가리 킵니까?
- 17. 시퀀스가 왼쪽에서 오른쪽으로 평가 순서가있는 언어를 가리 킵니까?
- 18. 페이지 탭 응용 프로그램에 대한 친구 초대장을 가리 킵니까?
- 19. 줌라를 어떻게 설정할 수 있습니까? 기본적으로 index.php를 가리 킵니까?
- 20. 작업 단위 (UOW)가 서비스 계층 또는 저장소를 가리 킵니까?
- 21. 왜 Tomcat STDOUT은 항상/dev/null을 가리 킵니까?
- 22. 하위 폴더에 codeigniter를 설치하고 기본 사이트를 가리 킵니까?
- 23. JVM 명령어 'main'메소드의 ALOAD_0이 'this'대신 'args'를 가리 킵니까?
- 24. Netbeans 빌드에 실패했습니다 (어떻게 새 Plugin을 가리 킵니까?)
- 25. 도메인 마스킹/웹 응용 프로그램의 디렉토리를 가리 킵니까?
- 26. OpenGL/SharpGL - 직교 투영의 한 면만을 가리 킵니까?
- 27. Apple App Store의 응용 프로그램 업로드 단계에서 어떤 파일이나 디렉토리를 가리 킵니까?
- 28. 레지스트리의 Win7 레지스터가 실패했습니다.
- 29. 장치에 레지스터가 있습니까?
- 30. 세그먼트 레지스터가 런타임에 변경됩니까?
이것은 컴파일러의 구현 세부 사항입니다. http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf –
레지스터는 CPU가 알아야 할 것에 대한 것입니다.CPU에는 스택을 사용하여 자동으로 작업을 수행하는 특별한 하드웨어가 있기 때문에 (예를 들어 인터럽트 발생시 컨텍스트 저장) SP 레지스터가 있습니다. CPU가 힙에 대해 알지 못하거나 걱정하지 않습니다. – TJD
힙은 하드웨어가 아니라 스택입니다. 힙 내의 힙 및 할당은 언어 및 라이브러리와 관련이 있습니다 (하드웨어와 관련 없음). –