Embedded °æ (¾«»ªÇø)

·¢ÐÅÈË: he (hehe), ÐÅÇø: Embedded_system
±ê  Ìâ: (LDD) Ch12-¼ÓÔØ¿éÉ豸Çý¶¯³ÌÐò (zz)
·¢ÐÅÕ¾: ¹þ¹¤´ó×϶¡Ïã (2001Äê06ÔÂ24ÈÕ17:18:01 ÐÇÆÚÌì), Õ¾ÄÚÐżþ

µÚÊ®¶þÕ ¼ÓÔØ¿éÉ豸Çý¶¯³ÌÐò



ÕýÈçÔÚµÚÒ»Õ¡°LinuxºËÐļò½é¡±ÖС°É豸ÓëÄ£¿éµÄ·ÖÀࡱÖÐËù¸ÅÊöµÄÒ»Ñù£¬UnixµÄÉ豸
Çý¶¯³ÌÐò²¢²»½öÏÞÓÚ×Ö·ûÉ豸¡£±¾Õ¾ÍÀ´½éÉÜһϵڶþ´óÀàµÄÉ豸Çý¶¯³ÌÐò¡ª¡ª¿éÉ豸
Çý¶¯³ÌÐò¡£ËùνÃæÏò¿éµÄÉ豸ÊÇÖ¸Êý¾Ý´«ÊäÊÇÒÔ¿éΪµ¥Î»µÄ£¨ÀýÈçÈíÅ̺ÍÓ²ÅÌ£©£¬ÕâÀï
Ó²¼þµÄ¿éÒ»°ã±»³Æ×÷¡°ÉÈÇø£¨Sector£©¡±¡£¶øÃû´Ê¡°¿é¡±³£ÓÃÀ´Ö¸Èí¼þÉϵĸÅÄÇý¶¯
³ÌÐò³£³£Ê¹ÓÃ1KB´óСµÄ¿é£¬¼´Ê¹ÉÈÇø´óСΪ512×Ö½Ú¡£

ÔÚÕâÒ»Õ£¬ÎÒÃǽ«À´¹¹ÔìÒ»¸öÈ«ÌØÕ÷µÄ¿éÉ豸Çý¶¯³ÌÐòsbull£¨Simple Block Utility
for Loading Localities£©¡£Õâ¸öÇý¶¯³ÌÐòÓëscullÀàËÆ£¬Ò²ÊÇʹÓüÆËã»úµÄÄÚ´æ×÷ΪӲ
¼þÉ豸¡£»»¾ä»°Ëµ£¬ËüÊÇÒ»¸öRAM-diskµÄÇý¶¯³ÌÐò¡£sbull¿ÉÒÔÔÚÈκÎLinux¼ÆËã»úÉÏÖ´
ÐУ¨²»¹ýÎÒÖ»ÔÚÓÐÏ޵ļ¸¸öƽ̨ÉÏ×÷¹ý²âÊÔ£©¡£

×¢²áÇý¶¯³ÌÐò

ºÍ×Ö·ûÉ豸Çý¶¯³ÌÐòÀàËÆ£¬ºËÐÄÀïµÄ¿éÉ豸Çý¶¯³ÌÐòÒ²ÊÇÓÉÒ»¸öÖ÷É豸ºÅÀ´±êʶ¡£ÓÃÀ´
¶ÔÆä½øÐÐ×¢²áºÍÈ¡Ïû×¢²áµÄº¯ÊýÊÇ£º

int register_blkdev(unsigned int major, const char*name, struct
file_operations *fops)

int unregister_blkdev(unsigned int major, const char*name)£»

²ÎÊýµÄº¬ÒåÓë×Ö·ûÉ豸Çý¶¯³ÌÐòÒ»Ñù£¬¶ÔÖ÷É豸ºÅµÄ¶¯Ì¬¸³ÖµÒ²ÀàËÆ¡£Òò´Ë£¬Ò»¸ösbull
É豸ÓëscullÒ»Ñù½«×Ô¼º×¢²á£º

result=register_blkdev(sbull_major,¡°sbull¡±£¬$sbull_fops);

if(result<0){

      printk(KERN_WARNING¡°sbull:can¡¯t get major %d\n¡±,sbull_major);

      return result;

      }

if (sbull_major==0)  sbull_major=result;     /*dynamic*/

major=sbull_major;                       /*Use ¡°major¡±later on to save
 /*Use ¡°major¡±later on to save
typing*/

register_blkdev µÄfops²ÎÊýÓëÎÒÃÇÔÚ×Ö·ûÉ豸Çý¶¯³ÌÐòÖÐʹÓõÄÀàËÆ£¬Îªread£¬write
ÒÔ¼°fsyncµÄ²Ù×÷²¢²»ÒªÇóÕë¶Ôij¸öÇý¶¯³ÌÐò¡£Í¨Óú¯Êýblock_read, block_write¼°blo
ck_fsync±»ÓÃÀ´´úÌæÈκÎÕë¶Ôij¸öÇý¶¯³ÌÐòµÄº¯Êý¡£ÁíÍ⣬check_media_changeºÍreval
idate¶Ô¿éÉ豸Çý¶¯³ÌÐòÒ²ÓÐÒâÒ壬¶þÕ߶¼ÔÚsbull_fopsÖж¨Òå¡£

ÔÚsbullÖÐʹÓõÄfops½á¹¹ÈçÏ£º

£¨´úÂë236£©

ͨÓõĶÁд²Ù×÷±»ÓÃÀ´»ñµÃ½Ï¸ßµÄÐÔÄÜ¡£Í¨¹ýÊý¾Ý»º³å»ñµÃ¼ÓËÙ£¬ÕâÔÚ×Ö·ûÉ豸Çý¶¯³Ì
ÐòÖØÖÐÊÇûÓеġ£¿éÉ豸Çý¶¯³ÌÐò¿ÉÒÔ±»»º³åÊÇÒòΪËüÃǵÄÊý¾Ý·þ´ÓÓÚ¼ÆËã»úµÄÎļþ²ã
´Î½á¹¹£¬ÈκÎÓ¦ÓóÌÐò¶¼ÎÞ·¨Ö±½Ó·ÃÎÊ£¬¶ø×Ö·ûÉ豸Çý¶¯³ÌÐòÔò²»ÊÇÕâÑù¡£

²»¹ý£¬µ±»º³åµÄ¸ßËÙ»º´æ²»ÄÜÂú×ãÒ»¸ö¶ÁÇëÇó»òµ±Ò»¸ö´ý´¦ÀíµÄд²Ù×÷Ҫˢе½ÎïÀí´Å
ÅÌÉÏʱ£¬Çý¶¯³ÌÐò±ØÐë±»µ÷ÓÃÀ´½øÐÐÕæÕýµÄÊý¾Ý´«ËÍ¡£fops½á¹¹³ýÁËreadºÍwriteÍ⣬²¢
²»´øÓÐÈë¿Úµã£¬Òò´Ë£¬±ØÐëÒªÒ»¸ö¶îÍâµÄ½á¹¹blk_dev_structÀ´·¢³ö¶Ôʵ¼ÊÊý¾Ý´«Ë͵Ä
ÇëÇó¡£

Õâ¸ö½á¹¹ÔÚ<linux/blkdev.h>¶¨Ò壬ËüÓм¸¸öÓò£¬µ«Ö»ÓеÚÒ»¸öÓòÐè±»Çý¶¯³ÌÐòÉèÖá£
ÏÂÃæÊÇÕâ¸ö½á¹¹ÔÚºËÐÄ2.0ÖеĶ¨Òå¡£
ÏÂÃæÊÇÕâ¸ö½á¹¹ÔÚºËÐÄ2.0ÖеĶ¨Òå¡£

£¨´úÂë237£©

µ±ºËÐÄÐèҪΪsbullÉ豸²úÉúÒ»¸öI/O²Ù×÷ʱ£¬Ëü±ãµ÷Óú¯Êýblk_dev[sbull_major].requ
est_fn¡£Òò´ËÕâ¸öÄ£¿éµÄ³õʼ»¯º¯ÊýÐëÉèÖÃÕâ¸öÓòʹÆäÖ¸ÏòËü×Ô¼ºµÄÇëÇóº¯Êý¡£Õâ¸ö½á
¹¹ÖеÄÆäËüÓòÖ»¹©ºËÐĺ¯Êý»òºê½øÐÐÄÚ²¿Ê¹Óã»Äã²»±ØÔÚÄãµÄ´úÂë¶ÎÖÐÏÔʽµØʹÓÃËüÃÇ
¡£

Ò»¸ö¿éÉ豸Çý¶¯³ÌÐòÄ£¿éÓëºËÐĵĹØϵ¼ûͼ12-1¡£

³ýÁËblk_dev»¹Óм¸¸öÊý×é´øÓпéÉ豸Çý¶¯³ÌÐòµÄÐÅÏ¢¡£ÕâЩÊý×éÒ»°ãÓÉÖ÷É豸ºÅ£¨ÓÐʱ
Ò²ÓôÎÉ豸ºÅ£©½øÐÐË÷Òý¡£ËüÃÇÔÚdrivers/block/ll_rw_block.cÖб»ÉùÃ÷ºÍÃèÊö¡£

int blk_size[][];

Õâ¸öÊý×éÓÉÖ÷É豸ºÅºÍ´ÎÉ豸ºÅË÷Òý¡£ËüÒÔKBΪµ¥Î»ÃèÊöÁËÿ¸öÉ豸µÄ´óС¡£Èç¹ûblk_s
ize[major]ÊÇNULL£¬Ôò²»¶ÔÕâ¸öÉ豸µÄ´óС½øÐмì²é£¨Ò²¾ÍÊÇ˵£¬ºËÐÄ¿ÉÄÜÒªÇóÊý¾Ý´«
ËÍͨ¹ýend_of_device£©¡£

int blksize_size[][];

±»Ã¿¸öÉ豸ËùʹÓõĿéµÄ´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£ÓëÉÏÒ»¸öÊý×éÀàËÆ£¬Õâ¸ö¶þάÊý×éÒ²ÊÇ
ÓÉÖ÷É豸ºÅºÍ´ÎÉ豸ºÅË÷Òý¡£Èç¹ûblksize_size[major]ÊÇÒ»¸ö¿ÕÖ¸Õ룬ÄÇô±ã¼ÙÉèÆä¿é
´óСΪBLOCK_SIZE£¨Ä¿Ç°ÊÇ1KB£©¡£¿é´óС±ØÐëÊÇ2µÄÃÝ£¬ÒòΪºËÐÄʹÓÃÒÆλ²Ù×÷½«Æ«ÒÆ
Á¿×ª»»Îª¿éºÅ¡£

int hardsect_size[][];

ÓëÆäËüµÄÒ»Ñù£¬Õâ¸öÊý¾Ý½á¹¹Ò²ÊÇÓÉÖ÷É豸ºÅºÍ´ÎÉ豸ºÅË÷Òý¡£Ó²¼þÉÈÇøµÄȱʡ´óСΪ5
12×Ö½Ú¡£Ö±µ½°üÀ¨2.0.X°æ±¾ÎªÖ¹£¬¿É±äÉÈÇø´óСÈÔδÕæÕýÖ§³Ö£¬ÒòΪһЩºËÐÄ´úÂëÈÔ¾É
¼ÙÉèÉÈÇø´óСΪ°ëKB¡£²»¹ýºÜ¿ÉÄÜÔÚ2.2°æ±¾ÖлáÕæÕýʵÏֿɱäÉÈÇø´óС¡£

int read_ahead[];

Õâ¸öÊý×éÓÉÖ÷É豸ºÅË÷Òý£¬Ëü¶¨ÒåÁËÒ»¸öÎļþ±»Ë³Ðò¶Áȡʱ£¬ºËÐÄ¿ÉÒÔÌáÇ°¶ÁÈ¡¶àÉÙÉÈ
Çø¡£ÔÚ½ø³ÌÇëÇóÊý¾Ý֮ǰ½«Æä¶Á³ö¿ÉÒÔ¸ÄÉÆϵͳµÄÐÔÄܼ°×ܵÄÍÌÍÂÂÊ¡£ÂýËÙÉ豸×îºÃÖ¸
¶¨Ò»¸ö½Ï´óµÄÌáÇ°¶ÁµÄÖµ£¬¶øÒ»¸ö¿ìËÙÉ豸Ôò¿ÉÒÔÔÚ½ÏСµÄÌáÇ°¶ÁµÄֵϹ¤×÷µÄºÜºÃ¡£
Õâ¸öÌáÇ°¶ÁµÄÖµÔ½´ó»º³å¸ßËÙ»º´æÔòÐèÒªÔ½¶àµÄÄڴ档ÿ¸öÖ÷É豸ºÅÓÐÒ»¸öÌáÇ°¶ÁµÄÖµ
£¬Ëü¶ÔËùÓдÎÉ豸ºÅÓÐЧ¡£Õâ¸öÖµ¿ÉÒÔͨ¹ýÇý¶¯³ÌÐòµÄioctl·½·¨À´¸Ä±ä£»Ó²ÅÌÇý¶¯³ÌÐò
Ò»°ãÉèΪ8¸öÉÈÇø£¬¶ÔÓ¦×Å4KB¡£

sbullÉ豸ÔÊÐíÔÚ¼ÓÔØʱÉèÖÃÕâЩֵ£¬ËüÃÇ×÷ÓÃÓÚʾÀýÇý¶¯³ÌÐòµÄËùÓдÎÉ豸ºÅ¡£ÔÚsbul
lÖбäÁ¿ÃûºÍËüÃǵÄȱʡֵΪ£º


size=2048(KB)

ÓÉsbullÉú³ÉµÄÿ¸öramdiskÕ¼Á½Õ××Ö½Ú£¬ÕýÈçϵͳµÄȱʡֵ¡£

hardsect=512(B)

sbullÉÈÇø´óСÊdz£ÓõİëKBÖµ¡£¸Ä±ähardsectµÄÖµÊDz»ÔÊÐíµÄ¡£

ÈçÇ°ËùÊö£¬ÆäËüµÄÉÈÇø´óС²¢²»±»Ö§³Ö¡£Èç¹ûÄãÒ»¶¨Òª¸ÄËü£¬¿ÉÒÔ½«sbull/sbull.cÖеÄ
°²È«¼ì²éÈ¥µô¡£²»¹ýÇë×öºÃ·¢ÉúÑÏÖصÄÄÚ´æ±ÀÀ£µÄΣÏÕµÄ×¼±¸¡£³ý·ÇÔÚÄã³¢ÊÔʱ£¬ÒѾ­
¼ÓÉÏÁ˶ԿɱäÉÈÇø´óСµÄÖ§³Ö¡£

rahead=2(ÉÈÇø)

