메모리 맵 방식...?
글쓴이: kkojiband / 작성시간: 일, 2003/07/06 - 1:06오후
또(--;) 질문드립니다...
vga 카드나 많은 데이타 이동이 있는 주변장치들이 메모리 맵 방식을 사용하는걸로 알고 있습니다...
사용법은 비디오 메모리 제어하듯이 메모리 맵되어있는 주소에 데이타를 쓰면 되는걸로 알고 있는데...
이게 어떤 식으로 작동을 하는거죠?
우리가 메모리에 데이타를 쓰면 dma 가 자동으로 비디오 메모리로 데이타를 옮기는건가요??
그렇다면 메모리 맵 방식이란 dma 가 사용하는 방식이란 말인가요??
책에 보니까 vga 카드나 대용량 디스크 등이 이 방식을 사용하는걸로 되어 있던데...아시는 분 좀 도와주세요~
질문 너무 많이 올려서 죄송합니다...T.T
Forums:
Re: 메모리 맵 방식...?
VGA 같은 경우 우리가 메모리에 데이터를 쓸 때
그것이 시스템의 메모리가 아니라 VGA 의 메모리 입니다.
그러므로 데이터를 옮길필요가 없지요...
처음에는 메모리 맵을 잘 이해하신것 같은데... 뒤에는 아니네요.. :roll:
Re: 메모리 맵 방식...?
칩셋 레벨에서 구현하죠.
cpu가 액세스하는 메모리 영역을 조사해서 특정 영역이면 원래
메모리 대신 외부 버스(대부분 agp나 pci쪽이 되겠지요) 날려보냅니다. 읽기시는
그쪽으로 접근을 시도하고요.
프로그램 짜는 사람은 거기 신경쓸 필요 없습니다. 다만 어느 메모리로
매핑되었는지를 조사할 필요는 있긴 하지만.
Written By the Black Knight of Destruction
인텔CPU에서는 기본적으로 Programmed IO를 지원합니다. 그러나
인텔CPU에서는 기본적으로 Programmed IO를 지원합니다. 그러나, 비디오램인경우 메모리맵 IO를 일부 지원합니다. 요즘 비디오카드보면 메모리 32메가 모 이렇게 많은데요. 이를 Programmed IO(보통 한번에 수바이트이내이니.....)로 전달하려면 아주 곤란하겠지요?
텍스트모드라 할지라도, 한자당 2바이트를 차지하니, 80*25*2라는 바이트를 출력해주어야 화면이 나올테니까요. 그래서 비디오 메모리는 메모리중 일부를 메인메모리에 매핑해줍니다. 즉, 주변장치(비디오카드)에 있는 메모리를 메인메모리처럼 주소를 부여하고, 매핑해줍니다. 비디오카드에 따라 64KB나 128KB를 할당해줍니다. 즉, CPU가 동시에 액세스가능한 비디오카드메모리는 64,또는 128KB라는 얘깁니다. 의문이 있지요? 그렇다면 그래픽모드는? 더 많은 메모리 영역은? 이는 비디오카드에 있는 주프로세서의 레지스터를 이용하여 선택하게 합니다. (이때는 반드시 programmed io로 입출력해주어야 합니다. 뱅크조작명령을)다시 말씀드리자면 비디오 메모리를 64kb영역으로 잘게 나누고 이를 각각 bank라고 부릅니다. 그리고 각 bank에 번호(주소)를 부여합니다. bank를 스위칭해가면서 메모리에 값을 써갑니다.
마치 식판을 들고 줄서서 밥타는 광경으로 상상해볼수있습니다. 비디오램은 사람들(식판들)이고, 밥주는 짬장은 CPU지요. CPU는 제한된 영역에( 해당위치에) 값을 계속 써갑니다.(물론 이를 담당하는것이 비디오 드라이버겠지요?) 해당 비디오메모리에는 순서대로 값들이 차곡차곡써질것이고 (수십메가라도요......), 이렇게 매핑이 이뤄집니다. 이후 비디오카드에 있는 DAC에 있는 refresh controller는 비디오메모리에 있는 내용을 화면에 주기적으로 아날로그 신호로 바꾸어 내보냅니다.(칼라매핑해서) 그럼 모니터에 나오지요. 이 작업은 순차적으로 일어나지만, 아주 빨라서, 사람의 눈으로는 감지하지 못하고 항상 화면에 글씨가 나오는 , 또는 전체 화면에 그래픽이 동작하는것으로 인지하게되지요.
음 제가 즉흥적으로 설명하려니 부족한 점이 많군요. 그림도 그리기는 그렇구......
님께서 비디오카드의 메모리 맵 원리를 이해하려면 bank switch라는 메카니즘을 이해하셔야 합니다. 또한 메모리 소요가 적어도 128kb보다는 커야할테니 그래픽모드에서의 뱅크스위치를 이해하셔야 겠지요. 아울러 refresh개념을 이해하시면 어느정도 이해가 될 줄 압니다. 이러한 것은 약 10년전에는 비교적 유행했었던 주제입니다. 그 당시의 서적등을 참조하시면 보탬이 되실듯합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
[quote="mach"]님께서 비디오카드의 메모리 맵 원리를 이해하려면
현재 국내에서 사용중인 그래픽 카드의 거의 대부분은 뱅크 스위칭이 필요없습니다(또는 아예 지원이 안되거나). 뱅크 스위칭은 x86 리얼 모드의 64kB 세그먼트 제한을 피하려고 만든, 일종의 꼼수입니다. 운영체제가 32비트 보호 모드 기반으로 이전하면서 필요가 없어져 버렸죠.
Re: 메모리 맵 방식...?
DMA란 CPU의 도움 없이 외부 장치(그래픽 카드, 사운드 카드, 랜 카드 등)가 메인 메모리를 직접 읽고 쓰는 걸 뜻합니다.
메모리 맵 입출력은 주변기기내 메모리(이를 프레임버퍼라고 합니다)를 메인 메모리의 주소 공간에 편입시켜 사용하는 방법입니다. 예를 들어 전체 메모리 공간을 A4 용지라고 가정하면, 그 위에 붙이는 포스트잇 노트가 프레임버퍼이고, 둘간의 관계가 메모리 매핑이라고 생각할 수 있습니다. 공간상으로 보면 분명히 포스트잇은 A4 용지 위에 붙어 있지만, 그위에 기록하는 내용은 종이가 아닌 노트위에 써지지요.
[quote]메모리 맵 입출력은 주변기기내 메모리(이를 프레임버퍼라고 합
님의 지적대로 10년전 리얼모드에서 그래픽 드라이버를 만들때 그러했습니다. 그 이후 관심을 가져본적이 없었는데, 님께서 좋은 말씀해주셔서 감사합니다.
질문이 있습니다. 주변장치의 메모리를 메인메모리의 주소공간에 편입하는 원리에 대해서 혹시 아시면 설명해주시면 감사하겠습니다. 또는 책이나, URL을 소개해주셔도 감사하고요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
[quote="mach"]질문이 있습니다. 주변장치의 메모리를 메인메모리
PCI 장치라면 이것은 매우 쉽습니다. 각 장치에는 BAR(base address register)라는 표가 있어서, 여길 참조하면 프레임버퍼의 시작 주소와 크기를 결정할 수 있습니다. 아래는 제가 만든 NetBSD용 ATI Mach64 프레임버퍼 드라이버에서 가져온 코드입니다:
Mach64의 경우 0번 BAR는 디스플레이 프레임버퍼에 관한 정보를, 1번 BAR는 PIO용 포트 정보를, 2번 BAR는 제어 레지스터용 프레임버퍼 정보를 담고 있습니다. 이 정보를 pci_mapreg_info() 커널 API 함수에 넘겨주는 것만으로 간단한 장치 등록과 매핑이 완료됩니다. 리눅스에서도 같은 일을 하는 함수가 있는데, 이름은 잘 모르겠습니다. 8)
그리고 하드웨어 프로그래밍에 관한 자세한 내용은 업체 내부 기밀에 해당하는 경우가 많습니다. 그런 경우 non-disclosure agreement(NDA)에 서명을 해야만 정보를 얻을 수가 있죠.
감사합니다~-- :o -----
감사합니다~
-- :o -----
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기