ºìÁªLinuxÃÅ»§
Linux°ïÖú

BSDÄں˵¼¶Á

·¢²¼Ê±¼ä:2006-08-28 10:14:15À´Ô´:ºìÁª×÷Õß:yinzelei
¡¡¡¡Ò»°ãнӴ¥BSDÄں˵ÄÅóÓѶ¼»á¶ÔBSDÄں˵ĴúÂëµÄ×éÖ¯¸Ðµ½²»ÊÊÓ¦£¬ÓÉÓÚBSD¹úÄÚûÓÐÏñ
linuxÄÇÑù·á¸»µÄ×ÊÔ´£¬Ò»°ã²»ÖªµÀ¸Å´ÓÄĸöÎļþ¿´Æð¡£ÕâÀïÎҾͰÑBSDÄں˴úÂëµÄ×éÖ¯ÐÎ
ʽºÍBSDµÄ´óÖÂÆô¶¯Á÷³Ì×öÒ»¸ö¼òµ¥µÄ½éÉÜ£¬ÎÒ×Ô¼ºÒ²²Å¿ªÊ¼¿´£¬ÖªµÀµÄ¶«Î÷ÓÐÏÞ£¬Õâ¸ö
Ö»ÊÇÅ×ש֮×÷£¬»¹ÍûÄÜÒý³ö¸ü¶àµÄ¼ÑÓñ³öÀ´¡£
¡¡¡¡ÏÖÔڱȽÏÁ÷ÐеÄBSDÓÐÈý¸ö£ºFreeBSD£¬NetBSD£¬OpenBSD¡£Ö»ÊÇ˵±È½ÏÁ÷ÐУ¬ÏÖÔÚÊÀ½çÉϵÄ
BSDϵͳӦ¸ÃûÈËÖªµÀÓжàÉÙÖÖ£¬Èç¹ûÄúÓÐÐËȤ£¬¿ÉÒÔ×Ô¼ºÍ³¼Æһϡ£ÕâÈý¸öϵͳµÄ¿ª·¢
×ÚÖ¼²»´óÒ»Ñù£¬FreeBSDÖصãÔÚÓÚÇ¿ÓÐÁ¦µÄÖ§³Öx86, NetBSDµÄÄ¿±êÊÇÖ§³ÖÊÀ½çÉÏËùÓеÄCPU
£¬¶øOpenBSDÊÇÒªÌṩһÌ×ÊÀ½çÉÏ×ö°²È«µÄͨÓòÙ×÷ϵͳ¡£ÓÉÓÚNetBSDºÍOpenBSDÖ§³ÖµÄÌå
ϵ½á¹¹±ÈFreeBSD¶à£¬ËùÓÐËûÃǵÄĿ¼½á¹¹ºÍFreeBSDÓÐÒ»µã²î±ð£¬¾ÍÊÇÌåϵ½á¹¹Ïà¹ØµÄÎÄ
¼þµÄ´æ·ÅµÄλÖò»Ò»Ñù¡£
ÏÂÃæÏȽéÉÜÌåϵ½á¹¹Î޹صÄĿ¼£¬È»ºó½éÉÜÌåϵ½á¹¹Ïà¹ØµÄĿ¼£¬ÔÚ½éÉÜBSDµÄ´óÖÂ
Æô¶¯Á÷³Ì£¬×îºó½éÉÜһ϶ÁBSDµÄÄں˴úÂ붼ÓÐһЩʲô×ÊÁÏ¿ÉÒÔ²éÔÄ¡£
1. BSDÌåϵ½á¹¹ÎÞ¹ØĿ¼¡£
ÉÏÊöÈýÌ×BSDµÄ´úÂ붼¿ÉÒÔÔÚÆä¹Ù·½ÍøÕ¾ÉÏÏÂÔØ£¨Èç¹ûÄú»¹²»ÖªµÀÉÏÊöÈýÌ×ϵͳµÄ¹Ù·½
ÍøÕ¾£¬Ç°²Î±¾ÎĵĵÚ3½Ú£©£¬Ò»°ãÕûÌåϵͳµÄ´úÂë½Ðsrc.tar.gz, ÆäÖаüº¬ÁËÄں˴úÂë
µ¥¶ÀµÄÄں˴úÂë½Ðsys.tar.gz£¬µ±È»ÎÒÕâÀï˵µÄÊÇ´ò°üÁ˵ġ£¹Ù·½ÍøÕ¾»á¸æËßÄúÔõÑùµÃ
µ½BSDµÄ´úÂë¡£½«ÉÏÊöÎļþ½âѹµ½µ±Ç°Ä¿Â¼£¨linux»òÕßUNIXÏÂÖ´ÐÐ "tar -xzvf
sys.tar.fz -C ."£©£¬Äú½«ÔÚµ±Ç°Ä¿Â¼Ïµõ½Ò»¸ö½ÐsrcµÄĿ¼£¬Õâ¸ö¾ÍÊÇBSDÔ´´úÂë
µÄĿ¼£¬srcĿ¼ÏµÄsysĿ¼¾ÍÊÇBSDÄں˴úÂëµÄĿ¼£¬ÏÂÃæµÄ˵Ã÷¶¼¼ÙÉèÄúλÓÚ
src/sysĿ¼Ï¡£
ÔÚÄÚºËĿ¼Ï£¬Ò»°ã»áÓÐÒ»¸öMakefileÎļþ£¬È»ºóÓкܶàĿ¼£¬ÏÂÃæÎҾͿªÊ¼½éÉÜ¿´
Äں˴úÂëʱÖ÷Òª»á¿´µÄ¼¸¸öĿ¼ÏµÄÎļþÊǶ¼¸ÉʲôµÄ£¬Ö®ËùÒÔ²»È«²¿½éÉÜÊÇÒòΪÎÒÒ²
²»ÖªµÀÓÐЩĿ¼ÊǸÉʲôµÄ£¬ºÇºÇ¡£Æ½³£ÎÒÃÇ¿´BSDµÄ´úÂ룬һ°ã¶¼Ö»»á½Ó´¥Õ⼸¸öÄ¿
¼£ºarch¡¢conf¡¢dev¡¢kern¡¢lib¡¢net¡¢netinet¡¢sys¡¢uvm(Õâ
¸öÄ¿ÊÇNetBSDºÍOpenBSdÌØÓеÄ)£¬¶ÔÓÚÆäËûµÄĿ¼£¬ÎÒÏàÐÅÔÚÄú¿´ÁËһЩBSDµÄ´úÂëÖ®
ºó£¬¾ÍÖªµÀËûÃÇÊǸÉʲôµÄÁË¡£
arch/ £ºÊÇÌåϵ½á¹¹Ïà¹ØµÄĿ¼£¬ÏÂÃæÓкܶà¹ØÓÚ¸÷¸öÌåϵµÄ×ÓĿ¼£¬ºóÃæ»áÏêϸ½é
ÉÜÕâ¸öĿ¼ÏµÄÎļþ¡£
conf/ £ºÕâ¸öĿ¼ÏÂÊÇһЩϵͳͨÓõÄÅäÖÃÎļþµÄĿ¼.NetBSD3.0µÄÕâ¸öĿ¼ÏÂÓÐÒ»
¸öºÜÖØÒªÎļþMakefile.kern.inc£¬µ±ÄúÔںܶàMikefileÎļþÖж¼ÕÒ²»µ½Ä³¸ö
±äÁ¿µÄ¶¨Òåʱ£¬ÄǸö±äÁ¿ºÜ¿ÉÄܾÍÔÚÕâ¸öÎļþÖУ¬¶ÔÓÚBSDµÄMakefile£¬ÐèÒª
רÃŵÄÎĵµÀ´½éÉÜ¡£
dev/ : Õâ¸öĿ¼ÏÂÊÇһЩÉ豸¹ÜÀíµÄ´úÂë,±ÈÈçPCI×ÜÏß°¡£¬USBÉ豸°¡Ê²Ã´µÄ¡£
kern/ : Õâ¸öĿ¼ÊÇϵͳµÄÌåϵÎ޹صÄһЩͨÓÃËã·¨µÄʵÏÖĿ¼,±ÈÈçϵͳµÄµ÷¶È³ÌÐò
£¬¿ÉÖ´ÐÐÎļþµÄ¼ÓÔØ£¬ÏµÍ³µ÷µÄʵÏÖ£¬½ø³Ì¼äͨÐŵÄһЩËã·¨£¬ÒÔ¼°ÐéÄâÎļþ
ϵͳµÈ£¬Õâ¸öĿ¼ÊDzÙ×÷ϵͳԭÀíÖнéÉܵÄÄÚÈݵÄʵÏÖµÄÖ÷ҪĿ¼¡£
lib/ £ºÏµÍ³µÄһЩ¿âº¯Êý£¬×¢Ò⣬ÕâÀïÊÇϵͳÄں˵Ŀ⺯Êý£¬²»ÊÇÓ¦Óñà³ÌÖÐÄǸö
¿âº¯ÊýµÄµÄ¸ÅÄҲ¾ÍÊÇ˵£¬Äں˵ĺܶಿ·Ö»áÓõ½Ò»Ð©Í¨ÓÃÀý³Ì£¬±ÈÈçC
ÓïÑÔµÄһЩ×Ö·û´®³öÀ´µÄÀý³Ì,¾ÍÔÚÕâ¸öĿ¼ÏµÄlibsaĿ¼ÖС£ÓÉÓÚÄÚºËÊÇ
¾²Ì¬Á¬½Ó£¬¶øÇÒÆäûÓÐÏñÓ¦ÓóÌÐòÄÇÑùÓÐϵͳµ÷Óú͹²Ïí¿â¿ÉÒÔÓã¬ËùÒÔÄÚºË
ÖеÄËùÓк¯Êýµ÷ÓÃÊÇÒ»¸ö·â±ÕµÄϵͳ£¬²»ÏñÓ¦ÓóÌÐò£¬¾ÍËãÊǾ²Ì¬±àÒ룬×î
ºóµÄϵͳµ÷Óû¹ÊÇÒªµ÷ÓÃÍⲿº¯Êý£¨¾ÍÊÇÒªµ÷ÓÃÄÚºËÖеĺ¯Êý£©¡£
net/ : Õâ¸öĿ¼ÊÇÍøÂ粿·ÖÓÚЭÒéÎ޹صIJ¿·ÖµÄʵÏÖ

