©®linuxÉçÇø©® °®ÐÄÔ®Öú ©® LinuxÈÏÖ¤©®ÏµÁÐ½Ì³Ì ©® Òµ½ç¶¯Ì¬©® Õ¾ÎñÐÂÎÅ ©® ¹«Ë¾ÕÐÆ¸©® ½¨ÒéÁôÑÔ ©® ÍøÖ·´óÈ« ©®LPIרÌâ©® CISCOרÌâ
ÉèΪÊ×Ò³
¼ÓÈëÊÕ²Ø
¹ÜÀíÍŶÓ
JSP  
JAVA  
PERL  
 ÄúµÄλÖãºÊ×Ò³ > article > unix > unixÌá¸ß >
À¸Ä¿µ¼À¸
×ÊÁÏËÑË÷
ÈÈÃÅÎÄÕÂ
¡¤20%µÄSOLARIS֪ʶ½â¾ö80%µÄÎÊÌâ
¡¤SolarisÆô¶¯¹ý³ÌÏê½â zt
¡¤²é¿´SolarisϵͳӲ¼þÅäÖõÄÃüÁî
¡¤UnixϵÁÐshell³ÌÐò±àд(ÖÐ)
¡¤STRUTS Ô´Âëѧϰ±Ê¼Ç
¡¤SOLARIS¼¼ÇÉÆª
¡¤snortÔ´Âë·ÖÎö
¡¤UnixϵÁÐshell³ÌÐò±àд(ÏÂ)
¡¤ÔÚsolaris 10/x86ϰ²×°oracle
¡¤solaris 10 Ó²Å̰²×°
¡¤Solaris°²È«ÅäÖÃÊÖ²á
¡¤ApacheÔ´´úÂë·ÖÎö¡ª¡ª¹ØÓÚÄ£¿é
¡¤HP-UX»ù±¾Ö¸Áî¿ìËٲο¼
¡¤ Tomcat ServerÔ´ÂëÆô¶¯·ÖÎö
¡¤Solaris8 Ë«Íø¿¨ÅäÖã¨Â·ÓÉÆ÷ÓÃ
×îÐÂÎÄÕÂ
¡¤solarisϵͳ°²È«ÅäÖÃ
¡¤RHEL5.0²Ù×÷ϵͳÏÂNFS·þÎñµÄÅä
¡¤Solaris Linux 9ÏÂVsftpdµÄÅäÖÃ
¡¤ÔÚHP-UXϽ¨Á¢Ö»¹éÊôÓÚij¸öĿ¼
¡¤SolarWinds2002ʹÓÃ˵Ã÷
¡¤´ÓÍⲿ´æ´¢»®Å̲¢¼ÓÈëvg,ΪfsÀ©
¡¤Òò´ø¿âÎÊÌâµ¼ÖÂϵͳ¹âÏË¿¨±¨´í
¡¤Unix϶àÏß³ÌÖÐÌõ¼þ±äÁ¿µÄʹÓÃ
¡¤UNIXºÍLinuxÖÐÐźŵĸöÊý
¡¤²»Í¬µÄÀàUNIX²Ù×÷ϵͳÃÜÂëÆÆ½â
¡¤AIXϵͳÏÂDominoÓʼþ·þÎñÆ÷°²×°
¡¤ÏÞÖÆROOTÓû§Ô¶³ÌµÇ½UNIXϵͳ
¡¤Unix²Ù×÷ϵͳÈëÇÖ×·×Ù·´»÷Õ½
¡¤AIX CDE²»ÄÜÆô¶¯µÄ¹ÊÕÏÒ»°ãÐÔ½â
¡¤CentOS4.4ÓÃVSFTPD¼ÜÉèFTP·þÎñ
Google
 
