LinuxÒÁµéÔ°ÂÛ̳'s Archiver

tseteen ·¢±íÓÚ 2004-4-5 20:17

FreeBSDºËÐÄÈëÃÅ

FreeBSDºËÐÄÈëÃÅ
1.1¸ÅÊö
FreeBSD¿ÉÒÔÔÚPC/AT¼æÈÝ»úÆ÷ÉÏÔËÐС£CPUÊÇi386,i486,Pentium,
Pentium ProÒÔ¼°Æä¼æÈÝоƬµÈ¡£
1.1.1£¨ÂÔ£©
1£¬ÀíÂÛµØÖ·: 2¸ö13 bit ³¤+32 bit ³¤
2£¬ÏßÐεØÖ·£º32 bit ³¤µÄ¿Õ¼ä
3£¬ÎïÀíµØÖ·£º32 bit ³¤µÄ¿Õ¼ä
1.1.2½ø³ÌµÄÐéÄâ¿Õ¼ä
1£¬text²¿·Ö
Õⲿ·ÖÊÇÖ´ÐÐÎļþµÄµÄtextÁìÓò£¬Ò²¾ÍÊÇ»úÆ÷ÓïÑÔ²¿·Ö£¬¶ÔÓÚÕâ¸ö
²¿·ÖµÄ¿Õ¼äÔÚ»úÆ÷ÉϵÄÎïÀíÄÚ´æÒ³Êǹ²Óе쬻¹ÓУ¬Õⲿ·Ö×îºóµÄ±äÁ¿
µØÖ·ÊÇetext¡£
2£¬dataºÍbss²¿·Ö
Ö´ÐÐÎļþµÄdata²¿·Ö£¬Ò²¾ÍÊdzõʼ»¯µÄÊý¾Ý¶ÎºÍÖ´ÐÐÎļþÖ¸¶¨µÄÄÚ
´æ±äÁ¿¡£ÄÚ´æ±äÁ¿ÔÚ¿ªÊ¼µÄʱºòÒÔ0Ìî³ä¡£ÕâÒ»¶Î¿Õ¼ä¿ÉÒÔ¶Áд¡£ËüµÄ
±ß½çÒ²ÊÇÒÔedataºÍendµÄµØÖ·×ö½áβ¡£½ø³ÌµÄmalloc£¨£©µÈÄÚ´æ·ÖÅäµÄ
²Ù×÷µÄʱºò£¬µØÖ·µÄÔö¼Ó·½ÏòÏòbss¿Õ¼ä½øÐС£
3£¬stack²¿·Ö
Ò²¾ÍÊǽø³ÌÖ´ÐеÄʱºòµÄstack¿Õ¼ä£¬Õⲿ·Ö¿Õ¼ä£¨´ÓµØÖ·µÄ×î¸ßλ
¿ªÊ¼¿ÉÒÔÉìËõ£©£¬Æä¶ÔÓÚÎïÀíÄڴ棬ÉìËõ³Ì¶ÈÓɺËÐÄ×Ô¶¯Ö´ÐС£
1.2 kernelµÄconfigure
freebsdµÄkernel¹¹³ÉÎļþÔÚ/usr/src/sysµÄĿ¼ÏÂÃæ¡£ÏÂÃæµÄ×ÓĿ¼×öÒ»¸ö
½éÉÜ¡£
compile ±àÒëºËÐĵÄĿ¼¡£
conf configureµÄĿ¼¡£
ddb ºËÐĵ÷ÊÔµÄsounre codeµÄĿ¼¡£
dev Ò»²¿·ÖµÄdriversµÄsource codeµÄĿ¼¡£
gnu ¸¡µãÔËËãµÄ·ÂÕæÒÔ¼°ex2fsÎļþϵͳµÄsource codeĿ¼¡£
i386 ÒÀÀµÓÚpc/at»úÆ÷µÄĿ¼£¬ÒÔϽéÉÜËüµÄ×ÖĿ¼¡£
apm suspendһЩ½Úµç³ÌÐò¡£
boot ²»ÊÇkernel±¾ÉíµÄ¶«Î÷£¬Ö»ÊÇһЩÔõô´Ó¿ª»úµ½¶ÁÈëkernel
µÄboot programµÄsource code¡£
conf configµÄһЩÒÀÀµdata¡£
isa isa busµÄÇý¶¯³ÌÐòÀàµÄsource code¡£
eisa eisa busµÄÇý¶¯³ÌÐòÀàµÄsource code¡£
include ¶Ôpc/atµÄһЩinclude files
i386 ¶Ôpc/atµÄһЩºËÐÄcode
ibcs2,linux ʹ¸÷ÀàµÄosµÄÖ´ÐÐÎļþÔÚfreebsdÉÏÖ´ÐеÄcode
isofs/cd9660
cd-romÔÚunixÎļþϵͳÉϲÙ×÷µÄµÄÓйØcode
kern ºËÐÄcode
libkern ºËÐÄ¿âµÄsource code
miscfs ʵÏÖunixÎļþϵͳµÄcode
msdosfs ÔÚunixÉϲÙ×÷ms-dosÎļþϵͳµÄÓйØcode
net ʵÏÖnetwork¹¦ÄܵĻù±¾²¿·Öcode
netatalk
ʵÏÖappletalk network¹¦ÄÜcode
netinet ʵÏÖinternet network¹¦ÄܵÄcode
netipx ʵÏÖipx¹¦ÄܵÄcode
netns ʵÏÖns networkµÄcode
netkey ʵÏÖÍøÂç¼ÓÃܲ¿·ÖµÄ¹¦ÄܵÄcode
nfs ʵÏÖnfs·þÎñ
pc98 ¶ÔÓÚpc98µÄÖ§³Ö
pccard ¶ÔpcmciaµÄÖ§³Ö
pci ¶Ôpci busµÄÇý¶¯³ÌÐòµÄsource code
scsi ¶Ôcd-rom£¬hard disk,tape µÈµÄscsiÇý¶¯³ÌÐòµÄsource code
sys ¶ÀÁ¢ÓÚ»úÆ÷Ìåϵ½á¹¹µÄÒ»²¿·Öcode
ufs unix file system µÄÖ§³Öcode
vm ÐéÄâÄÚ´æ¹ÜÀíµÄ²¿·Ö
1.2.1ÅäÖõIJÙ×÷----config command
ÔÚrootȨÏÞÏ£¬config£¬makeʵÐк󣬿ÉÒԵõ½¼òµ¥µÄkernel¡£
*configure file
ÒÆ¶¯µ½/usr/src/sys/i386/config¿´¿´¡£
GENERIC ´Ócd-romµÈ°²×°freebsdµÄʱºò¶ÔÓ¦ÓÚdefaule kernel
µÄÅäÖÃfile
LINT kernel×éºÏ¹¦ÄܵÄÍøÂ޵ĵÄÅäÖÃfile
ÏÂÃæ4¸öÊǶÔÅäÖúÜÓбØÒªµÄµÄÒÀÀµdata file
Makefile.386 configÉú³ÉµÄMakefile fileµÄtemplate.
devices.i386 ¶ÔÓÚunix filesystem¿ÉÄܵÄblockÐ͵Ädevice
Ãû×ÖºÍmajorºÅµÄ¶ÔÕÕ±í
files.i386 ¼Ç¼kernel¹¦ÄÜ×éºÏµÄ»ù´¡ÉÏ£¬ÒÀÀµÓÚpc/at
»úÆ÷µÄ¹¦ÄÜÃû³ÆºÍ¸÷ÖÖ¹¦ÄÜʵÏÖµÄsource code
fileµÄÃû×Ö±í¡£
options.i386 ¼Ç¼ÅäÖÃÏîÄ¿µÄ±í¡£
»¹ÓУ¬majors.i386ÊǼǼ¶ÔÓ¦Çý¶¯Æ÷µÄI/O±íºÍmajorºÅµÄÒ»¸öÎļþ¡£
ÓÚºËÐÄÅäÖÃû¹ØÏµ¡£
¶ÔÓÚеÄi/oÉ豸£¬Èç¹ûÒª×ödevice driver,¶Ôpc/at,ÒªÔÚfiles.i386(û
ÓеϰÔÚ/usr/src/sys/conf/files)×·¼ÓÏàÓ¦µÄÐУ¬²»È»¾Í²»ÄܰÑËü¼ÓÈë
µ½ºËÐÄÀïÃæ¡£
×·¼ÓµÄ¸ñʽΪ
Ïà¶ÔpathÃû optional device-name device-driver

¶ÔÓÚÅäÖÃÎļþ£¬Ê×ÏÈ£¬ÒªÉèÖÃcpu£¬bus£¬i/oÉ豸,¶àÉÙÓû§µÈ¡£ÀýÈç¶ÔÓÚGENERIC
machine "i386"
cpu "I386_CPU"
cpu "I486_CPU"
cpu "I586_CPU"
cpu "I686_COU"
ident GENERIC
maxusers 10
µ±×÷Ϊserverʱºò£¬Ó¦¸Ã°Ñ×î´óuserÉèÖôóÒ»µã£¬ÒÔÌá¸ßϵͳÐÔÄÜ¡£
ÏÂÒ»²½£¬Ö¸¶¨options£¬¶ÔÓÚGENERIC
options MATH_EMULATE #support for x87 emulation
options INET #interNETworing
options FFS #Berkeley Fast Filesystem
options NFS #Network Filesystem
......
optionsÖ¸¶¨µÄÃû×ÖxxxµÈ£¬Èç¹ûÔÚ/usr/src/sys/conf/options»òÕßÔÚ
/usr/src/sys/i386/conf/options.i386ÖмÇÔØµÄʱºò£¬Ó¦ÔÚ¶ÔÓ¦µÄopt_XXX.hÖÐдÈë
¡£Ã»Óеϰ£¬×÷ΪccÃüÁîÐеIJÎÊý¶¨Òå"-D"ÔÚMakefileÀïÃæ×·¼Ó¡£¶ÔÓÚXXXµÄ¸ñʽӦ¸Ã
ÊÇ
Ïà¶ÔpathÃû optional xxx
ÏÂÒ»²½£¬¶ÔÓÚconfig
config kernel root on wd0
(ÂÔ)
ÅäÖÃÎļþʣϵIJ¿·ÖÓ¦¸ÃÊÇbus,i/oµÈһЩӲ¼þÅäÖã¬Ò»°ãÓÐcontroller,device,
disk,tapeËÄÀà¡£ÀýÈç
controller isa0
controller eisa0
controller pci0
µÈ¡£
µÚ¶þ²ãµÄdeviceºÍcontroller£¬¼Ç¼ÁËһЩbusÉ豸µÄÁ¬½Ó¡£ISAµÄÇé¿öÊÇ
device device_name at isa? ²ÎÊý
controller controller_name at isa? ²ÎÊý
EISAºÍPCI¾ÍÏà¶Ô¼òµ¥Ò»µã£º
device device_name
controller controller_name
device_nameÀïÖ¸¶¨µÄÉ豸ÃûÊÇ£¬´®¿Ú£¬²¢¿Ú£¬ÍøÂçµÈ×°Öá£
µÚÈý²ãµÄdiskºÍtapeΪ
disk disk_name at ¿ØÖÆÉ豸Ãû¡¡drive ºÅ
tape tape_name at ¿ØÖÆÉ豸Ãû¡¡drive ºÅ
SCSI½Ó¿Ú¿¨×÷ΪµÚ¶þ²ãµÄ¿ØÖÆ×°ÖüǼµÄͬʱ
controller scbus0
×÷ΪͨÓõÄscsi¿ØÖÆÉ豸¡£Òò´Ë£¬¶ÔÓÚËüµÄhard disk,tape,cd-rom,moÉ豸£¬ÓÐ
device sd0
device st0
device cd0
device od0
µÈ£¬Ëü¿ÉÒÔ×Ô¶¯Ê¶±ðºÍ·ÖÅäºÅÂë¡£
¶ÔÓÚÆäËûµÄscsiÉ豸£¬ÓÐ
device pt0 at scbus?
ÕâЩ¶«Î÷(bus,scsi,i/o)£¬ÔÚÉú³ÉµÄioconf.cÒÔ¼°ÏàÓ¦µÄincludeÖÐÓз´Ó³¡£
configureµÄ×îºó£¬²»ÊÇһЩÎïÀíÉ豸£¬¶øÊÇkernelÄÚ²¿µÄһЩÈíÉèÖÃ
pseudo-device ÀíÂÛÉ豸Ãû
Ê×ÏÈ£¬Òª¿¼ÂÇÒÔÏÂÁ½¸öÉ豸£º
pseudo-device pty 16 #ttys - can go as high as 256
pseudo-device log #syslog interface (/dev/klog)
networkʹÓõij¡ºÏ£¬Ó¦¸ÃÓÐÏÂÃæÁ½¸ö
pseudo-device loop
pseudo-device ether
ÕâÖÖÇé¿öÏ£¬×îºÃÓÐ
pseudo-device bpfilter 4 #berkeley packet filter
pseudo-device tun 1 #Tunnel driver ( PPP)
Ïë×öfloppyµÄʱºò£¬Òª
pseudo-device vn #Vnode driver ( turns a file into a device)

tseteen ·¢±íÓÚ 2004-4-5 20:17

FreeBSDºËÐÄ̽ÌÖ£¨·­Ò룩2