netinet/ :
Õâ¸öĿ¼ÊÇIPv4µÄЭÒéµÄʵÏÖ¡£
sys/ £º Õâ¸öĿ¼ÊÇϵͳÎ޹صÄÄÚºËÍ·ÎļþµÄĿ¼
uvm/ : Õâ¸öĿ¼ÊÇNetBSDºÍOpenBSDµÄÐéÄâÄÚ´æ¹ÜÀíʵÏÖµÄĿ¼£¬ÎÒ¸öÈËÊǼ«Á¦ÍƼö
¿´Ò»¿´Õâ¸öÐéÄâÄÚ´æ¹ÜÀí£¬Éè¼Æ¼ò½à£¬ÔËÐиßЧ£¬²»ÏñÓÐЩϵͳ£¬¶¼²»ÖªµÀ
ÄÄЩ´úÂëÔÚ¸Éʲô¡£
2. Ìåϵ½á¹¹Ïà¹ØµÄĿ¼
Ö÷Òª¾ÍÊÇarchĿ¼ÏµĶ«Î÷£¬ÔÚarchĿ¼Ï£¬NetBSDºÍOpenBSD¶¼»á¸ù¾Ý¾ßÌåµÄÌåϵ
½á¹¹ÓÐÒ»¸öĿ¼£¬Õâ¸öÌåϵ½á¹¹µÄËùÓÐÌåϵÏà¹ØµÄ¹¦ÄܵÄʵÏ־Ͷ¼ÔÚÕâ¸öĿ¼ÏÂÁË£¬
±ÈÈçIntelµÄx86Ìåϵ½á¹¹µÄ´úÂë¾ÍÔÚarch/i386/ÏÂÃæ¡£ÔÚarch/machine/£¨machine±í
ʾij¸öÌåϵ½á¹¹£©ÏÂÃ棬»á·Ö³ÉºÜ¶à×ÓĿ¼£¬ÏÖÔÚÎÒÃǼÙÉèλÓÚarch/machine/Ŀ¼ÏÂ
Ãæ¡£Ò»°ãÌåϵÏà¹ØµÄ´úÂëÔÚmachineÏ£¬Æô¶¯Ïà¹ØµÄ´úÂëλÓÚstand/Ï£¬ÅäÖÃĿ¼Ϊ
conf/£¬±àÒëĿ¼Ϊcompile£¬ÌåЭÏà¹ØµÄÄÚºËÍ·ÎļþλÓÚinclude/Ï£¬»¹ÓÐÆäËûһЩ
Ŀ¼¶¼ÊÇһЩÌåϵÏà¹ØµÄÍâÉèµÄ»òÕßÌåϵÏà¹ØµÄһЩÌØÊ⹦ÄܵÄʵÏÖ¡£
3. BSDϵͳµÄÆô¶¯Á÷³Ì
BSDϵͳÊÇ°ÑÄں˵±³ÉÒ»¸ö¿ÉÖ´ÐÐÎļþͨ¹ýÆô¶¯³ÌÐò¼ÓÔص½ÄÚ´æÖУ¬ËùÓÐËûµÄÆô¶¯³ÌÐò
Òª×öºÜ¶à¹¤×÷¡£ÏÖÔÚµÄBSDµÄÆô¶¯³ÌÐò¼¸ºõ¾ÍÏëÒ»¸öÖ§³ÖelfÎļþ¸ñʽºÍufsÎļþϵͳµÄ
Ò»¸öµ¥ÈÎÎñµÄСµÄ²Ù×÷ϵͳ£¬Æô¶¯³ÌÐòͬʱҲ֧³ÖһЩ¼òµ¥µÄÃüÁî¡£
ÕâÀïÒÔi386ƽ̨ΪÀý£¬½éÉÜOpenBSDµÄÆô¶¯Á÷³Ì£¬NetBSDµÄÆô¶¯Á÷³ÌÀàËÆ¡£
Õâ¸öÊÇarch/i386/stand/biosboot/biosboot.SÎļþ¿ªÍ·µÄ×¢ÊÍ£¬Êµ¼ÊÉÏËüÒѾ­Ïêϸ˵
Ã÷ÁËϵͳµÄÆô¶¯Á÷³Ì£ºBIOS¼ÓÔØMBRµ½0x7C00, È»ºó°Ñ×Ô¼º¿½±´µ½0x7A00, È»ºóMBR¼ÓÔØ
biosboot.Sµ½0x7C00, biosboot.S¼ÓÔØ/bootµ½ 4000£º0000, È»ºó/boot¼ÓÔØÄں˵½Ïà
Ó¦µÄÄڴ棬ÔÙ°Ñ¿ØÖÆȨ´«¸øÄںˡ£ÏàÓ¦µÄһЩÎļþ¶¼ÔÚstandĿ¼ÏÂ, mbrĿ¼ÏÂÊÇMBR
µÄ£¬bootÏÂÊÇ/bootϵģ¬ÓÃÓÚ´Ó´ÅÅÌÆô¶¯£¬cdbootÏÂÊÇcdromµÄÆô¶¯´úÂ룬pxebootÏÂ
ÊÇÍøÂçÆô¶¯µÄ´úÂ룬¾ßÌåµÄϸ½Ú¾ÍÐèÒª¶ÁÕß×Ô¼ºÈ¥¶Á´úÂëÁË¡£
*
* Memory layout:
*
* 0x00000 -> 0x079FF our stack (to 30k5)
* 0x07A00 -> 0x07BFF typical MBR loc (at 30k5)
* 0x07C00 -> 0x07DFF our code (at 31k)
* 0x07E00 -> ... /boot inode block (at 31k5)
* 0x07E00 -> ... (indirect block if nec)
* 0x40000 -> ... /boot (at 256k)
*
* The BIOS loads the MBR at physical address 0x07C00. It then relocates
* itself to (typically) 0x07A00.
*
* The MBR then loads us at physical address 0x07C00.
*
* We use a long jmp to normalise our address to seg:offset 07C0:0000.
* (In real mode on x86, segment registers contain a base address in
* paragraphs (16 bytes). 0000:00010 is the same as 0001:0000.)
*
* We set the stack to start at 0000:79FC (grows down on i386)
*
* We then read the inode for /boot into memory just above us at
* 07E0:0000, and run through the direct block table (and the first
* indirect block table, if necessary).
*
* We load /boot at seg:offset 4000:0000.
*
´ËʱOpenBSD¾Í½øÈëÁËarch/i386/i386/locore.SµÄstart£º´¦£¬µ±È»Òýµ¼³ÌÐò»á´«ºÜ
¶à²ÎÊý¸øÄںˣ¬È»ºóÊDzÙ×÷ϵͳµÄ³õʼ»¯´úÂëÁË£¬ÏÖÔھͿÉÒÔ¸ú×Å´úÂë¶ÁÏÂÈ¥ÁË¡£
NetBSDµÄÆô¶¯Á÷³ÌËäÈ»ºÍÕâ¸ö²»Ò»Ñù£¬µ«ÀàËÆ¡£ËûÊÇÈý¼¶Æô¶¯¡£ÆäÆô¶¯´úÂëÒ²ÔÚstand
Ŀ¼Ï£¬ÓÉmbr/mbr.S¼ÓÔØbootxx/pbr.S£¬È»ºópbr.S¼ÓÔØbootxxµÄÆäÓಿ·Ö£¬bootxx
ÔÙ¼ÓÔØboot/ϵijÌÐò,Õâ¸ö³ÌÐò¾ÍÊÇ/boot, /bootÔÚÔËÐÐnetbsd£¬ÕâÑùÄں˾ÍÆô¶¯ÁË¡£
Äں˱»¼ÓÔغóÖ´ÐеĴúÂëÊÇarch/machine/machine/locore.SÎļþ£¬¶ÔÓÚi386, ÄÚºËÖ´
ÐÐÕâ¸öÎļþʱÒѾ­Ê±±£»¤Ä£Ê½ÏÂÁË£¬µ½ÁËÕâ¸öÎļþÖ®ºó£¬¾ÍÊÇϵͳµÄһЩ³õʼ»¯Ïà¹Ø
µÄ¹¤×÷ÁË£¬È»ºó¾Í¿ÉÒÔ¸ú×Å´úÂë¶ÁÏÂÈ¥ÁË¡£