ÒòΪramdiskÊÇÒ»¸ö¿ìËÙÉ豸£¬ËùÒÔÕâ¸öȱʡÌáÇ°¶ÁµÄÖµ±È½ÏС¡£

sbullÉ豸ҲÔÊÐíÄãÑ¡ÔñÒ»¸öÉ豸¸öÊý½øÐа²×°¡£devsÊÇÉ豸¸öÊý£¬È±Ê¡ÉèΪ2£¬±íÃ÷ȱ
Ê¡ÄÚ´æʹÓÃÁ¿Îª4Õסª¡ª2¸ö´óСΪ2MBµÄÅÌ¡£

sbullÉ豸µÄinit_moduleµÄʵÏÖÈçÏ£¨²»º¬Ö÷É豸ºÅµÄ×¢²áºÍ´íÎó»Ö¸´£©£º

£¨´úÂë239£©
£¨´úÂë239£©

ÏàÓ¦µÄÇå³ýº¯ÊýÈçÏÂËùʾ£º

£¨´úÂë240£©

ÕâÀµ÷ÓÃfsync_devÊDZØÐëµÄ£¬ÓÃÒÔÇå³ýºËÐı£´æÔÚ²»Í¬¸ßËÙ»º´æÖеĶÔÉ豸µÄËùÓÐÒý
Óá£ÊÂʵÉÏ£¬fsync_devÊÇÔËÐÐÔÚblock--_fsyncÖ®ºóµÄÒýÇ棬ËüÊÇ¿éÉ豸µÄfsync¡°·½·¨
¡±¡£

Í·Îļþ blk.h

ÓÉÓÚ¿éÉ豸Çý¶¯³ÌÐòµÄ¾ø´ó²¿·ÖÊÇÉ豸Î޹صÄ,ºËÐĵĿª·¢Õßͨ¹ý°Ñ´ó²¿·ÖÏàͬµÄ´úÂë·Å
ÔÚÒ»¸öÍ·Îļþ<linux/blk.h>ÖУ¬À´ÊÔͼ¼ò»¯Çý¶¯³ÌÐòµÄ´úÂë¡£Òò´Ë£¬Ã¿¸ö¿éÉ豸Çý¶¯³Ì
Ðò¶¼±ØÐë°üº¬Õâ¸öÍ·Îļþ£¬ÔÚ<linux/blk.h>Öж¨ÒåµÄ×îÖØÒªµÄº¯ÊýÊÇend_request£¬Ëü
±»ÉùÃ÷Ϊstatic£¨¾²Ì¬£©µÄ¡£ÈÃËü³ÉΪ¾²Ì¬µÄ£¬Ê¹µÃ²»Í¬Çý¶¯³ÌÐò¿ÉÓÐÒ»¸öÕýÈ·¶¨ÒåµÄe
nd_request£¬¶ø²»ÐèҪÿ¸ö¶¼Ð´×Ô¼ºµÄʵÏÖ¡£

ÔÚLinux1.2ÖУ¬Õâ¸öÍ·ÎļþÓ¦¸ÃÓÃ<linux/../../drivers/block/blk.h>À´°üº¬¡£Ô­ÒòÔÚ
ÓÚµ±Ê±»¹²»Ö§³Ö×Ô¶¨ÒåµÄ¿éÉ豸Çý¶¯³ÌÐò£¬¶øÕâ¸öÍ·Îļþ×î³õλÓÚdrivers/blockÔ´ÂëÄ¿
¼Ï¡£

ʵ¼ÊÉÏ£¬blk.hÏ൱²»Ñ°³££¬±ÈÈçËü¶¨ÒåÁ˼¸¸ö»ùÓÚ·ûºÅMAJOR_NRµÄ·ûºÅ£¬¶øMAJOR_NR±Ø
ÐëÓÉÇý¶¯³ÌÐòÔÚËü°üº¬Õâ¸öÍ·Îļþ֮ǰÉùÃ÷¡£ÕâÀÎÒÃÇÔٴο´µ½blk.hÔÚÉè¼Æʱ²¢Ã»ÓÐ
ÕæÕý¿¼ÂÇ×Ô¶¨ÒåÇý¶¯³ÌÐò¡£

¿´¿´blk.h£¬Äã»á·¢ÏÖ¼¸¸öÉ豸Ïà¹ØµÄ·ûºÅÊÇ°´ÕÕMAJOR_NRµÄÖµÉùÃ÷µÄ£¬Ò²¾ÍÊÇ˵MAJOR_
NRÓ¦¸ÃÌáÇ°ÖªµÀ¡£È»¶ø£¬Èç¹ûÖ÷É豸ºÅÊǶ¯Ì¬¸³ÖµµÄ£¬Çý¶¯³ÌÐòÎÞ·¨Ô¤ÖªÆäÖµ£¬Òò´ËÒ²
¾Í²»ÄÜÕýÈ·¶¨ÒåMAJOR_NR¡£Èç¹ûMAJOR_NR䶨Ò壬blk.h¾Í²»ÄÜÉ趨һЩÔÚend_request
ÖÐʹÓõĺꡣÒò´Ë£¬ÎªÁËÈÃ×Ô¶¨ÒåÇý¶¯³ÌÐò´ÓͨÓõÄend_requestº¯ÊýÊÜÒ棬´Ó¶ø±ÜÃâÖØ
ÐÂʵÏÖËü£¬Çý¶¯³ÌÐò±ØÐëÔÚ°üº¬blk.h֮ǰ¶¨ÒåMAJOR_NRºÍÆäËü¼¸¸ö·ûºÅ¡£

ÏÂÃæµÄÁбíÃèÊöÁËһЩ±ØÐëÌáÇ°¶¨ÒåµÄ<linux/blk.h>ÖеķûºÅ¡£Áбí½áβ¸ø³öÁËsbull
ÖÐʹÓõĴúÂë¡£

MAJOR_NR

Õâ¸ö·ûºÅÓÃÀ´·ÃÎÊһЩÊý×飬ÌرðÊÇblk-_devºÍblksize-_size¡£×Ô¶¨ÒåÇý¶¯³ÌÐò£¨Èçsb
ull£©²»ÄܸøÕâ¸ö·ûºÅ¸³Ò»¸ö³£Á¿Öµ£¬¿ÉÒÔ½«Æ䶨Ò壨#define£©ÎªÒ»¸ö´æÓÐÖ÷É豸ºÅµÄ
±äÁ¿¡£¶Ôsbull¶øÑÔ£¬ËüÊÇsbull-_major¡£

DEVICE_NAME

       ±»Éú³ÉµÄÉ豸Ãû¡£Õâ¸ö×Ö·û´®ÓÃÀ´´Óend_requestÖдòÓ¡´íÎóÐÅÏ¢¡£


DEVICE_NR(kdev_t device)

Õâ¸ö·ûºÅÓÃÀ´´Ókdev_tÉ豸ºÅÖгéÈ¡ÎïÀíÉ豸µÄÐòºÅ¡£Õâ¸öºêµÄÖµ¿ÉÒÔÊÇMINOR(device)
»ò±ðµÄ±í´ïʽ¡£ÕâÒªÒÀ¾Ý¸øÉ豸»ò·ÖÇø·ÖÅä´ÎÉ豸ºÅµÄ³£¹æ·½Ê½¶ø¶¨¡£¶Ôͬһ¸öÎïÀíÉè
±¸ÉϵÄËùÓзÖÇø£¬Õâ¸öºêÓ¦·µ»Øͬһ¸öÉ豸ºÅ¡ª¡ªÒ²¾ÍÊÇ˵£¬DEVICE_NR±í´ïµÄÊÇ´ÅÅ̺Å
£¬¶ø²»ÊÇ·ÖÇøºÅ¡£Õâ¸ö·ûºÅ±»ÓÃÀ´ÉùÃ÷CURRENT_DEV£¬ËüÔÚrequest_fnÖÐÓÃÀ´È·¶¨±»Ò»¸ö
´«ËÍÇëÇó·ÃÎʵÄÓ²¼þÉ豸µÄ´ÎÉ豸ºÅ£¬¿É·ÖÇøÉ豸½«ÔÚºóÃæ¡°¿É·ÖÇøÉ豸¡±Ò»½ÚÖнéÉÜ
¡£

DEVICE_INTR

Õâ¸ö·ûºÅÓÃÀ´ÉùÃ÷Ò»¸öÖ¸Ïòµ±Ç°Ï°벿´¦Àí³ÌÐòµÄÖ¸Õë±äÁ¿¡£ºêSET_INTR(intr)ºÍCLEAR
_INTRÓÃÀ´¸øÕâ¸ö±äÁ¿¸³Öµ¡£µ±É豸¿ÉÒÔ·¢³ö¾ßÓв»Í¬º¬ÒåµÄÖжÏʱ£¬Ê¹Óöà¸ö´¦Àí³ÌÐò
ÊǺܷ½±ãµÄ¡£Õâ¸öÖ÷Ì⽫ÔÚºóÃæ¡°ÖжÏÇý¶¯µÄ¿éÉ豸Çý¶¯³ÌÐò¡±Ò»½ÚÖÐÌÖÂÛ¡£

TIMEOUT_VALUE

DEBICE_TIMEOUT

TIMEOUT_VALUEÒÔ¼ÇÊýµÄ·½Ê½±í´ï³¬Ê±£¬Õâ¸ö³¬Ê±µÄÖµÓëÀϼÆʱÆ÷Ö®Ò»£¨ÌرðµØÖ¸¼ÆʱÆ÷
ºÅDEVICE_TIMEOUT£©Ïà¹ØÁª¡£Ò»¸öÇý¶¯³ÌÐò¿ÉÒÔÔÚÊý¾Ý´«ËÍʱ¼äÌ«³¤Ê±£¬Í¨¹ýµ÷ÓÃÒ»¸ö
»Øµ÷º¯ÊýÀ´¼ì²â´íÎóÌõ¼þ¡£²»¹ý£¬ÓÉÓÚÀϼÆʱÆ÷ÓÉÒ»¸öÔ¤¸³ÖµµÄ¼ÆʱÆ÷¾²Ì¬Êý×é×é³É£¨
¼ûµÚÁùÕ¡°Ê±¼äÁ÷¡±ÖС°ºËÐļÆʱÆ÷¡±Ò»½Ú£©£¬Ò»¸ö×Ô¶¨ÒåµÄÇý¶¯³ÌÐò²»ÄÜʹÓÃËüÃÇ¡£
ÎÒÔÚsbullÖжÔÕâÁ½¸ö·ûºÅ¶¼Î´¶¨Ò壬¶øÊÇÓÃÒ»¸öеļÆʱÆ÷ʵÏÖ³¬Ê±¡£

DEBICE_NO_RANDOM

ÔÚȱʡÇé¿öÏ£¬º¯Êýend_request¶ÔϵͳìØÖµ£¨¼´ËùÓÐËæ»úÐÔµÄ×ÜÁ¿£©ÓÐËù¹±Ï×£¬Õâ±»/d
ev/randomËùʹÓá£Èç¹ûÒ»¸öÉ豸²»ÄܶÔËæ»úÉ豸¹±Ï×ÏÔÖøµÄìØÖµ£¬DEVICE_NO_RANDOMÓ¦
±»¶¨Òå¡£/dev/randomÔÚµÚ¾ÅÕµġ°°²×°Öжϴ¦Àí³ÌÐò¡±ÖнøÐÐÁ˽éÉÜ£¬SA_SAMPLE_RAND
OMÒ²ÔÚÄǶù×öÁ˽âÊÍ¡£

DEVICE_OFF(kdev_t device)

end_requestº¯ÊýÔÚ½áÊøʱµ÷ÓÃÕâ¸öºê¡£ÀýÈçÔÚÈíÅÌÇý¶¯³ÌÐòÖУ¬Ëüµ÷ÓÃÒ»¸öº¯Êý£¬Õâ¸ö
º¯Êý¸ºÔð¸üÐÂÓÃÀ´¿ØÖÆÂí´ïͣתµÄÒ»¸ö¼ÆʱÆ÷¡£Èç¹ûÉ豸ûÓб»¹Øµô£¬ÄÇô´®DEVICE_OF
F¿ÉÒÔ±»¶¨ÒåΪ¿Õ¡£sbull²»Ê¹ÓÃDEVICE_OFF¡£

DEVICE_ON(kdev_t device)

DEVICE_REQUEST

ÕâЩº¯Êýʵ¼ÊÉϲ¢Î´ÔÚLinuxµÄÍ·ÎļþÖÐʹÓã¬ËùÒÔÇý¶¯³ÌÐò²¢²»ÐèÒª¶¨ÒåËüÃÇ¡£´ó¶àÊý
¹Ù·½µÄLinuxÉ豸Çý¶¯³ÌÐòÉùÃ÷ÕâЩ·ûºÅ²¢ÔÚÄÚ²¿Ê¹ÓÃËüÃÇ£¬µ«ÎÒÔÚsbullÀﲢûÓÐʹÓÃ
¹Ù·½µÄLinuxÉ豸Çý¶¯³ÌÐòÉùÃ÷ÕâЩ·ûºÅ²¢ÔÚÄÚ²¿Ê¹ÓÃËüÃÇ£¬µ«ÎÒÔÚsbullÀﲢûÓÐʹÓÃ
Ëü¡£

sbullÇý¶¯³ÌÐòÒÔÈçϵķ½Ê½ÉùÃ÷ÕâЩ·ûºÅ£º

£¨´úÂë242£©

Í·Îļþblk.hÓÃÉÏÃæÁгöµÄÕâЩºê¶¨ÒåÁËһЩ¿ÉÒÔÓÉÇý¶¯³ÌÐòʹÓõĶîÍâµÄºê£¬ÎÒ½«ÔÚºó
ÐøÕ½ÚÀï¶ÔÖ®½øÐнéÉÜ¡£

´¦ÀíÇëÇó

ϵͳÐÔÄܵķ½Ê½ÅÅÐò¡£ÕâЩÁª½á±íÖеÄÇëÇó±»´«µÝ¸öÇý¶¯³ÌÐòµÄÇëÇóº¯Êý£¬ÓÉËü¶ÔÁ´½Ó
±íÖеÄÿ¸öÇëÇóÖ´ÐÐÈçϵÄÈÎÎñ£º

l       ¼ì²éµ±Ç°ÇëÇóµÄÓÐЧÐÔ¡£Õâ¸ö¹¤×÷ÓÉÔÚblk.hÖж¨ÒåµÄºêINIT_REQUESTÍê³É¡£

