오랜만에 ARM Cortex에 대한 포스팅을 하네요.

지난번에는 ARM Corex-M7의 Block들의 의미와 기능에 대해서 공부를 했다면

이제 설계 엔지니어가 Cortex를 Control하기 위해 알아야될 것들에 대해서 정리를 해나가려고 합니다 :)

 

지난번에 봤듯이 Cortex 내부에는 정말 여러가지 Block들, 여러가지 기능들이 존재했죠.

그때 본 하나하나가 모두 중요한 요소겠지만 이러한 Cortex를 Control하는 입장에서는 어떤 요소가 가장 중요할까요?

음,, 저는 아마도 레지스터와 메모리일 것 같아요. 

이러한 Cortex를 자신의 회로에 넣고 Control하는 사람의 입장에서는 말이죠.

또, Cortex의 모든 과정은 메모리로부터 데이터를 레지스터로 올리고, 연산을 하고, 다시 레지스터에서 데이터를 메모리에 저장하는 방식이다보니 더욱 그런 생각이 듭니다. ㅎㅎ

 

그래서 이번 포스트에서는 Cortex 내부에 존재하는 레지스터에 대해 정리해보도록 할게요.

 

- Register

Cortex-M7 Block 중 DPU를 소개할 때, 내부에 Register file이 존재한다고 했었는데요.

그것이 바로 이번 포스트의 전부에요.

Register file

자, 위의 사진이 저번에 잠깐 등장했던 Register file이에요.

그때의 기억을 잠깐 더듬어보면 이 Register는 Core 내부에 존재하기 때문에

Core가 사용할 수 있는 저장 매체중 가장 빠른 속도를 자랑합니다.

오호. 그러면 이러한 레지스터들이 실제 Core가 instruction을 수행하는데 있어 압도적으로 많이 쓰일테고 이 놈들을 잘 알아둬야겠네요!

 

그림을 살펴보니.. 먼저 R0부터 R15까지 레지스터가 주르륵 있고.. xPSR(Program Status Register)는 잠시 제쳐둘게요!

R13부터 R15는 각각 SP, LR, PC라고 이름이 따로 붙어 있는 것도 보이고 SP_process, SP_main도 보입니다.

그럼 R0부터 내려가면서 살펴볼게요!

 

① 범용레지스터(General Purpose Register)

R0~R12General Purpose Register, 범용 레지스터에요. 

Core가 내부적으로 업무를 처리 중 데이터를 일시적으로 저장하고 하는 일반적인 목적을 지닌 레지스터들입니다.

정확히 어떤식으로 쓰이는지는 이후에 레지스터를 어떤 식으로 사용할 것인지에 대한 규정이 나와있는 ARM Procedure Call을 다루면서 설명해볼게요.

 

암튼.. 근데 그림을 보니 R0~R7을 low register로 R8~R12를 high register로 굳이 따로 구분을 해줬는데

low register에는 ARM instruction(32-bit), Thumb instruction(16-bit) 모두 접근할 수 있지만

high register에는 ARM instruction(32-bit)만 접근할 수 있다 정도로 알아두면 될 것 같습니다.

 

② R13(SP)

R13부터는 범용레지스터와 다르게 그 목적이 조금 특화되어있어요. 무슨 목적일까요?

R13은 SP, Stack Pointer로 현재 Stack이 어디까지 쌓였는지를 나타내는 포인터입니다.

Stack Poinster(R13)

Stack에 대해 생소하신 분들이 있을 수 있어 간단히 설명하고 넘어가자면

Memory는 Stack과 Heap, Code, Data 영역으로 나눌 수가 있는데요~

Stack 영역같은 경우에는 함수 호출 시에 생성되는 지역변수나, 매개변수등이 하나씩 차곡차곡 쌓이게 되는 공간이라고 보시면 됩니다. 

아마 Stack 부분은 추후에 자세히 설명할 기회가 있을 것 같은데 확실치 않으니...

빠른 시일내에 컴퓨터구조 카테고리에 업로드 해보도록 할게요^_^

여기서는 R13 Stack의 위치를 나타내는 Stack Pointer다!는 확실히 기억하고 넘어갑시다.

 

아 참, 근데 SP에 SP_Process랑 SP_Main이 보이는데 저건 뭘까요? 

기억하실지 모르겠지만 앞전 포스트에서 설명드렸었던 Cortex-M7의 특징 중 Banked Stack Pointer only라는 특징이 있었어요.

이게 바로 그 특징인데, Stack Pointer를 동작모드별로 독립적으로 사용하려는 목적으로 두개로 분리(Banked)해 놓은겁니다.

 

그럼 또 동작모드는 무엇이냐?!

Cortex-M7에는 Handler Mode(Privilege, Unprivilege), Thread Mode(Privilege)의 동작모드가 존재하는데요.

Privilege 모드에서는 SP_Main을 Unprivilege 모드에서는 SP_Process를 사용한답니다!

동작모드 부분도 추후 따로 설명을 해야겠군요. ㅠ

부족한 점이 많습니다 :)

 

③ R14(LR)

다음으로 R14, Link Register입니다.

이전에 Branch에 관한 설명을 드린적이 있죠. 그때 썼던 사진을 좀 살펴볼까요?

Branch

순차적으로 address를 4씩 높이며 프로그램이 수행되다가 Branch를 할때면 address를 멀리 jump 해버려야 해요.

위 상황의 경우 main()을 수행하다가 func1()을 수행하기 위해 멀리 jump를 했어요.

그럼 이후에 func1()이 끝나면 다시 main()으로 돌아와야 할텐데 어떻게 돌아올까요?

바로 이럴때 다시 돌아올 지점을 기억해 놓는 레지스터가 R14, Link Register입니다. 

R14(LR)가 func1()(0x00000400주소)으로 branch하기 이전에 0x0000010C 다음 주소인 0x00000110을 기억해 둔다면 func1()을 마치고 R14(LR)이 기억중이던 곳으로 돌아오기만 하면 main()작업을 마저 이어서 할 수 있겠죠.

 

정리하자면 R14(LR)Main Program에서 동작하다 Subroutine으로 Branch할 때, Subroutine이 끝나고 돌아올 Address를 저장하는 레지스터라고 볼 수 있겠네요.

 

④  R15(PC)

오늘 살펴볼 마지막 레지스터인 R15는 Program Counter입니다. 

R15(PC)는 공부할 때, 다음에 실행할 명령어의 주소 값을 저장 해놓는다. 현재 실행중인 명령어의 주소값을 저장한다. 등 좀 헷갈렸던 기억이 있습니다. 

저희는 파이프라인을 배웠으니 깔끔히 정리합시다.

Program Counter는 파이프라인(Fetch-Decode-Execute) 중 명령어를 Fetch해 온 주소를 나타낸다!

Pipeline

그럼 위 CC4 시점에 PC값은 빨간동그라미 쳐놓은 instruction을 Fetch해온 주소이겠죠?

 


기본적인 레지스터들에 대한 설명은 여기까지이고 이후에 Special Register들에 대해 살펴볼게요.

흠 .. 글을 쓰다보니 뭔가 Stack이라던지 동작모드 등 .. 설명을 군데군데 안한 것이 좀 많은 것 같네요.

얼른 이 구멍들을 매꾸고 다음 포스트를 쓰도록 해야겠어요 ㅎ_ㅎ

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기