×ܵÄÀ´Ëµ£¬³ýÁËÍøÂ磬ÆäËû²¿·ÖOpenBSD´¦ÀíµÄ±ÈNetBSDÒª¼òµ¥Ò»Ð©£¬ÎÒµÄÒâ˼ÊÇÒªºÃ
¶®Ò»Ð©¡£
4. ¶ÁBSDÄں˵ÄÏà¹Ø×ÊÁÏ
µÚÒ»±¾Òª¿´µÄÊéÊÇ¡¶The Design of the UNIX Operating System¡·¡£Õâ±¾ÊéÊÇ¿´ËùÓÐ
UNIX²Ù×÷ϵͳ±È¿´µÄÊé¡£
OpenBSDµÄÄں˻¹ÊDZȽϴ«Í³µÄ£¬Èç¹û²»¹ÜÍøÂ磬¡¶the Design and Implementation
of the 4.4BSD Operating System¡· ºÍuvm×÷ÕߵIJ©Ê¿ÂÛÎľͲ¶àÁË¡£OpenBSDµÄ
ÍøÂçÊÇÒ»´ó¿é£¬ÏÖÔÚÎÒ»¹Ã»ÓÐÁ˽â¹ý£¬ËùÒÔ²»×ö˵Ã÷£¬»¹ÇëÖªµÀµÄÅóÓÑÄÜ·ñ½éÉÜһϡ£