l       ½øÐÐʵ¼ÊµÄÊý¾Ý´«ËÍ¡£ÓñäÁ¿CURRENT£¨Êµ¼ÊÉÏÊǸöºê£©¿ÉÒÔ»ñµÃ·¢³öÇëÇóµÄÒ»
Щϸ½Ú¡£CURRENTÊÇÒ»¸öÖ¸Ïò½á¹¹requestµÄÖ¸Õ룬ÎÒ½«ÔÚϽڽéÉÜÕâ¸ö½á¹¹µÄÓò¡£

l       Çå³ýµ±Ç°µÄÇëÇó¡£Õâ¸ö²Ù×÷Óɾ²Ì¬º¯Êýend_requestÍê³É£¬º¯ÊýµÄ´úÂëÔÚblk.h
ÖС£Çý¶¯³ÌÐòÏòÕâ¸öº¯Êý´«µÝÒ»¸ö²ÎÊý£¬¼´³É¹¦Ê±Îª1£¬Ê§°ÜʱΪ0¡£µ±end_requestÒÔ²Î
Êý0µ÷ÓÃʱ£¬Ò»¸ö¡°I/O error¡±ÏûÏ¢»á±»·¢¸øϵͳÈÕÖ¾£¨Í¨¹ýprintk£©¡£

l       Ñ­»·»ØÖÁ¿ªÊ¼£¬Ïû»¯ÏÂÒ»¸öÇëÇ󡣿ÉÒÔ°´ÕÕ³ÌÐòÔ±µÄϲºÃʹÓÃÒ»¸ögoto»òÊÇÒ»
¸öfor(;;)£¬»òÕßwhile(1)¡£

ʵ¼ùÖУ¬ÇëÇóº¯ÊýµÄ´úÂëÈçϹ¹Ô죺

£¨´úÂë243£©

¾¡¹ÜÕâ¶Î´úÂë³ýÁË´òÓ¡ÏûÏ¢Íâʲô¶¼Ã»ÓÐ×ö£¬ÔËÐÐÕâ¸öº¯Êý¿ÉÒÔ¶ÔÊý¾Ý´«Ë͵Ļù±¾Éè¼Æ
ÓÐÒ»¸öºÜºÃµÄÁ˽⡣µ½´ËΪֹ£¬´úÂëÖÐΨһ²»Çå³þµÄµØ·½ÊÇCURRENTµÄÈ·Çк¬Òå¼°ËüµÄÓò
£¬Õâ¸öÎÒ½«ÔÚÏÂÒ»½Ú½éÉÜ¡£

ÎҵĵÚÒ»¸ösbullʵÏÖÖ»°üº¬ÁËËùʾµÄ¿Õ´úÂë¡£ÎÒÒâÔÚÒ»¸ö¡°²»´æÔÚ¡±µÄÉ豸ÉϹ¹ÔìÒ»¸ö
Îļþϵͳ£¬²¢Ê¹ÓÃËüÒ»»á¶ù£¬Ö»ÒªÊý¾ÝÈÔÔÚ»º³å¸ßËÙ»º´æÖС£ÔÚÔËÐÐÒ»¸öÏóÕâÑùÂÞàµÄ
ÇëÇóº¯Êýʱ£¬¿´¿´ÏµÍ³ÈÕÖ¾ÄÜ°ïÖúÄãÀí½â»º³å¸ßËÙ»º´æÊÇÈçºÎ¹¤×÷µÄ¡£

ÔÚ±àÒëʱ£¬¶¨Òå·ûºÅSBULL_EMPTY_REQUEST£¬ÄÇôÕâ¸ö¿ÕÇÒÂÞàµĺ¯Êý¿ÉÒÔÔÚsbull ÖÐÔË
ÐС£Èç¹ûÄãÏëÀí½âºËÐÄÊÇÈçºÎ´¦Àí²»Í¬¿é´óСµÄ£¬Äã¿ÉÒÔÔÚinsmodÃüÁîÐÐÉÏʵÑéblksize
=¡£Õâ¸ö¿ÕµÄÇëÇóº¯Êýͨ¹ý´òӡÿ¸öÇëÇóµÄϸ½Ú½ÒʾÁËÄÚ²¿ºËÐĵŤ×÷Çé¿ö¡£Äã»òÐíÒ²¿É
ÒÔÊÔÊÔhardsect=£¬µ«Ä¿Ç°Ëü±»¹Ø±ÕÁË£¬ÒòΪ±È½ÏΣÏÕ¡££¨¼û±¾Õ¿ªÊ¼Ê±µÄ¡°×¢²áÇý¶¯³Ì
Ðò¡±£©¡£


ÇëÇóº¯ÊýµÄ´úÂë²¢²»ÏÔʽµØµ÷ÓÃreturn(),ÒòΪµ±ÁбíÖеĴý´¦ÀíÇëÇóºÄ¾¡Ê±£¬INIT-_RE
QUEST»áÌæÄãÍê³ÉÕâ¸ö¹¤×÷¡£

Ö´ÐÐʵ¼ÊµÄÊý¾Ý´«ËÍ

ΪÁ˸øsbull¹¹ÔìÒ»¸ö¿ÉÒÔ¹¤×÷µÄÊý¾Ý´«ËÍ£¬ÈÃÎÒÃÇÏÈÀ´¿´¿´ºËÐÄÊÇÈçºÎÔڽṹrequest
ÖÐÃèÊöÒ»¸öÇëÇóµÄ¡£Õâ¸ö½á¹¹ÔÚ<linux/blkdev.h>Öж¨Ò塣ͨ¹ý·ÃÎÊCURRENTµÄÓò£¬Çý¶¯
³ÌÐò¿ÉÒԵõ½ËùÓÐΪÔÚ»º³å¸ßËÙ»º´æµÄÎïÀí¿éÉ豸֮¼ä´«ËÍÊý¾ÝËùÐèÒªµÄÐÅÏ¢¡£

CURRENTÊÇÓÃÀ´·ÃÎʵ±Ç°ÇëÇ󣨼´±»Ê×ÏÈ·þÎñµÄÄǸöÇëÇ󣩡£ÕýÈçÄã¿ÉÄܲµ½µÄ£¬CURREN
TÊÇblk_dev[MAJOR_NR].current_requestµÄËõ¶ÌÐÎʽ¡£

ÏÂÃæÕâЩµ±Ç°ÇëÇóµÄÓò°üº¬ÁËÇëÇóº¯ÊýµÄÓÐÓÃÐÅÏ¢£º

kdev_t rq_dev;

ÇëÇóËù·ÃÎʵÄÉ豸¡£Óб¾Çý¶¯³ÌÐòËù¹ÜÀíµÄËùÒÔÉ豸¾ù±»Ê¹ÓÃͬһ¸öÇëÇóº¯Êý¡£Ò»¸öÇë
Çóº¯Êý´¦ÀíËùÓеĴÎÉ豸ºÅ£»rq_dev¿ÉÒÔ±»ÓÃÀ´È¡µÃ±»²Ù×÷µÄ´ÎÉ豸¡£¾¡¹ÜLinux1.2³Æ
Õâ¸öÓòΪdev£¬ÄãÈÔÈ»¿ÉÒÔͨ¹ýºêCURRENT_DEVÀ´·ÃÎÊÕâ¸öÓò¡£CURRENT_DEVÔÚÎÒÃÇËùÌÖÂÛ
µÄËùÓа汾µÄºËÐÄÖÐÊÇ¿ÉÒÆÖ²µÄ¡£

int cmd;
int cmd;

Õâ¸öÓòÊÇREAD»òWRITE¡£

unsigned long sector;

ÇëÇóÖ¸ÏòµÄµÚÒ»¸öÉÈÇø¡£

unsigned long current_nr_sectors;

unsigned long nr_sectors;

µ±Ç°ÇëÇóµÄÉÈÇøÊý£¨´óС£©¡£Çý¶¯³ÌÐòÓ¦¸ÃÒýÓÃcurrent_nr_sectors,¶øÓ¦¸ÃºöÂÔnr_sec
tors£¨ÁÐÔÚÕâÀïÖ»ÊÇΪÁËÍêÕû£©¡£Çë¿´ÏÂÒ»½Ú¡°¼¯´ØÇëÇó¡±ÒÔ»ñµÃ¸ü¶àµÄϸ½Ú¡£

char *buffer

»º³å¸ßËÙ»º´æÖеÄÓò¡£Èç¹ûcmd==READ£¬¾ÍÊÇдÊý¾ÝµÄλÖã»Èç¹ûcmd==WRITE£¬¾ÍÊǶÁÊý
¾ÝµÄλÖá£

struct buffer_head *bh

Õâ¸ö½á¹¹ÃèÊöÁËÕâ¸öÇëÇóÁбíÖеĵÚÒ»¸ö»º³åÇø¡£ÎÒÃǽ«ÔÚ¡°¼¯´ØÇëÇó¡±ÖÐÓõ½Õâ¸öÓò
¡£

ÔÚÕâ¸ö½á¹¹Öл¹ÓÐÆäËüµÄһЩÓò£¬µ«ËüÃÇ»ù±¾ÉÏÊǺËÐÄÄÚ²¿Ê¹Óõģ¬Çý¶¯³ÌÐò²¢²»ÆÚÍû
ʹÓÃËüÃÇ¡£

sbullÖпɹ¤×÷µÄÇëÇóº¯ÊýµÄʵÏÖÈçÏÂËùʾ¡£ÔÚÏÂÃæµÄ´úÂëÖÐsbull-_devicesÓëscull_de
viceÀàËÆ¡£ÎÒÃÇÔÚµÚÈýÕÂ×Ö·ûÉ豸Çý¶¯³ÌÐòµÄ¡°´ò¿ª·½·¨¡±ÖнéÉܹýscull_devices¡£

£¨´úÂë245£©

ÓÉÓÚsbullÖ»ÊǸöRAMÅÌ£¬ËùÒÔËüµÄ¡°Êý¾Ý´«ËÍ¡±¼ò»¯ÎªÒ»¸ömemcpyµ÷Óá£Õâ¸öº¯ÊýΨһ
¡°Ææ¹Ö¡±µÄÌØÕ÷ÊÇÌõ¼þÓï¾äÖÐÏÞÖÆÖ»Äܱ¨¸æ×î¶à5¸ö´íÎó¡£ÕâÑù×öµÄÄ¿µÄÊÇΪÁË·Àֹϵͳ
ÈÕÖ¾±»Ì«¶àµÄÐÅÏ¢¸ãÂÒ£¬ÒòΪend-_request(0)ÔÚÇëÇóʧ°ÜʱÒÑ´òÓ¡ÁË¡°I/O error¡±µÄ
ÏûÏ¢¡£¾²Ì¬¼ÆÊýÆ÷ÊÇÏÞÖÆÏûÏ¢±¨¸æµÄ±ê×¼×ö·¨£¬ÔÚºËÐÄÖỶà´ÎÓõ½¡£

¼¯´ØÇëÇó

ÉÏÃæÇëÇóº¯ÊýÖÐÿ´ÎÑ­»·µü´ú¶¼´«Ëͼ¸¸öÉÈÇø¡ª¡ª°´ÕÕÊý¾ÝµÄʹÓã¬Ò»°ãÇé¿öÏ£¬Ï൱
ÓÚÒ»¸ö¿éµÄ¡°Êý¾Ý¡±Á¿¡£ÀýÈ磬½»»»Ò»´ÎÖ´ÐÐPAGE_SIZE´óСµÄÊý¾Ý£¬¶øÔÚext2Îļþϵͳ
ÖоÍÊÇ´«ËÍ1KBµÄ¿é¡£

¾¡¹ÜÔÚI/OÖÐ×î·½±ãµÄÊý¾Ý´óСÊÇÒ»¸ö¿é£¬µ«Èç¹û°ÑÏàÁÚ¿éµÄ¶Á»òд¼¯´ØÆðÀ´£¬Äã»á»ñµÃ
¾¡¹ÜÔÚI/OÖÐ×î·½±ãµÄÊý¾Ý´óСÊÇÒ»¸ö¿é£¬µ«Èç¹û°ÑÏàÁÚ¿éµÄ¶Á»òд¼¯´ØÆðÀ´£¬Äã»á»ñµÃ
ºÜ¸ßµÄÐÔÄܸÄÉÆ¡£ÔÚÕâ¸öÒâÒåÉÏ£¬¡°ÏàÁÚ¡±Ö¸µÄÊÇÔÚÓ²ÅÌÉÏ¿éµÄλÖ㬶ø¡°Á¬Ðø¡±ÔòÖ¸
Á¬ÐøµÄÄÚ´æÇøÓò¡£

½«ÏàÁڿ鼯´ØÓÐÁ½¸öºÃ´¦¡£Ê×ÏÈ£¬¼¯´Ø¼ÓËÙÁË´«ËÍ£¨ÀýÈ磬ÈíÅÌÇý¶¯³ÌÐò½«ÏàÁڵĿé×é
ºÏÔÚÒ»Æð£¬Ò»´Î´«ËÍÒ»¸ö´ÅµÀµÄÊý¾Ý£©¡£ÁíÍ⣬Ëü»¹ÄÜͨ¹ý±ÜÃâ·ÖÅäÈßÓàµÄrequest½á¹¹
À´½ÚÊ¡ºËÐÄÖеÄÄÚ´æ¡£

Èç¹ûÄãÔ¸Ò⣬Ҳ¿ÉÒÔÍêÈ«ºöÂÔ¼¯´Ø¡£ÉÏÃæ¸ø³öµÄ¿ò¼ÜÇëÇóº¯ÊýÔÚûÓм¯´ØµÄÇé¿öÏ¿ÉÒÔ
ÍêÈ«ÕýÈ·µØ¹¤×÷¡£²»¹ý£¬Èç¹ûÄãÏëÀûÓü¯´Ø£¬ÄãÐèÒª¸ü¼Ó×ÐϸµØÑо¿struct_requestµÄ
ÄÚ²¿¡£

²»ÐÒµÄÊÇ£¬ÎÒËùÖªµÀµÄËùÓеĺËÐÄ£¨ÖÁÉÙµ½2.1.51£©¶¼²»ÄÜΪ×Ô¶¨ÒåÇý¶¯³ÌÐò½øÐм¯´Ø
£¬¶øÖ»¶ÔÏóSCSIºÍIDEÕâÀàÄÚ²¿Çý¶¯³ÌÐòʹÓá£Èç¹ûÄã¶ÔºËÐĵÄÄÚ²¿²»¸ÐÐËȤ£¬Äã¿ÉÒÔÌø
¹ý±¾½ÚµÄÆäÓಿ·Ö¡£²»¹ý£¬¼¯´Ø½«À´»¹¿ÉÄÜÔÚÄ£¿éÖÐʵÏÖ£¬ËüÊÇͨ¹ý¼õÉÙÏàÁÚÉÈÇøµÄÇë
ÇóÑÓ³ÙÀ´Ìá¸ßÊý¾Ý´«ËÍÐÔÄܵÄÒ»¸öÓÐȤµÄ;¾¶¡£