1.3 FreeBSD boot֮ǰµÄ¹¤×÷
1.3.1pc/at»úÆ÷µÄboot˳Ðò
hard diskµÄ×îÇ°ÃæµÄÒ»¸öblock(512byte),½Ð×ömaster boot recorder(MBR).Õâ
ÀïÓÐÆô¶¯ÏÞ¶¨µÄprogramºÍ·ÖÇøµÄÐÅÏ¢¡£·ÖÇøÐÅÏ¢ÊÇÖ¸¶ÔÓÚÒ»¸öÇøÊÇ16byte³¤£¬×î¶à
Ö»ÄÜÓÐ4¸öÇø¡£16byteµÄÄÚÈÝÊÇ£¬·ÖÇøÄÄÀ↑ʼ£¬ÄÄÀï½áÊø¡£ÄÄÖÖos£¬ÄÜ·ñÆô¶¯µÈ¡£¶Ô
ÓÚfreebsd£¬°²×°µÄʱºòÏòMBRдÈëÁËboot easy.
´ÅÅ̵ĽṹÈçÏÂͼ±íʾ£º
block Number
#0 #1 #2 ... #14 #15 #16 #17
-------------------------------------------------------------
disk no used
label
-------------------------------------------------------------
<-boot->|<---------boot2-------------->| |<--unix file system--

FreeBSDÓõÄblock#0--#14µÄ15¸öblockÀïÃæ£¬º¬ÓжÁÈëfreebsdµÄ³ÌÐò£¬bootease
Ö»ÔÚblock#0ÀïÃæ£¬ÔÚ15¸öblockÖв¢Ã»ÓС£ËüµÄ×÷ÓÃ
¡£¶ÁÈëmbr£¬ÕÒfreebsdµÄ·ÖÇø
¡£¶ÁÈë×î³õµÄ15¸öblock£¬µ½ÎïÀíÄÚ´æÖÐ0x0001000
¡£Ìø×ªµ½Ï൱ÓÚblock#2µÄÄÚ´æÎ»ÖÃ
È»ºó£¬ÆÁÄ»±íʾΪ£º
¡£¡£¡£
¡£¡£¡£
boot£º
(²ÎÊý˵Ã÷ÂÔ)
ËüµÄsourceÊÇ/usr/src/sys/i386/boot/biosboot,makeÖ®ºó£¬Éú³ÉÁ½¸öÎļþ£º
boot1,boot2·Ö±ðдÈëblock#1£¬block#2--#14ÖС£
Ò»°ã£¬Ò»¸öÎïÀíµÄunix·ÖÇøÀíÂÛÉÏ¿ÉÒÔÓÐ8¸ö£¬±ÈÈçswap£¬unix systemµÈ¡£
boot2²¿·ÖÊÇboot program£¬Ëü¶ÁÈëkernelµÄÎļþÃûºÍoption¡£È»ºó
¡£ÕÒboot labelÖ¸¶¨µÄ·ÖÇø¡£
¡£¹¹Ôìunix filesystem£¬ÕÒÖ¸¶¨µÄkernel
¡£´Ó¿ªÊ¼Ö´ÐÐÎļþ£¬text,dataµÄ˳ÐòÏòÎïÀíÄÚ´æ¶ÁÈë¡£¶ÔbssÇåÁã¡£
¡£ÒÔoptionµÄÑ¡Ôñ£¬Ïò¿ªÊ¼Î»ÖÃÌø×ª¡£
1.3.2 kernelµÄ³õʼ»¯¶¯×÷
boot programÖ´ÐÐÖ®ºó£¬×ªÏòkernelµÄtext¶Î¿ªÊ¼½øÐгõʼ»¯£¬¼´ÏÈÖ´ÐÐ
locore.sµÄtext¶Î¡£Òò´ËÊÇÐéÄâÄڴ滹ûÓз¢Éú×÷Óã¬locore.sµÄ¿ªÊ¼²¿·Ö±Ø
Ðë¶Ôoffset½øÐв¹Õý¡£locore.sµÄ×÷ÓÃÊÇ
¡£±£´æ´Óboot program¹ýÀ´µÄoption
¡£É趨ÐéÄâµÄstacker
¡£¼ì²âcpuµÄmodule
¡£¶Ô×Ô¼ºµÄbss¿Õ¼ä½øÐÐ0³õʼ»¯
¡£ÎªÊ¹ÐéÄâÄڴ湤×÷£¬Òª±£Ö¤×îÉٵĹÜÀíÐÅÏ¢¡£È»ºóÊÇÐéÄâ¿Õ¼ä¶¯×÷¡£
Ò²¾ÍÊÇ£¬µ÷ÓÃcpuÓÐÇ¿µÄÒÀÀµ¹ØÏµµÄ¹ý³Ìinit386()(@i386/i386/machdep.c)£¬
È»ºó½øÐÐkernelÄڵĹÜÀíÐÅÏ¢³õʼ»¯£¬i/oÉ豸µÄµÇ¼Ç£¬Éú³É4¸ökernel process
£¬ÔÙµ÷ÓÃmain()(@kern/init_main.c)¡£µ±main()·µ»Ølocore.sʱ£¬Ó¦¸ÃÓÐÈçÏÂ
5¸ö½ø³Ì£º
PID TT STAT TIME COMMAND
0 ?? DLs 0:00.17 (swapper)
1 ?? Is 0:00.19 /sbin/init --
2 ?? DL 0:56.60 (pagedaemon)
3 ?? DL 0:00.06 (vmdaemon)
4 ?? DL 6:07.65 (updata)
´Ólocore.s·µ»Øµ½process #1£¬/sbin/init¿ªÊ¼¶¯×÷£¬È»ºóתÏòfreebsdµÄÆÕͨ
¶¯×÷¡£
init386()ºÍmain()µÄ´¦Àí´óÖÂÈçÏ£º
¡£init386()
GDTºÍLDT,IDT,task stages´¦ÀíµÄ³õʼ»¯£¬ÀýÍâ´¦ÀíµÈlocore.sû×öµÄ
ÊÂÇ飬ÐéÄâÄÚ´æ³õʼ»¯¡£È»ºó£¬¸ù¾Ýboot programµÄ²ÎÊý£¬Ôö¼ÓÎïÀíÄÚ
´æpageÊý¡£È»ºó£¬×÷³Éprocess #0µÄ³ûÐΡ£
¡£main()
Öð²½µ÷Óù¹³ÉkernelÄ£¿éµÄµÄ³õʼ»¯²¿·Ö¡£


FreeBSDºËÐÄ̽ÌÖ£¨·­Ò룩3

£¨ÐøÉÏ£¬liangvy.icewolf.leon·­Ò룩