FreeBSDºËÐÄÈëÃÅ
[ ×÷Õß:LinuxÁªÃËÊÕ¼¯  ¼ÓÈëʱ¼ä:2006-06-14 00:46:28  À´×Ô:LinuxÁªÃËÊÕ¼¯ ]
£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
2.2.4 struct buf ºÍblockµÄÊäÈëÊä³öroutine 9wMLinuxÁªÃË
ǰ½ÚµÄffs_mountfs()ÌᵽʹÓÃbread()(@kern/vfs_bio.c)¶Á³öpartitionµÄ 9wMLinuxÁªÃË
super block¡£Õâ¸ö½Ó¿Úº¯ÊýºÜ¿ì¾Í»á½âÊÍ¡£ËüÖ÷ÒªÓÃÓÚ¶ÁÈ¡blockÐ͵Ädeviceµ½ 9wMLinuxÁªÃË
kernelÄÚ²¿µÄbufferÖС£ 9wMLinuxÁªÃË
bread(struct vnode *vp, /*(in)ÊäÈë¶ÔÏóµÄv-node*/ 9wMLinuxÁªÃË
daddr_t blkno, /*(in)blockºÅ*/ 9wMLinuxÁªÃË
int size, /*(in)¶Á³öµÄbyteÊýÁ¿£¬block³¤µÄ±¶Êý*/ 9wMLinuxÁªÃË
struct ucred * cred,/*(in)ȨÏÞÐÅÏ¢*/ 9wMLinuxÁªÃË
struct buf ** bpp)/*(out)´æ´¢¶ÁÀ´µÄdata*/ 9wMLinuxÁªÃË
ͬÑùµÄbuffer linkºóµÄblockÊä³öµÄ×Ó³ÌÐòÊÇbwrite()¡£ 9wMLinuxÁªÃË
bwrite(struct buf *bp) /*(out)¿ÉÒÔÊä³öµÄstruct buf*/ 9wMLinuxÁªÃË
Á½ÕßÖ®¼ä¹²Í¬µÄµØ·½¾ÍÊÇstruct buf(@/sys/buf.h),ËüÓÃÓÚio´¦ÀíÖиødevice driver 9wMLinuxÁªÃË
×öÇÅÁº×÷ÓõÄÊý¾Ý½á¹¹¡£Ëü¼Ç¼ÁËv-node,ioµÄÇø±ð£¬¿ÉÒÔioµÄblockλÖÃ/byteÊý£¬´æ 9wMLinuxÁªÃË
´¢Êµ¼Êdata bufferµÄaddress£¬io´¦ÀíµÄ½øÕ¹Çé¿öµÈ¡£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
breadÔòͨ¹ýgetblk()¶ÔblockÊäÈëµÄ½á¹¹struct buf½øÐвÙ×÷¡£getblk()µ÷ÓÃÔÚºËÐÄ 9wMLinuxÁªÃË
¹ÜÀíbuffer linkºÍ·µ»ØÖ¸¶¨´óСµÄblockµÄstruct buf¡£Õâ¸ö£¨»º³åÇø£©ÄÚÈÝÔÚÄ¿µÄ 9wMLinuxÁªÃË
blockÊÇ·ñ´æÔÚÓëÖ¸¶¨v-nodeµÄÖ¸¶¨Î»ÖÃblockÊÇ·ñÒѾ­¹¹³É»º³å»·Óйء£struct buf 9wMLinuxÁªÃË
ÀïÃæÓÐÒ»¸ö±ê־룬µ±»º³å»·ÄÚÈݱ仯ÊÇ£¬Õâ¸ö±ê־λ¾Í»á¸Ä±ä¡£bread()¸ù¾ÝÕâ¸ö 9wMLinuxÁªÃË
flagÅжÏblockÊÇ·ñÒѾ­»º³å£¬Èç¹ûÒѾ­Íê³É£¬Ëü¾ÍÖÕÖ¹Í˳ö¡£Èç¹û²»ÊÇÕâÑù£¬ÔòÔÚ 9wMLinuxÁªÃË
struct bufµÄmarkÀïÃæ±êÖ¾£¬È»ºóµ÷ÓÃVOP_STRATEGY()¡£ÔÚv-nodeµÇ¼ÇµÄstrategy 9wMLinuxÁªÃË
routine¼Ç¼ÁËio´¦ÀíµÄ¹ý³Ì£¬ËùÒÔbread()µ±Êµ¼ÊµÄ´¦ÀíÍêÁ˺󣬾͵÷ÓÃbiowait() 9wMLinuxÁªÃË
½øÈëµÈ´ý״̬¡£È»ºó£¬¾Í×ªÒÆµ½±ðµÄ½ø³ÌA¡£io´¦ÀíÍêÁ˺󣬵÷ÓÃbiodone(),½ø³ÌA 9wMLinuxÁªÃË
Ò²¿ÉÒÔ¼ÌÐø½øÐС£»¹ÓУ¬µ÷ÓÃbread()µÄÒ»±ß£¬µ±Íê³É²Ù×÷ºó£¬¾Íµ÷ÓÃbrelse(),ÔÚ 9wMLinuxÁªÃË
ÀïÃæ¶Ôstruct bufµÄflagÖØÐÂÉèÖã¬ÈÃËü¶Ô±ðµÄ³ÌÐò¿ª·Å¡£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
bwriteÒ²ÊÇͬÑùµÄͨ¹ýVOP_STRATEGY()¶Ôio´¦ÀíÒªÇó½øÐеǼǣ¬Í¬Ê±Ò²µ÷ÓÃbiowait() 9wMLinuxÁªÃË
½øÈëµÈ´ý״̬£¬Í¬Ñù£¬µ±Êµ¼Ê²Ù×÷ÍêÁ˺ó£¬Ò²ÉèÖÃflag½øÐи´Î»£¬Ê¹µÃÆäËû³ÌÐò¿ÉÒÔ 9wMLinuxÁªÃË
ʹÓÃio£¬µ±¿ÕÏеÄʱºò£¬io¾Í¹ÒÆð£¬×ªÏòÆäËû½ø³Ì´¦Àí¡£ 9wMLinuxÁªÃË
½ø³ÌµÈ´ý½øÈëµÄʱºò£¬µ±È»²»ÏÞÓÚÖ»Êǵ÷ÓÃbiowait()¡£ÔÚbread()»òÕßbwrite()֮ǰ£¬ 9wMLinuxÁªÃË
ϵͳ±ØÐë·ÖÅä×ã¹»µÄ×ÊÔ´¹©ËüʹÓ㬱ÈÈçһЩ»º³åÇøµÈ¡£µ±½øÐÐʵ¼Êioʱºò£¬1¸öblock 9wMLinuxÁªÃË
Ò²¿ÉÒÔ£¬¶à¸öblockÒ²¿ÉÒÔ£¬¶øÇÒÕâÑù¿ÉÒÔ»ñµÃ¸ü¸ßµÄЧÂÊ£¬ÕâÑù¿´ÆðÀ´£¬¾ÍÏóʵ¼ÊÉÏ 9wMLinuxÁªÃË
ÊÇÁ¬Ðø²Ù×÷ÁË¡£ 9wMLinuxÁªÃË
(´úÐø) 9wMLinuxÁªÃË
9wMLinuxÁªÃË
9wMLinuxÁªÃË
FreeBSDºËÐÄ̽ÌÖ.7.Çý¶¯³ÌÐòƪ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
2.2.5ϵͳµ÷ÓÃopen()µÄ´¦Àí¸ÅÒª 9wMLinuxÁªÃË
½ø³Ìͨ¹ýϵͳµ÷ÓÃread()/write()½øÐÐio´¦Àí£¬ËüÓÉÎļþÃèÊö·ûÖ¸¶¨¶ÔÄÄÀï½ø 9wMLinuxÁªÃË
ÐÐi/o£¬ÎļþÃèÊö·ûÊÇ0ÒÔÉϵÄÕûÊý£¬ËüÔÚ¸÷¸ö½ø³ÌµÄstruct procµÄ³ÉÔ± 9wMLinuxÁªÃË
struct filedesc *p_fd(struct filedesc(@sys/filedesc.h))±£ÁôµÄstruct file 9wMLinuxÁªÃË
((@sys/file.h)½øÐÐÑ¡ÔñÌí¼Ó¡£¶Ôstruct file£¬Ëüº¬ÓдÓÎļþµÄÍ·µÄÊäÈëÊä³öµÄbyte 9wMLinuxÁªÃË
λÖã¬ÊäÈë²Ù×÷£¬Êä³ö²Ù×÷£¬ÊäÈëÊä³ö¿ØÖÆ£¬ÊäÈëÊä³öµÄ×¼±¸×´Ì¬µÄ¼ì²é£¬Ö´ÐÐclose 9wMLinuxÁªÃË
µÄroutine£¬ÒÔ¼°ÃèÊöio´¦Àí¶ÔÏóµÄÐÅÏ¢(v-node,socket,pipe) ¡£ÏµÍ³µ÷ÓÃopen() 9wMLinuxÁªÃË
(@kern/vfs_syscalls.c)¾ÍÊǰѰüº¬Â·¾¶ÐÅÏ¢µÄv-nodeÕÒѰ³öÀ´£¬ÎªÁ˶ÔËü½øÐÐio´¦Àí£¬ 9wMLinuxÁªÃË
ÏÈÒª¶Ôstruct file½øÐгõʼ»¯£¬È»ºó·µ»ØÎļþÃèÊö·û¡£ 9wMLinuxÁªÃË
´Ó·¾¶Ãû²éÕÒv-nodeheºÍio×¼±¸²Ù×÷ÓÉvn_open()(@kern/vfs_vnops.c)³Ðµ£¡£ 9wMLinuxÁªÃË
vn_open()ͨ¹ýnamei()(@kern/vfs_lookup.c)²éÕÒ·¾¶¶ÔÓ¦µÄv-nodeÃû£¬ÓÉVOP_OPEN() 9wMLinuxÁªÃË
µ÷Óò»Í¬µÄv-node¶¨ÒåµÄ×¼±¸¹ý³Ìroutine¡£ÀýÈ磬ÓÐÈçϵĴ¦Àí·½·¨¡£ 9wMLinuxÁªÃË
¡£ÆÕͨµÄfile/directory 9wMLinuxÁªÃË
µ÷ÓÃufs_open()(@ufs/ufs/ufs_vnops.c)£¬¼ì²éopenµÄmode 9wMLinuxÁªÃË
¡£ÌØÊâÉ豸Îļþ 9wMLinuxÁªÃË
µ÷ÓÃspec_open()(@miscfs/specfs/spec_vnops.c) 9wMLinuxÁªÃË
ÎÄ×ÖÐÍ µ÷ÓÃdevice driverµÄopen routine 9wMLinuxÁªÃË
¿ìÐÍ mountµÄʱºò³ö´í¡£Èç¹û²»ÊÇÕâÑù£¬¾Íµ÷ÓÃdevice driverµÄ 9wMLinuxÁªÃË
open routine¡£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
»Ø¹ýÍ·À´£¬namei()µÄÈÎÎñÊǾÍÊÇ£¬¶ÔÓÚÖ¸¶¨µÄ·¾¶Ãû£¬¶ÔÓ¦ÓÚ¸úĿ¼»òÕßµ± 9wMLinuxÁªÃË
ǰĿ¼µÄv-node×÷ΪÆðµã£¬Í¨¹ýlookup()(@kern/vfs_lookup.c)½øÐÐv-node²éÕÒ¡£ 9wMLinuxÁªÃË
lookup()´Ó·¾¶Ãû¿ªÊ¼µÄv-node(VDIR)¿ªÊ¼²éÕÒ¡£ÕÒµ½Á˵Äv-node×÷ΪÐÂµÄÆðµã¼ÌÐø½øÐÐ 9wMLinuxÁªÃË
²éÕÒÏÂÒ»²½µÄÒªËØÃû£¬È»ºóµÃµ½Ä¿µÄµÄv-node¡£Õâ¸öʱºò£¬¸ù¾Ýv-nodeµÄ²»Í¬£¬Ä¿Â¼µÄ¼ì 9wMLinuxÁªÃË
Ë÷·½·¨Ò²¾Í²»Í¬¡£¸÷¸öÒªËØµÄʵ¼Ê¼ìË÷ÓÉVOP_LOOKUP()À´×ö¡£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
2.2.6ϵͳµ÷ÓÃread()µÄ´¦Àí¸ÅÒª 9wMLinuxÁªÃË
open()È¡µÃÎļþÃèÊö·ûºó£¬¶ÔËüµÄÊäÈë´¦Àí£¬ÓÐÈçϵÄÁ÷³Ì¡£Ö¸¶¨µÄÎļþÃèÊö·û 9wMLinuxÁªÃË
µÄstruct fileÄڵǼǵĴ¦ÀíroutineÓÐvn_read()(@kern/vfs_vnops.c),vn_write(), 9wMLinuxÁªÃË
vn_ioctl(),vn_select(),vn_closefile()£¬v_node 9wMLinuxÁªÃË
µÇ¼ÇµÄ²Ù×÷routine²»ÄÜ·Ö¿ªÊ¹Óá£vn_*()ÀֻÓÐÔÚºÏÊʵÄǰ׺²Ù×÷Ï£¬²ÅÄÜÕýÈ·µ÷Óᣠ9wMLinuxÁªÃË
read()Ê×ÏÈÔÚstruct uio(@sys/uio.h)µÇ¼Ç½ø³ÌÖ¸¶¨µÄbufferµÄλÖúͳ¤¶È¡£ 9wMLinuxÁªÃË
Ö´ÐÐread()ºó£¬vn_read()Ïòstruct fileÉ趨µÇ¼ÇµÄÎļþµÄ¶ÁдλÖã¬È»ºóµ÷ÓÃVOP_READ()¡£ 9wMLinuxÁªÃË
¸ù¾Ý¶Á³öÀ´µÄbyteÊý£¬¶ÁдλÖÃÏàÓ¦Ôö¼Ó¡£ 9wMLinuxÁªÃË
VOP_READ()µÄcall routineÔòÊÇÓëv-nodeÓйأ¬¾ÍÏóÏÂͼһÑù¡£ 9wMLinuxÁªÃË
9wMLinuxÁªÃË
vn_read() 9wMLinuxÁªÃË
ÎÄ×ÖÐÍ/¿éÐÍ | 9wMLinuxÁªÃË
/------------------ 9wMLinuxÁªÃË
| | file/directory 9wMLinuxÁªÃË
spec_read() ---------ffs_read()-------VOP_READ() 9wMLinuxÁªÃË
blockÐÍ | | 9wMLinuxÁªÃË
/---------------|charÐÍ | 9wMLinuxÁªÃË
bread() device driver bread() 9wMLinuxÁªÃË
| | 9wMLinuxÁªÃË
spec_strategy() ---------------ufs_strategy() --VOP_STRATEGY() 9wMLinuxÁªÃË
| | | 9wMLinuxÁªÃË
| | | 9wMLinuxÁªÃË
device driver spec_strategy() -------------/ 9wMLinuxÁªÃË
| 9wMLinuxÁªÃË
| 9wMLinuxÁªÃË
device driver 9wMLinuxÁªÃË
9wMLinuxÁªÃË
9wMLinuxÁªÃË
¡£ÆÕͨµÄfile/directory 9wMLinuxÁªÃË
µ÷ÓÃffs_read()(@ufs/ufs/ufs_readwrite.c)¡£¶ÔÓ¦Ö¸¶¨µÄ¶ÁдλÖ㬼ÆËãblock 9wMLinuxÁªÃË
µÄλÖã¬È»ºóÓÃbread()¶Á³öÀ´¡£¶Á³öÀ´µÄÊý¾ÝË͵½½ø³ÌËù×¼±¸µÄ»º³åÇø¡£´Óbread() 9wMLinuxÁªÃË
´«µÝ¹ýÀ´µÄblock²¢²»ÊÇÎïÀíblockµÄλÖ㬶øÊǰÑfile×÷ΪblockÁеÄÒ»¸öÀíÂÛÖµ¡£ 9wMLinuxÁªÃË
´ÓÀíÂÛ¿éµ½ÎïÀí¿éµÄ±ä»»ÓÉVOP_STARATEGY()Íê³É¡£Ò²¾ÍÊÇ˵£¬ufs_strategy()Ï顄 9wMLinuxÁªÃË
ÎļþÄÚλÖÃת»¯ÎªÎïÀíblockλÖã¬È»ºó´Óv-node¼Ç¼µÄi-node°Ñ±íʾÎïÀíÉ豸µÄ 9wMLinuxÁªÃË
v-node È¥³öÀ´£¬Õâ¸öVOP_STRATEGY¾Íµ÷ÓÃspec()(@miscfs/specfs/spec_vnops.c) 9wMLinuxÁªÃË
ÈÃËü½øÐÐÊäÈëÒªÇó¡£ 9wMLinuxÁªÃË
¡£ÌØÊâÉ豸Îļþ 9wMLinuxÁªÃË
ͨ¹ýµ÷ÓÃspec_read()(@miscfs/specfs/spec_vnops.c),°ÑËü·ÖΪÎÄ×ÖÐͺͿéÐÍÁ½Àà¡£ 9wMLinuxÁªÃË
ÎÄ×ÖÐÍ µ÷ÓÃdevice driverµÄÊäÈëroutine 9wMLinuxÁªÃË
¿éÐÍ Í¨¹ýbread()½øÐÐÊäÈë´¦Àí 9wMLinuxÁªÃË
9wMLinuxÁªÃË
¶ÔÎļþµÄϵͳµ÷ÓÃwrite()µÄ³¡ºÏÒ²ÊÇÀàËÆµÄ´¦ÀíÁ÷³Ì(ufs_write()->bwrite()), 9wMLinuxÁªÃË
ufs_write()ÔòÒª¿¼Âǵ½Îļþ´óСµÄÑÓÉì¡£
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ÂÛ̳ÌÖÂÛ
·ÖÒ³£º1 2 3 [4] 5
¡¾ÆÀÂÛ¡¿¡¾¼ÓÈëÊղؼС¿¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿¡¾¹Ø±Õ¡¿
¡ù Ïà¹ØÁ´½Ó
ÎÞÏà¹ØÐÅÏ¢