ÔÚÎÒÃèÊöÇý¶¯³ÌÐòÈçºÎÀûÓü¯´ØÇëÇó֮ǰ£¬ÈÃÎÒÃÇÏÈÀ´¿´¿´µ±Ò»¸öÇëÇó±»ÅŶÓʱ·¢ÉúÁË
ʲô¡£

µ±ºËÐÄÇëÇóÊý¾Ý¿é´«ËÍʱ£¬ËüɨÃèÄ¿±êÉ豸µÄ»î¶¯ÇëÇóÁ´±í¡£µ±Ò»¸öпéÔÚÅÌÉÏÓëÒ»¸ö
ÒѾ­±»ÇëÇóµÄ¿éÏàÁÚʱ£¬Ëü¾Í±»¼¯´Øµ½µÚÒ»¸ö¿éÉÏ¡£µ±Ç°ÒÑ´æÔÚµÄÇëÇó±ã±»À©´óÁ˶ø²»
ÊÇÔö¼ÓÒ»¸öÐÂÇëÇó¡£
ÊÇÔö¼ÓÒ»¸öÐÂÇëÇó¡£

²»ÐÒµÄÊÇ£¬´ÅÅÌÉÏÏàÁÚµÄÁ½¸öÊý¾Ý»º³åÇøÔÚÄÚ´æÖв¢²»Ò»¶¨ÏàÁÚ¡£Õâ¸ö·¢ÏÖ£¬Íâ¼ÓÉÏÐè
ÒªÓÐЧµØ¹ÜÀí»º³å¸ßËÙ»º´æ£¬µ¼Ö´´½¨Ò»¸öbuffer_head½á¹¹¡£Ò»¸öbuffer_headºÍÒ»¸ö
Êý¾Ý»º³åÏà¹ØÁª¡£

Òò´Ë£¬Ò»¸ö¡°¼¯´Ø¡±µÄÇëÇ󣬾ÍÊÇÒ»¸öÖ¸Ïòbuffer_headµÄ½á¹¹Á´±íµÄrequest_struct½á
¹¹¡£end_requestº¯Êý¸ºÔðÕâ¸öÎÊÌ⣬Õâ¾ÍÊÇΪʲôǰÃæ¸ø³öµÄÇëÇóº¯Êý¿ÉÒÔ¶ÀÁ¢ÓÚ¼¯´Ø
¶ø¹¤×÷¡£»»¾ä»°Ëµ£¬end_requestҪôÇå³ýµ±Ç°ÇëÇó²¢×¼±¸ÎªÏÂÒ»¸ö·þÎñ£¬ÒªÃ´×¼±¸´¦Àí
ͬһ¸öÇëÇóÖеÄÏÂÒ»¸ö»º³åÇø¡£Òò´Ë£¬¼¯´Ø¶Ô²»¹ØÐÄËüµÄÉ豸Çý¶¯³ÌÐòÊÇ͸Ã÷µÄ£¬ÉÏÃæ
µÄsbullº¯Êý¾ÍÊÇÒ»¸öÀý×Ó¡£

Ò»¸öÇý¶¯³ÌÐò¿ÉÄÜÏ£Íûͨ¹ýÔÚËüµÄrequest_fnº¯ÊýÖÐÿ´ÎÑ­»·Ê±´¦ÀíÕû¸ö»º³åÇøÍ·Á´±í
µÄ°ì·¨À´´Ó¼¯´ØÖлñÒ档ΪÁË×öµ½ÕâÒ»µã£¬Çý¶¯³ÌÐòÓ¦¸ÃÖ¸ÏòCURRENT->current_nr_sec
tors£¨Õâ¸öÓòÎÒÔÚÉÏÃæµÄsbull_requestÖÐÒѾ­Óùý£©ºÍCURRENT->nr_sectors£¬Ëü°üº¬
Á˼¯´ØÔÚ¡°µ±Ç°¡±buffer_headsÁбíÖеÄÏàÁÚÉÈÇøµÄÊýÄ¿¡£

µ±Ç°»º³åÇøÍ·ÊÇCURRENT->bh£¬¶øÊý¾Ý¿éÊÇCURRENT->bh->b_data¡£ºóÒ»¸öÖ¸ÕëΪÁËÏósbu
llÒ»ÀàºöÂÔ¼¯´ØµÄÇý¶¯³ÌÐò»º³åÔÚCURRENT->bufferÖС£

ÇëÇ󼯴ØÔÚdrivers/block/ll_rw_block.cµÄº¯Êýmake_requestÖÐʵÏÖ¡£²»¹ý£¬ÈçÉÏËù˵
£¬¼¯´ØÖ»¶Ô¼¸¸öÇý¶¯³ÌÐòÓÐЧ£¨ÈíÇý£¬IDE£¬ºÍSCSI£©£¬ÒÔÆäÖ÷É豸ºÅΪ׼¡£ÎÒÔøͨ¹ýÒÔ
major=34×°ÔØsbull¿´µ½¹ý¼¯´ØÊÇÈçºÎ¹¤×÷µÄ£¬ÒòΪ34ÊÇIDE3_MAJOR£¬¶øÎÒµÄϵͳÖÐûÓÐ
µÚÈý¸öIDE¿ØÖÆÆ÷¡£

ÏÂÃæÁбí×ܽáÁ˵±É¨ÃèÒ»¸ö¼¯´ØÇëÇóʱӦ×öµÄÊÂÏî¡£bhÊDZ»´¦ÀíµÄ»º³åÇøÍ·¡ª¡ªÁбíµÄ
µÚÒ»Ïî¡£¶ÔÁбíÖеÄÿ¸ö»º³åÇøÍ·£¬Çý¶¯³ÌÐòÒªÍê³ÉÏÂÃæһϵÁвÙ×÷£º

l        ´«ËÍλÓÚµØÖ·bh->b_data£¬´óСΪbh->b_size×Ö½ÚÊý¾Ý¿é¡£Êý¾Ý´«Ë͵ķ½Ïòͨ
³£ÓÉCURRENT->cmdÖ¸³ö¡£

l        ´ÓÁбíÖÐÕÒ³öÏÂÒ»¸ö»º³åÇøÍ·£ºbh->b_request¡£½Ó×Åͨ¹ý½«b_requestÖÃΪ0
£¬°Ñ¸Õ´«Ë͹ýµÄ»º³åÇø´ÓÁбíÖÐժϡ£b_reqnextÖ¸ÏòÄã¸ÕÕÒ³öµÄлº³åÇø¡£

l        Í¨¹ýµ÷ÓÃmark_buffer_uptodate(bh,1)£¬unlock_buffer(bh)£¬¸æËߺËÐÄÄãÒÑ
Íê³É¶ÔÉϸö»º³åÇøµÄ²Ù×÷¡£ÕâЩµ÷Óñ£Ö¤»º³å¸ßËÙ»º´æ±£³ÖÕýÈ·£¬²»ÖÂÓдíÎóÖ¸ÏòµÄÖ¸
Õë¡£mark_buffer_uptodateÖвÎÊý¡°1¡±±íʾ´«Ëͳɹ¦£¬Èô´«ËÍʧ°Ü£¬Ôò»»Îª0¡£

l        Ñ­»·»Øµ½¿ªÊ¼£¬´«ËÍÏÂÒ»¸öÏàÁÚ¿é¡£

µ±Äã×öÍêÁ˼¯´ØÇëÇó£¬CURRENT->bh±ØÐë±»¸üÐÂÒÔÖ¸Ïò¡°ÒѾ­±»´¦Àíµ«Î´±»½âËø¡±µÄµÚÒ»
¸ö»º³åÇø¡£Èç¹ûÁбíÖÐËùÓеĻº³åÇø¶¼Òѱ»´¦ÀíºÍ½âËø£¬CURRENT->bh¿É±»ÖÃΪNULL¡£

´Ëʱ£¬Çý¶¯³ÌÐò¿ÉÒÔµ÷ÓÃend_request¡£Èç¹ûCURRENT->bhÊÇÓÐЧµÄ£¬ÄÇôÕâ¸öº¯ÊýÔÚת
µ½ÏÂÒ»¸ö»º³å֮ǰ¶ÔÆä½øÐнâËø¡ª¡ªÕâÊǷǼ¯´Ø²Ù×÷Ëù·¢ÉúµÄÇé¿ö£¬´ËʱÓÉend_request
µ½ÏÂÒ»¸ö»º³å֮ǰ¶ÔÆä½øÐнâËø¡ª¡ªÕâÊǷǼ¯´Ø²Ù×÷Ëù·¢ÉúµÄÇé¿ö£¬´ËʱÓÉend_request
ÕÕ¹ÜËùÓеÄÊÂÇé¡£Èç¹ûÖ¸ÕëΪ¿Õ£¬Õâ¸öº¯ÊýÖ±½Óתµ½ÏÂÒ»¸öÇëÇó¡£

È«¹¦Äܵļ¯´ØʵÏÖ³öÏÖÔÚdriver/block/floppy.c£¬¶øÒªÇóµÄËùÓвÙ×÷³öÏÖÔÚblk.hµÄend
_requestÖС£floppy.cºÍblk.h¶¼²»ÈÝÒ×Àí½â£¬²»¹ý½¨ÒéÏÈ´ÓºóÕß¿ªÊ¼¡£

°²×°£¨Mounting£©ÊÇÈçºÎ¹¤×÷µÄ

¿éÉ豸Óë×Ö·ûÉ豸¼°Ò»°ãÎļþµÄ²»Í¬ÔÚÓÚËüÃÇ¿ÉÒÔ±»°²×°µ½¼ÆËã»úµÄÎļþϵͳÉÏ¡£ÕâÓë
Ò»°ãµÄ·ÃÎÊ·½Ê½²»Í¬¡£Ò»°ãµÄ·ÃÎÊ·½Ê½Í¨¹ý½á¹¹file½øÐУ¬Õâ¸ö½á¹¹ÓëÌض¨µÄ½ø³ÌÏà¹Ø
Áª£¬²¢ÇÒÖ»ÔÚopenµ½closeÖ®¼ä´æÔÚ¡£µ±Ò»¸öÎļþϵͳ±»°²×°ºó£¬Ã»Óнø³ÌÓµÓÐÒ»¸öfilp
¡£

µ±ºËÐÄ°ÑÒ»¸öÉ豸°²×°µ½ÎļþϵͳÉÏ£¬Ëüµ÷ÓÃÒ»°ãµÄopen·½·¨À´·ÃÎÊÇý¶¯³ÌÐò¡£È»¶ø£¬
ÕâÖÖÇé¿öÏÂopenµÄ²ÎÊýfilpÊǸöÐéµÄ±äÁ¿£¬¼¸ºõÖ»ÊÇΪÁËÕ¼¸öµØ·½£¬ËüΨһÓÐÒâÒåµÄÓò
ÊÇf_mode¡£ÆäËüÓòº¬ÈÎÒâÖµ²¢²»Ê¹Óá£f_modeµÄÖµÊǸæËßÇý¶¯³ÌÐòÉ豸ÊÇÒÔÖ»¶Á£¨f_mod
e==FMODE_READ£©»¹ÊǶÁд£¨f_mode==£¨FMODE_READ|FMOD_WRITE£©£©·½Ê½±»°²×°¡£Ê¹ÓÃ
Ò»¸öÐé±äÁ¿¶ø²»ÊÇfile½á¹¹µÄÔ­ÒòÊÇÒòΪʵ¼ÊµÄ½á¹¹fileÔÚ½ø³Ì½áÊøʱ½«±»ÊÍ·Å£¬¶ø±»
°²×°µÄÎļþϵͳÔÚmountÃüÁîÍê³ÉºóÈÔÈ»´æÔÚ¡£

ÔÚ°²×°Ê±£¬Çý¶¯³ÌÐòΨһµ÷ÓõÄÊÇopen·½·¨¡£µ±´ÅÅ̱»°²×°ºó£¬ºËÐĵ÷ÓÃÉ豸ÖеÄread
ºÍwrite ·½·¨£¨±»Ó³Éäµ½request_fn£©À´¹ÜÀíÎļþϵͳÖеÄÎļþ¡£Çý¶¯³ÌÐò²¢²»ÖªµÀreq
uest_fn·þÎñµÄÊÇÒ»¸ö½ø³Ì£¨Ïófsck£©»¹ÊǺËÐÄÖеÄÎļþϵͳ²ã¡£

ÖÁÓÚumount£¬ËüÖ»ÊÇˢлº³å¸ßËÙ»º´æ²¢µ÷ÓÃÇý¶¯³ÌÐòµÄrelease£¨close£©·½·¨¡£ÓÉÓÚ
ûÓÐÓÐÒâÒåµÄfilp¿ÉÒÔ´«µÝ¸øfop->realse£¬ºËÐÄʹÓÃNULL¡£

Òò´Ë£¬µ±ÄãʵÏÖreleaseʱ£¬ÄãÓ¦½«Çý¶¯³ÌÐòÉèΪÄÜ´¦ÀíΪNULLµÄfilpÖ¸Õë¡£²»È»£¬Èç¹û
ÄãÓÃÁËfilp£¬Äã¿ÉÄÜÔËÐÐmkfsºÍfsck£¬ËüÃǶ¼Ê¹ÓÃfilpÀ´·ÃÎÊÉ豸£¬ÄãÒ²¿ÉÄÜmountÕâ¸ö
É豸£¬µ«umount½«ÎÞ·¨ÔËÐУ¬Ô­Òò¾ÍÊÇNULLÖ¸Õë¡£

ÓÉÓÚÒ»¸ö¿éÉ豸Çý¶¯³ÌÐòµÄreleaseʵÏÖ²»ÄÜÓÃfilp->private_dataÀ´·ÃÎÊÉ豸ÐÅÏ¢£¬Ëü
²ÉÓÃinode->i_rdevÀ´Çø·ÖÉ豸¡£ÕâÀïÊÇreleaseµÄsbullʵÏÖ£º

£¨´úÂë249£©

ÆäËüµÄÇý¶¯³ÌÐòº¯Êý²¢²»¹ØÐÄfilpÎÊÌ⣬ÒòΪËüÃÇÓë°²×°µÄÎļþϵͳÎ޹ء£ÀýÈ磬һ¸ö
ÏÔʾµØopenÕâ¸öÉ豸µÄ½ø³ÌÖ»·¢³öioctl¡£

ioctl·½·¨

