본문 바로가기
반응형

시스템 반도체48

Arm SWAP Instruction ( 메모리 접근, SWP, MESI protocol, LDREX, STREX ) Memory access 중에 swap instruction을 보자. SWAP Instruction swp r0, r1, [r2] 이런 식으로 사용하는데, 동작은 2가지로 나눠 볼 수 있다. 1. r2가 가지고 있는 주소의 데이터를 r0에 저장하고 2. r1의 값을 r2의 메모리 값에 저장한다. 즉 swapping 동작을 수행한다. 이런 동작이 왜 필요할까? 자원을 공유하기 위해서이다. 굉장히 중요한 동작인데 예를 들어, 하나의 프린터를 여러 컴퓨터가 공유한다고 할 때, 동시에 사용할 수 없기 때문에 사용 가능한지 안 한지 계속 확인해야 한다. 이런 부분을 확인하려면 메모리에 "Lock"이라는 부분을 확인해야 한다. 즉, Lock의 정보를 불러와서 확인하고 업데이트해야 하기 때문에 STR, LDR을 사용.. 2022. 4. 7.
Arm Memory Map ( 메모리 맵, 메모리 공간 분할, I/O ) I/O CPU는 어떻게 I/O device의 정보를 얻고 변경할까? 메인 메모리에선 ldr, str과 같은 명령어를 사용하여 정보를 얻고 업데이트하는 것처럼 I/O 장치에서는 어떻게 정보를 얻는지 궁금증이 생긴다. Arm에선 메모리든, I/O 장치든 모두 같은 명령어를 사용한다. 무슨 말이냐 하면, I/O 장치에 접근할 때도 메모리 접근 명령어와 마찬가지로 ldr, ldm을 사용하고, 업데이트할 때도 str, stm을 사용한다. 어떻게 가능할까?? 바로 Memory map을 이용하기 때문에 가능하다. Memory Map Arm CPU에서 32bit를 제공한다고 하면, 메모리 공간은 2의 32승 byte의 공간을 가진다. 말 그대로 공간이다. 어떤 것도 배정되지 않은 빈 공간을 가진다. 이 공간에 메인 메.. 2022. 4. 7.
Arm Memory Access instruction (메모리 접근 명령어, LDR, SRT, LDM, STM, Stack operation) Memory Access instruction - single-register transfer : 하나의 레지스터를 읽고 쓰는 명령어 - muitiple-register-transfer : 2개 이상의 레지스터를 한 번에 읽고 쓰는 명령어 Single-Register Transfer 1. LDR - 메모리로부터 주소를 읽어 레지스터에 저장하는 것이다. 단위는 word = 4byte이다. + 하나의 byte만 얻고싶을 땐 LDRB나 LDRSB를 사용한다. 근데 레지스터는 word 단위로 돼 있는데 byte만 가져오면 사이즈가 안맞다 이럴 땐 어떻게 해야 할까? 사이즈에 맞게 크기를 맞춰줘야 하는데 LDRB는 zero extensiong하고 LDRSB는 sign extenstion한다. 예를 들면, 아래와 .. 2022. 4. 7.
Arm Branch instruction ( 분기 명령어, B, BL ) Branch instruction signed_immed 에는 24 bit로 얼마나 떨어져 있는 곳으로 갈지 정한다. 예를 들어 아래 코드를 봤을 때, foo에서 PC인데 foo까지 얼마나 떨어졌나 보면, 4칸 떨어져 있다. 그래서 우리는 4를 인코딩해서 24bit로 채워 넣는다고 생각한다. 하지만 Arm은 조금 다르게 PC + 8가 기준이 된다. 즉, PC +8에서 얼마나 떨어졌나를 가즌으로 24bit을 채운다. 아래의 경우에는 2칸 떨어져 있으니, 2를 24bit에 넣는다. 왜 이럴까?? piplined을 생각하면 된다. 5 stage라고 했을 때. b foo의 E단계에서 이동해야 한다는 걸 알았을 때는 이미 PC + 8이 된 다다음 명령어의 Fetch가 된 상태라 그렇다. 1. B ( branch).. 2022. 4. 7.
Arm Aruthmetic instruction ( 산술 명령어, ADD, ADC, SUB, SBC, RSB, RSC, CLZ ) Data processing 중 하나인 Aruthmetic instruction을 알아보자. Aruthmetic 1. ADD - Rd = Rn + N 굉장히 단순하다. adds는 연산이 끝난 후에 nzcv flag를 업데이트한다는 차이가 있다. add r0, r1, r2 ; r0 = r1 +r2 add r0, r1, #256 ; r0 = r1 + 256 adds r0, r2, r3, lsl#1 ; r0 = r2 + (r3 2022. 4. 7.