'KIPA_2006_DeviceDriver/블럭디바이스_드라이버'에 해당되는 글 2건

  1. 2006/09/02 게으른 엔지니어 make_request 함수
  2. 2006/09/02 게으른 엔지니어 Block device 프로그래밍시 고려할 종류들...(? 제목이 좀 이상함... ㅋㅋㅋ)
#define BSK_SECTOR_SIZE                512 // sector는 한번에 읽고 쓸 수 있는 크기
#define BSK_SIZE                (4*1024*1024) // 전체 크기
#define BSK_SIZE_KB                (BSK_SIZE/1024)
#define BSK_SECTOR_TOTAL        (BSK_SIZE/BSK_SECTOR_SIZE)
#define BSK_AHEAD                2 // 근처에 있는 것도 읽힐 가능성이 높으로므로 미리 읽을 것이 몇개인지 표시

교재 큰 페이지로 76 페이지를 보면, Block device의 경우 5개의 전역 변수를 가지고 있다.


nt bsk_init( void )
{
 int lp;

 printk( "[M] block device driver module is loaded.\n" );
 bsk_major = register_blkdev( 0, "bsk", &bsk_fops );
 printk( "[M] major number is %d\n", bsk_major );

 blk_queue_make_request( BLK_DEFAULT_QUEUE(bsk_major), &bsk_make_request ); // make_request 함수 등록

 read_ahead[bsk_major] = BSK_AHEAD;

 bsk_size = BSK_SIZE_KB;
 blk_size[bsk_major] = &bsk_size; // 항상 포인터로넘겨 줘야 함

 bsk_ramdisk = vmalloc( BSK_SIZE );

 return 0;
}


static int bsk_make_request( request_queue_t *q, int rw, struct buffer_head *sbh )
{
 char *pbsk_data;

 if ( ( (sbh->b_rsector*BSK_SECTOR_SIZE) + sbh->b_size ) >= BSK_SIZE )
   goto fail;

 pbsk_data = bsk_disk + (sbh->b_rsector*BSK_SECTOR_SIZE);

 switch ( rw )
 {
   case READA:
   case READ:
     memcpy( sbh->b_data, pbsk_data, sbh->b_size ); // 실제 하드웨어인 경우 I/O 처리해야 할 부분
     printk( "[M] Read....    " );
     break;

   case WRITE:
     memcpy( pbsk_data, sbh->b_data, sbh->b_size ); // 실제 하드웨어인 경우 I/O 처리해야 할 부분
     mark_buffer_uptodate( sbh, 1 );
     printk( "[M] Write....    " );
     break;

   default:
     goto fail;
 }
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/50

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/50

Block device driver


===================================================================================
1. 장치가 하나인 경우

2. 장치가 여러개인 경우

3. 장치가 여러개이면서 partition이 있는 경우
===================================================================================


===================================================================================
1. make_request
  ==> 속도가 빠른 매체로 즉각 반응

2. request
  ==> 속도가 느린 매체, 즉 하드 디스크 같은 경우, 즉각적인 반응을 하지 않음.
===================================================================================


===================================================================================
* Block device인 경우 read/write의 작업이 언제 끝나는지를 kernel에게 알려 줘야 함. 이럴때 만약 디바이스가 인터럽트를 제공하면 그것을 사용하면 되지만, 그렇지 않을 경우 끝나는 시간을 추즉하여 timer로 알려 줘야 한다. 왜냐하면 작업이 시작되면 blocking 이 되기 때문이다.(이 이유는 좀 더 확실히 확인해야 함.)
1. 디바이스가 인터럽트를 제공하는지 여부

2. 디바이스가 인터럽트를 제공하지 않는 경우
=> timer(시간을 guess한다) 를 통해서 디바이스가 처리를 끝냈음을 kernel에게 알려 줘야함
===================================================================================


매체에 대한 I/O 처리


를 하면 전체적으로 block device에 대한 프로그래밍이 끝나는 경우이다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/49

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/49