Èç×Ö·ûÉ豸һÑù£¬¿éÉ豸Ҳ¿ÉÒÔͨ¹ýioctlϵͳµ÷ÓýøÐвÙ×÷¡£Á½ÕßÖ®¼äÏà¶Ô²»Ò»ÑùµÄµØ
·½ÔÚÓÚ¿éÉ豸Çý¶¯³ÌÐòÓдóÁ¿Çý¶¯³ÌÐò¶¼ÒªÖ§³ÖµÄioctlÃüÁî¡£

¿éÉ豸Çý¶¯³ÌÐò¾­³£Òª´¦ÀíµÄÃüÁîÈçÏÂËùʾ£¬ËüÃÇÔÚ<linux/fs.h>Öб»ÉùÃ÷¡£
¿éÉ豸Çý¶¯³ÌÐò¾­³£Òª´¦ÀíµÄÃüÁîÈçÏÂËùʾ£¬ËüÃÇÔÚ<linux/fs.h>Öб»ÉùÃ÷¡£

BLKGETSIZE

»ñÈ¡µ±Ç°É豸µÄ´óС£¬ÒÔÉÈÇøÊý±íʾ¡£ÓÉϵͳµ÷Óô«µÝµÄ ÊýÖµargÊÇÒ»¸öÖ¸ÏòlongÊýÖµ
µÄÖ¸Õ룬ÓÃÀ´½«´óС¿½±´µ½Ò»¸öÓû§¿Õ¼äµÄ±äÁ¿ÖС£Õâ¸öioctlÃüÁî¿ÉÒÔ±»mkfsÓÃÀ´»ñÖª
²úÉúµÄÎļþϵͳµÄ´óС¡£

BLKFLSBUF

×ÖÃæÉϵÄÒâ˼ÊÇ¡°Ë¢Ð»º³åÇø¡±¡£Õâ¸öÃüÁîµÄʵÏÖ¶Ôÿ¸öÉ豸¶¼ÊÇÒ»ÑùµÄ£¬ÎÒÃǽ«ÔÚºó
ÃæÕû¸öioctl·½·¨µÄʾÀý´úÂëÖиø³öÀ´¡£

BLKRAGET

ÓÃÀ´ÎªÉ豸ȡµÃµ±Ç°ÌáÇ°¶ÁµÄÖµ¡£µ±Ç°ÊýÖµÓ¦¸ÃÓÃÔÚ²ÎÊýargÖд«µÝ¸øioctlµÄÖ¸Õëд½ø
Ò»¸ölongÀàÐ͵ÄÓû§¿Õ¼ä±äÁ¿¡£

BLKRASET

ÉèÖÃÌáÇ°¶ÁµÄÖµ¡£Óû§½ø³ÌÔÚargÖд«µÝÕâ¸öÐÂÖµ¡£

BLKRRPART
BLKRRPART

ÖضÁ·ÖÇø±í¡£Õâ¸öÃüÁîÖ»¶Ô¿É·ÖÇøÉ豸ÓÐÒâÒ壬½«ÔÚºóÃæ¡°¿É·ÖÇøÉ豸¡±ÖнéÉÜ¡£

BLKROSET

BLKROGET

ÕâЩÃüÁîÓÃÀ´¸Ä±äºÍ¼ì²éÉ豸µÄÖ»¶Á±êÖ¾¡£ÒòΪ´úÂëÊÇÉ豸Î޹صģ¬ËüÃÇÓɺêRO_IOCTLS
£¨kdev_tdev,unsigned long where£©À´ÊµÏÖ¡£Õâ¸öºêÔÚblk.hÖж¨Òå¡£

HDIO_GETGEO

ÔÚ<linux/hdreg.h>Öж¨Ò壬ÓÃÀ´»ñµÃ´ÅÅ̵ļ¸ºÎ²ÎÊý¡£Õâ¸ö²ÎÊýÓ¦±»Ð´ÈëÓû§¿Õ¼äµÄ½á
¹¹hd_geometryÖУ¬ËüÒ²ÔÚhdreg.hÖж¨Òå¡£sbullÏÔʾÁËÕâ¸öÃüÁîµÄÒ»°ãʵÏÖ¡£

HDIO_GETGEOÊÇ<linux/hdreg.h>Öж¨ÒåµÄһϵÁÐHDIOÃüÁîÖÐ×î³£ÓõÄÒ»¸ö¡£¸ÐÐËȤµÄ¶Á
Õß¿ÉÒԲ鿴ide.cºÍhd.cÒÔ»ñµÃÕâЩÃüÁîµÄ¸ü¶àÐÅÏ¢¡£

ÕâÀïÁгöµÄÕâЩÃüÁîµÄÒ»¸öÖ÷ҪȱµãÊÇËüÃÇÊÇÒÔ¡°ÀÏ¡±·½·¨¶¨ÒåµÄ£¨ÊǵÚÎåÕ¡°ÔöÇ¿µÄ
×Ö·ûÉ豸Çý¶¯³ÌÐò²Ù×÷¡±ÖС°Ñ¡ÔñioctlÃüÁһ½Ú£©£¬Òò´ËÎÞ·¨Ê¹ÓÃλÓòµÄºêÀ´¼õ»¯´ú
Â롪¡ªÃ¿¸öÃüÁîҪʵÏÖËü×Ô¼ºµÄverify_area¡£²»¹ý£¬Èç¹ûÒ»¸öÇý¶¯³ÌÐòÐèÒª¶¨ÒåËü×Ô¼º
µÄÃüÁîÀ´ÀûÓÃÉ豸µÄһЩÌØÊâÌص㣬Äã¿ÉÒÔ×ÔÓɵØʹÓá°Ð¡±·½·¨À´¶¨ÒåÃüÁî¡£

sbullÉ豸ֻ֧³ÖÉÏÃæµÄͨÓÃÃüÁÒòΪʵÏÖÉ豸Ìض¨µÄÃüÁîÓëʵÏÖ×Ö·ûÉ豸Çý¶¯³ÌÐòµÄ
ÃüÁîûÓÐʲô²»Í¬¡£sbullµÄioctlʵÏÖÈçÏÂËùʾ£¬Ëü½«ÓÐÖúÓÚÄãÀí½âÉÏÃæÁгöµÄÃüÁî¡£

£¨´úÂë250£©

£¨´úÂë251£©

º¯Êý¿ªÊ¼µÄPDEBUGÓï¾ä±»Áô³ö£¬ÕâÑùµ±Äã±àÒëÕâ¸öÄ£¿éʱ£¬Äã¿ÉÒÔ´ò¿ªµ÷ÊÔ£¨debugging
£©À´¿´¿´É豸Éϵ÷ÓÃÁËÄĸöioctlÃüÁî¡£

ÀýÈ磬¶ÔÓÚÏÔʾµÄioctlÃüÁÄã¿ÉÒÔÔÚsbullÉÏʹÓÃfdisk¡£ÏÂÃæÊÇÔÚÎÒ×Ô¼ºÏµÍ³ÉϵÄÒ»
¸öʾÀýÖ´Ðйý³Ì£º

£¨´úÂë252 1#£©

ÔڻỰ¹ý³ÌÖÐÏÂÃæµÄÏûÏ¢³öÏÖÔÚÎÒµÄϵͳÈÕÖ¾ÖУº

£¨´úÂë252 2#£©

µÚÒ»¸öioctlÊÇHDIO_GETGEO£¬ËüÔÚfdiskÆô¶¯Ê±±»µ÷Ó㻵ڶþ¸öÊÇBLKRRPART¡£¶ÔºóÒ»¸ö
ÃüÁîµÄsbullʵÏÖ½ö½öÊǵ÷ÓÃÒ»ÏÂrevalidateº¯Êý£¬ËüÔòÔÚ´òÓ¡Êä³öÖдòÓ¡×îºóµÄÏûÏ¢£¨
ÃüÁîµÄsbullʵÏÖ½ö½öÊǵ÷ÓÃÒ»ÏÂrevalidateº¯Êý£¬ËüÔòÔÚ´òÓ¡Êä³öÖдòÓ¡×îºóµÄÏûÏ¢£¨
¼û±¾ÕºóÃæµÄ¡°revalidate¡±£©¡£

¿É²ðжµÄÉ豸

ÔÚÎÒÃÇÌÖÂÛ×Ö·ûÉ豸Çý¶¯³ÌÐòʱ£¬ÎÒÃǺöÂÔÁËfops½á¹¹ÖеÄ×îºóÁ½¸öÎļþ²Ù×÷£¬ÒòΪËü
ÃÇÖ»ÊÇΪ¿É²ðж¿éÉ豸¶øÉèµÄ¡£ÏÖÔÚÊÇ¿´¿´ËüÃǵÄʱºòÁË¡£sbull²¢²»ÕæÊǿɲðжµÄ£¬µ«
Ëü¼Ù×°ÊÇ£¬Òò´ËËüʵÏÖÁËÕâЩ·½·¨¡£

ÎÒËù˵µÄ²Ù×÷ÊÇcheck_media-_changeºÍrevalidate¡£Ç°ÕßÓÃÀ´·¢ÏÖÉ豸×ÔÉϴηÃÎÊÒÔÀ´
ÊÇ·ñ¸Ä±ä¹ý£¬ºóÕßÔòÔÚ´ÅÅ̱䶯֮ºóÖØгõʼ»¯Çý¶¯³ÌÐòµÄ״̬¡£

ÖÁÓÚsbull£¬ÓëÉ豸ÏàÁªµÄÊý¾ÝÇøÔÚʹÓüÆÊýϽµÎªÁãºó°ë·ÖÖÓÒªÊÍ·Å¡£´ýÕâ¸öÉ豸´¦ÓÚ
δ°²×°×´Ì¬£¨»ò¹Ø±Õ״̬£©×ã¹»³¤µÄʱ¼äÒÔÄ£ÄâÒ»´Î´ÅÅ̵ĸı䣬ÏÂÒ»´Î¶ÔÉ豸µÄ·ÃÎÊ
·ÖÅäÒ»¸öеÄÄÚ´æÇøÓò¡£

ÕâÒ»ÀàµÄ¡°Ê±¼äµ½ÆÚ¡±Í¨¹ýÒ»¸öºËÐļÆÊýÆ÷À´ÊµÏÖ¡£

check_media_change
Õâ¸ö¼ì²éº¯Êý½ÓÊÕµ½kev_t×öΪһ¸öÈ·¶¨É豸µÄ²ÎÊý¡£Èç¹û½éÖʱ»¸Ä±äÁË·µ»ØֵΪ1£¬·ñ
ÔòΪ0¡£Èç¹ûÒ»¿éÉ豸Çý¶¯³ÌÐò²»Ö§³Ö¿É²ðжÉ豸£¬¿ÉÒÔͨ¹ýÖÃfops->check_media_chan
geΪNULLÀ´±ÜÃâÕâ¸öÉùÃ÷º¯Êý¡£


ÓÐȤµÄÊÇҪעÒ⣬µ±Ò»¸öÉ豸ÊǿɲðжµÄ£¬µ«È´ÎÞ·¨ÅжÏËüÊÇ·ñ¸Ä±äÁË£¬Õâʱ£¬·µ»Ø1ÊÇ
¸ö°²È«Ñ¡Ôñ¡£ÊÂʵÉÏ£¬IDEÇý¶¯³ÌÐòÔÚ´¦Àí¿É ðж´ÅÅÌÊ ¾ÍÊÇÕâô×öµÄ¡£

sbullµÄʵÏÖÊÇÕâÑùµÄ£¬µ±ÓÉÓÚ¼ÆÊýÆ÷³¬Ê±£¬É豸ÒѾ­´ÓÄÚ´æÖÐɾ³ýʱ¾Í·µ»Ø1£¬Èç¹ûÊý
¾ÝÈÔÈ»ÓÐЧÔò·µ»Ø0¡£Èç¹ûÉèÖÃÁ˵÷ÊÔ£¬ËüͬʱÏòϵͳÈÕÖ¾´òÓ¡Ò»ÌõÏûÏ¢£¬ÕâÑùÓû§¾Í¿É
ÒÔ¼ì²éºËÐÄʲôʱºòµ÷ÓÃÁËÕâ¸ö·½·¨¡£

£¨´úÂë253 1#£©

revalidate

Õâ¸öÓÐЧ»¯º¯ÊýÊÇÔÚ¼ì²âµ½Ò»¸ö´ÅÅ̵ĸıäʱ±»µ÷Óá£ËüÒ²±»ÔÚºËÐĵÄ2.1°æÖÐʵÏֵĸ÷
ÖÖstatϵͳµ÷Ó᣷µ»ØֵĿǰ²»×öʹÓã»Îª°²È«Æð¼û£¬·µ»Ø0±íʾ³É¹¦£¬³ö´íʱ·µ»ØÒ»¸ö
¸ºµÄ´íÎó´úÂë¡£

revalidateÖ´ÐеĶ¯×÷ÊÇÉ豸Ìض¨µÄ£¬µ«revalidateͨ³£¸üÐÂһЩÄÚ²¿×´Ì¬ÐÅÏ¢ÒÔ·´Ó³
еÄÉ豸¡£

ÔÚsbullÖУ¬revalidate·½·¨ÔÚûÓÐÒ»¸öÓÐЧÇøÓòµÄÇé¿öÏÂÊÔͼ·ÖÅäÒ»¿éеÄÊý¾ÝÇøÓò¡£


£¨´úÂë253  2#£©
£¨´úÂë253  2#£©

£¨´úÂë254  1#£©

Ìرð×¢Òâ

µ±¿É²ðжÉ豸ÒѾ­´ò¿ªÊ±£¬Çý¶¯³ÌÐòÒ²Ó¦¸Ã¼ì²éÊÇ·ñÓдÅÅ̵ĸı䣻ÔÚmountʱºËÐÄ×Ô¶¯
µ÷ÓÃËüµÄcheck-_disk_changeº¯Êý£¬µ«ÔÚopenʱ£¬²¢²»ÕâÑù×ö¡£

²»¹ý£¬ÓÐЩ³ÌÐòÖ±½Ó·ÃÎÊ´ÅÅÌÊý¾Ý¶ø²»°²×°Õâ¸öÉ豸£¬fsck£¬mcopyºÍfdisk¶¼ÊÇÕâÀà³Ì
ÐòµÄÀý×Ó¡£Èç¹ûÇý¶¯³ÌÐòÔÚÄÚ´æÖб£´æ¿É²ðжÉ豸µÄ״̬ÐÅÏ¢£¬ËüÓ¦ÔÚÉ豸µÚÒ»´Î´ò¿ª
ʱµ÷ÓÃcheck_disk_changeº¯Êý¡£Õâ¸öºËÐĺ¯Êý»¹ÒªÒÀÀµÇý¶¯³ÌÐò·½·¨£¨check_media_ch
angeºÍrevalidate£©£¬Òò´ËÔÚopenÀï²»ÐëʵÏÖÈκÎÌرðµÄ¶«Î÷¡£

