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ºÁÃë