본문 바로가기

Select translate language for this page

PC통신 HITEL 내발자국[동호회]

[질문] BT848 DMA버퍼 할당..

by 컴매니아 1998. 6. 1.
반응형
BT848A를 사용해서 뭘 좀 만들고 있습니다.
음 제공하는 프로그램을 이용해서 테스트 해 보니 잘 돌아가는데..
제가 DOS용 watcom 컴파일러에서 사용할 수 있도록
H/W라이브러리를 만들어야 합니다.
PCI레이스터 읽어서 848이랑 데이터를 주고 받는 것은 문제가 없는데.
848의 DMA 콘트롤러를 위한 DMA 메모리 할당이 문제가 되는 군요.
다른 부분은 다쉽게 만들수 있겠는데..
DMA 메모리로 사용하기 위해서는 물리적으로 메모리가 연속적이어야 할뿐 아니라
phsical address를 알아야 합니다.
이에 관련된 서비스가 DPMI랑 VDS가 있는데..
dpmi는 dos protected mode interface고 vds는 virtual dma services죠.
32bit extender를 사용하는 컴파일러에서
DOS memory (어드레스 1M이하)를 얻기 위해서는
라이브러리를 특별히 제공하지 않는다면..
DPMI서비스를 이용해서 얻어야 합니다.
1M 이하의 메모리를 얻는 이유는..
컴파일러마다 다르긴 한데..
1M 이하의 영역에 대해 쉽게 물리적 어드레스를 얻는 방법을 제공하기 때문이죠.
1M 이상에 대해 물리적 어드레스를 얻으려면 VDS를 사용해야 합니다.
이 VDS에서 DMA descriptor structure를 이용해서 정보를 전달하고 받습니다.
이 구조체의 어드레스를 ES:DI에 넣게 되어있죠.
음 ES:DI면 32bit인데.. dos에서 사용하는 32bit 논리 어드레스?
아니면 32bit extender가 제공하는 32bit offset address?
우선 dos에서 사용하는 32bit 논리 어드레스라고 하면
DPMI를 이용해서 dos 메모리를 할당받고.
VDS에 이 주소를 전달하게 되죠.
이렇게 해 보고 있는데..
watcom에서 해보니 자꾸 GP(general protection fault)가 나는군요.
848 DJGPP로는 라이브러리를 제공하기 때문에..
이것을 고쳐서도 해 봤는데..
__dpmi_int 함수와 같은것을 만들어서 dpmi_int라고 하여 사용해보니 역시 GP.
dpmi로 메모리를 할당받아 인터럽트에 이용시 일반 interrupt는 사용하지 못하고
dpmi루틴중에 있는 int 서비스를 사용해야 하는 것으로 알고 있습니다.
그래서 dpmi_int를 만들었는데.. 음.. DJGPP에서 라이브러러를 이용하면
멀쩡한데.. 만들어서 돌리면 다운.. 음.. 관련문서는 다 본거 같은데..
화상처리에는 역시 DMA를 써야 하는데..
이런 경험을 해보신 분이 없으신지..
도움 부탁드립니다..

728x90
반응형

댓글