ÕâÀïÊÇopenµÄsbullʵÏÖ£¬Ëü¹Ø×¢ÁË·¢Éú´ÅÅ̸ıäµÄÇé¿ö£º

£¨´úÂë254  2#£©

ÔÚÇý¶¯³ÌÐòÖв»Ðè¶Ô´ÅÅ̵ĸıä×öÈκαðµÄ¡£Èç¹ûÒ»¸ö´ÅÅ̱»¸Ä±äÁË£¬¶øËüµÄ´ò¿ª¼ÆÊý
´óÓÚÁ㣬ÄÇôÊý¾Ý»á±»ÆÆ»µ¡£·ÀÖ¹ÕâÖÖÇé¿ö·¢ÉúµÄΨһ·½·¨ÊÇÈÃÀûÓÃÔÚÎïÀíÉÏÖ§³ÖµÄÉè
±¸Ê¹ÓüÆÊý¿ØÖÆÃÅËø¡£openºÍclose¿ÉÒÔÔÚºÏÊʵÄʱºò¹Ø±Õ»ò´ò¿ªËø¡£

¿É·ÖÇøÉ豸
¿É·ÖÇøÉ豸

Èç¹ûÄãÏëÓÃfdiskÉú³É·ÖÇø£¬Äã»á·¢ÏÖËüÃÇÓÐһЩÎÊÌâ¡£fdisk³ÌÐò³ÆÕâЩ·ÖÇøΪ/dev/sb
ull01£¬/dev/sbull02ÒÔ ´ËÀàÍÆ£¬µ«ÎļþϵͳÉϲ¢²»´æÔÚÕâЩÃû×Ö¡£µÄÈ·£¬»ù±¾µÄsbull
É豸ÊÇÒ»¸ö×Ö½ÚÕóÁУ¬²»´æÔÚÌṩ·ÃÎÊÊý¾ÝÇøÓòµÄ×ÓÇøÓòµÄÈë¿Úµã£¬Òò´ËÏë¶Ôsbull½øÐÐ
·ÖÇøÊÇÐв»Í¨µÄ¡£

ΪÁËÄܶÔÉ豸·ÖÇø£¬ÎÒÃDZØÐë¸øÿ¸öÎïÀíÉ豸·ÖÅ伸¸ö´ÎÉ豸ºÅ¡£Ò»¸öÊý×ÖÓÃÀ´·ÃÎÊÕû
¸öÉ豸£¨Èç/dev/hda£©£¬ÆäËüµÄÓÃÀ´·ÃÎʲ»Í¬µÄ·ÖÇø£¨Èç/dev/hda1£©¡£ÓÉÓÚfdisk²úÉú
·ÖÇøÃûµÄ°ì·¨ÊÇÔÚÈ«ÅÌÉ豸Ãûºó¼ÓÒ»¸öÊý×Öºó׺£¬ÎÒÃǽ«ÔÚºóÃæµÄ¿éÉ豸Çý¶¯³ÌÐòÖÐ×ñ
ѭͬÑùµÄÃüÃû¹æÔò¡£

ÔÚ±¾½ÚÖÐÎÒ½«Òª½éÉܵÄÉ豸½Ðspull£¬Òò´ËËüÊÇÒ»¸ö¡°¼òµ¥µÄ¿É·ÖÇø¹¤¾ß£¨Simple
Partitionable Utility£©¡±¡£Õâ¸öÉ豸λÓÚspullĿ¼£¬ÍêÈ«ÓësbullÎ޹أ¬¾¡¹ÜËüÃǹ²
ÏíºÜ¶à´úÂë¡£

ÔÚ×Ö·ûÉ豸Çý¶¯³ÌÐòscullÖУ¬²»Í¬µÄ´ÎÉ豸ºÅ¿ÉÒÔʵÏÖ²»Í¬µÄÐÐΪ£¬Òò´ËÒ»¸öÇý¶¯³ÌÐò
¿ÉÒÔÏÔʾ¼¸ÖÖ²»Í¬µÄʵÏÖ¡£¶ø°´ÕÕ´ÎÉ豸ºÅÇø·Ö¿éÉ豸ÊDz»¿ÉÐеģ¬Õâ¾ÍÊÇΪʲôsbull
ºÍspull±»·ÖÀ뿪¡£ÕâÖÖÎÞÄÜΪÁ¦ÊÇ¿éÉ豸Çý¶¯³ÌÐòµÄÒ»¸ö»ù±¾ÌØÕ÷£¬ÒòΪ¼¸¸öÊý¾Ý½á¹¹
ºÍºêÖ»ÊÇ×÷ΪÖ÷É豸ºÅµÄº¯Êý¶¨ÒåµÄ¡£

¹ØÓÚÒÆÖ²£¬ÐèҪעÒâµÄÊÇ¿É·ÖÇøÄ£¿é²»Äܱ»¼ÓÔص½ºËÐĵÄ1.2°æ£¬ÒòΪ·ûºÅresetup_one_
dev£¨ÔÚ±¾½ÚºóÃæ½éÉÜ£©Ã»Óб»Òý³öµ½Ä£¿é¡£ÔÚ¶ÔSCSIÅ̵ÄÖ§³ÖÄ£¿é»¯Ö®Ç°£¬Ã»ÓÐÈ˻ῼ
ÂÇ¿É·ÖÇøµÄÄ£¿é¡£

ÎÒÒª½éÉܵÄÉ豸½áµã±»³Æ×öpd£¬±íʾ¡°¿É·ÖÇø´ÅÅÌ£¨partitionable disk£©¡±¡£ËĸöÍê
ÕûµÄÉ豸£¨Óֳơ°µ¥Ôª¡±£©±»³Æ×ö/dev/pdaÖ±µ½/dev/pdd£»Ã¿¸öÉ豸×î¶àÖ§³Ö15¸ö·ÖÇø
¡£´ÎÉ豸ºÅÓÐÏÂÃæµÄº¬Ò壺µÍËÄλ±íʾ·ÖÇøºÅ£¨0ΪÍêÕûµÄÉ豸£©£¬¸ßËÄλ±íʾµ¥ÔªºÅ¡£
Õâ¸ö¹æÔòÔÚÔ´ÎļþÖÐÓÉÏÂÃæµÄºê±í´ï£º

£¨´úÂë255£©

ÆÕͨӲÅÌ

ÿ¸ö¿É·ÖÇøÉ豸ÐèÒªÖªµÀËüÊÇÈçºÎ·ÖÇøµÄ¡£Õâ¸öÐÅÏ¢¿ÉÒÔ´Ó·ÖÇø±íÖеõ½¡£³õʼ»¯½ø³Ì
µÄÒ»²¿·Ö°üÀ¨½âÂë·ÖÇø±í£¬²¢¸üÐÂÄÚ²¿Êý¾Ý½á¹¹ÒÔ·´Ó³·ÖÇøÐÅÏ¢¡£

Õâ¸ö½âÂë²¢²»ÈÝÒס£²»¹ýÐÒÔ˵ÄÊÇ£¬ºËÐÄÌṩ¿É±»ËùÓпéÉ豸Çý¶¯³ÌÐòʹÓõġ°ÆÕͨӲ
ÅÌ¡±Ö§³Ö£¬ËüÏÔÖøµØ¼õÉÙÁË´¦Àí·ÖÇøÇý¶¯³ÌÐòµÄ´úÂë¡£Õâ¸öÆÕ֧ͨ³ÖµÄÁíÒ»¸öºÃ´¦ÊÇÇý
¶¯³ÌÐòµÄ×÷Õß²»±ØÀí½â·ÖÇøÊÇÈçºÎÍê³ÉµÄ£¬¶ø²»ÐèÒªÐÞ¸ÄÇý¶¯³ÌÐòµÄ´úÂë¾Í¿ÉÒÔÔÚºËÐÄ
ÖÐÖ§³ÖеķÖÇø·½Ê½¡£

ÏëÒªÖ§³Ö·ÖÇøµÄ¿éÉ豸Çý¶¯³ÌÐòÒª°üº¬<linux/genhd.h>£¬²¢ÉùÃ÷½á¹¹gendisk¡£ËùÓÐÕâ
ÑùµÄ½á¹¹±»×éÖ¯ÔÚÒ»¸öÁ´±íÖУ¬ËüµÄÍ·ÊÇÈ«¾ÖÖ¸Õëgendisk_head¡£


ÔÚÎÒÃǽøÐÐÏÂÒ»²½Ö®Ç°£¬ÈÃÎÒÃÇÏÈ¿´¿´½á¹¹gendiskµÄÓò¡£ÄãΪÁËÀûÓÃÆÕͨÉ豸֧³Ö¾ÍÐè
ÒªÀí½âËüÃÇ¡£

int major

È·¶¨Õâ¸ö½á¹¹ËùÖ¸µÄÉ豸Çý¶¯³ÌÐòµÄÖ÷É豸ºÅ¡£

const char*major_name

ÊôÓÚÕâ¸öÖ÷É豸ºÅµÄÉ豸µÄ»ù±¾Ãû¡£Ã¿¸öÉ豸ÃûÊÇͨ¹ýÔÚÕâ¸öÃû×ÖºóΪÿ¸öµ¥Ôª¼ÓÒ»¸ö
×Öĸ²¢ÎªÃ¿¸ö·ÖÇø¼ÓÒ»¸öÊý×ֵõ½¡£ÀýÈ磬¡°hd¡±ÊÇÓÃÀ´¹¹³É/dev/hda1ºÍ/dev/hda3µÄ
»ù±¾Ãû¡£»ù±¾Ãû×î¶à5¸ö×Ö·û³¤£¬ÒòΪadd_partitionÔÚÒ»¸ö8×ֽڵĻº³åÇøÖй¹ÔìÈ«Ãû£¬
ËüÒª¸½¼ÓÉÏÒ»¸öÈ·¶¨µ¥ÔªµÄ×Öĸ£¬·ÖÇøºÅºÍÒ»¸öÖÕÖ¹·û¡®\0¡¯¡£spullËùÓõÄÃû×ÖÊÇpd£¨
¡°¿É·ÖÇø´ÅÅÌ£¨partitionable disk£©¡±£©¡£

int minor_shift

´ÓÉ豸µÄ´ÎÉ豸ºÅÖлñÈ¡Çý¶¯Æ÷ºÅÒª½øÐÐÒÆλµÄ´ÎÊý¡£ÔÚspullÖÐÕâ¸öÊýÊÇ4¡£Õâ¸öÓòÖÐ
µÄÖµÓ¦ÓëºêDEVICE_NR(device)ÖеĶ¨ÒåÒ»Ö£¨¼û±¾ÕÂÇ°ÃæµÄ¡°Í·Îļþblk.h¡±£©¡£spull
ÖеĺêÀ©Õ¹Îªdevice>>4¡£

int max_p
int max_p

·ÖÇøµÄ×î´óÊýÄ¿¡£ÔÚÎÒÃǵÄÀý×ÓÖУ¬max_p1ÊÇ16£¬»ò¸üÒ»°ãµØ£¬ÊÇ<<minor_shift¡£

int max-_nr

µ¥ÔªµÄ×î´óÊýÄ¿¡£ÔÚspullÖУ¬Õâ¸öÊý×ÖÊÇ4¡£µ¥Ôª×î´óÊýÄ¿ÔÚÒÆλminor_shift´ÎºóµÄ½á
¹ûӦƥÅä´ÎÉ豸ºÅµÄ¿ÉÄܵķ¶Î§£¬Ä¿Ç°ÊÇ0-255¡£IDEÇý¶¯³ÌÐò¿ÉÒÔͬʱ֧³ÖºÜ¶àÇý¶¯Æ÷
ºÍÿһ¸öÇý¶¯Æ÷ºÜ¶à·ÖÇø£¬ÒòΪËü×¢²áÁ˼¸¸öÖ÷É豸ºÅ£¬´Ó¶øÈƹýÁË´ÎÉ豸ºÅ·¶Î§Ð¡µÄ
ÎÊÌâ¡£

void(*init)£¨struct gendisk*£©

Çý¶¯³ÌÐòµÄ³õʼ»¯º¯Êý£¬ËüÔÚ³õʼ»¯É豸ºóºÍ·ÖÇø¼ì²éÖ´ÐÐÇ°±»µ÷Óá£ÎÒ½«ÔÚÏÂÃæ½éÉÜ
Õâ¸öº¯Êý¸ü¶àµÄϸ½Ú¡£

struct hd_struct *part

É豸µÄ½âÂëºóµÄ·ÖÇø±í¡£Çý¶¯³ÌÐòÓÃÕâÒ»ÏîÈ·¶¨Í¨¹ýÿ¸ö´ÎÉ豸ºÅÄÄЩ·¶Î§µÄ´ÅÅÌÉÈÇø
ÊÇ¿ÉÒÔ·ÃÎʵġ£´ó¶àÊýÇý¶¯³ÌÐòʵÏÖmax_nr<<minor_shift¸ö½á¹¹µÄ¾²Ì¬ÊýÖµ£¬²¢¸ºÔðÊý
×éµÄ·ÖÅäºÍÊÍ·Å¡£ÔÚºËÐĽâÂë·ÖÇø±í֮ǰÇý¶¯³ÌÐòÓ¦½«Êý×é³õʼ»¯ÎªÁã¡£

int *sizes
int *sizes

Õâ¸öÓòÖ¸ÏòÒ»¸öÕûÊýÊý×é¡£Õâ¸öÊý×é±£³Ö×ÅÓëblk_sizeͬÑùµÄÐÅÏ¢¡£Çý¶¯³ÌÐò¸ºÔð·ÖÅä
ºÍÊͷŸÃÊý¾ÝÇøÓò¡£×¢ÒâÉ豸µÄ·ÖÇø¼ì²é°ÑÕâ¸öÖ¸Õ뿽±´µ½blk_size£¬Òò´Ë´¦Àí¿É·ÖÇø
É豸µÄÇý¶¯³ÌÐò²»±Ø·ÖÅäÕâºóÒ»¸öÊý×é¡£

int nr_real

´æÔÚµÄÕæʵÉ豸£¨µ¥Ôª£©µÄ¸öÊý¡£Õâ¸öÊý×Ö±ØÐëСÓÚµÈÓÚmax_nr¡£

void *real_devices

Õâ¸öÖ¸Õë±»ÄÇЩÐèÒª±£´æһЩ¶îÍâ˽ÓÐÐÅÏ¢µÄÇý¶¯³ÌÐòÄÚ²¿Ê¹Óã¨ÕâÓëfilp->private_d
ataÀàËÆ£©¡£

void struct gendisk *next

ÔÚÆÕͨӲÅÌÁбíÖеÄÒ»¸ùÁ´¡£

