-
마크다운변환 : 20190905
-
출처 : http://cafe.naver.com/elp/134
- 해당 게시물을 보기좋게 편집하였습니다.
MMU 와 MPU 차이
MMU 와 MPU | 소프트웨어 강좌 (2004.04.29 12:20 ) | cslee03
MMU와 MPU의 차이점에 대해서 궁금해 하시는 분들이 계신것 같아 몇자 적어 봅니다.
일단 MMU(Memory Management Unit)과 MPU(Memory Protection Unit)은 Memory를 관리한다는 점에서 비슷하기는 하지만, MMU와 MPU는 다른 것이라 볼 수 있읍니다. 정확하게 얘기하자면 MMU는 MPU 기능외에 복잡한 기능을 가지고 있다고 보시면 됩니다.
일단 MMU및 MPU에 대한 H/W적인 정보를 원하신다면 www.arm.com에서 관련 정보를 얻으 실수 있읍니다. 예를 들어 ARM9에서 ARM920계열은 MMU를 장착한Core이고 ARM940 계열은 MPU를 장착한 Core입니다. 따라서 해당 계열의 Refrence Manual을 다운받아 보시면 MMU및 MPU구조에 대한 설명이 잘 나와 있읍니다.
ARM946ES(940계열, MPU) http://www.arm.com/pdfs/DDI0155A_946ES.pdf
ATM920T(920계열 MMU) http://www.arm.com/pdfs/DDI0151C_920T_TRM.pdf
해당 Manual을 보시면 설명이 자세히 나와 있으며, MMU및 MPU을 이해하시기 위해서는 Cache에 대한 Concept또한 이해하셔야 합니다.
암튼 여기서 간단히 MMU와 MPU에 대해 말씀드리자면, 크게 두가지로 구분하여 말씀 드릴수 있겠네요.
- 첫째 MMU와 MPU의 구조, 기능적인 차이 (H/W관점)
- 둘째 S/W개발에 있어서 MMU와 MPU는 어떤 차이점을 갖는가?
첫째 MMU와 MPU의 구조, 기능적인 차이 (H/W관점)
MPU는 CPU에 Attach된 RAM을 관리하는 놈이라고 보시면 됩니다.
Memory를 여러개의 Partiotion으로 나누어서 Cache/Non-Cache Region등을 나눌수 있고 각 Region별로 Read/Write Permission을 제어 할 수 있으며, 또한 Write Bufferable Region등을 지정할 수 있읍니다. 간단히 말하면, 메모리를 user가 원하는 대로 나누어서 어떤 Region은 Cache Region으로 어떤 Region은 Non-Cache Region으로, 또한 어떤 Region은 Write Bufferable Region으로 어떤 Region, non-Bufferable Region으로, 또한 어떤 Region은 Read Only로 어떤 Region은 Read/Write Region으로 Configure할 수 있으며, Cache관련하여 Invaliation, Clean, Flush등등의 기능을 제공합니다. MPU는Control하기 위해서 ARM core에서는 cp15 register group및 mcr/mrc instruction을 이용합니다.
MMU는 위의 MPU가 갖는 기능은 물론 아주 중요한 기능을 하나 가지고 있읍니다. 그것이 바로 Virtual Address <-> Physical Address Mapping 기능입니다. MPU에서는 Virtual Address의 개념이 없읍니다. 즉 Physical Address와 Virtual Address는 항상 1:1 mapping되며, 따라서 User(program)은 항상 DRAM의 physical address를 가지고 memory를 접근하게 됩니다. 반면에 MMU의 경우 Virtual Address <-> Physical Address Mapping기능을 제공합니다. 즉 CPU Core에서 발생시키는 Virtual Address를 Physical Address로 Mapping하여 Physical Address로 실제 Memory를 Access하게 됩니다. 이러한 기능을 제공하면 어떤 장점이 있냐구요? 여러가지 장점이 있읍니다. 이중 가장 중요한 두가지 점만을 적어 봅니다.
)1) 먼저 memory운영에 있어서 실제 Physical한 Address영역을 Virtual Address로 접근하여 사용함으로써 Memory의 사용 효율을 높일수 있읍니다. 예를 들어 System Booting후에 각종 Program에서 Memory를 이것 저것 사용하다보니 쪼가리 RAM이 여기저기 생겼다라고 가정해 보십시오. 이들 Memory의 Physical Address는 연속적인 Address영역에 존재하지 않읍니다. 예를 들어
0x10000 ~ 0x10200, 0x10600~~0x10800, 0x10a00~~0x10c00 의 사용되지 않은 영역이 있다고 합시다.
보통 프로그램 수행시에, 프로그램은 독립적인 Stack및 Heap영역을 사용하게 되고 , 이영역은 연속적인 Memory Address영역에 존재하여야 합니다. 원칙적 어떤 프로그램이 0x600의 메모리는 원한다하더라도 위의 세영역을 사용할 수 없읍니다. 이유는 연속적인 영역이 아니기 때문이죠. 우리가 코드를 Compile하고 Linking하여 Image를 만들때, 혹은 그 코드내에서 memory를 Allocation받을때 언제나 연속적인 Memory영역을 가정합니다. 근데 MMU가 있는 경우는 상황이 달라집니다. 위에서 말슴드렸듯이 MMU는 Virtual Address <-> Physical Address의 Mapping기능을 제공합니다. 따라서 0x10000 ~ 0x10200, 0x10600~~0x10800, 0x10a00~~0x10c00의 Physical Address를 0xa0000~~0xa0600으로 mapping시킬수 있읍니다. (참고로 이것은 예일뿐 보통 mapping의 단위는 이와 같이 작지 않고 256K, 512K, 1M...와 같이 근값입니다, 단지 설명을 위한 예라는 점을 기억하세요) 따라서 실제 CPU는 0xa0000~~0xa0600의 연속적인 address영역을 사용하고 이를 MMU가 physical address로 mapping하여 0x10000 ~ 0x10200, 0x10600~~0x10800, 0x10a00~~0x10c00의 영역을 access하게 됩니다. 어떠세요? 이렇게 사용하면 Memory Utilization이 높아지겠죠? 훌륭합니다. 좀 있어보이는 용어로 압축하여 표현하자면 Memory Fragmentation문제를 해결합니다. 있어보이나여? :)
)2) MPU는 Physical Address <-> Virtual Address가 1:1 mapping이라고 했읍니다. 그럼 예를 들어 메모리가 8M이면 8M이상의 크기를 갖는 Application은 어케 동작 할 수 있을까여? MPU즉 physical, virtual address가 1:1, 즉 같은 값을 갖는 경우라면 불가능 합니다. 하지만 MMU가 있는 경우 상황이 달라집니다. MMU는 Memory뿐만 아니라 HDD, Flash등등의 영역을 Mmeory Address로 mapping시킨다음 이를 Memory와 같이 사용할 수 있도록 합니다. CPU가 어떤 Address를 Access할떄 MMU는 해당 Address가 DRAM상의 address인지, 아니면 HDD와 같은 Device에 memory와 같이 할당된 Address인지 분별하고, memory address인 경우 해당 virtual address에 해당하는 physical address를 이용memory를 access하고, 만약 memory address아니라면 해당 device(예를 들어 HDD)에서 정보를 가져오게 됩니다. 이때 해당 영역을 memory로 Loading하게 됩니다. 이러한 mapping을 위해 MMU는 내부에 mapping table을 가지고 있읍니다.
어떻게 생각하세요? 보통 PC를 생각할때는 이와 같은 기능은 없어서는 안돠겠죠? 또 한번 훌륭합니다.
두번째로 S/W를 개발하는 입장에서 MMU와 MPU는 어떤 차이점을 유발하는가?
이문제는 그야 말로 Case By Case라고 봅니다.
어떤 분은 MMU없는 것은 사용하기도 싫다 라고 말씀하시던데...제 의견은 그렇지 않습니다. 자신이 개발하려는 목적에 따라 MPU가 좋을 수도 있고, MMU가 좋을 수도 있읍니다.
일단 Linux를 Embedded용으로 많이 사용하시는데, Linux에 있는 많은 Application들을 그대로 사용하시고 싶다면 MMU가 있어야 겟죠. 즉 절라 크기가 큰 Application들을 전부 올리구, PC version으로 release되는 application들을 별 고민 없이 사용하고자 하신다면 MMU있어야 합니다. 주로 application개발 하시는 분들이 원하시는 바죠. 예를 들어 PDA개발하시는 분은 MMU있는 버전 사용하셔야 합니다. 왜냐? Graphic, Window, Application,Game등등 Memory크게 필요한 Application많습니다. HDD나 Flash달아서 memory상에서만 program이 돌지 않고 스위칭하게 됩니다. 따라서 MMU가 없는 경우 memory 크게 달아야 하고, program도 알맞게 수정되어야 합니다. memory와 HDD의 가격은 단순히 비교해서 하드가 80G에 10만원이면 Memory는 256M 10만원.... 으...엄청 차이납니다. 글서 Program을 RAM에만 올려서 사용하신다면 돈좀 들여야 할 것 같습니다.
반면에 VDSL Router, IP 공유기 같은 네튼워크 제품 개발하시는 분들....MMU필요없읍니다. Protocol Stack이나 Network Application등은 크기 작습니다. 애써 memory외에 다른 장치에 Program올려놓을 필요없읍니다. 괜히 올렸다가 성능 떡이 되어(memory Access속도는 엄청 빠르죠? HDD에 비교하면 말이여...) 욕 얻어 먹고 팔지도 못합니다. Memory Fragmentation? 요새 Memory엄청 쌉니다. 그거좀 아껴보겟다고 MMU사용합니까? 미친짓입니다...
이외에 H/W적인 특징 외에 개발 과정에 있어서의 문제점두 있읍니다. 예를 들어 linux에서 shared library를 사용하고 싶은데, MMU 장착 CPU용으로 release된 linux에서는 이를 지원하는데 MPU 장착 CPU용으로는 release된 linux에서는 없다면????? 이는 H/W적인 문제에 기인하는 것이 아닙니다. 단지 해당 CPU용으로 Code가 안만들어 졌기 때문이죠... 여기서 한가지 집고 넘어갈 것은 Linux에서 가장 먼저 개발되는 것은 PC용입니다. PC요? 아시다시피 현존하는 가장 빠른 대중화된 CPU인 Pentium씁니다. MMU당근 있죠....글서 처음 개발 되는 각종 코드는 해당 base하에 작성 됩니다. 글서 MPU를 갖는 CPU를 기반으로 어떤 제품을 만들때 특정 Application을 올리려면 기다려야 한다거나 고생을 하는 경우가 많습니다. 물론 개발자 자신이 MMU가 있는 버전용으로 작성된 각종 코드를 맘대루 수정하고 핸들링 하여 사용할 수 있다면 문제 없겠지만....소규모 개발 집단에서 하기에는 버겁습니다.
결국 자신이 개발하려는 제품이 먼지...해당 제품에서 필요한 S/W기능(Stack, Application)이 먼지, 그러한 S/W가 MPU Based Linux에 Porting되어 있는지 알아보셔야 합니다. 이렇게 설명하면 복잡한가여? 남들이 개발 해놓은 스펙을 많이 참고하세요. 즉 Bech-Marking한 제품이 어떤 CPU를 사용하고 어떤 Linux를 사용했는데 어떤 Application이 올라가있더라.... 그렇게 파악할 수 있읍니다. 일단 그렇게 타겟을 잡고 좀더 구체적으로 자신이 사용하고자 하는 Linux에서 사용할 수 있는(큰 수정 없이) S/W를 체크해 봅니다.
예를 들어 IPSec을 개발하고자 합니다. MMU없는거 사용하고 싶습니다. 글서 글로트렉스 Cello 사용하고자 합니다. Cello에는 uClinux사용한다고 합니다. uClinux찾아보니 IPSec(freeSWAN)을 지원합니다. 그럼 사용할 수 있는 거지요... (글로트렉스 광고해서 죄송합니다. :) )
마지막으로 MPU구 어쩌구 저쩌구 MMU > MPU라면 머하러 MPU사용합니까? 라고 질문하시는 분들을 위해 한마디 더...
(1) 첫째 가격...
MMU있는거 가격 비쌉니다. 이유는 ARM의 경우만 하더라고 MMU가 있는 Core(ARM920 Series)는 MPU가 있는 Core(ARM940 Series)보다 Silicon 크기가 2-3배 정도 됩니다. 즉 생산 단가가 비싸진다는 거죠...당근 판매단가 비쌉니다. 머어 허기사 이는 실제 생산 단가일뿐 때로는 시장에서 미친척하는 손해보구 파는 회사두 있읍니다.
(2) 둘째 편리성
MPU의 경우 Virtual<--> Physical Address가 1:1mapping되므로 암생각없이 어디서나 Memory Directly Access가능합니다. 별로 중요하지 않다고생각하실수 있으나 , 실제 성능을 높인다거나 할떄 복잡한 구조적 코딩 대신 성능 위주의 코딩시에 매우 유용합니다.
마지막으로 드리고 싶은 말은 MPU/MMU에 대해 공부하실때 Cache Management에 대해서도 같이 공부하셔야 이해도 쉽고, 얻는 것도 많습니다..(넘 당연한 말인가여? ;)
이상 MMU/MPU에 대한 허접한 설명 이었읍니다.