반도체 소프트웨어

코멘토 실무PT 후기 챌린지_"반도체 SW 엔지니어를 위한 새로운 SoC 위에 리눅스 디바이스 드라이버 포팅하기" 강의 3주 차 후기 본문

교육/코멘토 직무PT

코멘토 실무PT 후기 챌린지_"반도체 SW 엔지니어를 위한 새로운 SoC 위에 리눅스 디바이스 드라이버 포팅하기" 강의 3주 차 후기

반도체 소프트웨어 엔지니어 2024. 1. 30. 19:31

<학습 소감>

3주 차는 DMA에 대해 공부했다. DMA는 말 그대로 CPU를 거치지않고 디바이스가 메모리에 직접 접근하는 방식이라는 개념적인 정의 이상으로 아는 것이 아무 것도 없었다. QEMU로 DMA 기법을 사용하는 하드웨어를 작성하고, DMA를 지원하는 디바이스 드라이버를 개발하는 과정이 정말 인상깊었다. 특히 UART에 DMA가 적용한 소스 코드를 분석하면서 DMA에 대해 정말 깊고 넓게 이해할 수 있었다. DMA가 머릿속에서 추상적인 개념이 아닌 효율적으로 메모리를 접근하는 디바이스를 개발하는 기법 중 하나라는 것을 소스코드와 실무적인 레벨에서 이해할 수 있었다. 현업에서 DMA를 사용하게 된다면 요번 주차에서 공부한 경험이 정말 큰 도움이 될 것이다.

 

<실습 중>

DMA 개념
DMA 기반 커널 모듈 작성중

 

<이번 주 수업 내용 리뷰>

[2024/01/24(수) 20:00]

  1. 작주 복습
    • 버스: 병렬적으로 연결된 전선
    • QEMU에서는 sysbus_ 접두사를 사용해서 AMBA 버스 사용
    • MMIO아닌데 시스템 버스에 물리는 디바이스는 거의 없다고 보면 됨
    • 시스템버스가 결국 하드웨어의 read() / write()를 호출시켜주는 것
    • 대기큐는 현업에서 꽤 많이 씀
    • 데이터가 들어올떄까지 기다리는게 아니라 인터럽트가 들어왔을때 read()하는 방식도 꽤사용함
    • cpio파일 수정하는 법은 찾으면 있음. 이걸로 유저프로그램 추가하면 됨
  2. DMA
    • 필요성
      • 저번주에는 1바이트씩 복사하는 PIO방식을 사용했음
      • 예를 들어 그래픽카드는 몇기가씩 데이터 주고 받음. 1바이트씩 처리하는 방식으로는 어려움
      • 이방식은 계속 LDR, STR하는거임. 이게 MEMCPY임
      • 메모리복사를 CPU를 거치지 않고 전용 하드웨어를 거치는 방식을 위해 DMA가 동작
    • DMA(Direct Memory Access): 디바이스가 직접 메모리에 접근해서 데이터를 R/W
      • 메모리 복사, 오류 통지, 기타 등등 작업을 모두 수행해야하기에 DMA 컨트롤러라는 하드웨어를 사용함
      • 디바이스 버퍼 꽉찼나 등도 확인
      • DMA 컨트롤러: 디바이스 버퍼, 메모리, CPU 중간에서 작업 및 중재 역할
    • scatter/gather
      • scatter/gather 를 많이 쓰진않지만 개념 자체가 중요함. 면접으로 물어볼확률 높음
      • DMA컨트롤러는 물리주소 사용해서 작업함
      • GFP_KERNEL이 아닌 GFP_DMA 기반으로 메모리를 할당하면 물리주소에서 연속적이도록 요청
      • 스캐터: 흩어진 메모리 공간을 모아서 관리해줌
      • 게더: 스캐터가 모은걸 합쳐진 공간으로 DMA에게 전달해줌
      • 둘다 개념적인 용어로 보는 것이 편함
      • 스캐터-게더는 잘 안쓰므로 요즘은 IOVA 방법을 주로 사용. 스캐터 리스트 관리및 연산하는게 오래걸려서 잘안씀
    • IOVA(I/O virtual address); 입출력 가상주소
      • 마치 가상메모리처럼 디바이스를 위한 별도의 주소공간(iova)를 운영하는 것
      • 흩어진 디바이스 메모리를 IOVA 메모리가 메모리맵으로 운영하고 이걸 DMA가 이걸 사용하는 것. SMMU를 사용함

[2024/01/24(수) 21:00]

  1. DMA자체도 MMIO를 사용하는 디바이스
  2. 1+16 : 1개 오류 인터럽트용과 16개 인터럽트 사용
  3. sg: 스캐터 리스트
  4. 교재에는 실제 uart코드에 담긴 dma를 보여줬음
  5. dma컨트롤러를 사용하면 PIO로 구현된 부분을 개선 가능
  6. 일반적인 디바이스도 DMA를 사용할수 있구나. 이게 DMA 개발하는거네


[2024/01/24(수) 22:00]

  1. qemu에 추가하는 사항
    • 인터럽트 구현
    • 흐름제어구현
  2. 그래서 1번에 high주면 뭐가어떻게되고 이렇게되고 등등 중간에 중단도시켜주네
  3. qemu_set_irq(~, 0)는 0을 인터럽트에 쓰는것, 1을 인터럽트 발생시키는것
  4. dma디바이스드라이버소스 너무 외우려고하진말고 기억하고 있다가 나중에 현업에서 dma컨트롤러적용해야할때 이걸 참고해도 좋다
  5. 수신데이터가없을떄는 굳이 dma를 동작시킬필요가없다.
  6. 작업속도뿐만아니라 cpu작업량을 줄여주기에 dma쓰는게 꽤 좋음
  7. mmc(multimediacard): 플래시메모리카드 표준
    • mmc와 sd가 다르긴하지만 혼용해서 부름
    • mmc -> sd로 진화
    • spi로도 mmc/sd카드제어가능하지만 mmc 컨트롤러 하드웨어로도 가능
    • 송신, 수신 각각 인터럽트 사용
    • 별도 전원이 필요하기도함
      • PIMC라는 장치가 따로있음. 전원을 관리하는 자이임 얘가 일정한 전압을 유지시켜줌
      • 레귤레이터와 비슷
      • 배터리 <-> PMIC <-> 디바이스
      • 전압을 목표한대로 유지시키줌 - 전압 레귤레이터
    • 그냥 단순히 빈 메모리가 아닌 포맷을 정해줘야 파일시스템 헤더, 드라이버를 만들수있고 이를 바탕으로 저장장치를 사용할수있는것
  8. SD카드 이미지
    • lo setup: loop setup이구나
    • sd카드를 흉내내는것
    • MMC를 사용해서 SD카드를 읽는다

 

링크: https://bit.ly/3D9XCOz