NetBSDµÄÄں˺Í4.4BSDÏà±È¾Í¸ÄÁ˺ܶàÁË£¬Ôö¼ÓÁ˺ܶàÐµĹ¦ÄÜ£¬±ÈÈçÏ̵߳÷¶È£¬
¶à´¦ÀíÆ÷Ö§³ÖµÈµÈ£¬NetBSDµÄ¹Ù·½ÍøÕ¾ÉÏÓкܶàºÜÓÐÓõÄ×ÊÁÏ¡£¹ØÓÚËüµÄÏ̵߳÷¶È£¬
ÎÒһֱûÓÐÕÒµ½ºÜºÃµÄ×ÊÁÏ£¬ÄÇλÅóÓÑÖªµÀµÄ»°²»ÖªÄÜ·ñÄܽéÉÜһϡ£
Ïà¹ØÍøÖ·£º
1. ÈýÌ×ϵͳµÄ¹Ù·½ÍøÕ¾£º
ÉÏÃæµÄ½éÉÜÖп϶¨Óкܶ಻Í×Ö®´¦£¬»¶Ó­´ó¼ÒÌÖÂÛ£¬Í¬Ê±Ò²Ï£ÍûÄÜÒý³ö¸ü¶àµÄÃÀÓñ³öÀ´¡£
»¶Ó­´ó¼ÒÀ´ÐźÍÎÒÌÖÂÛ¹ØÓÚBSDºÍplan9µÄÎÊÌâ(BSDºÍplan9¶¼ÔÚѧϰÖÐ)¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