·ÖÇø¼ì²éµÄÉè¼Æ×îÊʺÏÄÇЩֱ½ÓÁ´ÈëºËÐÄÓ³ÏóµÄÇý¶¯³ÌÐò£¬Òò´ËÎÒ½«´Ó½éÉܺËÐÄ´úÂëµÄ
»ù±¾½á¹¹¿ªÊ¼¡£ÒÔºóÎÒ½«½éÉÜspullÄ£¿é´¦ÀíËüµÄ·ÖÇøµÄ·½·¨¡£

ºËÐÄÖеķÖÇø¼ì²â
ºËÐÄÖеķÖÇø¼ì²â

ÔÚÒýµ¼Ê±£¬init/main.cµ÷ÓÃÁ˸÷ÖÖ¸÷ÑùµÄ³õʼ»¯º¯Êý¡£ÆäÖÐÒ»¸öÊÇstart_kernel£¬Ëüͨ
¹ýµ÷ÓÃdevice_setupÀ´³õʼ»¯ËùÓеÄÇý¶¯³ÌÐò¡£Õâ¸öº¯ÊýÓÖµ÷ÓÃblk_dev_init£¬½Ó׿ì
²éËùÓÐ×¢²áµÄÆÕͨӲÅ̵ķÖÇøÐÅÏ¢¡£ÈκÎÒ»¸ö¿éÉ豸Çý¶¯³ÌÐò£¬Èç¹ûËüÕÒµ½ÖÁÉÙÒ»¸öËü
µÄÉ豸£¬¾Í½«Õâ¸öÇý¶¯³ÌÐòµÄgenhd½á¹¹×¢²áµ½ºËÐÄÁбíÖУ¬ÕâÑùËüµÄ·ÖÇø±ã¿ÉÒÔ±»ÕýÈ·
µØ¼ì²â³öÀ´¡£

Òò´Ë£¬Ò»¸ö¿É·ÖÇøµÄÇý¶¯³ÌÐòÓ¦¸ÃÉùÃ÷Ëü×Ô¼ºµÄ½á¹¹genhd¡£Õâ¸ö½á¹¹¿´ÆðÀ´ÈçÏ£º

£¨´úÂë258£©

ÓÚÊÇ£¬ÔÚÕâ¸öÇý¶¯³ÌÐòµÄ³õʼ»¯º¯ÊýÖУ¬Õâ¸ö½á¹¹±»ÅŶÓÔÚ¿É·ÖÇøÉ豸µÄÖ÷ÁбíÖС£

±»Á´ÈëºËÐĵÄÇý¶¯³ÌÐòµÄ³õʼ»¯º¯ÊýÓëinit_moduleµÈ¼Û£¬¼´Ê¹Ëü±»µ÷Óõķ½Ê½²»Í¬¡£Õâ
¸öº¯ÊýÒ»¶¨°üº¬ÈçÏÂÁ½ÐУ¬ËüÃÇÓÃÀ´½«½á¹¹ÅŶӣº

my_gendisk.next=gendisk_head;

gendisk_head=my_gendisk;

ͨ¹ý½«½á¹¹²åÈëÁ´±í£¬Õâ¼òµ¥µÄÁ½ÐбãÊÇÇý¶¯³ÌÐòÈë¿ÚµãΪËùÓеķÖÇøÕýÈ·µØʶ±ðºÍÅä
ÖÃËùÐèÒªµÄËùÓÐÄÚÈÝ¡£

¶îÍâµÄÉèÖÃͨ¹ýmy_geninitÍê³É¡£ÔÚÉÏÃæµÄÀý×ÓÖУ¬Õâ¸öº¯ÊýÌî³ä¡°µ¥ÔªÊý¡±ÓòÀ´·´Ó³
¼ÆËã»úϵͳµÄʵ¼ÊÓ²¼þÉèÖá£ÔÚmy_geninit½áÊøºó£¬gendisk.cΪËùÓеÄÅÌ£¨µ¥Ôª£©Ö´ÐÐ
ʵ¼ÊµÄ·ÖÇø¼ì²â¡£Äã¿ÉÒÔ¿´µ½ÏµÍ³Æô¶¯Ê±±»¼ì²âµÄ·ÖÇø£¬ÒòΪgendisk.cÔÚϵͳ¿ØÖÆ̨ÉÏ
´òÓ¡·ÖÇø¼ì²éPartition check£º£¬ºóÃæ¸úËæËüÔڿɵõÄÆÕͨӲÅÌÉÏÕÒµ½µÄËùÓзÖÇø¡£

Äã¿ÉÒÔÐÞ¸ÄÇ°ÃæµÄ´úÂ룬ÍƳÙmy_sizesºÍmy_partitionsµÄ·ÖÅäÖ±µ½my_geninitº¯Êý¡£Õâ
¿ÉÒÔ½ÚÊ¡ÉÙÁ¿µÄºËÐÄÄڴ棬ÒòΪÕâЩÊý×é¿ÉÒÔСµ½nr_real<<minor_shift£¬¶ø¾¹Ì¬Êý×é
Ôò±ØÐëΪmax_nr<<minor_shift×Ö½Ú³¤¡£²»¹ý£¬µäÐ͵ÄÊýÖµÊÇÿ¸öÎïÀíµ¥Ôª½ÚÊ¡¼¸°Ù¸ö×Ö
½Ú¡£

Ä£¿éÖеķÖÇø¼ì²â

Ò»¸öÄ£¿é»¯µÄÇý¶¯³ÌÐòºÍÁ´½Óµ½ºËÐĵÄÇý¶¯³ÌÐòµÄÇø±ðÔÚÓÚËüÎÞ·¨ÊÜÒæÓÚ¼¯ÌåÖеijõʼ
»¯¡£Ïà·´£¬ËüÐèÒª´¦ÀíËü×Ô¼ºµÄÉèÖá£ÓÉÓÚûÓÐΪģ¿éµÄÁ½²½³õʼ»¯£¬ËùÒÔspullµÄgend
isk½á¹¹ÔÚËüµÄinitº¯ÊýÖ¸ÕëÖÐÓÐÒ»¸öNULLÖ¸Õ룺

£¨´úÂë259 1#£©

ͬʱҲ²»±ØÔÚÆÕͨӲÅ̵ÄÈ«¾ÖÁ´±íÀï×¢²ágendisk½á¹¹¡£

ͨ¹ýÒý³öº¯Êýresetup_one_dev£¬Îļþgendisk.c±»×¼±¸ÓÃÀ´´¦ÀíÏóÄ£¿éÐèÒªÒ»Àà¡°ÍíµÄ
ÏóÄ£¿éÐèÒªÒ»Àà¡°ÍíµÄ
¡±³õʼ»¯¡£resetup_one_devΪµ¥¸öÎïÀíÉ豸ɨÃè·ÖÇø¡£ÆäÔ­ÐÍÊÇ£º

boid resetup_one_dev(struct gendisk *dev,int drive)£»

´ÓÕâ¸öº¯ÊýÃû×ÖÄã¿ÉÒÔ¿´³öÀ´ËüÊÇÒª¸Ä±äÒ»¸öÉ豸µÄÉèÖÃÐÅÏ¢¡£Õâ¸öº¯Êý±»Éè¼ÆΪÓÉioc
tlÀïBLKRRPARTʵÏÖµ÷Ó㬵«ËûÒ²¿ÉÒÔ±»ÓÃÀ´Íê³ÉÒ»¸öÄ£¿éµÄ³õʼÉèÖá£

µ±Ò»¸öÄ£¿é±»³õʼ»¯ºó£¬ËüÓ¦¸ÃΪÿ¸öËü½«Òª·ÃÎʵÄÎïÀíÉ豸µ÷ÓÃresetup_one_dev£¬´Ó
¶ø½«·ÖÇøÐÅÏ¢Öü´æmy_gendisk->partÖС£·ÖÇøÐÅÏ¢»á±»É豸µÄrequest_fnº¯ÊýʹÓá£

ÔÚspullÖУ¬init_moduleº¯Êý³ýÁËͨ³£µÄÖ¸ÁîÍ⻹°üº¬ÁËÏÂÃæµÄ´úÂë¡£Ëü·ÖÅä·ÖÇø¼ì²â
ËùÐèµÄÊý×é²¢³õʼ»¯Êý×éÖÐÍêÕû´ÅÅ̵ÄÏîÄ¿¡£

£¨´úÂë259 2#£©

£¨´úÂë260 1#£©

ÓÐȤµÄÊÇ×¢Òâµ½resetup_one_devͨ¹ýÖظ´µ÷ÓÃÏÂÃ溯Êý´òÓ¡·ÖÇøÐÅÏ¢£º

printk£¨¡°%s£º¡±£¬disk_name£¨hd£¬minor£¬buf£©£©£»

Õâ¾ÍÊÇΪʲôspullÒª´òÓ¡Ò»¸öÒýµ¼´®¡£ËüÒâζ×ÅҪΪÈû½øϵͳÈÕÖ¾µÄÐÅÏ¢Ôö¼ÓһЩÉÏÏÂ
¡Ò»¸öÒýµ¼´®¡£ËüÒâζ×ÅҪΪÈû½øϵͳÈÕÖ¾µÄÐÅÏ¢Ôö¼ÓһЩÉÏÏÂ
ÎÄ¡£

µ±Ò»¸ö¿É·ÖÇøµÄÄ£¿é±»Ð¶ÔØʱ£¬Çý¶¯³ÌÐòÓ¦¸Ãͨ¹ýΪÿ¸öÖ§³ÖµÄÖ÷/´Î¶Ôµ÷ÓÃfsync_dev
À´°²ÅÅËùÓеķÖÇøˢС£¶øÇÒ£¬Èç¹û½á¹¹gendisk±»²åÔÚÈ«¾ÖÁ´±íÖУ¬ËüÓ¦¸Ã±»É¾³ý¡ª¡ª
×¢Òâspull²¢Î´×Ô¼º²åÈëËü£¬Ô­ÒòÉÏÃæÌáµ½¹ý¡£

spullµÄÇå³ýº¯ÊýÊÇ£º

£¨´úÂë260 2#£©

£¨´úÂë261£©

ʹÓÃInitrd½øÐзÖÇø¼ì²â

Èç¹ûÄãÏë´ÓÒ»¸öÉ豸ÉÏ°²×°ÄãµÄ¸ùÎļþϵͳ£¬¶øÕâ¸öÉ豸µÄÇý¶¯³ÌÐòÖ»ÓÐÄ£¿é»¯µÄÐÎʽ
£¬Äã¾Í±ØÐëʹÓÃÓÉÏÖ´úLinuxºËÐÄÌṩµÄInitrd¹¤¾ß¡£ÎÒ²»ÏëÔÚÕâÀï½éÉÜInitrd£¬ÕâһС
½ÚÊÇÕë¶ÔÄÇЩÁ˽âInitrd²¢ÏëÖªµÀËüÊÇÈçºÎÓ°Ïì¿éÉ豸Çý¶¯³ÌÐòµÄ¶ÁÕߵġ£

µ±ÄãÓÃInitrdÒýµ¼Ò»¸öºËÐÄʱ£¬Ëü»áÔÚ°²×°ÕæÕýµÄ¸ùÎļþϵͳ֮ǰ½¨Á¢Ò»¸öÔÝʱµÄÔËÐÐ
»·¾³¡£Ä£¿éͨ³£ÊÇ´Ó±»ÓÃ×÷ÁÙʱ¸ùÎļþϵͳµÄramdiskÖÐ×°ÔØ¡£

ÓÉÓÚInitrd½ø³ÌÊÇÔÚËùÓÐÆäËüÒýµ¼Ê±³õʼ»¯Íê³ÉÖ®ºó²Å¿ªÊ¼ÔËÐУ¨µ«ÔÚÕæÕýµÄ¸ùÎļþϵ
У¨µ«ÔÚÕæÕýµÄ¸ùÎļþϵ
ͳ°²×°Ö®Ç°£©£¬Òò´ËÔÚ×°ÔØÒ»¸öÆÕͨģ¿éºÍÔÚInitrd ramdiskÖеÄÄ£¿éûÓÐÇø±ð¡£Èç¹û
Ò»¸öÇý¶¯³ÌÐò¿ÉÒÔÕýÈ·µØ×°Ôز¢ÒÔÄ£¿éµÄÐÎʽ±»Ê¹Óã¬ÄÇôËùÓк¬ÓÐInitrdµÄLinux·¢²¼
¶¼¿ÉÒÔ½«Õâ¸öÇý¶¯³ÌÐò°üº¬ÔÚ°²×°ÅÌÖжø²»ÐèÒªÄãÑо¿Ð޸ĺËÐÄÔ´Âë¡£

spullµÄÉ豸·½·¨

³ýÁ˳õʼ»¯ºÍÇå³ý¹¤×÷£¬¿É·ÖÇøÉ豸ºÍ²»¿É·ÖÇøÉ豸»¹ÓÐÆäËüµÄ²»Í¬¡£¸ù±¾ÉÏ˵£¬ÕâЩ
Çø±ðÀ´×ÔÒ»¸öÊÂʵ£¬¼´Èç¹ûÒ»¸ö´ÅÅÌÊÇ¿É·ÖÇøµÄ£¬ÄÇôͬһ¸öÎïÀíÉ豸¿ÉÒÔͨ¹ý²»Í¬µÄ
´ÎÉ豸ºÅ½øÐзÃÎÊ¡£´Ó´ÎÉ豸ºÅµ½´ÅÅÌÉÏÎïÀíλÖõÄÓ³ÉäÓÉresetup_one_dev´æÖüÔÚÊý×é
gendisk->partÖС£ÏÂÃæµÄ´úÂëÖ»°üº¬ÁËspullÓësbull²»Í¬µÄ²¿·Ö£¬ÒòΪ¾ø´ó²¿·Ö´úÂëÊÇ
ÍêÈ«Ò»ÑùµÄ¡£

Ê×ÏÈ£¬openºÍclose±ØÐëÕÆÎÕÿ¸öÉ豸µÄʹÓüÇÊýÇé¿ö¡£ÓÉÓÚʹÓüÇÊýÊǹØÓÚÎïÀíÉ豸£¨
µ¥Ôª£©µÄ£¬ÏÂÃæµÄ¸³Öµ±»ÓÃÓÚdev±äÁ¿£º

spull_Dev *dev=spull_devicex+DEVICE_NR(inode->i_rdev)£»

ÕâÀïÓõ½µÄºêDEVICE_NR±ØÐë°üº¬<linus/blk.h>֮ǰ±»ÉùÃ÷¡£

