¡¡¡¡É豸¹ÜÀíÊDzÙ×÷ϵͳÎå´ó¹ÜÀíÖÐ×ÔӵIJ¿·Ö¡£ÓëUnixϵͳһÑù£¬Linuxϵͳ²ÉÓÃÉ豸Îļþͳһ¹ÜÀíÓ²¼þÉ豸£¬´Ó¶ø½«Ó²¼þÉ豸µÄÌØÐÔ¼°¹ÜÀíϸ½Ú¶ÔÓû§Òþ²ØÆðÀ´£¬ÊµÏÖÓû§³ÌÐòÓëÉ豸ÎÞ¹ØÐÔ¡£ÔÚLinuxϵͳÖУ¬Ó²¼þÉ豸·ÖΪÁ½ÖÖ£¬¼´¿éÉ豸ºÍ×Ö·ûÉ豸¡£
¡¡¡¡1.ÌØ±ðÎļþ
¡¡¡¡Óû§ÊÇͨ¹ýÎļþϵͳÓëÉ豸½Ó¿ÚµÄ£¬ËùÓÐÉ豸¶¼×÷ÎªÌØ±ðÎļþ£¬´Ó¶øÔÚ¹ÜÀíÉϾ;ßÓÐһЩ¹²ÐÔ¡£
¡¡¡¡(1)ÿ¸öÉ豸¶¼¶ÔÓ¦ÎļþϵͳÖеÄÒ»¸öË÷Òý½Úµã£¬¶¼ÓÐÒ»¸öÎļþÃû¡£É豸µÄÎļþÃûÒ»°ãÓÉÁ½²¿·Ö¹¹³É£¬µÚÒ»²¿·ÖÊÇÖ÷É豸ºÅ£¬µÚ¶þ²¿·ÖÊÇ´ÎÉ豸ºÅ¡£
¡¡¡¡Ö÷É豸ºÅ´ú±íÉ豸µÄÀàÐÍ£¬¿ÉÒÔΩһµØÈ·¶¨É豸µÄÇý¶¯³ÌÐòºÍ½çÃæ£¬Èçhd±íʾIDEÓ²ÅÌ£¬sd±íʾSCSIÓ²ÅÌ£¬tty±íʾÖÕ¶ËÉ豸µÈ£»´ÎÉ豸ºÅ´ú±íͬÀàÉ豸ÖеÄÐòºÅ£¬Èçhda±íʾIDEÖ÷Ó²ÅÌ£¬hdb±íʾIDE´ÓÓ²Å̵ȡ£
¡¡¡¡£¨2£©Ó¦ÓóÌÐòͨ³£¿ÉÒÔͨ¹ýϵͳµ÷ÓÃopen( )´ò¿ªÉ豸Îļþ£¬½¨Á¢ÆðÓëÄ¿±êÉ豸µÄÁ¬½Ó¡£
¡¡¡¡£¨3£©¶ÔÉ豸µÄʹÓÃÀàËÆÓÚ¶ÔÎļþµÄ´æÈ¡¡£´ò¿ªÉ豸ÎļþÒԺ󣬾ͿÉÒÔͨ¹ýread( )¡¢write( )¡¢ioctl( )µÈÎļþ²Ù×÷¶ÔÄ¿±êÉ豸½øÐвÙ×÷¡£
¡¡¡¡£¨4£©É豸Çý¶¯³ÌÐò¶¼ÊÇϵͳÄں˵ÄÒ»²¿·Ö£¬ËüÃDZØÐëΪϵͳÄں˻òËüÃǵÄ×ÓϵͳÌṩһ¸ö±ê×¼µÄ½Ó¿Ú¡£ÀýÈ磬һ¸öÖÕ¶ËÇý¶¯³ÌÐò±ØÐëΪLinuxÄÚºËÌṩһ¸öÎļþI/O½Ó¿Ú£»Ò»¸öSCSIÉ豸Çý¶¯³ÌÐòÓ¦¸ÃΪSCSI×ÓϵͳÌṩһ¸öSCSIÉ豸½Ó¿Ú£¬Í¬Ê±SCSI×ÓϵͳҲӦΪÄÚºËÌṩÎļþI/OºÍ»º³åÇø¡£
¡¡¡¡£¨5£©É豸Çý¶¯³ÌÐòÀûÓÃһЩ±ê×¼µÄÄں˷þÎñ£¬ÈçÄÚ´æ·ÖÅäµÈ¡£ÁíÍ⣬´ó¶àÊýLinuxÉ豸Çý¶¯³ÌÐò¶¼¿ÉÒÔÔÚÐèҪʱװÈëÄںˣ¬²»ÐèҪʱ¿ÉÒÔÐ¶ÔØÏÂÀ´¡£
¡¡¡¡´¦ÓÚÓ¦ÓòãµÄ½ø³Ìͨ¹ýÎļþÃèÊö×ÖfdÓëÒÑ´ò¿ªÎļþµÄfile½á¹¹ÏàÁªÏµ¡£ÔÚÎļþϵͳ²ã£¬°´ÕÕÎļþϵͳµÄ²Ù×÷¹æÔò¶Ô¸ÃÎļþ½øÐÐÏàÓ¦´¦Àí¡£
¡¡¡¡¶ÔÓÚÒ»°ãÎļþ(¼´´ÅÅÌÎļþ)£¬Òª½øÐпռäµÄÓ³Éä--´ÓÆÕͨÎļþµÄÂß¼¿Õ¼äÓ³Éäµ½É豸µÄÂß¼¿Õ¼ä£¬È»ºóÔÚÉ豸Çý¶¯²ã×ö½øÒ»²½Ó³Éä--´ÓÉ豸µÄÂß¼¿Õ¼äÓ³Éäµ½ÎïÀí¿Õ¼ä(¼´É豸µÄÎïÀíµØÖ·¿Õ¼ä)£¬½ø¶øÇý¶¯µ×²ãÎïÀíÉ豸¹¤×÷¡£
¡¡¡¡¶ÔÓÚÉ豸Îļþ£¬ÔòÎļþµÄÂß¼¿Õ¼äͨ³£¾ÍµÈ¼ÛÓÚÉ豸µÄÂß¼¿Õ¼ä£¬È»ºó´ÓÉ豸µÄÂß¼¿Õ¼äÓ³Éäµ½É豸µÄÎïÀí¿Õ¼ä£¬ÔÙÇý¶¯µ×²ãµÄÎïÀíÉ豸¹¤×÷¡£
¡¡¡¡2.É豸Çý¶¯³ÌÐòºÍÄÚºËÖ®¼äµÄ½Ó¿Ú
¡¡¡¡LinuxϵͳºÍÉ豸Çý¶¯³ÌÐòÖ®¼äʹÓñê×¼µÄ½»»¥½Ó¿Ú¡£ÎÞÂÛÊÇ×Ö·ûÉ豸¡¢¿éÉ豸»¹ÊÇÍøÂçÉ豸µÄÇý¶¯³ÌÐò£¬µ±ÄÚºËÇëÇóËüÃÇÌṩ·þÎñʱ£¬¶¼Ê¹ÓÃͬÑùµÄ½Ó¿Ú¡£
¡¡¡¡LinuxÌṩÁËÒ»ÖÖȫеĻúÖÆ£¬¾ÍÊÇ¡°¿É°²×°Ä£¿é¡±¡£¿É°²×°Ä£¿éÊÇ¿ÉÒÔÔÚϵͳÔËÐÐʱ¶¯Ì¬µØ°²×°ºÍ²ðжµÄÄÚºËÄ£¿é¡£ÀûÓÃÕâ¸ö»úÖÆ£¬¿ÉÒÔ¸ù¾ÝÐèÒªÔÚ²»±Ø¶ÔÄÚºËÖØÐ±àÒëÁ¬½ÓµÄÌõ¼þÏ£¬½«¿É°²×°Ä£¿é¶¯Ì¬²åÈëÔËÐÐÖеÄÄںˣ¬³ÉΪÆäÖÐÒ»¸öÓлú×é³É²¿·Ö£¬»òÕß´ÓÄÚºËÐ¶ÔØÒѰ²×°µÄÄ£¿é¡£É豸Çý¶¯³ÌÐò»òÓëÉ豸Çý¶¯½ôÃÜÏà¹ØµÄ²¿·Ö(ÈçÎļþϵͳ) ¶¼ÊÇÀûÓÿɰ²×°Ä£¿éʵÏֵġ£
¡¡¡¡ÔÚÓ¦ÓóÌÐò½çÃæÉÏ£¬ÀûÓÃÄÚºËÌṩµÄϵͳµ÷ÓÃÀ´ÊµÏֿɰ²×°Ä£¿éµÄ¶¯Ì¬°²×°ºÍ²ðж¡£µ«Í¨³£Çé¿öÏ£¬Óû§ÊÇÀûÓÃϵͳÌṩµÄ²åÈëÄ£¿é¹¤¾ßºÍÒÆ×ßÄ£¿é¹¤¾ßÀ´×°Ð¶¿É°²×°Ä£¿é¡£²åÈëÄ£¿éµÄ¹¤×÷Ö÷ÒªÈçÏ£º
¡¡¡¡(1) ´ò¿ªÒª°²×°µÄÄ£¿é£¬°ÑËü¶Áµ½Óû§¿Õ¼ä¡£ÕâÖÖ¡°Ä£¿é¡±¾ÍÊǾ¹ý±àÒ뵫ÉÐδÁ¬½ÓµÄ.oÎļþ¡£
¡¡¡¡(2) ±ØÐë°ÑÄ£¿éÄÚÉæ¼°¶ÔÍâ·ÃÎʵķûºÅ(º¯ÊýÃû»ò±äÁ¿Ãû)Á¬½Óµ½Äںˣ¬¼´°ÑÕâЩ·ûºÅÔÚÄÚºËÓ³ÏñÖеĵØÖ·ÌîÈë¸ÃÄ£¿éÐèÒª·ÃÎÊÕâЩ·ûºÅµÄÖ¸Áî¼°Êý¾Ý½á¹¹ÖС£
¡¡¡¡(3) ÔÚÄں˴´½¨Ò»¸ömoduleÊý¾Ý½á¹¹£¬²¢ÉêÇëËùÐèµÄϵͳ¿Õ¼ä¡£
¡¡¡¡(4) ×îºó£¬°ÑÓû§¿Õ¼äÖÐÍê³ÉÁËÁ¬½ÓµÄÄ£¿éÓ³Ïñ×°ÈëÄں˿ռ䣬²¢ÔÚÄÚºËÖС°µÇ¼Ç¡±±¾Ä£¿éµÄÓйØÊý¾Ý½á¹¹(Èçfile_operations½á¹¹)£¬ÆäÖÐÓÐÖ¸ÏòÖ´ÐÐÏà¹Ø²Ù×÷º¯ÊýµÄÖ¸Õë¡£
¡¡¡¡ÈçǰËùÊö£¬LinuxϵͳÊÇÒ»¸ö¶¯Ì¬µÄ²Ù×÷ϵͳ¡£Óû§¸ù¾Ý¹¤×÷ÖеÄÐèÒª£¬»á¶ÔϵͳÖÐÉè±¸ÖØÐÂÅäÖã¬È簲װеĴòÓ¡»ú¡¢Ð¶ÔØÀÏʽÖն˵ȡ£ÕâÑù£¬Ã¿µ±LinuxϵͳÄں˳õÆôʱ£¬Ëü¶¼Òª¶ÔÓ²¼þÅäÖýøÐмì²â£¬ºÜÓпÉÄÜ»á¼ì²âµ½²»Í¬µÄÎïÀíÉ豸£¬¾ÍÐèÒª²»Í¬µÄÇý¶¯³ÌÐò¡£
¡¡¡¡ÔÚ¹¹½¨ÏµÍ³ÄÚºËʱ£¬¿ÉÒÔʹÓÃÅäÖýű¾½«É豸Çý¶¯³ÌÐò°üº¬ÔÚϵͳÄÚºËÖС£ÔÚϵͳÆô¶¯Ê±¶ÔÕâЩÇý¶¯³ÌÐò³õʼ»¯£¬ËüÃÇ¿ÉÄÜδÕÒµ½Ëù¿ØÖƵÄÉ豸£¬¶øÁíÍâµÄÉ豸Çý¶¯³ÌÐò¿ÉÒÔÔÚÐèҪʱ×÷ΪÄÚºËÄ£¿é×°È뵽ϵͳÄÚºËÖС£
¡¡¡¡ÎªÁËÊÊÓ¦É豸Çý¶¯³ÌÐò¶¯Ì¬Á¬½ÓµÄÌØÐÔ£¬É豸Çý¶¯³ÌÐòÔÚÆä³õʼ»¯Ê±¾ÍÔÚϵͳÄÚºËÖнøÐеǼǡ£LinuxϵͳÀûÓÃÉ豸Çý¶¯³ÌÐòµÄµÇ¼Ç±í×÷ΪÄÚºËÓëÇý¶¯³ÌÐò½Ó¿ÚµÄÒ»²¿·Ö£¬ÕâЩ±íÖаüÀ¨Ö¸ÏòÓйش¦Àí³ÌÐòµÄÖ¸ÕëºÍÆäËüÐÅÏ¢¡£
xuanchengzi ÓÚ 2006-11-20 00:27:03·¢±í:
¡¡¡¡3.×Ö·ûÉ豸
¡¡¡¡ÔÚLinuxϵͳÖУ¬´òÓ¡»ú¡¢Öն˵È×Ö·ûÉ豸¶¼×÷Ϊ×Ö·ûÌØ±ðÎļþ³öÏÖÔÚÓû§ÃæÇ°¡£Óû§¶Ô×Ö·ûÉ豸µÄʹÓþͺʹæÈ¡ÆÕͨÎļþÒ»Ñù¡£ÔÚÓ¦ÓóÌÐòÖУ¬Ê¹Óñê×¼µÄϵͳµ÷ÓÃÀ´´ò¿ª¡¢¹Ø±Õ¡¢¶Áд×Ö·ûÉ豸¡£µ±×Ö·ûÉ豸³õʼ»¯Ê±£¬ÆäÉ豸Çý¶¯³ÌÐò±»Ìí¼Óµ½ÓÉdevice_struct½á¹¹×é³ÉµÄchrdevs½á¹¹Êý×éÖС£
¡¡¡¡device_struct½á¹¹ÓÉÁ½Ïî¹¹³É£¬Ò»¸öÊÇÖ¸ÏòÒѵǼǵÄÉ豸Çý¶¯³ÌÐòÃûµÄÖ¸Õ룬ÁíÒ»¸öÊÇÖ¸Ïòfile_operations½á¹¹µÄÖ¸Õë¡£¶øfile_operations½á¹¹µÄ³É·Ö¼¸ºõÈ«ÊǺ¯ÊýÖ¸Õ룬·Ö±ðÖ¸ÏòʵÏÖÎļþ²Ù×÷µÄÈë¿Úº¯Êý¡£É豸µÄÖ÷É豸ºÅÓÃÀ´¶ÔchrdevsÊý×é½øÐÐË÷Òý¡£
¡¡¡¡Ç°Ãæ½²¹ý£¬Ã¿¸öVFSË÷Òý½Úµã¶¼ºÍһϵÁÐÎļþ²Ù×÷ÏàÁªÏµ£¬²¢ÇÒÕâЩÎļþ²Ù×÷ËæË÷Òý½ÚµãËù´ú±íµÄÎļþÀàÐͲ»Í¬¶ø²»Í¬¡£Ã¿µ±Ò»¸öVFSË÷Òý½ÚµãËù´ú±íµÄ×Ö·ûÉ豸Îļþ´´½¨Ê±£¬ËüµÄÓйØÎļþµÄ²Ù×÷¾ÍÉèÖÃΪĬÈϵÄ×Ö·ûÉ豸²Ù×÷¡£
¡¡¡¡Ä¬ÈϵÄÎļþ²Ù×÷Ö»°üº¬Ò»¸ö´ò¿ªÎļþµÄ²Ù×÷¡£µ±´ò¿ªÒ»¸ö´ú±í×Ö·ûÉ豸µÄÌØ±ðÎļþÒԺ󣬾͵õ½ÏàÓ¦µÄVFSË÷Òý½Úµã£¬ÆäÖаüÀ¨¸ÃÉ豸µÄÖ÷É豸ºÅºÍ´ÎÉ豸ºÅ¡£
¡¡¡¡ÀûÓÃÖ÷É豸ºÅ¾Í¿ÉÒÔ¼ìË÷chrdevsÊý×飬½ø¶ø¿ÉÒÔÕÒµ½ÓйشËÉ豸µÄ¸÷ÖÖÎļþ²Ù×÷¡£ÕâÑù£¬Ó¦ÓóÌÐòÖеÄÎļþ²Ù×÷¾Í»áÓ³Éäµ½×Ö·ûÉ豸µÄÎļþ²Ù×÷µ÷ÓÃÖС£
¡¡¡¡4.¿éÉ豸
¡¡¡¡¶Ô¿éÉ豸µÄ´æÈ¡ºÍ¶ÔÎļþµÄ´æÈ¡·½Ê½Ò»Ñù£¬ÆäʵÏÖ»úÖÆÒ²ºÍ×Ö·ûÉ豸ʹÓõĻúÖÆÏàͬ¡£LinuxϵͳÖÐÓÐÒ»¸öÃûΪblkdevsµÄ½á¹¹Êý×飬ËüÃèÊöÁËһϵÁÐÔÚϵͳÖеǼǵĿéÉ豸¡£
¡¡¡¡Êý×éblkdevsҲʹÓÃÉ豸µÄÖ÷É豸ºÅ×÷ΪË÷Òý£¬ÆäÔªËØÀàÐÍÊÇdevice_struct½á¹¹¡£¸Ã½á¹¹ÖаüÀ¨Ö¸ÏòÒѵǼǵÄÉ豸Çý¶¯³ÌÐòÃûµÄÖ¸ÕëºÍÖ¸Ïòblock_device_operations½á¹¹µÄÖ¸Õë¡£
¡¡¡¡ÔÚblock_device_operations½á¹¹Öаüº¬Ö¸ÏòÓйزÙ×÷µÄº¯ÊýÖ¸Õë¡£ËùÒÔ£¬¸Ã½á¹¹¾ÍÊÇÁ¬½Ó³éÏóµÄ¿éÉ豸²Ù×÷Óë¾ßÌå¿éÉ豸ÀàÐ͵IJÙ×÷Ö®¼äµÄÊàŦ¡£
¡¡¡¡Óë×Ö·ûÉ豸²»Ò»Ñù£¬¿éÉ豸Óм¸ÖÖÀàÐÍ£¬ÀýÈçSCSIÉ豸ºÍIDEÉ豸¡£Ã¿Àà¿éÉ豸¶¼ÔÚLinuxϵͳÄÚºËÖеǼǣ¬²¢ÏòÄÚºËÌṩ×Ô¼ºµÄÎļþ²Ù×÷¡£
¡¡¡¡ÎªÁ˰Ѹ÷ÖÖ¿éÉ豸µÄ²Ù×÷ÇëÇó¶ÓÁÐÓÐЧµØ×éÖ¯ÆðÀ´£¬ÄÚºËÖÐÉèÖÃÁËÒ»¸ö½á¹¹Êý×éblk_dev£¬¸ÃÊý×éÖеÄÔªËØÀàÐÍÊÇblk_dev_struct½á¹¹¡£Õâ¸ö½á¹¹ÓÉÈý¸ö³É·Ö×é³É£¬ÆäÖ÷ÌåÊÇÖ´ÐвÙ×÷µÄÇëÇó¶ÓÁÐrequest_queue£¬»¹ÓÐÒ»¸öº¯ÊýÖ¸Õëqueue¡£
¡¡¡¡µ±Õâ¸öÖ¸Õ벻Ϊ0ʱ£¬¾Íµ÷ÓÃÕâ¸öº¯ÊýÀ´ÕÒµ½¾ßÌåÉ豸µÄÇëÇó¶ÓÁС£ÕâÊÇ¿¼Âǵ½¶à¸öÉ豸¿ÉÄܾßÓÐͬһÖ÷É豸ºÅ£¬¸ÃÖ¸ÕëÔÚÉ豸³õʼ»¯Ê±±»ÉèÖúá£Í¨³£µ±Ëü²»Îª0ʱ£¬»¹ÒªÊ¹ÓøýṹÖеÄÁíÒ»¸öÖ¸Õëdata£¬ÓÃÀ´Ìṩ¸¨ÖúÐÔÐÅÏ¢£¬°ïÖú¸Ãº¯ÊýÕÒµ½Ìض¨É豸µÄÇëÇó¶ÓÁС£Ã¿Ò»¸öÇëÇóÊý¾Ý½á¹¹¶¼´ú±íÒ»¸öÀ´×Ô»º³åÇøµÄÇëÇó¡£
¡¡¡¡Ã¿µ±»º³åÇøÒªºÍÒ»¸öµÇ¼Ç¹ýµÄ¿éÉ豸½»»»Êý¾Ý£¬Ëü¶¼»áÔÚblk_dev_structÖÐÌí¼ÓÒ»¸öÇëÇóÊý¾Ý½á¹¹.
¡¡¡¡Ã¿Ò»¸öÇëÇó¶¼ÓÐÒ»¸öÖ¸ÕëÖ¸ÏòÒ»¸ö»ò¶à¸öbuffer_headÊý¾Ý½á¹¹£¬¶ø¸Ã½á¹¹¶¼ÊÇÒ»¸ö¶ÁдÊý¾Ý¿éµÄÇëÇó¡£Ã¿Ò»¸öÇëÇó½á¹¹¶¼ÔÚÒ»¸ö¾²Ì¬Á´±íall_requestsÖС£Èô¸ÉÇëÇóÊÇÌí¼Óµ½Ò»¸ö¿ÕµÄÇëÇóÁ´±íÖУ¬Ôòµ÷ÓÃÉ豸Çý¶¯³ÌÐòµÄÇëÇóº¯Êý£¬¿ªÊ¼´¦Àí¸ÃÇëÇó¶ÓÁС£·ñÔò£¬É豸Çý¶¯³ÌÐò¾Í¼òµ¥µØ´¦ÀíÇëÇó¶ÓÁÐÖеÄÿһ¸öÇëÇó¡£
¡¡¡¡µ±É豸Çý¶¯³ÌÐòÍê³ÉÁËÒ»¸öÇëÇóºó£¬¾Í°Ñbuffer_head½á¹¹´Órequest½á¹¹ÖÐÒÆ×ߣ¬²¢±ê¼Çbuffer_head½á¹¹ÒѸüУ¬Í¬Ê±½âËø£¬ÕâÑù£¬¾Í¿ÉÒÔ»½ÐÑÏàÓ¦µÄµÈ´ý½ø³Ì¡£