Stack Alignmnet in x86-64

c4fiber·2024년 1월 3일
0

SW사관학교 정글7기

목록 보기
46/49

왜 공부하게 되었나?

https://velog.io/@c4fiber/pintOS-project-2-syscall 을 공부하다가 우연히 FAQ에서 stack alignment에 대한 내용을 봤다.


16byte Alignment

x86-64 에는 calling convention이 존재한다.
https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI

이에 따르면 함수 호출(call) 직전의 stack의 상태에서 rsp의 값이 16의 배수여야 함을 알리고 있다.

alignment는 performance를 위한 권장사항이라고 한다.


Intel® 64 and IA-32 Architectures Software Developer Manuals

(Vol.1 4-1) 프로그램과 자료 구조(특히 stack)의 성능을 위해서 alignment를 수행해야 한다고 나와있다.


(Vol. 3A 6-20) IA-32e mode에서는 stack frame을 생성하기 전 RSP의 16byte alignment를 요구한다


(Vol.1 5-17) 몇몇개의 명령어는 16byte alignment를 강제한다.
그중 하나는 MOVAPS 명령어 이다. 부동소수점 값을 복사하기 위한 명령어인데
XMM 레지스터를 사용하고, 정렬된 4개의 packed floating-point values를 이동시킨다고 나온다.


운 좋게 들어맞았던 argument passing

https://velog.io/@c4fiber/pintOS-project-2-argument-passing 을 수행할 때는 운이 좋았습니다.

테스트를 통과하기 위해서 8bytes 정렬만 고려하고 코드를 작성했는데
이미 RSP+8 의 값이 0x4747FFD0 로 16byte 정렬이 되어있었다.


이대로 진행해도 상관없을까?

pintOS에서는 XMM 레지스터를 사용하지 않고, 부동소수점 연산을 지원하지 않습니다.

업로드중..

MOVAPS 같은 부동소숫점 연산 명령어를 사용하지 않으므로 8byte alignment만 수행해도 프로그램에 문제는 없습니다.


참고자료

Intel® 64 and IA-32 Architectures Software Developer Manuals: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

pintos-kaist document: https://casys-kaist.github.io/pintos-kaist/project2/introduction.html

profile
amazing idiot

0개의 댓글