¾¡¹Ü¼¸ºõËùÓеÄÎïÀí·½·¨¿ÉÒÔ¹¤×÷ÓÚÎïÀíÉ豸£¬ioctlÓ¦¸Ã·ÃÎÊÿ¸ö·ÖÇøµÄÌض¨ÐÅÏ¢¡£Àý
È磬Ӧ¸Ã¸æËßmkfsÿ¸ö·ÖÇøµÄ´óС£¬¶ø²»ÊÇÍêÕûÉ豸µÄ´óС¡£ÏÂÃæÊÇiotclµÄBLKGETSIZE
ÃüÁîÈçºÎÒòÒ»¸öÉ豸һ¸ö´ÎÉ豸ºÅ±äΪһ¸öÉ豸¶à¸ö´ÎÉ豸ºÅ¶øÊܵ½Ó°ÏìµÄ¡£ÕýÈçÄãËù
´ÎÉ豸ºÅ±äΪһ¸öÉ豸¶à¸ö´ÎÉ豸ºÅ¶øÊܵ½Ó°ÏìµÄ¡£ÕýÈçÄãËù
ÆÚÍûµÄ£¬spull=gendisk->part±»ÓÃÀ´×öΪ·ÖÇø´óСµÄÀ´Ô´¡£

£¨´úÂë262  #1£©

ÁíÒ»¸ö¶Ô¿É·ÖÇøÉ豸²»Í¬µÄioctlÃüÁîÊÇBLKRRPART¡£¶Ô¿É·ÖÇøÉ豸À´ËµÖضÁ·ÖÇø±íÊÇÓÐ
ÒâÒåµÄ£¬ËüµÈ¼ÛÓÚÔÚ·¢Éú´ÅÅ̸ıäºó¶Ô´ÅÅ̵ÄÖØÓÐЧ»¯£¨revalidating£©£º

£¨´úÂë262  #2£©

º¯Êýspull_revalidate½Ó×ŵ÷ÓÃresetup_one_devÀ´Öؽ¨·ÖÇø±í¡£²»¹ý£¬ËüÊ×ÏÈÐèÒªÇåµô
ËùÓÐÒÔÇ°µÄÐÅÏ¢¡ª¡ª²»È»µÄ»°£¬Î²·ÖÇø»¹»á³öÏÖÔÚ·ÖÇø±íµÄºó²¿£¬Èç¹ûзÖÇø±íº¬ÓÐÉÙ
ÓÚÒÔÇ°µÄ·ÖÇøÊý¡£

£¨´úÂë262  #3£©

µ«ÊÇsbullºÍspullµÄÖ÷ÒªÇø±ðÔÚÓÚÇëÇóº¯Êý¡£ÔÚspullÖУ¬ÇëÇóº¯Êý±ØÐëʹÓ÷ÖÇøÐÅÏ¢ÒÔ
ÔÚ²»Í¬´ÎÉ豸ºÅÖ®¼äÕýÈ·µØ´«ËÍÊý¾Ý¡£

spull_gendisk->partÖеÄÐÅÏ¢ÔÚÎïÀíÉ豸ÉÏΪÿ¸ö·ÖÇø¶¨Î»¡£part[minor]->nr_sects
ÊÇ·ÖÇøµÄ´óС£¬part[minor]->start_sectÊǾà´ÅÅÌÆðʼλÖõÄÆ«ÒÆ¡£ÇëÇóº¯Êý×îÖÕת»Ø
µ½ÍêÕû´ÅÅ̵ÄʵÏÖ¡£


ÏÂÃæÊÇÔÚspull_requestÖеÄÏà¹ØÐУº

£¨´úÂë263#4£©

£¨´úÂë263#1£©

ÉÈÇøÊý³ËÒÔÉÈÇø´óС512£¨ÕâÀïÖ±½Ó±àдÔÚspullÖеģ©µÃµ½ÒÔ×Ö½ÚΪµ¥Î»µÄ·ÖÇøµÄ´óС
¡£

ÖжÏÇý¶¯µÄ¿éÉ豸Çý¶¯³ÌÐò

µ±Ò»¸öÇý¶¯³ÌÐò¿ØÖÆÒ»¸öʵ¼ÊµÄÓ²¼þÉ豸ʱ£¬²Ù×÷Ò»°ãÊÇÖжÏÇý¶¯µÄ¡£Ê¹ÓÃÖжÏÒÀ¿¿ÔÚI
/O²Ù×÷ʱÊÍ·Å´¦ÀíÆ÷£¬´Ó¶øÌá¸ßϵͳÐÔÄÜ¡£ÎªÁËÈÃÖжÏÇý¶¯I/OÄܹ»¹¤×÷£¬±»¿ØÖƵÄÉ豸
±ØÐëÄÜÒì²½µØ´«ËÍÊý¾Ý²¢²úÉúÖжϡ£

µ±Çý¶¯³ÌÐòÊÇÖжÏÇý¶¯Ê±£¬ÇëÇóº¯ÊýÅÉÉú³öÒ»¸öÊý¾Ý´«ËͲ¢Á¢¼´·µ»Ø£¬²¢²»µ÷ÓÃend_req
uest¡£²»¹ý£¬ºËÐIJ¢²»ÈÏΪÇëÇóÒѾ­±»Íê³ÉÁË£¬Ö±µ½end_request±»µ÷ÓÃʱ¡£Òò´Ë£¬µ±Éè
±¸·¢³öÐźűíÃ÷Êý¾Ý´«ËÍÒѾ­Íê³Éʱ£¬Éϰ벿»òÏ°벿Öжϴ¦Àí³ÌÐòµ÷ÓÃend_request¡£


Èô²»Ê¹ÓÃϵͳ΢´¦ÀíÆ÷£¬sbullºÍspull¶¼²»ÄÜ´«ËÍÊý¾Ý£»²»¹ýspull×°±¸ÁËαװÖжÏÇý¶¯
²Ù×÷µÄÄÜÁ¦£¬Õâͨ¹ýÔÚ×°ÔØʱָ¶¨irq=1ʵÏÖ¡£µ±irqΪÁãʱ£¬Çý¶¯³ÌÐòʹÓÃÒ»¸öºËÐļÆ
ʱÆ÷À´ÍƳٵ±Ç°ÇëÇóµÄÍê³É¡£Ñӳٵij¤¶ÈÊÇirqµÄÖµ£ºÖµÔ½´ó£¬ÑÓ³ÙÔ½³¤¡£

ÖжÏÇý¶¯É豸µÄÇëÇóº¯Êý¸æËßÓ²¼þÖ´Ðд«ËͲ¢·µ»Ø¡£spullº¯ÊýÖ´ÐÐͨ³£µÄ´íÎó¼ì²é£¬²¢
µ÷ÓÃmemcpy´«ËÍÊý¾Ý£¨Õâ¸öÈÎÎñÔÚʵ¼ÊÇý¶¯³ÌÐòÖÐÊÇÒì²½Ö´Ðеģ©¡£Ëü½«È·ÈÏÓ¦´ðÑÓ³Ù
ÖÁÖжÏʱ¡£

£¨´úÂë263  #2£©

£¨´úÂë264  #1£©

µ±É豸ÕýÔÚ´¦Àíµ±Ç°ÇëÇóʱ£¬ÐÂÀ´µÄÇëÇó¿ÉÒÔ»ýÀÛÆðÀ´£¬µ«Èç¹ûÇý¶¯³ÌÐòÕýÔÚ´¦ÀíÒ»¸ö
ÇëÇ󣬺ËÐIJ¢²»ÎªÖ®µ÷ÓÃÇëÇóº¯Êý¡£Õâ¾ÍÊÇΪʲôÕâÀïÏÔʾµÄº¯Êý²¢²»¼ì²éË«Öص÷Óá£

ÔÚÉÏÒ»¸öÊý¾Ý´«ËÍÍê³Éºó£¬ÉèÖÃÏÂÒ»´ÎÊÇÖжϴ¦Àí³ÌÐòµÄÔðÈΡ£Îª±ÜÃâ´úÂëÖظ´£¬´¦Àí
³ÌÐòͨ³£µ÷ÓÃÇëÇóº¯Êý£¬Òò´ËÇëÇóº¯ÊýÓ¦ÄÜÔÚÖжÏʱÔËÐУ¨¼ûµÚ6Õ¡°ÈÎÎñ¶ÓÁеı¾ÖÊ¡±
£©¡£

ÔÚÎÒÃǵÄʾÀýÄ£¿éÖУ¬Öжϴ¦Àí³ÌÐòµÄ½ÇÉ«ÊÇͨ¹ý¼ÆʱÆ÷³¬Ê±Ê±µ÷Óõĺ¯ÊýÍê³ÉµÄ¡£ÄÇ
¸öº¯Êýµ÷ÓÃend_request²¢Í¨¹ýµ÷ÓÃÇëÇóº¯ÊýÀ´µ÷¶ÈÏÂÒ»´ÎÊý¾Ý´«ËÍ¡£

£¨´úÂë264 2#£©


×¢ÒâÕâ¸öÖжϴ¦Àí³ÌÐòµ÷ÓÃÇëÇóº¯ÊýÀ´µ÷¶ÈÏÂÒ»´Î²Ù×÷¡£ÕâÒâζ×ÅÔÚÕâÖÖÇé¿öÏ£¬ÇëÇó
º¯Êý±ØÐëÄÜÔÚÖжÏʱ½øÐС£

Èç¹ûÄãÊÔͼÒÔÖжÏÇý¶¯·ç¸ñÔËÐÐspullÄ£¿é£¬Äã»áÃ÷ÏÔµØ×¢Òâµ½Ôö¼ÓµÄÑÓ³Ù¡£Õâ¸öÉ豸¼¸
ºõÏóËüÒÔÇ°Ò»Ñù¿ì£¬ÒòΪ»º³å¸ßËÙ»º´æ±ÜÃâÁËÄÚ´æºÍÎïÀíÉ豸֮¼äµÄ¾ø´ó¶àÊýÊý¾Ý´«ËÍ
¡£Èç¹ûÄãÏë¸ÐÊÜÒ»ÏÂÒ»¸öÂýÉ豸ÊÇÈçºÎÔËÐеģ¬Äã¿ÉÒÔÔÚ¼ÓÔØspullʱΪirqÖ¸¶¨Ò»¸ö´ó
µã¶ùµÄÖµ¡£

¿ìËٲο¼

ÏÂÃæ×ܽáµÄÊÇÔÚдһ¸ö¿éÉ豸Çý¶¯³ÌÐòʱ×îÖØÒªµÄº¯ÊýºÍºê¡£²»¹ý£¬ÎªÁ˽ÚÊ¡¿Õ¼ä£¬ÎÒ
ûÓÐÁгö½á¹¹requestºÍgenhdµÄÓò£¬ÁíÍâÎÒҲʡÂÔÁËÔ¤Ïȶ¨ÒåµÄioctlÃüÁî¡£

int register_blkdev(unsigned int major,const char *name,struct
file_operations *fops);

int unregister_blkdev(unsigned int major,const char *name);

ÕâÁ½¸öº¯Êý¸ºÔðÔÚinit_moduleÖеÄÉ豸ע²áºÍcleanup_moduleÖеÄÉ豸³·³ý¡£

struct blk_dev_struct blk_dev[MAX_BLKDEV];


Õâ¸öÊý×éÓÃ×öÔÚºËÐĺÍÇý¶¯³ÌÐò¼äÇëÇóµÄ´«µÝ¡£blk_dev[major].request_fnÓ¦¸ÃÔÚ¼ÓÔØ
ʱ±»¸³ÖµÒÔÖ¸Ïò¡°µ±Ç°ÇëÇóµÄÇëÇóº¯Êý¡±¡£

int read_ahead[][];

ÿ¸öÖ÷É豸ºÅµÄÌáÇ°¶ÁµÄÖµ¡£ÊýֵΪ8¶ÔÓ²ÅÌÒ»ÀàµÄÉ豸±È½ÏºÏÀí£»¶ÔÂýËÙ½éÖÊÕâ¸öÖµÓ¦
¸Ã´óÒ»µã¶ù¡£

int read_ahead[];

int blksize_size[][];

int blk_size[][];

ÕâЩ¶þάÊý×éÓÉÖ÷É豸ºÅºÍ´ÎÉ豸ºÅË÷Òý¡£Çý¶¯³ÌÐò¸ºÔð·ÖÅäºÍÊÍ·ÅÓëÖ÷É豸ºÅ¹ØÁªµÄ
¾ØÕóÖеÄÐС£ÕâЩÊý×é·Ö±ð±íʾÒÔ×Ö½ÚΪµ¥Î»µÄÉ豸¿éµÄ´óС£¨Í¨³£Îª1KB£©£¬ÒÔKBΪµ¥
λµÄÿ¸ö´ÎÉ豸µÄ´óС£¨²¢·ÇÒÔ¿éΪµ¥Î»£©£¬ÒÔ×Ö½ÚΪµ¥Î»µÄÓ²¼þÉÈÇøµÄ´óС¡£

µ±Ç°£¬²»Ö§³Ö512ÒÔÍâµÄÉÈÇø´óС£¬¾¡¹Ü´úÂëÖÐÓÐÒ»¸ö¹³×Óº¯Êý£¨hook£©¡£

MAJOR_NR


DEVICE_NAME

DEVICE_NR(kdev_t device)

DEVICE_INTR

#include <linux/blk.h>

ÕâЩºê±ØÐëÔÚÇý¶¯³ÌÐò°üº¬Í·Îļþ֮ǰ¶¨Ò壬ÒòΪ¾ø´ó¶àÊýÍ·ÎļþÒªÓõ½ËüÃÇ¡£

struct request *CURRENT

Õâ¸öºêÖ¸Ïòµ±Ç°µÄÇëÇó¡£Õâ¸öÇëÇó½á¹¹ÃèÊöÒ»¸öÒª±»´«Ë͵ÄÊý¾Ý¿é£¬±»µ±Ç°Çý¶¯³ÌÐòµÄr
equest_fnʹÓá£

#include <linux/gendisk.h>

struct genhd;

ÆÕͨӲÅÌʹµÃLinuxÇáËɵØÖ§³Ö¿É·ÖÇøÉ豸¡£

void resetup_one_dev(struct gendisk *genhd,int ddrive);

Õâ¸öº¯ÊýɨÃè´ÅÅ̵ķÖÇø±í£¬²¢ÖØдgenhd->partÒÔ·´Ó³ÐµķÖÇø¡£

  

--
¡ù À´Ô´:¡¤¹þ¹¤´ó×϶¡Ïã bbs.hit.edu.cn¡¤[FROM: 202.118.235.250]
[°Ù±¦Ïä] [·µ»ØÊ×Ò³] [Éϼ¶Ä¿Â¼] [¸ùĿ¼] [·µ»Ø¶¥²¿] [Ë¢ÐÂ] [·µ»Ø]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º213.098ºÁÃë