메모리 정렬제한에 대해서...
글쓴이: gurumong / 작성시간: 월, 2008/06/09 - 11:04오후
메모리 정렬제한에 대해서...
어셈블리어를 공부하다가 메모리 정렬제한이라는 것을 알게되었습니다
이 정렬제한이라는것을 어기게되면
CPU가 임의번지에 바로 접근하지 않고 먼저 4의 배수 번지에 접근을 하기 때문에
데이터를 두번에 걸쳐서 읽게되고 그때문에 성능이 많이 나빠진다고 하는데
왜 이렇게 4의 배수로만 접근을 해서 필요한 데이터를 잘라내기를 하는지 궁금합니다
한참이나 웹서칭을 해서 알게된것은 그렇게 하는것이 회로를 구현하기가 더 간단하다고 하는데
접근하고자 하는 임의주소에서 그보다 빠른 4의 배수 번지를 계산하고
읽어들인 4바이트중 몇번째 부터가 데이터의 시작인지 계산하는것이 더 부하가 크지 않나요?
제가 알지 못해서 이런 생각을 하는것이겠지만...ㅜ.ㅜ 도무지 알수가 없습니다
Forums:
저도 궁금하네요.
삭제
가상의 machine, ASDF가
가상의 machine, ASDF가 있다고 가정해 봅시다. 이 machine은 32-bit addressing을 하고, word (32-bit) 단위로 load/store를 제공합니다. machine instruction은 ir이란 레지스터에 저장되고, load 명령은 메모리의 한 word를 읽어서 레지스터 r0 또는 r1에 그 내용을 넣어 줍니다. 또한 모든 명령은 32-bit로 표현합니다.
load 명령은 32-bit로 이루어져 있으며, 다음과 같은 형태를 지닙니다:
이 때, bit 0은 1(load를 나타냄)이며, bit 1이 0일 경우 r0을, 1일 경우 r1을 뜻합니다. 그리고 나머지 30개의 비트는 메모리의 주소를 나타냅니다.
메모리는 32-bit이므로, byte단위로 addressing할려면 32bit가 필요합니다. 하지만, 위 load 명령에서는 한 명령의 길이가 32 bit이고, bit 0은 opcode를 나타내고 bit 1은 target register를 나타내므로, 실제 주소를 표현할 수 있는 bit의 수는 30 bit입니다.
따라서 32-bit의 주소를 가진 메모리 (최대 4GB)를 모두 addressing 하기 위해서 이 30bit 주소에 4를 곱해서 나타냅니다. 결국, 실제 메모리 주소는 load 명령의 XXXX로 표기한 값에 4를 곱해야 나옵니다. 그렇다면 load 명령으로 접근할 수 있는 실제 메모리 주소는 항상 4의 배수가 된다는 결론이 나옵니다.
실제 IR의 상위 30bit (bit 2에서 bit 31까지)의 배선은 RAM의 address pin (bit 2에서 bit 31까지)에 일대일로 연결되어 있으며 RAM의 address pin, bit 0과 bit 1은 항상 0으로 연결되어 있습니다.
이런 설계를 가진 ASDF는 무조건 4의 배수로 된 주소에서 한 word (32-bit)만 레지스터로 읽어 올 수 있습니다.
그렇다면 다음과 같은 상황에 대해 처리하는 것도 생각해 봐야 합니다:
4 byte로 align되지 않는 주소에서 한 word를 읽는 경우.
아쉽게도 제가 상상한 ADSF 머신은 이런 기능이 없습니다. 하지만 대부분 현존하는 processor는 이런 경우도 해결책을 제공합니다. (processor에 따라 약간씩 다름)
이 경우, 대부분 RISC processor는 bus error(SIGBUS)를 발생시킵니다. 즉, 4 바이트 배수가 아닌 주소에서 word 단위로 읽어올 수 없습니다. 어떤 processor에서는 이 경우에도 제대로 읽어 올 수 있도록 설계됩니다. 이 경우, 여러가지 옵션이 있는데, 첫째, load instruction이 모든 address를 다 지정할 수 있도록 32-bit address를 포함하도록 합니다. (이 경우 load instruction의 길이는 더 이상 32-bit가 아닙니다. opcode 부분을 포함해야 되기 때문) 이 경우 instruction의 길이가 가변적이 되거나, 아니면 64-bit 고정이 되겠지요. 또 다른 방식으론, load 명령을 두 번 발생시켜서, 두 개의 word를 읽게 한 다음, 절반씩 꺼내어 합치는 것입니다. 이 경우 4의 배수로 된 주소에서 꺼내는 것보다 훨씬 느리게 되지만, SIGBUS를 걱정할 필요가 없습니다. 어떤 RISC 머신은 설정에 따라 bus error를 낼 수도 있고, 바로 앞에서 설명한 것처럼, 두번의 load를 통해 읽어오게 할 수도 있습니다.
제가 설명한 내용이 모든 processor에 그대로 적용되는 것은 아니지만, 왜 특정 processor가 word 단위로 값을 읽을 때, alignment rule에 따라야 하는지, 설명은 될 것이라고 생각합니다.
이 분야의 다른 내용이나 좀 더 자세한 내용은 computer architecture에 관한 책을 읽으면 알 수 있습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
두분 답변 정말로 감사드립니다 (__)
질문은 몇줄 되지 않는데
이렇게 긴 답변을 써주셔서 미안하기까지 하네요 T.T
몇일간 웹서칭을해서도 알지못했는데
정말로 감사드립니다 (__)
댓글 달기