FreeBSDºËÐÄ̽ÌÖ.8.Çý¶¯³ÌÐòƪ
9wMLinuxÁªÃË9wMLinuxÁªÃË9wMLinuxÁªÃË2.3 Device Driver
9wMLinuxÁªÃ˽ø³ÌµÄioÒªÇóµ½ÕâÀï˵µÄ²î²»¶àÁË¡£ÉÏÃæÒ²½â˵Á˶ÔÓÚÎÄ×ÖÐÍ£¬¿éÐ͵ÄÇý¶¯³ÌÐò½Ó¿Ú£¬¾Í
9wMLinuxÁªÃËÊÇdev_spec_vnodeop_opv_descÀﶨÒåµÄ×Óº¯ÊýÄÇЩ¡£²Î¿¼É豸Çý¶¯³ÌÐò£¬ÔÚsys/conf.h
9wMLinuxÁªÃËÀﶨÒåµÄ½á¹¹Ìå¡£blockÐÍÊÇ
9wMLinuxÁªÃËstruct bdevsw{
9wMLinuxÁªÃËd_open_t *d_open;
9wMLinuxÁªÃËd_close_t *d_close;
9wMLinuxÁªÃËd_strategy_t *d_strategy;
9wMLinuxÁªÃËd_ioctl_t *d_ioctl;
9wMLinuxÁªÃËd_dump_t *d_dump;
9wMLinuxÁªÃËd_psize_t *d_psize; /*µÃµ½ÈÝÁ¿*/
9wMLinuxÁªÃËint *d_flags;
9wMLinuxÁªÃËchar *d_name; /*device Ãû*/
9wMLinuxÁªÃËstruct cdesw *d_cdev; /*¶ÔÓ¦µÄÎÄ×ÖÐÍ*/
9wMLinuxÁªÃËint d_maj; /*majorºÅ*/
9wMLinuxÁªÃË}
9wMLinuxÁªÃËÎÄ×ÖÐ͵ÄÔòÊÇ
9wMLinuxÁªÃËstruct cdevsw{
9wMLinuxÁªÃËd_open_t *d_open;
9wMLinuxÁªÃËd_close_t *d_close;
9wMLinuxÁªÃËd_read_t *d_read; /* rawread() */
9wMLinuxÁªÃËd_write_t *d_write; /* rawwrite()*/
9wMLinuxÁªÃËd_ioctl_t *d_ioctl;
9wMLinuxÁªÃËd_stop_t *d_stop; /* nostop()*/
9wMLinuxÁªÃËd_reset_t *d_reset; /* nullreset()*/
9wMLinuxÁªÃËd_devtotty_t *d_devtotty; /* nodevtotty*/
9wMLinuxÁªÃËd_select_t *d_select; /* deltrue*/
9wMLinuxÁªÃËd_mmap_t *d_mmap; /* nommap*/
9wMLinuxÁªÃËd_strategy_t *d_strategy
9wMLinuxÁªÃËchar *d_name; /*deviceÃû*/
9wMLinuxÁªÃËstruct bdevsw *d_bdev; /*¶ÔÓ¦blockÐÍ*/
9wMLinuxÁªÃËint d_may; /*majorºÅ*/
9wMLinuxÁªÃË}
9wMLinuxÁªÃË9wMLinuxÁªÃË9wMLinuxÁªÃËÁ½·½Ã湲ͬµÄ²¿·ÖÓÐ
9wMLinuxÁªÃËxx_open(dev_t dev,int oflags,int devtype,struct proc *p)
9wMLinuxÁªÃËxx_close(dev_t dev,int fflag,int devtype,struct proc *p)
9wMLinuxÁªÃËxx_ioctl(dev_t dev,int cmd,caddr_t data,int fflag,struct proc *p)
9wMLinuxÁªÃËxx_open()ÓÃÓÚ´ò¿ªdeviceºÅµÄÉ豸¡£xx_close()ÔòÓÃÓڹرÕËü¡£xx_ioctl()Ôò¶ÔÉ豸µÄ
9wMLinuxÁªÃ˶¯×÷״̬£¬»úÄܵÄÈ¡µÃ£¬ÉèÖõȽøÐпØÖÆ£¬Ëüͨ¹ýint cmdÃüÁîºÍ²ÎÊýcaddr_t data¶ÔÖ®
9wMLinuxÁªÃ˽øÐд¦Àí¡£xx_open()µÄoflagsÔòÊÇϵͳµ÷ÓÃopen()ÀïÖ¸¶¨µÄ±êÖ¾¡£xx_close()ºÍ
9wMLinuxÁªÃËxx_ioctl()µÄfflagÊÇÿ¸öÎļþÃèÊö·ûÉ趨µÄ±êÖ¾¡£int devtypeÓÃÀ´Çø±ðÉ豸ÀàÐÍÊÇÎÄ
9wMLinuxÁªÃË×ÖÐ͵ϹÊÇ¿éÐ͵ġ£struct proc *pÊDZ¾´ÎÒªÇóµÄ½ø³ÌºÅ¡£
9wMLinuxÁªÃË9wMLinuxÁªÃËÔÚÎÄ×ÖÐ͵IJÙ×÷ÀÓÐÕâÈý¸öº¯Êý
9wMLinuxÁªÃËxx_read(dev_t dev,struct uio *uio,int ioflag)
9wMLinuxÁªÃËxx_write(dev_t dev,struct uio *uio,int ioflag)
9wMLinuxÁªÃËxx_select(dev_t dev,int which, struct proc *p)
9wMLinuxÁªÃËxx_read()/xx_write()ÊǶÔdeviceºÅµÄio£¬struct uio *uio ÊÇioµÄbuffer£¬int ioflag
9wMLinuxÁªÃ˱êÖ¾io¶¯×÷µÄoption¡£ÀýÈ磬ÊäÈëdataû׼±¸ºÃµÄ³¡ºÏ²»ÓýøÈëµÈ´ý״̬Ҳ¿ÉÒÔ¡£
9wMLinuxÁªÃËxx_select()¼ì²éÊÇ·ñ¿ÉÒÔ½øÐÐioÒªÇó¡£
9wMLinuxÁªÃËÔÚ¿éÉ豸µÄ²Ù×÷ÖÐ,ÓÐÒ»¸öº¯Êý
9wMLinuxÁªÃËxx_strategy(struct buf *bp)
9wMLinuxÁªÃËËü´¦ÀíioÒªÇó¡£struct buf *bpÀïÃæ°üº¬×ÅdeviceºÅ£¬ÊäÈ뻹ÊÇÊä³ö£¬ioµÄbufferµÈ¡£
9wMLinuxÁªÃË9wMLinuxÁªÃËdeviceºÅÖеÄmajorºÅ£¬¶ÔÎÄ×ÖÐ͵Ästruct cdevsw *cdevsw[],¶Ô¿éÐ͵Ästruct
9wMLinuxÁªÃËbdevsw *bdevsw[]£¬×÷ΪÅäÁеÄÌí¼Ó×ÖʹÓá£ÏòÕâЩÅäÁеǼǣ¬¾Í¿ÉÒÔµ÷³ödevice driver
9wMLinuxÁªÃ˵ĵǼÇroutine¡£
9wMLinuxÁªÃ˶Ôcdevsw[]µÇ¼ÇµÄ¹ý³ÌÔÚkern/kern_conf.c,ËüʹÓÃ
9wMLinuxÁªÃËint cdevsw_add(
9wMLinuxÁªÃËdev_t *descrip, /*ÊÕ¼¯deviceºÅµÄ±äÁ¿µÄÖ¸Õë*/
9wMLinuxÁªÃËstruct cdevsw *newentry,/*ÉèÖÃstruct cdevswµÄÖ¸Õë*/
9wMLinuxÁªÃËstruct cdevsw **oldentry,/*¾ÉµÄÉ趨ÄÚÈݵķµ»ØÁìÓò*/
9wMLinuxÁªÃË)
9wMLinuxÁªÃËÁíÒ»·½Ã棬¶Ôbdevsw[]µÄµÇ¼Ç¹ý³ÌÔòʹÓÃ
9wMLinuxÁªÃËint bdevsw_add_generic(
9wMLinuxÁªÃËint bdev, /*blockÐ͵ÄmajorºÅ*/
9wMLinuxÁªÃËint cdev, /*ÎÄ×ÖÐ͵ÄmajorºÆ*/
9wMLinuxÁªÃËstruct bdevsw *bdevsw, /*É趨struct bdevswµÄÖ¸Õ룬¶ÔÓ¦d_cdev*/
9wMLinuxÁªÃË)
9wMLinuxÁªÃËblockÐ͵ÄdeviceºÍcharÐ͵ÄdeviceÓÐ×ÅÒ»¶¨µÄ¶ÔÓ¦¹ØÏµ¡£ÕâЩ½á¹¹ÌåÏ໥²Î¿¼¡£
9wMLinuxÁªÃËbdevsw_add_generic()´ÓblockµÄ½á¹¹Ì忪ʼ£¬¶Ô×÷ΪcharÐ͵ÄdeviceµÄ½á¹¹Ìå½øÐгõʼ»¯¡£
9wMLinuxÁªÃË»¹ÓУ¬network interfaceµÄdevive driver,²¢Ã»ÓÐÏòcdevsw[]ºÍbdevsw[]µÇ¼Ç¡£¶øÇÒҲûÓÐ
9wMLinuxÁªÃËdeviceºÅ¡£ÍøÂç¼äµÄpackageÁ÷£¬ºÍ½ø³Ì¼äÓëÍøÂç¼äµÄpackageÁ÷ҲûÓÐÌØ±ðÖ¸Ã÷¡£
9wMLinuxÁªÃ˵÷ÓõǼÇroutineµÄʱºò£¬¿ÉÒÔ°ÑÎļþϵͳµÄmodules×÷ÎªÌØÊâÉ豸Îļþ²Î¿¼¡£µÇ¼Ç
9wMLinuxÁªÃËroutineÔÚʲôµØ·½¶¼¿ÉÒÔµ÷Óá£
9wMLinuxÁªÃË¡£main()(@kern/init_mail.c)µÄ³õʼ»¯¹ý³ÌÖеǼǵÄroutineµ÷ÓõÄʱºò£¬¸÷¸ö
9wMLinuxÁªÃËdevice driverµÄmodulesÀïÓɺêSYSINIT()×¼±¸½øÐС£
9wMLinuxÁªÃË¡£È·ÈÏdevice driverÀïµÄioÉ豸µÄ´æÔÚµÄʱºò£¬µ÷ÓõǼÇroutine¡£
9wMLinuxÁªÃ˵±µ÷ÓõǼdzÌÐò¶ÎµÄʱºò£¬Èç¹ûmajorºÅºÍ/dev/MAKEDEVµÄmajorºÅÓгåÍ»µÄʱºò£¬
9wMLinuxÁªÃ˾͵÷ÓÃÈ«²¿ÎÞ¹ØÐÔdevice fileµÄ´¦Àíroutine£¬Ò²¿ÉÄÜûÓÐÔ¤ÆÚµÄµÄÔÖÄÑÊÂÇé¡£»¹ÓбðµÄ
9wMLinuxÁªÃËÒÔÍâÊÂÇ飬¾ÍÊǵ±/devÀïûÓжÔÓ¦µÄÌØÊâÉ豸ÎļþµÄʱºò£¬Ò²¾Í²»ÄÜ´Ó½ø³Ì½øÐвο¼¡£
9wMLinuxÁªÃË9wMLinuxÁªÃË9wMLinuxÁªÃËFreeBSDºËÐÄ̽ÌÖ.9.Çý¶¯³ÌÐòƪ
9wMLinuxÁªÃË9wMLinuxÁªÃË9wMLinuxÁªÃË2.3.1Çý¶¯³ÌÐò³õʼ»¯
9wMLinuxÁªÃË´ÓÎļþϵͳµÄÄ£¿é¿ÉÒÔ¿´³öÀ´£¬Èç¹ûÒª¶ÔÇý¶¯³ÌÐòµÄÎïÀíÉ豸½øÐÐio,±ØÐë
9wMLinuxÁªÃËÏȶÔËüÃǽøÐгõʼ»¯£¬·ñÔò²»ÄÜ´¦ÀíprocessµÄio¡£ºËÐijõʼ»¯µÄ¹ý³ÌÀһ¹²µÇ¼Ç
9wMLinuxÁªÃËÁËÁ½¸ö»ù±¾µÄ²Ù×÷¹ý³Ì¡
LinuxÁªÃËÊÕ¼¯ÕûÀí ,תÌùÇë±êÃ÷ÔʼÁ´½Ó,ÈçÓÐÈκÎÒÉÎÊ»¶ÓÀ´±¾Õ¾
LinuxÂÛ̳ÌÖÂÛ