반응형
정의 :직접 메모리 접근(Direct Memory Access, DMA)은 특정 하드웨어 하위 시스템이 CPU와 독립적으로 메인 시스템 메모리에 접근할 수 있게 해주는 컴퓨터 시스템의 기능
효과 : 프로세서 붙은 주변장치의 데이터는 장치 컨트롤러에 의해 로컬 버퍼로 이동한다. 그러나 전송할 데이터가 많은 경우, 프로세서에 부담이 된다. 이러한 문제를 해결하기 위해 DMA를 이용한다. DMA가 데이터를 이동시키는 동안 CPU는 다른 작업을 수행 할 수 있다는 장점이 있다. CPU에서는 데이터 이동이 완료되었다는 단 한 번의 인터럽트만 받으면 된다.
예시 : 디스크 드라이브 컨트롤러, 그래픽 카드, 네트워크 카드, 사운드 카드를 포함한 많은 하드웨어 시스템이 DMA를 사용한다. DMA는 멀티 코어 프로세서의 칩 내부 데이터 전송에도 쓰인다. DMA는 메모리 간 복사 또는 데이터 이동에도 쓰일 수 있다.
DMA 에 대한 설명은 Xilinx의 DMA/Bridge Subsystem for PCI Express 의 문서에도 확인할 수 있다.
At the most basic level, the PCIe® DMA engine typically moves data between host memory and memory that resides in the FPGA which is often (but not always) on an add-in card.
> DMA engine은 FPGA의 메모리와 프로세서의 메모리 사이에 데이터를 이동할 때 사용한다.
When data is moved from host memory to the FPGA memory, it is called a Host to Card (H2C) transfer or System to Card (S2C) transfer. Conversely, when data is moved from the FPGA memory to the host memory, it is called a Card to Host (C2H) or Card to System (C2S) transfer.
The PCIe DMA engine is simply moving data to or from PCIe address locations.
> DMA engine는 구체적으로 데이터를 PCIe 전용으로 배정된 주소에 데이터를 보내거나, 데이터를 가져오는 역할을 한다. 이 문구를 보면 DMA engine과 PCIe 블록의 역할은 다른 것으로 보인다. DMA engine으로만 프로세서한테 데이터를 전송하는 것이 아니라, DMA engine의 계획(Descriptor)에 따라 PCIe 블록이 프로세서와 데이터를 주거나, 받는다.
In typical operation, an application in the host must to move data between the FPGA and host memory.
To accomplish this transfer, the host sets up buffer space in system memory and creates descriptors that the DMA engine use to move the data.
The contents of the descriptors will depend on a number of factors, including which user interface is chosen for the DMA engine. If an AXI4-Stream interface is selected, C2H transfers do not use the source address field and H2C fields do not use the destination address. This is because the AXI4-Stream interface is a FIFO type interface that does not use addresses.
FPGA DMA/Bridge subsystem for PCI express IP의 내부구조는 다음과 같다. DMA sub system과 PCIe block이 합쳐진 형태이다. DMA는 PCIe와 한쌍으로 같이 구성되는 경우가 많은 것 같다. 경계를 대강 나누면 다음과 같다.
초록색 부분 : DMA engine
주황색 부분 : PCIe 블록
card to host의 DMA 과정을 예시로 보자
- card : FPGA, host : 프로세서
- user program : 프로세서에 깔린 사용자 프로그램
- 드라이버 : 프로세서에 깔린 드라이버 프로그램
The example C2H flow sequence is as follows:
1. Open device C2H and initialize the DMA.
2. The user program allocates buffer pointer (based on size), passes pointer to read function
with specific device (C2H) and data size.
3. The driver creates descriptor based on size and initializes the DMA with descriptor start
address. Also if there are any adjacent descriptor.
> 드라이버가 descriptor를 만든다.
4. The driver writes control register to start the DMA transfer.
5. The DMA reads descriptor from host and starts processing each descriptor.
6. The DMA fetches data from Card and sends data to host. After all data is transferred based
on the settings, the DMA generates an interrupt to host.
7. The ISR driver processes the interrupt to find out which engine is sending the interrupt and
checks the status to see if there are any errors and also checks how many descriptors are
processed.
8. After the status is good, the drive returns transfer byte length to user side so it can check for
the same.
반응형
'FPGA - 프로세서 그리고 데이터의 이동 > DMA' 카테고리의 다른 글
DMA 통신 과정 (0) | 2022.02.07 |
---|