µ«ÊÇ£¬kernel¹¹³ÉµÄ¸÷¸öÄ£¿éµÄ³õʼ»¯×Ó³ÌÐòÒ»¸ö¸öµÄÁоٳöÀ´ÔËÐкÜÏÔÈ»ÊÇ
²»Ðеġ£Í¨³£ÊÇÀûÓÃʱ¼äÁ¬±íµÄ¼¼ÄÜÀ´ÔËÐÐËü£¨ld command£©¡£Ò²¾ÍÊÇ£¬³ÌÐò
ÊÇÒԺܶà¸ösource·Ö¿ª±àÒëºÍÁª½á¡£ÏàͬµÄÄ£¿éÃû×־ͶÔÓ¦ÓÚÏàͬµÄµØÖ·À´½ø
Ðе÷Óá£ËüÔÚʱ¼äÁ´±íÀïÃæ×Ô¶¯µ÷½ÚÖ´ÐС£
³õʼ»¯Ê±ºò£¬main£¨£©º¯ÊýÒªcallµÄÄ£¿éÀûÓÃÔÚsys/kernel.hÀïÃæ¶¨ÒåµÄºê
SYSINIT()ºÍSYSINIT_KT()½øÐеǼǡ£ÕâÑù£¬kernelÔÚlinkµÄʱºò£¬ldÃüÁî¾Í
Äܹ»µÃµ½ÄÇЩÐÅÏ¢ºÍ½øÐÐÅäÖÃÁÐ±í¡£Õâ¸öÁбí¾ÍÊÇkernelµÄ×é³ÉÄ£¿éµÄ³õʼ»¯
routineµÄµÇ¼Ç¡£¼ì²ésource£¬
¾Í¿ÉÒÔÕÒµ½³õʼ»¯routineµÄ²¿·Ö¡£
Èç±í£º
print_caddr_t(copyright) kern/init_main.c
vm_men_init(NULL) vm/vm_init.c
syctl_order(&sysctl_) kern/kern_sysctl.c
kmemnit(NULL) kern/kern_malloc.c
fpu_init(NULL) i386/i386/math_emulate.c
cpu_startup(NULL) i386/i386/machdep.c
gnufpu_init(NULL) miscfs/devfs/devfs_tree.c
...
¸÷¸ödeviceµÄmajorºÅÓë´¦ÀíroutineµÄµÇ¼Ç £¨majorÑ­ÐòºÅ£©
...
configure(NULL) i386/i386/autoconf.c
proc0_init(NULL) kern/init_main.c
rqinit(NULL) kern/kern_synch.c
vm_init_limits(&proc0) vm/vm_glue.c
vfsinit(NULL) kern/vfs_init.c
elf_insert_brand_entry(&linux_brand) i386/linux/linux_sysvec.c
initclocks(NULL) kern/kern_clock.c
mbinit(NULL) kern/uipc_mbuf.c
clst_init(NULL) kern/tty_subr.c
shmnit(NULL) kern/sysv_shm.c
seminit(NULL) kern/sysv_sem.c
msginit(NULL) kern/sysc_msg.c
kludge_splimp(&x_save_spl) kern/uipc_domain.c
ifinit(NULL) net/if.c
domaininit(NULL) kern/uipc_domain.c
kludge_splx(&x_save_spl) kern/uipc_domain.c
kmstartup(NULL) kern/subr_prof.c
sched_setup(NULL) kern/init_main.c
xxx_vfs_mountroot(NULL) kern/init_main.c
xxx_vfs_root_fdtab(NULL) kern/init_main.c
swapinit(NULL) kern/init_main.c
proc0_post(NULL) kern/init_main.c
kthread_init(NULL) kern/init_main.c||
kproc_start(&page_kp) vm/vm_pageout.c||
kproc_start(&vm_kp) vm/vm_pageout.c||
kproc_start(&up_kp) kern/vfs_bio.c||
scheduler(NULL) vm/vm_glue.c
(||±íʾÓжà¸ö³ÌÐò£©
proc-post£¨£©±»ºô½Ðºó£¬main£¨£©¾ÍÊÇÔÚ¶ÔÓ¦process 0 µÄkernelµÄÐéÄâ
ÄÚ´æÀﶯ×÷¡£kthread_init(),kproc_start(&page_kp),kproc_start(&vm_kp)
,kproc_start(&up_kp)µÈÕ⼸¸ö½ø³Ì£¬ÔÚfork£¨£©ºóÏà¼Ì±»µ÷Óá£Ëü¾ÍÊÇÏà
Ó¦µÄ½ø³Ì1£¬2£¬3£¬4µÈ¡£
³ýprocess 1 ÒÔÍ⣬ÆäËûµÄ½ø³Ìµ÷Óò¢²»·µ»Øµ÷ÓõĵØÖ·¡££¨Ò²¾ÍÊÇ£¬main()
µÄ¸úËæÖ´Ðк󣬲¢²»·µ»Ølocore.s£©¡£¶ÔÓÚprocess #1µÄkernelµÄÐéÄâÄڴ棬
ÔÚkthread_init()·µ»Øºó£¬main()µÄ¸úËæ¾ÍÍêÁË£¬»Øµ½locore.sºó,process #1
µÄ½ø³Ì¿Õ¼äµÄÅäÖÃÎļþ/sbin/init¾Í±»Ö´ÐС£
main()ÔÚprocess #0¶ÔÓ¦µÄkernelÐéÄâÄÚ´æÔËÐк󣬽øÈëʱ¼äÁ´±íscheduler()¡£
Õâ¸ö²¢²»·µ»Ø¡£ÄÇÏÖÔÚ¾ÍÓÐÎå¸ö½ø³ÌÁË¡£
È»ºó£¬fork() µÄµ÷ÓÃÔÚÏÂÃæËµÃ÷¡£
1£¬·ÖÅäprocess ID£¬±£Ö¤struct proc()ÓõĿռ䡣
2£¬¸´ÖƸ¸Ç×µÄprocessµÄÐéÄâÄÚ´æ¿Õ¼ä£¬×÷³ÉÎïÀíÄÚ´æµÄ±ä»»±í¡£¶Ô
Ó¦Á½¸ö½ø³Ì£¬²ÉÓÃÏà¶ÔÓ¦µÄÎïÀíÄÚ´æ±í¡£
3£¬¸ø»Ø¸¸Ç×µÄstruct procºÍstruct user£¬È»ºó¶Ô×Ó½ø³ÌµÄstructºÍ
struct user½øÐгõʼ»¯¡£
4£¬kernelµÄstackerÒ²½øÐи´ÖÆ¡£
5£¬·µ»Ø¸¸½ø³Ìºó£¬±ê¼ÇÉú³ÉµÄ×Ó½ø³Ì¡£Íê³É´¦Àí¡£
µ«ÊÇ£¬process #0 -- 4 ÕâÎå¸ö½ø³ÌµÄÐéÄâÄÚ´æÀïÃæÊ²Ã´¶¼Ã»ÓС£ÕâЩÊǺËÐÄ
½ø³ÌµÄÌØÊⲿ·Ö¡£½ø³Ì0£¬2£¬3Êǵ÷½Úϵͳ´æÔڵĽø³ÌµÄÖ´ÐÐÓÅÏȼ¶£¬¼àÊÓÎïÀí
ÄÚ´æµÄ²»×㣬Èç¹û²»¹»¾ÍʹÓÃswapÇø½øÐн»»»¡£½ø³Ì4µÄ×÷ÓþÍÊǶ¨ÆÚµ÷²éºËÐÄ
µÄunixÎļþϵͳµÄ¹ÜÀíÐÅÏ¢ÓëÇý¶¯³ÌÐòµÄ¹ÜÀíÐÅÏ¢µÄÒ»ÖÂÐÔ£¬Ê¹ËüµÄÐÅÏ¢Ò»Ö±
ÊÇ×îеġ£

1.3.3 /sbin/init
´ÓkernelÀïÃæ¿´£¬/sbin/init¾ÍÊǵ¥Ò»µÄ½ø³Ì¿Õ¼äÀﶯ×÷£¬ÓëÒ»°ãµÄ
user programÒ»Ñù£¬ÌṩuserʹÓõÄunixÎļþϵͳµÄ»·¾³µÄ·þÎñ¡£
ºËÐÄÆô¶¯ºó×î³õµÄ¶¯×÷¾ÍÊÇ/sbin/init¡£×÷ÓÃÈçÏ£º
¡£È·±£file systemµÄÒ»ÖÂÐÔ£¬½øÐÐmount¡£
¡£Ö®ºó£¬networkµÄÉ趨ºÍ¸÷ÖÖdaemonµÄÆô¶¯¡£
¡£¼àÊÓÖն˵ÄloginµÄÅäÖúͶ¯×÷״̬¡£Õâ¸ö¶¯×÷ÍêÁ˺ó£¨logout£©£¬
Ð޸ĺÍÅäÖà login¡£
Ò²¾ÍÊÇ˵£¬Èç¹ûûÓÐËü£¬Óû§¾Í²»ÄÜʹÓÃunixÎļþϵͳ¡£»¹ÓоÍÊÇ£¬Èç¹ûboot
progam²ÎÊýÖ¸¶¨-sµÄ»°£¬Ëü¾Í¹ý¶Éµ½µ¥Ò»µÄÓû§Ä£Ê½¡£Ïà¶ÔÀ´Ëµ£¬ÆÕͨµÄÓû§
ģʽҲ¾ÍÊÇmultiģʽ¡£ÎªÁËʹÆÕͨÓû§Äܹ»Ê¹ÓÃϵͳ£¬/sbin/initµÄ²Î¿¼Îļþ
Ö÷ÒªÔÚ/etcĿ¼Àï·Å×Å¡£Ö÷Òª¾ÍÊÇÔËÐÐ/etc/rcÎļþ¶Ôϵͳ½øÐгõʼ»¯¡£
/etc/rcÎļþµÄÖ÷ÒªÄÚÈݺÍ×÷ÓÃÈçÏ£º
¡£Ê¹ÏµÍ³Äܹ»Ê¹ÓÃswapÇø
¡£¼ì²é/etc/fstab,¼ì²éËüµÄÁ¬¹áÐÔ£¬Èç¹ûÓÐÎÊÌâ¾Íתµ½µ¥Ò»µÄÓû§Ä£Ê½
¡£mount nfsÒÔÍâµÄÎļþϵͳ
¡£¶ÁÈënetwork µÄÉ趨ºÍ¸÷ÖÖdaemon½ø³ÌµÄÉ趨Çé¿öµÄ¼Ç¼Îļþ
/etc/c.conf£¬Õâ¸öÄÚÈÝ×÷Ϊshell scriptµÄ±äÁ¿É趨£¬ÒÔϵľÍÊÇ
¸÷¸öshellµÄ¶¯×÷µ÷Õû
¡£serialµÄ³õʼ»¯£¨/etc/rc.serial£©
¡£ÔËÐÐPCMCIA¿¨µÄ²å°Î¼à¿ØÊØ»¤½ø³Ì£¨/etc/rc.pccard£©
¡£networkµÄ²¿·Ö³õʼ»¯£¨/etc/rc.network£©
¡£Èç¹ûÓÐnfsµÄʱºò¾Í½øÐÐmount²Ù×÷
¡£networkµÄ×îÖÕ³õʼ»¯£¨/etc/rc.network£ºÆô¶¯ºÍentworkÓйصÄdaemon£©
¡£¹²ÓпâµÄÓйØÐÅÏ¢µÄ³õʼ»¯
¡£intd,lpd,sendmailµÄÆô¶¯
¡£ÒÀÀµÏµÍ³µÄһЩ³õʼ»¯½ø³Ì
/etc/rcµÄ´¦ÀíÍêÁ˺ó£¬/sbin/init¾Í¶Ô/etc/ttysµÈ¼ÇÊöµÄһЩÖն˵ÄÓû§login½øÐÐ
¼àÊÓ¡£¶ÔÓÚÕâ¸ö£¬/etc/ttysÀïÖ¸¶¨µÄÖÕ¶Ë£¬fork()ºóµÄ½ø³ÌÀ
¡£exec£¨£©Ö¸¶¨µÄ³ÌÐò£¨ÆÕͨµÄÇé¿öÊÇ/usr/libexec/getty£©
¡£/usr/libexec/getty½øÐÐÖÕ¶ËËٶȵȵÄÉ趨¡£Ìáʾlogin:,µÈ´ýÓû§ÊäÈë
¡£Óû§ÊäÈëºó£¬Ãû×Ö×÷Ϊ²ÎÊýexec() /etc/bin/login
¡£/usr/bin/login¾ÍÌáʾ³öpasswd:£¬µÈ´ýÓû§µÄÊäÈë
¡£×¼±¸userÃûºÍpasswd£¬¶ÔÊäÈëµÄÓû§Ãû½øÐÐÈ·¶¨£¬ÕýÈ·µÄ»°¾Íexec()Óû§
shell

ÏÂͼ¾ÍÊÇ/sbin/initµÄ¼àÊÓ½ø³Ìͼ£º

process #1
-------------------------------------------------------->
/sbin/init | ^ \
| fork() | | fork()
+ exec() exec() exec() | | exec()
process #n |---------->+--------->+------------------*+--------
getty login userµÄlogin shell process #m

(µÚÒ»ÕÂÍ꣬ÏÂÒ»Õ½éÉÜÎļþϵͳºÍÇý¶¯³ÌÐò£¬liangvy)


FreeBSDºËÐÄ̽ÌÖ.4.Çý¶¯³ÌÐòƪ

·­Ò룺liangvy [email]liangvy@bigfoot.com[/email] icewolf.leon
°æÈ¨ËùÓУ¬¿ÉÒÔתÌù

tseteen ·¢±íÓÚ 2004-4-5 20:18

µÚ¶þÕ ÎļþϵͳºÍÉ豸Çý¶¯³ÌÐò

ÕâÕÂÖ÷Òª½éÉÜÎļþϵͳºÍÌØÊâµÄÉ豸ÎļþÒÔ¼°ËüÃǵĶÔÓ¦¹ØÏµ¡£

2..1 diskÉ쵀 unix file system µÄ»ù±¾ÖªÊ¶
Ê×ÏȽéÉÜһϾ­µäµÄunix file systemµÄ˼ά·½·¨¡£
disk µÄ partition¾ÍÊÇ´Ó0µ½512byteµÄÁ¬Ðø³¤¶ÈµÄblockµÄ¶«Î÷¡£ÕâÀïÓÐ
1.file/directoryÓйصĹ̶¨³¤¶ÈµÄÐÅÏ¢,i-node
2.file/directoryµÄ±¾Ì壬data block
µÄÁ½Ñù²»Í¬µÄ¶«Î÷¡£partitionµÄÇ°ÃæµÄ¸½½ü¿é(block#16 ,1--15ÓÃÓÚboot
program )¾ÍÊÇi-node,data blockÓõÄÁìÓòµÈµÈµÄ¿ªÊ¼Î»ÖÃ(blockºÅ)
ºÍ³¤¶È(blockÊýÁ¿)µÈµÄ¼Ç¼£¬½Ð×ösuper-block¡£Ò»¸öblock¿ÉÄܵÄÈÝÁ¿Ö»
ÄÜÓй̶¨ÊýÄ¿µÄi-node£¬ËùÒÔÈç¹û·ÖÅäÁ˹̶¨µÄi-node,ÊÕ¼Á˽ڵãºÅºÍ½Ú
µãµÄ¿éºÅºÍ¿éµÄλÖþͿÉÒÔ¼ÆËã³öÀ´¡£
i-node¾ÍÊÇ
¡£±íÃ÷i-nodeµÄÖÖÀà(file ,direstory,deviceµÈ)
¡£Õâ¸ö½Úµã²Î¿¼µÄ´ÎÊý(Ŀ¼Êý)
¡£²Î¿¼£¬×÷³É£¬±ä»¯µÄʱ¼ä
¡£È¨ÏÞ
¡£ËùÓÐÕßµÄuser id / group id
¡£±¾ÌåµÄ³¤¶È
¡£ÊÕ¼¯±¾ÌåµÄdata blockµÄblockºÅÂëµÄ¹Ì¶¨³¤¶ÈµÄ¶ÔÓ¦±í
µÄһЩ¼Ç¼¡£ÒòΪdata blockµÄ¶ÔÓ¦±íÊǹ̶¨µÄ¹ØÏµ£¬±È
Èç10¸ö£¬×¾ÍÄܹ»×÷³ö512*10=5kΪֹµÄfile¡£

µ±Îļþ±È¿é´óµÄʱºò£¬unix¾Í²ÉÓóÉ×éÁª½áµÄ·½Ê½¶ÔËüÃǽøÐйÜÀí¡£¾ÍÊÇ
°ÑËùÓеĿÕÏпéÒÔÒ»¶¨ÊýĿΪһ×éµÄ·½·¨×÷³Éµ¥Ïò¿ÕÏпéstacker¡£
ÌØ±ðµØ£¬ÎļþµÄ´ÓÏÈÍ·µÄbyteλÖÿªÊ¼ºÍi-nodeÄڵĶÔÓ¦±íÓÐ×ÅÃÜÇеĹØÏµ¡£
¶øÇÒ£¬¶ÔÓÚi-nodeµÄÊäÈëÊä³ö£¬¿ÉÒÔ¶ÔÓ¦Ö¸¶¨Î»ÖõÄÊý¾Ý¿é½øÐжÁд¡£ÖØÒª
µÄÊÇ£¬ºËÐÄ¿ÉÒÔÒÀÕÕÕâ¸ö¹ÜÀí±í¶Ôio×°ÖýøÐйÜÀí¡£
unix¶ÔioÉ豸µÄ²Ù×÷Ò²ÊÇ×÷Ϊ£¨ÌØÊ⣩Îļþ½øÐеġ£¶ÔÓÚÓÃi-node½øÐÐ
ÃèÊöµÄioÉ豸£¬data blockÊý¾Ý¿éµÄ¶ÔÓ¦±í¾Íû±ØÒªÁË¡£Õâ¸ö²¿·ÖµÄioÉ豸
µÄʶ±ð¾Íͨ¹ýdeviceºÅÂëÀ´½øÐС£ÏòÕâЩ¶Ôi-node½øÐÐÊäÈëÊä³ö´¦ÀíµÄ£¬
¾ÍÓÖÉ豸Çý¶¯ºÅÇø±ð£¬À´½øÐÐdevice driverÇý¶¯¡£
ÄÇô£¬½ÚµãÔõôµÄ½øÐвéÕÒÄØ£¿partitionµÄ×î³õµÄĿ¼£¨¸ùĿ¼£©¾ÍÊÇ£¬
´ÓµÚ¶þ¸öi-node¿ªÊ¼£¬Ò»¸öÒ»¸ö˳×Å½Úµã½øÐвéÕÒ¡£
±ÈÈ磬¶ÔÓÚĿ¼/uuu/vvv/.../yyy/zzzµÄ²éÕÒ·½Ê½£¬ÓÐÕâÖÖ¹ØÏµ£º
¡£i-node #2 Ëù´æ·ÅµÄÊÇroot directory¡£¶ÁÈëËüµÄ±¾Ì壬¾Í¿ÉÒÔÕÒµ½
ÏàÓ¦µÄuuuËù¶ÔÓ¦µÄi-node¡£
¡£¶ÁÈëÕâ¸öi-nodeËù´æ·ÅµÄdirectoryµÄi-node±¾Ì壬ÕÒµ½ÏàÓ¦µÄvvv½Úµã¡£
......
²éÕÒ¶ÔÓ¦yyyµÄ½Úµã
¡£¶ÁÈëÕâ¸ö½ÚµãµÄ±¾ÌåÐÅÏ¢£¬ÕâÀï°üº¬Ä¿Â¼±¾ÌâµÄÄÚÈÝ£¬ÕâÑù¾Í¿ÉÒÔÕÒµ½
zzzËù¶ÔÓ¦µÄi-node¡£
Ŀ¼ÀïÃæÓÉÓڼǼÁ˶ÔÓ¦ÎļþÃûµÄ½ÚµãºÅ£¬ËùÒÔ£¬Ò²ÓпÉÄÜͬһ¸ö½ÚµãºÅ
¸ù¾ÝÎļþÃû²»Ò»Ñù£¬¾Í¿ÉÒÔÕÒµ½²»Í¬µÄĿ¼Ãû¡£Õâ¾ÍÊÇÓ²Á¬½Ó(hard link).
µ«ÊÇ£¬½ÚµãºÅÓÐÖ»´æÔÚÓÚ½ÚµãËùÔڵķÖÇøµÄº¬Ò壬ËùÒÔ£¬²»Í¬µÄ·ÖÇø£¬
ÕâÖÖÓ²Á¬½Ó¾Í²»¾ßÓдæÔڵĿÉÄÜÐÔ¡£ÎªÁ˽â¾öÕâ¸öì¶Ü£¬¾ÍÓÐÁË·ûºÅÁ¬½Ó
£¨symble link£©µÄ˵·¨¡£µ±½ÚµãÊÇÊäÈë·ûºÅÁ¬½ÓµÄʱºò£¬·ûºÅÁ¬½Ó¾Í°üº¬
ÁËÕâ¸ö½ÚµãµÄdata blockËùÖ¸¶¨µÄ·¾¶Ãû¡£µ«ÊÇ£¬¿ÕÁ¬½ÓºÍloopÁ¬½ÓÕâÖÖ
Çé¿öÒ²ÊÇÔÊÐíµÄ£¬ËùÒÔºËÐÄÒªÖ¸¶¨Ñ­»·Á¬½ÓµÄ×î´ó´ÎÊý¡£¾ßÌåÓɲÎÊý
MAXSYMLINKS(@sys/param.h)Ö¸¶¨¡£
ÕâÑù£¬¶à¸ö·ÖÇø½¨Á¢Ò»¸öÎļþϵͳ¾ÍÓпÉÄÜÁË¡£Æô¶¯ºËÐĵķÖÇø×÷Ϊһ¸ö
ÒÑ´æµÄÎļþϵͳ£¬ÆäËûµÄ·ÖÇø¾Í¼Þ½Óµ½Ä¿Â¼²ãÉÏÃæ¡£Õâ¸ö²Ù×÷¹ý³Ì¾ÍÊÇmount¡£
ÀûÓÃmountÖ¸Á¾Í¿ÉÒÔʵÏÖÉÏÃæµÄ²Ù×÷¡£µ«ÊÇ£¬mount֮ǰµÄĿ¼£¬ÔÚmountºó
¾Í¸øÆÁ±ÎÁË£¬Ö±µ½mount½áÊø£¬ÄÇЩĿ¼¾Í¿ÉÒÔÔÙÏÖ¡£
ÒÔÉϾÍÊǾ­µäµÄunixÎļþϵͳÀíÂÛ¡£µ«ÊÇ£¬¶ÔÓÚ¶ÁÈëÁËi-node£¬¾ÍÈ¥¶Á
data block £¬ÕâÖÖÇé¿ö£¬¶ÔÓÚÒ»¸ö±È½Ï´óµÄ·ÖÇø£¬Ó²ÅÌ´ÅÍ·Ïòdisk headµÄ¾à
Àë¾ÍÌ«´óÁË¡£×ܵÄÀ´Ëµ£¬·ÃÎÊʱ¼ä¾Í»á±ä³¤¡£ÔÚÕâÀïÓÐһЩָµ¼Ë¼Ï룺
¡£·ÖÇøÒª±È½ÏС£¬¶à·ÖÐ¡Çø
¡£Á˽ⳬ¼¶¿éµÄµØÎ»£¬³¬¼¶¿é¼Ç¼ÁË·ÖÇøµÄÐÅÏ¢£¬¿¼ÂÇÓÉÓÚ½éÖʵÄÔ­Òò¶ø
ʹÕâ¸ö³¬¼¶¿éÔì³ÉË𺦣¬ËùÒÔ£¬ÔÚ·ÖÇøÄÚ²¿¾Í±ØÐëΪËü×¼±¸¶à¼¸¸ö¿½±´¡£
¡£Ä¿Â¼ºÍËüϲãµÄÎļþ£¬ÒªÔÚÏàͬµÄÁìÓòÄÚ·ÅÖá£
¡£È·±£µ¥Î»data blockÒª±È´ÅÅ̵Äblock´ó¡£
¿¼ÂÇÁËһЩ¶«Î÷ºó£¬¾­¹ý¸ÄÁ¼±ê×¼£¬freebsd¾Í²ÉÓÃÒ»¸ö½Ð×öFFSµÄÎļþϵ
ͳ£¨Fast File System£©,µ«ÕâÖ»ÊÇi-nodeÁìÓò/dataÁìÓòµÄÅäÖ÷½·¨µÄ±ä»¯£¬»ù
±¾µÄ¿¼ÂÇ·½·¨²¢Ã»Óб䡣¶Ô´ÅÅÌ·ÖÇø½øÐÐÎļþϵͳµÄ¹¹ÔìµÄ³õʼ»¯ÓÉÃüÁînewfs
Ìṩ¡£¿´¿´ËüµÄsource¾ÍÖªµÀÔõôÅäÖõÄÁË¡£ÆäËûµÄ¹¹Ôì(......)¶ÔÓ¦ÓÚkernel
µÄsource£¬¶ÔÓÚ¹¹³Éboot programµÄÎļþdisk.cºÍsys.c(@i386/boot/biosboot)
±È½Ï¼òµ¥Ò×¶®£¨µ¥´¿ÐÔ£©¡£
ÉÏÃæ½²ÊöµÄi-node¶ÔdiskµÄpartitionµÄ¼Ç¼ÐÎʽ£¬ÏêϸµÄ£¨source£©ÔÚ
struct dinode(@ufs/ufs/dinode.h)ÀïÃæÓС£ÔÚºËÐÄÄÚ²¿Ê¹Óõ쬰üº¬Õâ¸ö¶«Î÷
µÄÊÇstruct inode(@ufs/ufs.inode.h)¡£

ÃèÊöioÉ豸µÄÎļþ½ÐÌØÊâÎļþ(special file)£¬Ëû¶ÔÓ¦µÄi-nodeÓÐÁ½¸öÖÖ
Àࣺ
¡£¿éÐÍ(block)
ºÍ×°ÖõĹÌÓеÄÊý¾Ý¼Ç¼µÄµ¥Î»£¨´ó¶àÊýµÄÇé¿öÊÇ512byte£©Î޹ء£¶Áд
µÄ×îСµ¥Î»ÊÇ1byte£¬¿ÉÒÔÔÚÈÎÒâµÄ³¡ËùÀïÈÎÒⳤ¶ÈµÄdata¡£ºËÐĶԸ÷¸ö
blockÐ͵ÄÌØÊâÎļþ½øÐй̶¨µÄ¼Ç¼µ¥Î»³¤¶È£¨±¶Êý£©½øÐлº³å(buffer)
¹ÜÀí£¬ÕâÑù¾Í¿ÉÒÔ´¦ÀíÈÎÒⳤ¶ÈµÄ¶ÁдÁË.
¡£ÎÄ×ÖÐÍ(char)
¶ÁдµÄ»ù±¾µ¥Î»ÊÇ£¬Êܵ½×°ÖùÌÓеÄdate¼Ç¼µ¥Î»³¤µÄÏÞ¶¨¡£Ã»ÓÐblock
Ð͵Ļº³å¹ÜÀí£¬¶ÔÓ¦ÓÚ×°ÖõÄÎïÀíÌØÐÔ£¬¶ÁдÊôÓÚרÓ᣻òÕß˵£¬ÊǶÁд
Á½Óá£
³ýÁËÍøÂç½Ó¿ÚÖ®Í⣬io×°ÖÿÉÒÔÈ«²¿·ÖΪÎÄ×ÖÐͺͿéÐÍÁ½¸ö´óÀà¡£×ܵÄÀ´Ëµ£¬
´ÅÅ̲Ù×÷µÄÁ½Ñù¶¼Ó㬵«ÆäËûµÄio×°ÖÃÖ»ÓÐÎÄ×ÖÐÍ¡£»¹ÓоÍÊÇһЩû¶ÔÓ¦ÎïÀíÉè
±¸µÄkernel modulesÌṩµÄÐéÄâÉ豸ҲÓУ¬ËüÃǶÔÓ¦×ÅÎÄ×ÖÐ͵ÄÌØÊâÎļþ¡£ÌØÊâ
Îļþϰ¹ß·ÅÔÚĿ¼/devÀïÃæ¡£

¶ÔÓÚÌØÊâÉ豸ÎļþµÄi-nodeÓÐblockºÍchatÁ½¸öÀ࣬É豸ͨ¹ýÇý¶¯ºÅ½øÐмǼ
¡£Í¨¹ýÕâЩ£¬¾Í¿ÉÒÔʶ±ðdevice driver¡£device ºÅ¾ÍÊÇmajorºÅ£¨8bit£©£¨Ö÷É豸
ºÅ£©ºÍminorºÅ£¨24bit£©£¨¸¨ÖúÉ豸ºÅ£©£¬device driverµÄʶ±ð¾ÍÊÇÓÉmajorµÄ²»
Ò»Ñù¶øÇø±ð¡£¶øÇÒÄØ£¬blockÐÍ£¬charÐ͵ĵȵȿÉÄÜ´æÔÚ×î´óÊýÄ¿ÊÇ256ÖÖÀà¡£Ò»°ãµÄ
Çé¿ö£¬Í¬ÖÖÀàµÄÉ豸²»Í¬ÊýÄ¿µÄÇø±ð¾ÍÊÇͨ¹ý¸¨ÖúÉ豸ºÅ½øÐÐʶ±ð¡£Êµ¼ÊÉÏ£¬¶ÔÓÚ
diskµÄÌØÊâÎļþ£¬ÓÐdisk/slide/partition±íʾ·¨£¬¶øÇÒ£¬ÎÄ×ÖÐÍ£¬¿éÐ͵ȵÄÌØÊâ
É豸ÎļþÒ²´æÔÚ¡£ÒÔϾÍÊÇÒ»¸öideÓ²Å̵ĵÄÎÄ×ÖÐÍÌØÊâÉ豸ÎļþµÄÀý×Ó£º
/dev/rwd0 1̨ideµÄÓ²ÅÌ
/dev/rwd0s1 1̨ideµÄÓ²Å̵Äslide #1
/dev/rwd0s2 1̨ideµÄÓ²Å̵Äslide #2
/dev/rwd0s2a slide #2µÄpartition a
/dev/rwd0s2b slide #2µÄpartition b
...
/dev/rwd0s3 1̨µÄideµÄÓ²Å̵Äslide #3

Èç¹û°Ñrwd»»³Éwd£¬¶ÔÓ¦µÄ¾ÍÊÇblockÐ͵ÄÌØÊâÉ豸ÎļþÁË¡£
¶ÔÓÚ´ÅÅÌ£¬ÓÐÈçϵÄʹÓ÷½·¨£º
¡£¶ÔÓÚslideµÄÎÄ×ÖÐÍÌØÊâÎļþ
¶Áдdisk labelʱºòʹÓã¨disklabel command£©
¡£¶ÔÓÚ¶ÔÓ¦µÄpartitionµÄÎÄ×ÖÐÍÌØÊâÎļþ
ÔÚ·ÖÇøÉϽ¨Á¢unixÎļþϵͳʱºò£¨newfs command£©,ÎļþϵͳÐÞ¸´£¬
¼ì²é£¨fsck£©Ê±ºòʹÓÃ
¡£¶ÔÓÚpartitionµÄblockÐ͵ÄÌØÊâÎļþ
×÷ΪmountÃüÁîµÄ²ÎÊýʹÓÃ
(ÏÂÒ»½Ú½éÉÜÐéÄâÎļþϵͳºÍv-node£¬ÒªÐÝÏ¢ÁË )


FreeBSDºËÐÄ̽ÌÖ.5.Çý¶¯³ÌÐòƪ

2.2 ÐéÄâÎļþϵͳºÍv-node
FreeBSDÔÚdiskÉϵijýÁËffsÒÔÍ⻹¿ÉÒÔ²Ù×÷¸÷ÖÖ¸÷ÑùµÄÎļþϵͳ¡£Ö÷ÒªµÄÈç
주
¡£cd9660
¿ÉÒÔ¶ÔISO9660ÐÎʽµÄcd-romµÄĿ¼/Îļþ¹¹ÔìµÄÎļþϵͳ½øÐÐmount£¬
locateµÈĿ¼²ãµÄ²Ù×÷
¡£ms-dos
¶Ôms-dosÎļþϵͳ½øÐÐĿ¼²ã´ÎµÄmount£¬¶¨Î»µÈ²Ù×÷
¡£mfs
ͨ¹ýʹÓÃÐéÄâÄÚ´æ¶ÔswapÇøµÄÒ»²¿·Ö½øÐÐunixÎļþϵͳµÄ¹¹Ô죬¶¨Î»
×÷ΪĿ¼µÄÒ»²¿·Ö½øÐжÁд
¡£nfs
ÓÉnfs serverÌṩµÄremoteĿ¼¼¶½øÐÐmount£¬¶¨Î»µÄĿ¼²ã²Ù×÷¡£
¡£null
¶ÔÒѾ­´æÔÚµÄĿ¼²ãµÄʹÓñðÃû
¡£union
¶ÔÒÑÓеÄĿ¼A£¨Éϲ㣩ÔÚϲãĿ¼BÉϽøÐÐÖØµþ (²»´óÀí½âÕâµÄÒâ˼
£¬´ó¸ÅÊÇÔÚϲãĿ¼ÀïÃæÓÖ¼Þ½ÓÁËÉϲãĿ¼µÄÒâ˼£ºÒëÕß)¡£ÎļþÃûµÄ²é
ÕÒÓÉÉϲãÓÅÏȽøÐС£Ã»Óеϰ¾ÍתµÀϲ㡣Èç¹û¶ÔϲãµÄÎļþ½øÐÐд²Ù×÷
£¬ËüµÄ¿½±´¾ÍÔÚÉϲãÉϽøÐС£¾ÙÀý˵Ã÷£¬×÷ҵĿ¼ÔÚÉϲ㣬µ«cd-romµÄÔ´
ÔÚϲ㣬Á½¸öÄ¿Â¼ÖØµþ£¬ÄÇô±àÒësourceµÄʱºò£¬¾ÍÏ൱·½±ãÁË¡£
¡£procfs
¶ÔÓÚ½ø³ÌºÅµÄĿ¼×÷³Émount point¡£Í¨¹ýÎļþÃû¶Ô¸÷¸öĿ¼µÄ½ø³Ì½øÐÐ
¿ØÖÆ¡£
¡£kernfs
ΪÁ˶Զ¯×÷ÖеÄkernelÓйصÄÐÅÏ¢½øÐвο¼£¬¶ø×÷³ÉµÄmount point
¡£fdesc
¶ÔÓÚ¸÷¸ö½ø³Ì£¬ÓÃËüËù´ò¿ªµÄÎļþ±ú¶ÔÓ¦µÄÎļþ×÷³ÉµÄmount point

ʵ¼ÊÉÏ£¬ÔÚºËÐÄÄÚ²¿£¬ÎªÁ˶ÔËüÃǽøÐÐͳһ²Ù×÷£¬¾Í¶ÔÎļþϵͳºÍv-node
½øÐгéÏ󻯣¬Êµ¼ÊµÄ´¦Àí¹ý³Ì¾ÍÊǵ÷Óø÷ÀàµÄÎļþϵͳµÄÄ£¿é½øÐд¦Àí¡£

tseteen ·¢±íÓÚ 2004-4-5 20:19

2.2.1¶ÔÐéÄâÎļþϵͳµÄ²Ù×÷
¸÷¸öÎļþϵͳ¿ÉÒÔÌṩµÄ²Ù×÷µÄÒ»ÀÀÈçÏ£¬ËüÔÚstruct vfsops
(@sys/mount.h)ÀïÃæ¶¨Ò壺
¡£¶ÔÎļþϵͳ½øÐÐmountµÄ²Ù×÷
¡£±¾ÎļþϵͳµÄ¿ªÊ¼¶¯×÷µÄ²Ù×÷
¡£±¾ÎļþϵͳµÄumount²Ù×÷
¡£±í´ïÎļþϵͳµÄ¸ùµÄv-nodeµÄ²éÕÒ²Ù×÷
¡£¶ÔÒ»°ãÓû§µÄȨÏÞ¿ØÖÆ
¡£È¡µÃÎļþϵͳµÄ״̬
¡£ÄÚ´æÄڵĹÜÀíÐÅϢдÈë½éÖÊÖÐ
¡£´Ói-nodeµ½v-nodeµÄÈ¡µÃ²Ù×÷
¡£v-nodeºÍnfsµÄÎļþ±úµÄÏ໥±ä»»µÄ²Ù×÷
¡£Îļþϵͳʵ¼ÊµÄÄ£¿éµÄ³õʼ»¯

¶ÔÓÚÎļþϵͳ£¬¸÷¸öʵ¼ÊµÄ²Ù×÷routineÔÚvfsopsµÄÐÎʽÌṩ׼±¸¹¤×÷¡£¸÷¸öÎļþϵ
ͳµÄvfsops£¬ÔÚÒÔϵıíÀïµÄsource½øÐж¨Ò壺

--------------------------------------------------------------
file system vfsopsµÄ¶¨Òå source
--------------------------------------------------------------
ufs ufs_vfsops ufs/ffs/ffs_vfsops.c
cd9660 cd9660_vfsops isofs/cd9660/cd9660_vfsops.c
msdos msdosfs_vfsops msdosfs/msdosfs_vfsops.c
mfs mfs_vfsops ufs/mfs/mfs_vfops.c
nfs nfs_vfsops nfs/nfs_vfsops.c
null null_vfsops miscfs/nullfs/null_vfsops.c
nuion union_vfsops miscfs/union/union_vfsops.c
procfs procfs_vfsops miscfs/procfs/procfs_vfsops.c
kernfs kernfs_vfsops miscfs/kernfs/kernfs_vfsops.c
fdesc fdesc_vfsops miscfs/fdesc/fdesc_vfsops.c
devfs devfs_vfsops miscfs/devfs/devfs_vfsops.c
ext2fs ext2fs_vfsops gnu/ext2fs/ext2_vfsops.c
lfs lfs_vfsops ufs/lfs/lfs_vfsops.c
portal portal_vfsops miscfs/portal.portal_vfsops.c
umap umap_vfsops miscfs/umapfs/umap_vfsops.c
---------------------------------------------------------------
ÕâЩ¾ÍÊÇÎļþϵͳµÄʵ¼ÊÄ£¿é(*_vfsops.c)£¬ÎļþϵͳÃû³Æ£¬ÎļþϵͳºÅµÈµÈ
ÔÚstruct vfsconf(@sys/mount.h)ÀïÃæ»ã×Ü£¬¸÷¸öÄ£¿éÀïÓúêVFS_SET()½øÈëºË
ÐÄ¡£
¸ù¾Ýmain()(@kern/init_main.c),ÔÚkernel³õʼ»¯µÄ¹ý³ÌÖУ¬vfsinit()
(@kern/vfs_init.c)ÀïÃæÓÐ
struct vfsconf *vfsconf[MOUNT_MAXTYPE+1];
struct vfsops *vfssw[MOUNT_MAXTYPE+1];
¸÷ÖÖ¶«Î÷µÄÉ趨£¬ÕâЩÊÇ£¬¹ÜÀímountÐÅÏ¢µÄstruct mount(@sys/mount.h)µÄ³ÉÔ±
mnt_vfcºÍmnt_opÒªÖ¸¶¨Ëù¶ÔÓ¦µÄÎļþϵͳµÄvfsconf,vfssw¡£»¹ÓкêVFS_²Ù×÷Ãû
(struct mount *,..)À¿ÉÒÔ¸÷¸ö²Ù×÷µÄµ÷Óá£

2.2.2¶Ôv-nodeµÄ²Ù×÷
ÐéÄâÎļþϵͳ¾ÍÊÇͨ¹ý¶Ôi-nodeµÄ³éÏó»¯Ö®ºóµÄv-nodeµÄÎļþ/Ŀ¼½øÐÐio´¦Àí¡£
ΪÁËÕâ¸öÄ¿µÄ£¬×÷Ϊ¶Ôv-nodeµÄÊÊÓô¦Àí£¬ÓÐ
¡£´Óv-nodeµ½ÎļþÃûµÄ²éÕÒ£¬·µ»Øv-node
¡£´ò¿ª/¹Ø±Õv-node
¡£¼ì²éÊÇ·ñ¿ÉÄÜ·ÃÎÊv-node
¡£µÃµ½-v-nodeµÄÊôÐÔ
¡£É趨v-nodeµÄÊôÐÔ
¡£¶Ôv-nodeµÄÊäÈë/Êä³ö
¡£À©Õ¹v-nodeµÄÓ²Á¬½ÓºÍ·ûºÅÁ¬½Ó
¡£¶Ôv-node½øÐÐĿ¼µÄ×÷³ÉºÍɾ³ý
¡£¡£¡£¡£
ÓÉÕâÀ↑ʼ£¬Ò»¹²¶¨ÒåÁË41¸ö¡£
v-nodeÓÉstruct vnode(@sys/vnode.h)ÀﶨÒ壬×÷ΪÀà±ðÔÚenum vtype
ÀïÃæ±íʾ³öÀ´£¬Ò»¹²ÊÇ9ÖÖÀà¡£Ëü°üº¬×ÅÔÚ¸÷¸öÎļþϵͳÉ϶Ը÷¸öµÄÎļþ/Ŀ¼£¨°ü
À¨ÌØÊ⣩Îļþ½øÐÐͳһʶ±ðµÄÐÅÏ¢¡£ÎªÁËʵÏÖÕâÑù£¬v-nodeÒ»Á¬´®µÄ²Ù×÷¾ÍÊÇÔÚ¸÷
Ä£¿éÀïͨ¹ýºêVNODEOP_SET()ºÍºËÐÄͨѶ¡£ÕâЩ²Ù×÷ÃûºÍʵÏÖµÄroutineÖ»ÐèÒª±ØÒª
µÄ¼¸¸ö¶ÔÓ¦¡£ÔÚºËÐijõʼ»¯Àvfs_opv_init()(@kern/vfs_init.c)¾Íʹ´ÓÊý¾ÝµÃ
µ½µÄºÅÂëÒ»Ò»¶ÔÓ¦£¬ÊÕ¼¯ÁËroutineµÄµØÖ·µÄͬһsizeµÄÅäÁÐÔÙ½øÐÐ×éºÏ¡£¸÷¸ö
v-node¾ÍÒ»¸öÒ»¸öÖ¸ÏòÕâЩÅäÁС£¶Ôv-nodeµÄ²Ù×÷ÔÚvnode_if.hÀﶨÒ壺
ËüÒÔ
VOP_²Ù×÷Ãû(v-node,...)
µÄͳһÐÎʽ¼ÇÊö¡£

ÏÂÃæÊǶÔv-nodeµÄ²Ù×÷µÄ¶¨Òåsource£º
------------------------------------------------------------------------
¸÷¸öv-node²Ù×÷£¨vnodeopv£© source
------------------------------------------------------------------------
cd9660_fifoop_opv_desc isofs/cd9660/cd9660_vnops.c
cd9660_specop_opv_desc isofs/cd9660/cd9660_vnops.c
cd9660_vnodeop_opv_desc isofs/cd9660/cd9660_vnops.c
dead_vnodop_opv_desc miscfs/deadfs/dead_devfs_vnops.c
devfs_vnodeop_desc miscfs/devfs/devfs_vnops.c
ext2fs_fifoop_opv_desc gnu/ext2fs/ext2fs_vnops.c
ext2fs_specop_opv_desc gnu/ext2fs/ext2fs_vnops.c
ext2fs_vnodeop_opv_desc gnu/ext2fs/ext2fs_vnops.c
fdesc_vnodeop_opv_desc miscfs/fdesc/fdesc_vnops.c
ffs_fifoop_opv_desc ufs/ffs/ffs_vnops.c
ffs_specop_opv_desc ufs/ffs/ffs_vnops.c
ffs_vnodeop_opv_desc ufs/ffs/ffs_vnops.c
fifo_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
fifo_vnodeop_opv_desc miscfs/fifofs/fifo_vnops.c
kernfs_vnodeop_opv_desc miscfs/kernfs/kernfs_vnops.c
lfs_fifoop_opv_desc ufs/lfs/lfs_vnops.c
lfs_specop_opv_desc ufs/lfs/lfs_vnops.c
lfs_vnodeop_opv_desc ufs/lfs/lfs_vnops.c
mfs_vnodeop_opv_desc ufs/mfs/mfs_vnops.c
msdosfs_vnodeop_opv_desc msdosfs/msdosfs_vnops.c
nfsv2_vnodeop_opv_desc nfs/nfs_vnops.c
null_vnodeop_opv_desc miscfs/nullfs/null_vnops.c
portal_vnodeop_opv_desc miscfs/portal/portal_vnops.c
procfs_vnodeop_opv_desc miscfs/procfs/procfs_vnops.c
spec_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
spec_vnodeop_opv_desc miscfs/specfs/spec_vnops.c
umap_vnodeop_opv_desc miscfs/umapfs/umap_vnops.c
union_vnodeop_opv_desc miscfs/union/union_vnops.c
------------------------------------------------------------------------
Õâ¸ö»ù´¡ÉÏ£¬spec_vnodeop_opv_specÀïÃèÊöµÄ²Ù×÷Ⱥ¾ÍÊÇdevice driver
interfaceµÄ¶«Î÷£¡£¡

( ±¾Ð¡½ÚÍ꣬´ý±¾µºÖ÷ÓпÕÔÙ¼ÌÐø )


FreeBSDºËÐÄ̽ÌÖ.6.Çý¶¯³ÌÐòƪ

2.3 mount¸ùĿ¼֮ǰµÄ´¦Àí¸ÅÒª
mount¸ùĿ¼µÄʱºò£¬main()(@kern/init_main.c)µÄ³õʼ»¯µÄ¹ý³Ì´Óxxx_vfs_mountroot()
(@kern/init_mail.c)±»µ÷ÓÿªÊ¼¡£Èç¹û´¦Àí¹ý³ÌÕý³££¬¾Í¶ÔrootvpÉ趨°üº¬ÁËrootµÄ
v-node¡£
¡£main()µÄ³õʼ»¯¹ý³ÌÖУ¬configure()(@autoconf.c)±»µ÷Óá£ÔÚÕâ¸ö£¬ioÉ豸
³õʼ»¯ÍêÁ˺󣬾Í×ªÒÆµ½ÈçÏÂÁ½¸ö±äÁ¿µÄµØÖ·£ºÒ»¸öÊÇmountroot,ÊÇ´¦ÀímountµÄroutine,
ÁíÒ»¸öÊÇmountrootvfsops,ÊÇ´¦ÀíÐéÄâÎļþϵͳµÄroutine¡£ÔÚ±¾»ú´ÅÅÌÖУ¬¾Í½øÈë±äÁ¿
rootdevËùÖ¸¶¨µÄdiskºÅÖС£ÕâÀï¾ÍÊÇ,¼Ù¶¨±¾»ú´ÅÅÌ
mountroot vfs_mountroot
mountrootvfsop &ufs_vfsops
rootdev boot disk number

¡£xxx_vfs_mountroot()(@kern/init_main.c)
ÔËÐÐ(*mountroot)(mountrootvfsops)ºó£¬¾ÍÖ¸Ã÷ÁËroot file systemµÄmount.
¡£vfs_mountroot()(@kern/vfs_conf.c)
¹ÜÀímountµÄÁËÎļþϵͳµÄÐÅÏ¢µÄstruct mount(@sys/mount.h),¶ÔËü½øÐÐÈ·ÈÏ
£¬È»ºóÉ趨´«µÝ¹ýÀ´µÄ¶ÔÐéÄâÎļþϵͳµÄ²Ù×÷Ⱥ(&ufs_vfsops),²Å½øÐÐ"root"
±ê¼Ç¡£¸ù¾ÝVFS_MOUNT(mp,...)½øÐÐmountÕâ¸öÐéÄâÎļþϵͳ¡£mount³É¹¦ºó£¬¾Í
×·¼Ófile systemµÄlist¡£ÕâÀÓÉÓÚ´«µÝÁË&ufs_vfsops£¬¾Í¿ÉÒÔµ÷ÓÃ
ffs_mount()(@ufs/ffs/ffs_vfsops.c)
¡£ffs_mount()
Ê×Ïȵ÷ÓÃbdevvp()(@kern/vfs_subr.c),½øÐÐVBLKÀà±ð£¬spec_vnodeop_p
(@misc/specfs/spec_vnops.c) v-node²Ù×÷£¬±£Ö¤É趨ÁËÇý¶¯ºÅµÄrootdevµÄ
v-nodeµÄ×îÐÂÐÅÏ¢£¬È»ºóÉ趨rootvp¡£×îºó£¬Í¨¹ýffs_mountfs()µ÷ÓýøÐÐʵ¼Ê
µÄmount rootvp²Ù×÷¡£
¡£ffs_mountfs()
¸÷ÖÖ¸÷ÑùµÄ¼ì²éÍêÁ˺󣬵÷ÓÃVOP_OPEN(),´ò¿ªrootvpµÄv-node¡£ÔÚÕâÀÈç¹û
v-nodeµÄv_op³ÉÔ±ÔÚspec_vnodeop_p´æÔڵϰ£¬¾Íµ÷ÓÃspec_open()(@misc/
specfs/spec_vnops.c)¡£
.spec_open
ÓÉÓÚVBLKÀï°üº¬v-nodeµÄÖÖÀ࣬´Óv-nodeÖ¸¶¨µÄdeviceºÅÈ¡µÃmajorµÄ
ºÅ£¬µ÷ÓöÔÓ¦driverµÄXXopen() routine

ÐøÉÏ£¬ÓÉVOP_IOCTL()(»¹ÊǵÄͨ¹ýspec_ioctl()(@misc/specfs/spec_vnops.c))
¿ÉÒԵõ½partitionÐÅÏ¢£¬È»ºó¸Ã¼ì²ésuper blockµÄÄÚÈÝ¡£ÕýÈ·µÄ»°£¬¾ÍÔÚstruct
ufsmount(@ufs/ufs/ufsmount.h)É趨unix file system£¬ÕâÑù´¦Àí¹ý³Ì¾ÍÍêÁË¡£

2.2.4 struct buf ºÍblockµÄÊäÈëÊä³öroutine
ǰ½ÚµÄffs_mountfs()ÌᵽʹÓÃbread()(@kern/vfs_bio.c)¶Á³öpartitionµÄ
super block¡£Õâ¸ö½Ó¿Úº¯ÊýºÜ¿ì¾Í»á½âÊÍ¡£ËüÖ÷ÒªÓÃÓÚ¶ÁÈ¡blockÐ͵Ädeviceµ½
kernelÄÚ²¿µÄbufferÖС£
bread(struct vnode *vp, /*(in)ÊäÈë¶ÔÏóµÄv-node*/
daddr_t blkno, /*(in)blockºÅ*/
int size, /*(in)¶Á³öµÄbyteÊýÁ¿£¬block³¤µÄ±¶Êý*/
struct ucred * cred,/*(in)ȨÏÞÐÅÏ¢*/
struct buf ** bpp)/*(out)´æ´¢¶ÁÀ´µÄdata*/
ͬÑùµÄbuffer linkºóµÄblockÊä³öµÄ×Ó³ÌÐòÊÇbwrite()¡£
bwrite(struct buf *bp) /*(out)¿ÉÒÔÊä³öµÄstruct buf*/
Á½ÕßÖ®¼ä¹²Í¬µÄµØ·½¾ÍÊÇstruct buf(@/sys/buf.h),ËüÓÃÓÚio´¦ÀíÖиødevice driver
×öÇÅÁº×÷ÓõÄÊý¾Ý½á¹¹¡£Ëü¼Ç¼ÁËv-node,ioµÄÇø±ð£¬¿ÉÒÔioµÄblockλÖÃ/byteÊý£¬´æ
´¢Êµ¼Êdata bufferµÄaddress£¬io´¦ÀíµÄ½øÕ¹Çé¿öµÈ¡£

breadÔòͨ¹ýgetblk()¶ÔblockÊäÈëµÄ½á¹¹struct buf½øÐвÙ×÷¡£getblk()µ÷ÓÃÔÚºËÐÄ
¹ÜÀíbuffer linkºÍ·µ»ØÖ¸¶¨´óСµÄblockµÄstruct buf¡£Õâ¸ö£¨»º³åÇø£©ÄÚÈÝÔÚÄ¿µÄ
blockÊÇ·ñ´æÔÚÓëÖ¸¶¨v-nodeµÄÖ¸¶¨Î»ÖÃblockÊÇ·ñÒѾ­¹¹³É»º³å»·Óйء£struct buf
ÀïÃæÓÐÒ»¸ö±ê־룬µ±»º³å»·ÄÚÈݱ仯ÊÇ£¬Õâ¸ö±ê־λ¾Í»á¸Ä±ä¡£bread()¸ù¾ÝÕâ¸ö
flagÅжÏblockÊÇ·ñÒѾ­»º³å£¬Èç¹ûÒѾ­Íê³É£¬Ëü¾ÍÖÕÖ¹Í˳ö¡£Èç¹û²»ÊÇÕâÑù£¬ÔòÔÚ
struct bufµÄmarkÀïÃæ±êÖ¾£¬È»ºóµ÷ÓÃVOP_STRATEGY()¡£ÔÚv-nodeµÇ¼ÇµÄstrategy
routine¼Ç¼ÁËio´¦ÀíµÄ¹ý³Ì£¬ËùÒÔbread()µ±Êµ¼ÊµÄ´¦ÀíÍêÁ˺󣬾͵÷ÓÃbiowait()
½øÈëµÈ´ý״̬¡£È»ºó£¬¾Í×ªÒÆµ½±ðµÄ½ø³ÌA¡£io´¦ÀíÍêÁ˺󣬵÷ÓÃbiodone(),½ø³ÌA
Ò²¿ÉÒÔ¼ÌÐø½øÐС£»¹ÓУ¬µ÷ÓÃbread()µÄÒ»±ß£¬µ±Íê³É²Ù×÷ºó£¬¾Íµ÷ÓÃbrelse(),ÔÚ
ÀïÃæ¶Ôstruct bufµÄflagÖØÐÂÉèÖã¬ÈÃËü¶Ô±ðµÄ³ÌÐò¿ª·Å¡£

bwriteÒ²ÊÇͬÑùµÄͨ¹ýVOP_STRATEGY()¶Ôio´¦ÀíÒªÇó½øÐеǼǣ¬Í¬Ê±Ò²µ÷ÓÃbiowait()
½øÈëµÈ´ý״̬£¬Í¬Ñù£¬µ±Êµ¼Ê²Ù×÷ÍêÁ˺ó£¬Ò²ÉèÖÃflag½øÐи´Î»£¬Ê¹µÃÆäËû³ÌÐò¿ÉÒÔ
ʹÓÃio£¬µ±¿ÕÏеÄʱºò£¬io¾Í¹ÒÆð£¬×ªÏòÆäËû½ø³Ì´¦Àí¡£
½ø³ÌµÈ´ý½øÈëµÄʱºò£¬µ±È»²»ÏÞÓÚÖ»Êǵ÷ÓÃbiowait()¡£ÔÚbread()»òÕßbwrite()֮ǰ£¬
ϵͳ±ØÐë·ÖÅä×ã¹»µÄ×ÊÔ´¹©ËüʹÓ㬱ÈÈçһЩ»º³åÇøµÈ¡£µ±½øÐÐʵ¼Êioʱºò£¬1¸öblock
Ò²¿ÉÒÔ£¬¶à¸öblockÒ²¿ÉÒÔ£¬¶øÇÒÕâÑù¿ÉÒÔ»ñµÃ¸ü¸ßµÄЧÂÊ£¬ÕâÑù¿´ÆðÀ´£¬¾ÍÏóʵ¼ÊÉÏ
ÊÇÁ¬Ðø²Ù×÷ÁË¡£
(´úÐø)


FreeBSDºËÐÄ̽ÌÖ.7.Çý¶¯³ÌÐòƪ

2.2.5ϵͳµ÷ÓÃopen()µÄ´¦Àí¸ÅÒª
½ø³Ìͨ¹ýϵͳµ÷ÓÃread()/write()½øÐÐio´¦Àí£¬ËüÓÉÎļþÃèÊö·ûÖ¸¶¨¶ÔÄÄÀï½ø
ÐÐi/o£¬ÎļþÃèÊö·ûÊÇ0ÒÔÉϵÄÕûÊý£¬ËüÔÚ¸÷¸ö½ø³ÌµÄstruct procµÄ³ÉÔ±
struct filedesc *p_fd(struct filedesc(@sys/filedesc.h))±£ÁôµÄstruct file
((@sys/file.h)½øÐÐÑ¡ÔñÌí¼Ó¡£¶Ôstruct file£¬Ëüº¬ÓдÓÎļþµÄÍ·µÄÊäÈëÊä³öµÄbyte
λÖã¬ÊäÈë²Ù×÷£¬Êä³ö²Ù×÷£¬ÊäÈëÊä³ö¿ØÖÆ£¬ÊäÈëÊä³öµÄ×¼±¸×´Ì¬µÄ¼ì²é£¬Ö´ÐÐclose
µÄroutine£¬ÒÔ¼°ÃèÊöio´¦Àí¶ÔÏóµÄÐÅÏ¢(v-node,socket,pipe) ¡£ÏµÍ³µ÷ÓÃopen()
(@kern/vfs_syscalls.c)¾ÍÊǰѰüº¬Â·¾¶ÐÅÏ¢µÄv-nodeÕÒѰ³öÀ´£¬ÎªÁ˶ÔËü½øÐÐio´¦Àí£¬
ÏÈÒª¶Ôstruct file½øÐгõʼ»¯£¬È»ºó·µ»ØÎļþÃèÊö·û¡£
´Ó·¾¶Ãû²éÕÒv-nodeheºÍio×¼±¸²Ù×÷ÓÉvn_open()(@kern/vfs_vnops.c)³Ðµ£¡£
vn_open()ͨ¹ýnamei()(@kern/vfs_lookup.c)²éÕÒ·¾¶¶ÔÓ¦µÄv-nodeÃû£¬ÓÉVOP_OPEN()
µ÷Óò»Í¬µÄv-node¶¨ÒåµÄ×¼±¸¹ý³Ìroutine¡£ÀýÈ磬ÓÐÈçϵĴ¦Àí·½·¨¡£
¡£ÆÕͨµÄfile/directory
µ÷ÓÃufs_open()(@ufs/ufs/ufs_vnops.c)£¬¼ì²éopenµÄmode
¡£ÌØÊâÉ豸Îļþ
µ÷ÓÃspec_open()(@miscfs/specfs/spec_vnops.c)
ÎÄ×ÖÐÍ µ÷ÓÃdevice driverµÄopen routine
¿ìÐÍ mountµÄʱºò³ö´í¡£Èç¹û²»ÊÇÕâÑù£¬¾Íµ÷ÓÃdevice driverµÄ
open routine¡£

»Ø¹ýÍ·À´£¬namei()µÄÈÎÎñÊǾÍÊÇ£¬¶ÔÓÚÖ¸¶¨µÄ·¾¶Ãû£¬¶ÔÓ¦ÓÚ¸úĿ¼»òÕßµ±
ǰĿ¼µÄv-node×÷ΪÆðµã£¬Í¨¹ýlookup()(@kern/vfs_lookup.c)½øÐÐv-node²éÕÒ¡£
lookup()´Ó·¾¶Ãû¿ªÊ¼µÄv-node(VDIR)¿ªÊ¼²éÕÒ¡£ÕÒµ½Á˵Äv-node×÷ΪÐÂµÄÆðµã¼ÌÐø½øÐÐ
²éÕÒÏÂÒ»²½µÄÒªËØÃû£¬È»ºóµÃµ½Ä¿µÄµÄv-node¡£Õâ¸öʱºò£¬¸ù¾Ýv-nodeµÄ²»Í¬£¬Ä¿Â¼µÄ¼ì
Ë÷·½·¨Ò²¾Í²»Í¬¡£¸÷¸öÒªËØµÄʵ¼Ê¼ìË÷ÓÉVOP_LOOKUP()À´×ö¡£

2.2.6ϵͳµ÷ÓÃread()µÄ´¦Àí¸ÅÒª
open()È¡µÃÎļþÃèÊö·ûºó£¬¶ÔËüµÄÊäÈë´¦Àí£¬ÓÐÈçϵÄÁ÷³Ì¡£Ö¸¶¨µÄÎļþÃèÊö·û
µÄstruct fileÄڵǼǵĴ¦ÀíroutineÓÐvn_read()(@kern/vfs_vnops.c),vn_write(),
vn_ioctl(),vn_select(),vn_closefile()£¬v_node
µÇ¼ÇµÄ²Ù×÷routine²»ÄÜ·Ö¿ªÊ¹Óá£vn_*()ÀֻÓÐÔÚºÏÊʵÄǰ׺²Ù×÷Ï£¬²ÅÄÜÕýÈ·µ÷Óá£
read()Ê×ÏÈÔÚstruct uio(@sys/uio.h)µÇ¼Ç½ø³ÌÖ¸¶¨µÄbufferµÄλÖúͳ¤¶È¡£
Ö´ÐÐread()ºó£¬vn_read()Ïòstruct fileÉ趨µÇ¼ÇµÄÎļþµÄ¶ÁдλÖã¬È»ºóµ÷ÓÃVOP_READ()¡£
¸ù¾Ý¶Á³öÀ´µÄbyteÊý£¬¶ÁдλÖÃÏàÓ¦Ôö¼Ó¡£
VOP_READ()µÄcall routineÔòÊÇÓëv-nodeÓйأ¬¾ÍÏóÏÂͼһÑù¡£

vn_read()
ÎÄ×ÖÐÍ/¿éÐÍ |
/------------------
| | file/directory
spec_read() ---------ffs_read()-------VOP_READ()
blockÐÍ | |
/---------------|charÐÍ |
bread() device driver bread()
| |
spec_strategy() ---------------ufs_strategy() --VOP_STRATEGY()
| | |
| | |
device driver spec_strategy() -------------/
|
|
device driver


¡£ÆÕͨµÄfile/directory
µ÷ÓÃffs_read()(@ufs/ufs/ufs_readwrite.c)¡£¶ÔÓ¦Ö¸¶¨µÄ¶ÁдλÖ㬼ÆËãblock
µÄλÖã¬È»ºóÓÃbread()¶Á³öÀ´¡£¶Á³öÀ´µÄÊý¾ÝË͵½½ø³ÌËù×¼±¸µÄ»º³åÇø¡£´Óbread()
´«µÝ¹ýÀ´µÄblock²¢²»ÊÇÎïÀíblockµÄλÖ㬶øÊǰÑfile×÷ΪblockÁеÄÒ»¸öÀíÂÛÖµ¡£
´ÓÀíÂÛ¿éµ½ÎïÀí¿éµÄ±ä»»ÓÉVOP_STARATEGY()Íê³É¡£Ò²¾ÍÊÇ˵£¬ufs_strategy()ÏȰÑ
ÎļþÄÚλÖÃת»¯ÎªÎïÀíblockλÖã¬È»ºó´Óv-node¼Ç¼µÄi-node°Ñ±íʾÎïÀíÉ豸µÄ
v-node È¥³öÀ´£¬Õâ¸öVOP_STRATEGY¾Íµ÷ÓÃspec()(@miscfs/specfs/spec_vnops.c)
ÈÃËü½øÐÐÊäÈëÒªÇó¡£
¡£ÌØÊâÉ豸Îļþ
ͨ¹ýµ÷ÓÃspec_read()(@miscfs/specfs/spec_vnops.c),°ÑËü·ÖΪÎÄ×ÖÐͺͿéÐÍÁ½Àà¡£
ÎÄ×ÖÐÍ µ÷ÓÃdevice driverµÄÊäÈëroutine
¿éÐÍ Í¨¹ýbread()½øÐÐÊäÈë´¦Àí

¶ÔÎļþµÄϵͳµ÷ÓÃwrite()µÄ³¡ºÏÒ²ÊÇÀàËÆµÄ´¦ÀíÁ÷³Ì(ufs_write()->bwrite()),
ufs_write()ÔòÒª¿¼Âǵ½Îļþ´óСµÄÑÓÉì¡£

tseteen ·¢±íÓÚ 2004-4-5 20:21

FreeBSDºËÐÄ̽ÌÖ.8.Çý¶¯³ÌÐòƪ


2.3 Device Driver
½ø³ÌµÄioÒªÇóµ½ÕâÀï˵µÄ²î²»¶àÁË¡£ÉÏÃæÒ²½â˵Á˶ÔÓÚÎÄ×ÖÐÍ£¬¿éÐ͵ÄÇý¶¯³ÌÐò½Ó¿Ú£¬¾Í
ÊÇdev_spec_vnodeop_opv_descÀﶨÒåµÄ×Óº¯ÊýÄÇЩ¡£²Î¿¼É豸Çý¶¯³ÌÐò£¬ÔÚsys/conf.h
ÀﶨÒåµÄ½á¹¹Ìå¡£blockÐÍÊÇ
struct bdevsw{
d_open_t *d_open;
d_close_t *d_close;
d_strategy_t *d_strategy;
d_ioctl_t *d_ioctl;
d_dump_t *d_dump;
d_psize_t *d_psize; /*µÃµ½ÈÝÁ¿*/
int *d_flags;
char *d_name; /*device Ãû*/
struct cdesw *d_cdev; /*¶ÔÓ¦µÄÎÄ×ÖÐÍ*/
int d_maj; /*majorºÅ*/
}
ÎÄ×ÖÐ͵ÄÔòÊÇ
struct cdevsw{
d_open_t *d_open;
d_close_t *d_close;
d_read_t *d_read; /* rawread() */
d_write_t *d_write; /* rawwrite()*/
d_ioctl_t *d_ioctl;
d_stop_t *d_stop; /* nostop()*/
d_reset_t *d_reset; /* nullreset()*/
d_devtotty_t *d_devtotty; /* nodevtotty*/
d_select_t *d_select; /* deltrue*/
d_mmap_t *d_mmap; /* nommap*/
d_strategy_t *d_strategy
char *d_name; /*deviceÃû*/
struct bdevsw *d_bdev; /*¶ÔÓ¦blockÐÍ*/
int d_may; /*majorºÅ*/
}


Á½·½Ã湲ͬµÄ²¿·ÖÓÐ
xx_open(dev_t dev,int oflags,int devtype,struct proc *p)
xx_close(dev_t dev,int fflag,int devtype,struct proc *p)
xx_ioctl(dev_t dev,int cmd,caddr_t data,int fflag,struct proc *p)
xx_open()ÓÃÓÚ´ò¿ªdeviceºÅµÄÉ豸¡£xx_close()ÔòÓÃÓڹرÕËü¡£xx_ioctl()Ôò¶ÔÉ豸µÄ
¶¯×÷״̬£¬»úÄܵÄÈ¡µÃ£¬ÉèÖõȽøÐпØÖÆ£¬Ëüͨ¹ýint cmdÃüÁîºÍ²ÎÊýcaddr_t data¶ÔÖ®
½øÐд¦Àí¡£xx_open()µÄoflagsÔòÊÇϵͳµ÷ÓÃopen()ÀïÖ¸¶¨µÄ±êÖ¾¡£xx_close()ºÍ
xx_ioctl()µÄfflagÊÇÿ¸öÎļþÃèÊö·ûÉ趨µÄ±êÖ¾¡£int devtypeÓÃÀ´Çø±ðÉ豸ÀàÐÍÊÇÎÄ
×ÖÐ͵ϹÊÇ¿éÐ͵ġ£struct proc *pÊDZ¾´ÎÒªÇóµÄ½ø³ÌºÅ¡£

ÔÚÎÄ×ÖÐ͵IJÙ×÷ÀÓÐÕâÈý¸öº¯Êý
xx_read(dev_t dev,struct uio *uio,int ioflag)
xx_write(dev_t dev,struct uio *uio,int ioflag)
xx_select(dev_t dev,int which, struct proc *p)
xx_read()/xx_write()ÊǶÔdeviceºÅµÄio£¬struct uio *uio ÊÇioµÄbuffer£¬int ioflag
±êÖ¾io¶¯×÷µÄoption¡£ÀýÈ磬ÊäÈëdataû׼±¸ºÃµÄ³¡ºÏ²»ÓýøÈëµÈ´ý״̬Ҳ¿ÉÒÔ¡£
xx_select()¼ì²éÊÇ·ñ¿ÉÒÔ½øÐÐioÒªÇó¡£
ÔÚ¿éÉ豸µÄ²Ù×÷ÖÐ,ÓÐÒ»¸öº¯Êý
xx_strategy(struct buf *bp)
Ëü´¦ÀíioÒªÇó¡£struct buf *bpÀïÃæ°üº¬×ÅdeviceºÅ£¬ÊäÈ뻹ÊÇÊä³ö£¬ioµÄbufferµÈ¡£

deviceºÅÖеÄmajorºÅ£¬¶ÔÎÄ×ÖÐ͵Ästruct cdevsw *cdevsw[],¶Ô¿éÐ͵Ästruct
bdevsw *bdevsw[]£¬×÷ΪÅäÁеÄÌí¼Ó×ÖʹÓá£ÏòÕâЩÅäÁеǼǣ¬¾Í¿ÉÒÔµ÷³ödevice driver
µÄµÇ¼Çroutine¡£
¶Ôcdevsw[]µÇ¼ÇµÄ¹ý³ÌÔÚkern/kern_conf.c,ËüʹÓÃ
int cdevsw_add(
dev_t *descrip, /*ÊÕ¼¯deviceºÅµÄ±äÁ¿µÄÖ¸Õë*/
struct cdevsw *newentry,/*ÉèÖÃstruct cdevswµÄÖ¸Õë*/
struct cdevsw **oldentry,/*¾ÉµÄÉ趨ÄÚÈݵķµ»ØÁìÓò*/
)
ÁíÒ»·½Ã棬¶Ôbdevsw[]µÄµÇ¼Ç¹ý³ÌÔòʹÓÃ
int bdevsw_add_generic(
int bdev, /*blockÐ͵ÄmajorºÅ*/
int cdev, /*ÎÄ×ÖÐ͵ÄmajorºÆ*/
struct bdevsw *bdevsw, /*É趨struct bdevswµÄÖ¸Õ룬¶ÔÓ¦d_cdev*/
)
blockÐ͵ÄdeviceºÍcharÐ͵ÄdeviceÓÐ×ÅÒ»¶¨µÄ¶ÔÓ¦¹ØÏµ¡£ÕâЩ½á¹¹ÌåÏ໥²Î¿¼¡£
bdevsw_add_generic()´ÓblockµÄ½á¹¹Ì忪ʼ£¬¶Ô×÷ΪcharÐ͵ÄdeviceµÄ½á¹¹Ìå½øÐгõʼ»¯¡£
»¹ÓУ¬network interfaceµÄdevive driver,²¢Ã»ÓÐÏòcdevsw[]ºÍbdevsw[]µÇ¼Ç¡£¶øÇÒҲûÓÐ
deviceºÅ¡£ÍøÂç¼äµÄpackageÁ÷£¬ºÍ½ø³Ì¼äÓëÍøÂç¼äµÄpackageÁ÷ҲûÓÐÌØ±ðÖ¸Ã÷¡£
µ÷ÓõǼÇroutineµÄʱºò£¬¿ÉÒÔ°ÑÎļþϵͳµÄmodules×÷ÎªÌØÊâÉ豸Îļþ²Î¿¼¡£µÇ¼Ç
routineÔÚʲôµØ·½¶¼¿ÉÒÔµ÷Óá£
¡£main()(@kern/init_mail.c)µÄ³õʼ»¯¹ý³ÌÖеǼǵÄroutineµ÷ÓõÄʱºò£¬¸÷¸ö
device driverµÄmodulesÀïÓɺêSYSINIT()×¼±¸½øÐС£
¡£È·ÈÏdevice driverÀïµÄioÉ豸µÄ´æÔÚµÄʱºò£¬µ÷ÓõǼÇroutine¡£
µ±µ÷ÓõǼdzÌÐò¶ÎµÄʱºò£¬Èç¹ûmajorºÅºÍ/dev/MAKEDEVµÄmajorºÅÓгåÍ»µÄʱºò£¬
¾Íµ÷ÓÃÈ«²¿ÎÞ¹ØÐÔdevice fileµÄ´¦Àíroutine£¬Ò²¿ÉÄÜûÓÐÔ¤ÆÚµÄµÄÔÖÄÑÊÂÇé¡£»¹ÓбðµÄ
ÒÔÍâÊÂÇ飬¾ÍÊǵ±/devÀïûÓжÔÓ¦µÄÌØÊâÉ豸ÎļþµÄʱºò£¬Ò²¾Í²»ÄÜ´Ó½ø³Ì½øÐвο¼¡£


FreeBSDºËÐÄ̽ÌÖ.9.Çý¶¯³ÌÐòƪ


2.3.1Çý¶¯³ÌÐò³õʼ»¯
´ÓÎļþϵͳµÄÄ£¿é¿ÉÒÔ¿´³öÀ´£¬Èç¹ûÒª¶ÔÇý¶¯³ÌÐòµÄÎïÀíÉ豸½øÐÐio,±ØÐë
ÏȶÔËüÃǽøÐгõʼ»¯£¬·ñÔò²»ÄÜ´¦ÀíprocessµÄio¡£ºËÐijõʼ»¯µÄ¹ý³ÌÀһ¹²µÇ¼Ç
ÁËÁ½¸ö»ù±¾µÄ²Ù×÷¹ý³Ì¡£
1.probe È·ÈÏioÉ豸
2.attach ÉèÖÃdevice driverÄÚ²¿µÄÊý¾Ý½á¹¹£¬Ê¹ËüÄܹ»¶ÔioÉ豸
½øÐвÙ×÷¡£µÇ¼ÇÖжÏ×Ó³ÌÐò¡£
ÔÚdevice driverÖеĴ¦Àí¹ý³ÌÓУº
1.i/oµØÖ·
i/oÃüÁîʹÓõĵØÖ·£¬Ê¹ioÉ豸µÄ¿ØÖÆÓ²¼þºÍÊý¾Ý½»»»¡£
2.ÖжϺÅ
ioÉ豸µÄ״̬±ä»¯µÄʱºò£¬Ïòcpu·¢³ö֪ͨ¡£
3.¹²ÓÐÄÚ´æµØÖ·
¸ù¾ÝÉ豸µÄ²»Í¬£¬Ê¹ÓÃÒ»²¿·ÖÄÚ´æ¿Õ¼ä½øÐÐcpuºÍÊý¾ÝµÄ½»»»¡£
4.DMAͨµÀ
²»ÓÃͨ¹ýcpu×öÖн飬É豸ºÍÄÚ´æÖ±½Ó½»»»Êý¾Ýʱºò²ÉÓõÄͨµÀµÄʶ±ðºÅ¡£
cpu¿ÉÒÔÔÚÊý¾Ý´«Ë͵ÄʱºòͬʱִÐÐËüµÄ»úÆ÷ÓïÑÔ¡£
ǰÁ½ÖÖÊDZØÐëÓеġ£É豸¸ù¾ÝËûÁ¬½ÓµÄ×ÜÏßÉ豸²»Ò»Ñù£¬´¦Àí¹ý³ÌÒ²¾Í²»Í¬¡£
Õâ¸öÔÚºËÐĵÄconfigureÖз´Ó³³öÀ´¡£

¸÷ÖÖ×ÜÏßÉ豸µÄdevice driverµÄ³õʼ»¯
Çý¶¯³ÌÐòµÄ³õʼ»¯ÔÚmain()³õʼ»¯µÄ¹ý³ÌÖе÷ÓÃconfigure()
(@i386/i386autoconf.c).

EISA bus
Á¬½ÓEISA busµÄioÉ豸ÓõÄdevice driverµÄ³õʼ»¯ÔÚeisa_configure()
(@i386/eisa/eisaconf.c)¡£¸÷¸ödevice driverÔÚmoduleÀï¶Ôstruct eisa_driver
XXX(@i386/eisa/eisaconf.h)½øÐÐprobe,attachµÈµÄÉèÖã¬×¼±¸ÔÚºêDATA_SET
(eisadriver_set,XXX)½øÐеǼǡ£
eisa_configure()(@i386/eisa/eisaconf.c)¶ÔÁ¬½ÓEISA busµÄÈ«²¿ioÉ豸
±êÖ¾ºÍi/oµØÖ·½øÐмì²â¡£Ö®ºó±ãµ÷ÓõǼǵÄprobe×Ó³ÌÐò¡£ÔÚprobe×Ó³ÌÐòÖУ¬Í¨¹ý
eisa_match_dev()(@i386/eisa/eisaconf.c)¶Ô×ÔÉí¼ì²â£¬²éÕÒioÉ豸£¬¼ì²âi/oÖжÏ
ºÅ£¬È»ºó½øÐÐʹÓÃÔ¤¶¨£¬Ö®ºóÓÃeisa_registerdev()(@i386/eisa/eisaconf.c)ÔÚ
struct eisa_driver XXX¶ÔÕâ¸öÉ豸²Ù×÷£¬×÷Ϊdevice driverµÇ¼Ç¡£È«²¿µÄioÉ豸
µÄ¿ØÖÆdevice driverµÇ¼ÇÍê±Ïºó£¬eisa_configure()¾Íµ÷ÓÃdevice driverµÄattach
×Ó³ÌÐò¡£attach×Ó³ÌÐòÔò½øÐÐÖжϴ¦Àí³ÌÐòµÄµÇ¼ÇºÍdevice driverµÄÊý¾ÝµÄ³õʼ»¯¡£

ºËÐĵÄconfigureÎļþµÇ¼ÇÁËÒÔϵÄһЩdevice driver:
--------------------------------------------------------------------------
device device driverµÄÇ鱨 source ²Î¿¼
--------------------------------------------------------------------------
mainboard_drv i386/eisa/eisaconf.c
ahb ahb_eisa_driver i386/eisa/aha1742.c scsi adapt
ahc ahc_eisa_driver i386/eisa/aic7770.c scsi adapt
bt bt_eisa_driver i386/eisa/bt74x.c scsi adapt
ep ep_eisa_driver i386/eisa/3c5x9.c network interface
fea pdq_eisa_driver i386/eisa/if_fea.c network interface
vx vx_eisa_driver i386/eida/if_vx_eisa.c network interface
--------------------------------------------------------------------------

PCI bus
Á¬½Ópci busµÄÉ豸µÄ³õʼ»¯ÔÚpci_configure()(@pci/pci.c)½øÐС£¸÷¸ö
device driverÔÚmoduleÄÚµÄstruct pci_device XXX(@pci/pcivar.h)ÉèÖÃprobeºÍ
attach£¬ÔÚͨ¹ýºêDATA_SET(pcidevice_est,XXX)½øÐеǼǡ£
DATA_SET(pcibus_set,i386pci)(@i386/isa/pcibus.c)µÇ¼ÇµÄ×Ó³ÌÐò¿ÉÒÔ
µÃµ½ÓйØpci busµÄһЩÐÅÏ¢¡£Ö®ºóºÍeisa bus´¦Àí¹ý³ÌÒ»Ñù½øÐи÷ÖÖ¸÷ÑùµÄµ÷Óá£
ºËÐĵÄconfigureÎļþµÇ¼ÇÁËÒÔϵÄһЩdevice driver:
--------------------------------------------------------------------------
device device driverµÄÇ鱨 source ²Î¿¼
--------------------------------------------------------------------------
ahc ahc_pci_driver pci/aic7870.c scsi adapt
bt bt_pci_driver pci/bt9xx.c scsi adapt
ncr ncr_device pci/ncr.c scsi adapt
amd trmamd_device pci/tek390.c scsi adapt
cy cy_device pci/cy_pci.c serial port
meteor met_device pci/meteor.c meteorͨµÀ
stl stlpcidriver i386/isa/stallion.c serial port
wdc wdc_pci_driver pci/wdc_p.c ide control
de dedevice pci/if_de.c network interface
ed ed_pci_driver pci/if_ed_p.c network interface
fpa pfadevice pci/if_pfa.c network interface
fxp fxp_device pci/if_pxp.c network interface
lnc lnc_pci_driver pci/if_lnc_p.c network interface
sr sr_pci_driver pci/if_sr_p.c network interface
vx vxdevice pci/if_vx_pci.c network interface
-------------------------------------------------------------------------

ISA bus
Á¬½ÓISA busµÄioÉ豸µÄdevice driverµÄ³õʼ»¯ÔÚisa_configure()(@i386/
isa/isa.c)½øÐС£ºÍEISA,PCIºÜ´óµÄÒ»¸öÇø±ð¾ÍÊÇ£¬ÔÚºËÐĵÄÅäÖÃÎļþÖУ¬ÒªÖ¸¶¨Ëù
ÓеÄioµØÖ·µÈ¡£
configureÎļþÖУ¬ÓÐÏóÈçϵļǼ
controller ¿ØÖÆÉ豸Ãû at isa?...
device deviceÃû at isa?...
ÕâЩÄÚÈÝÔÚ±àÒëºËÐĵÄĿ¼ÏÂ×÷Ϊioconf.cµÄstruct isa_device
isa_devtab_XXX[]µÄ³õʼֵÓÉconfigÃüÁîд½øÈ¥¡£ÔÚstruct isa_device(@i386/isa
/isa_device.h)µÄÉÏ£¬Æä´ÎµÄ³ÉÔ±±äÁ¿ÓÉconfigureÎļþµÄ¼Ç¼ÄÚÈݽøÐÐÉ趨¡£µ«ÊÇ
£¬¡°Ãû×Ö¡±ÊÇ¿ØÖÆÉ豸Ãû/deviceÃûµÄÊý×Ö³ýÍâµÄ²¿·Ö¡£
-------------------------------------------------------------------------
memberÃû configureµÄ¼ÇÊöÄÚÈÝ
-------------------------------------------------------------------------
id_driver Ãû×Ödrvier
id_iobase prot I/O address
id_irq irqºÅ
id_drq drq DMAͨµÀºÅ
id_maddr iomem¹²ÓÐmemory address
id_msize iosiz¹²ÓÐmemory³¤¶È
id_intr vector device driverµÄÖжϴ¦Àí³ÌÐòÃû
id_unit Ãû×ֵĺóµÄÊý×Ö(?)
id_flags flags
-------------------------------------------------------------------------

µ«ÊÇ,ºÍ¿ØÖÆÉ豸/deviceÃûÓйصÄһЩ¶«Î÷Èçbio,net,tty³öÏֵij¡ºÏ£¬Õâ
Щһ°ã³ÉΪisa_devtab_bio[],isa_devtab_net[],isa_devtab_tty[]Êý×éµÄ³õʼֵ¡£
ûÓеÄÇé¿ö£¬Ôò³ÉΪisa_tab_null[]µÄ³õʼֵ¡£»¹ÓÐÒ»¸ö¾ÍÊÇÃû×Ödriver£¬ËüÊǸ÷¸ö
device driverµÄmoduleÄÚ²¿µÄstruct isa_driver(@i386/isa/isa_device.h)Ò»¸ö¶«
Î÷¡£¶Ôisa busÉ豸µÄdevice driver£¬Õâ¸öÊÇÒ»¸ö¹Ì¶¨Öµ¡£
ÏóÕâÑùµÄ¼Ç¼£º
------------------------------------------------------------
disk deviceÃû at ¿ØÖÆÉ豸Ãû driver Êý×Ö
tape deviceÃû at ¿ØÖÆÉ豸Ãû driver Êý×Ö
------------------------------------------------------------
ÿ¸öÊý×Ö³ýÍâ¿ØÖÆÉ豸Ãû(wdc»òÕßfdc)£¬×ܽáÆðÀ´¾ÍÊÇд½øÒ»¸ö½Ð×ö
isa_biotab_¿ØÖÆÉ豸Ãû[]µÄÊý×éµÄij¸öÔªËØµÄ³õʼÉ趨ֵ¡£µ«¶Ôunit³ÉÔ±ÌîÈëÊý×Ö
Í⣬ÆäËûµÄÒ²¾ÍºÍisa_devtab_bio[]µÄÄÚÈÝÒ»Ñù¡£
isa_configure()ÒÀÕÕisa_devtab_bio[],isa_devtab_net[],
isa_devtab_tty[]µÄÉ趨ֵµ÷ÓÃprobe×Ó³ÌÐò¶ÔÉ豸µÄÓÐÎÞ½øÐÐÈ·ÈÏ¡£Óеϰ¾Í¼ÌÐø
µ÷ÓÃattach×Ó³ÌÐò¡£
probe×Ó³ÌÐò¶ÔÉ豸½øÐÐÈ·ÈÏ£¬²»Í¬µÄprobe×Ó³ÌÐòÒ²ÓпÉÄܶÔͬÑùµÄioµØÖ·
½øÐвÙ×÷¡£ËùÒÔΪÁË·ÀÖ¹Õâ¸öÎÊÌ⣬isa_configure()¶ÔÒѾ­È·ÈϹýµÄµÄioµØÖ·²»ÔÙ
¸ø±ðµÄprobe½øÐж¯×÷¡£
ͬÑù£¬´íÈϵĿÉÄÜÐÔÒ²Óеġ£±ØÒªµÄʱºòûÁ¬½ÓµÄÉ豸µÄprobeÒª½ûֹʹÓã¬
£¨ÔÚbootµÄ²ÎÊýµÄʱºò£©¡£

tseteen ·¢±íÓÚ 2004-4-5 20:24

´ó¼ÒºÃºÃ¿´Ò»ÏÂÄܹ»¿´¶®70%ÒÔÉϾͿÉÒÔÁË.

dada730 ·¢±íÓÚ 2004-5-11 16:49

Îļþϵͳ¸ñʽÎÒÒ»Ö±²»ÄܺÜÇå³þµÄÀí½â¡£Ã¿¸öblock¶¼ÓÐÒ»¸ö½ÚµãºÅºÍblockºÅ¡£¼ÙÈç˵°´ÕÕblockÀ´½øÐÐÎļþ´æÈ¡¿ÉÒÔÀí½â£¬µ«¶Ô´óÓÚÒ»¸öblockµÄÎļþ£¬ÊDz»ÊÇÒ²ÊÇÓÉÓи÷¸öblockºÅµÄblock×éºÏ³ÉÒ»¸öÎļþ¡£ÒÔǰ¼ÇµÃ±ðµÄÎÄÕÂÉÏ˵£¬windowsµÄ·ÖÇø¸ñʽʹ´ÅÅ̾­³£²úÉúÎļþË鯬£¬¶øunixϵľͲ»»á£¬ÎªÊ²Ã´¡£ÔÚblock¼¶±ðÉÏÓÐÊ²Ã´Çø±ð£¿Ò²¾ÍÊǶ¨ÒåµÄblockÓÐÊ²Ã´Çø±ð£¿

ÌìÃü¹Â¶À ·¢±íÓÚ 2004-7-18 08:22

ÕâÑùµÄºÃÌùÎÞÈ˶¥?

ͬÉÏ~ ÎÒÊÕ²Ø,лл°ßÖñ`

lijihuai ·¢±íÓÚ 2004-9-8 13:05

ºÕºÕ£¬¶àл¥Ö÷ÁË£¬ÊÕ²ØÁË

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.