11.07.2015 Views

블록 디바이스 드라이버 예제 블록 디바이스 드라이버

블록 디바이스 드라이버 예제 블록 디바이스 드라이버

블록 디바이스 드라이버 예제 블록 디바이스 드라이버

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

블록 디바이스 드라이버 예제531request 방식의 가상 하드디스크http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버532예제 소스 – vdisk.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버533예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버534예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버535예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버536예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버537예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버538예제 소스 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버539예제 소스 – 실행 결과 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버540예제 소스 – 실행 결과 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버541예제 소스 – 실행 결과 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver블록 디바이스 드라이버542예제 소스 – 실행 결과 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver


블록 디바이스 드라이버543예제 소스 – 실행 결과 – vhdd.c (kernel 2.6)http://eoslab.ssu.ac.krLinux Device Driver커널 2.6의 블록 디바이스 드라이버544블록 디바이스 드라이버 작성시 처리 내용블록 디바이스의 특성 정의 (2.4와 동일)주 번호와 부 번호 및 디바이스명에 대한 정의 (2.4와 동일)블록 디바이스 드라이버 등록블록 디바이스 드라이버를 위한 구조체 선언파일 오퍼레이션 구조체 처리요구 큐에 관련된 처리 및 함수 선언블록 디바이스 추가를 위한 gendisk 구조체 생성 및 등록블록 디바이스의 크기 설정 및 기타 속성 처리http://eoslab.ssu.ac.krLinux Device Driver


커널 2.6의 블록 디바이스 드라이버545블록 디바이스 드라이버 등록과 해제블록 디바이스 드라이버 등록블록 디바이스 드라이버 해제http://eoslab.ssu.ac.krLinux Device Driver커널 2.6의 블록 디바이스 드라이버546블록 디바이스 드라이버를 위한 구조체 선언http://eoslab.ssu.ac.krLinux Device Driver


커널 2.6의 블록 디바이스 드라이버547struct block_device_operationshttp://eoslab.ssu.ac.krLinux Device Driver커널 2.6의 블록 디바이스 드라이버548요구 큐에 관련된 처리 및 함수make_request() 함수를 이용해 구현하는 경우make_request() 함수의 등록 방법request를 이용해 구현하는 경우request() 함수의 등록 방법http://eoslab.ssu.ac.krLinux Device Driver


커널 2.6의 블록 디바이스 드라이버549gendisk 구조체 생성 및 등록gendisk 구조체gendisk 구조체 할당과 해제gendisk 구조체 등록과 해제http://eoslab.ssu.ac.krLinux Device Driver커널 2.6의 블록 디바이스 드라이버550블록 디바이스의 크기 설정http://eoslab.ssu.ac.krLinux Device Driver


커널 2.6의 블록 디바이스 드라이버551블록 디바이스 드라이버 제거http://eoslab.ssu.ac.krLinux Device Driver552DMAhttp://eoslab.ssu.ac.krLinux Device Driver


DMA553DMAPCIhttp://eoslab.ssu.ac.krLinux Device DriverDMA554http://eoslab.ssu.ac.krLinux Device Driver


DMA555DMA란프로세서 대신 DMAC(Direct Memory Access Controller)가 데이터의 전송 담당, 메모리와 I/O 디바이스간의 데이터 전송을 고속으로 처리채널• 채널 구성 요소• 전송 데이터의 소스 주소• 전송 데이터의 목적지 주소• 전송 데이터의 크기• DMAC가 관리할 수 있는 장치의 수를 의미• 프로세서에 따라 동시에 여러 채널의 데이터 전송 가능http://eoslab.ssu.ac.krLinux Device DriverDMA556리눅스에서의 DMA 처리DMA 소유권 등록과 해제• #include • 등록• int request_dma(unsigned int dmanr, const char *device_id);• dmanr : 사용하려는 DMA 채널 지정• device_id id : 채널 소유를 proc 파일 시스템에 표시하기 위한 문자열• 등록에 성공하면 ‘0’, 실패하면 –EINVAL, –EBUSY 반환• MAX_DMA_CHANNELS : 시스템에 사용할 수 있는 DMA 채널 수• 해제• void free_dma(unsigned int dmanr);http://eoslab.ssu.ac.krLinux Device Driver


DMA561• claim_dma_lock• 다른 디바이스 드라이버와의 경쟁 방지• unsigned long claim_ dma_ lock(void);• disable_dma• DMA 동작 금지• void disable_dma(unsigned dma(unsigned int dmanr);• clear_dma_ff• DMA의 플립플롭(flip-flop) 클리어• 플립플롭 :16비트 데이터 전송을 8비트 버스에서 처리할 때 사용• void clear_dma_ff(unsigned int dmanr);• set_dma_mode• 전송 방향 설정• void set_dma_mode(unsigned int dmanr, char mode);• mode type• DMA_MODE_READ : I/O 하드웨어에서 메모리로 데이터 전송• DMA_MODE_WRITE : 메모리에서 I/O 하드웨어로 데이터 전송http://eoslab.ssu.ac.krLinux Device DriverDMA562• set_dma_addr• DMA에 사용되는 DMA 버퍼 주소 지정• void set_ dma_ addr(unsigned int dmanr, unsigned int a);• DMA에 지정되는 주소는 버스 주소여야 하므로 __get_dma_pages와 같은 함수를 사용하여 반환된 주소인 경우 virt_to_bus() 함수를 이용하여버스 주소로 변환• set_dma_count• DMA를 이용해 전송되는 데이터의 크기 지정• void set_dma_count(unsigned int dmanr, unsigned int count);• 전송 단위는 바이트• DMA 채널이 16비트 채널인 경우 반드시 짝수• enable_dma• DMAC 활성화• void enable_dma(unsigned int dmanr);http://eoslab.ssu.ac.krLinux Device Driver


DMA563• release_dma_lock• claim_dma_lock() 함수를 사용했을 경우의 해제 함수• void release_ dma_ lock(unsigned long flags);• get_dma_residue• 현재 DMA에 전송중인지 확인• int get_dma_residue(unsigned int dmanr);• 전송이 끝났거나 대기중이면 0을 반환http://eoslab.ssu.ac.krLinux Device DriverDMA564DMA와 mmapDMA용 버퍼를 할당할 경우 mmap을 이용한 처리• 메모리 할당struct page *page;unsigned long sz = DMA_BUFF_SIZE;dmabuff = (char*)__get_dma_pages(GFP_KERNEL, get_order(sz));for (page = virt_to_page(dmabuff); page


PCI567PnP와 디바이스 환경 설정 공간lspci를 이용한 PCI 정보 검색proc 파일 시스템을 이용한 PCI 정보 검색 sysfs 파일 시스템을 이용한 PCI 정보 검색 (커널 2.6)디바이스 드라이버에서 환경 설정 공간의 접근http://eoslab.ssu.ac.krLinux Device DriverPCI568PCI 디바이스의 디바이스 드라이버PCI 디바이스 검출probe()와 remove() 함수의 처리PCI 디바이스의 수동 검출http://eoslab.ssu.ac.krLinux Device Driver


PCI569버스 마스터링 DMADMA 버퍼 할당과 해제DMA 처리 주소 한계 확인http://eoslab.ssu.ac.krLinux Device Driver

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!