This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

µ¹¦³¤ß²`¤J¬ã¨sªº FreeBSD hacker

Chapter 13. µ¹¦³¤ß²`¤J¬ã¨sªº FreeBSD hacker

Q: SNAPs ©M RELEASEs ¬O¤°»ò¡H
Q: §Ú­n«ç»ò§@¥X¦Û¤vªº release¡H
Q: «ç¼Ë¤~¯à°µ¥X¦Û¤v¥Îªº¦w¸ËºÏ¤ù¡H
Q: ``make world'' §â­ì¨Ó¸Ëªº binary Àɳ£´«±¼¤F¡C
Q: ¦b¨t²Î¶}¾÷®É¡A¥X²{ ``(bus speed defaulted)''¡C
Q: §Úªººô¸ô³s½u¤£§Ö¡A¨º¥i¥H¸òµÛ current ªºµo®i¶Ü¡H
Q: §A¬O«ç»ò§âµo¦æª©¥»¤¤ªºÀɮפÁ¦¨¤@­Ó­Ó 240k ªº¤pÀɮסH
Q: §Ú¦b kernel ¸Ì¥[¤F¨Ç·s¥\¯à¡A­n§â¥¦±Hµ¹½Ö¡H
Q: ISA ªº Plug N Play ¥d¬O«ç»ò°»´ú©Mªì©l¤Æªº¡H
Q: FreeBSD ¬O§_¦³¤ä´© x86 ¥H¥~ªº¾÷¾¹¬[ºc¡H
Q: §Ú­è­è¼g¤F¬Y­Ó³]³ÆªºÅX°Êµ{¦¡¡A¯à¤£¯àµ¹¥¦¤@­Ó major number¡H
Q: Ãö©ó©ñ¸m¥Ø¿ý©MÀÉ®× inode §@ªk¤Wªº¬Û²§
Q: ¦p¦ó±q kernel panic ±o¨ì³Ì¦h¸ê°T¡H
Q: dlsym() ¹ï ELF °õ¦æÀɤ£¯à¥Î!
Q: ¼W¥[©Î´î¤Ö kernel ¯à©w§}ªºªÅ¶¡

Q: SNAPs ©M RELEASEs ¬O¤°»ò¡H

A: ¥Ø«e¦³¤T­Ó¬¡ÅD/¥b¬¡ÅDªº¤À¤ä¦b FreeBSD ªº CVS Repository:

  • RELENG_2_2 §Y 2.2-stable §Y "2.2 branch"

  • RELENG_3 §Y 3.x-stable §Y "3.0 branch"

  • HEAD §Y -current §Y 4.0-current



¦p¦P¨ä¥L¨â­Ó¡AHEAD ¨Ã¤£¬O¯u¥¿ªº branch tag¡A¥¦¥u¬O¤@­Ó²Å¸¹ ±`¼Æ¡A«ü¦V "current¡G©|¥¼¤À¤äªºµo®i¤¤ª©¥»" ¡A²°O¬° -current¡C

¥H²{¦b¨Ó»¡¡A-current ´Â¦V 4.0 µo®i¡A¦Ó 3.0-stable ³o ­Ó¤À¤ä¡A¤]´N¬O RELENG_3¡A¦b 1999 ¦~ 1 ¤ë±q -current ¤À¥X ¨Ó¡C

2.2-stable ³o­Ó¤À¤ä¡A¤]´N¬O RELENG_2_2¡A¬O¦b 1996 ¦~ 11 ¤ë±q -current ¤À¥X¨Ó¡C

2.1-stable ³o­Ó¤À¤ä¡A¤]´N¬O RELENG_2_1_0¡A«h¬O¦b 1994 ¦~ 9 ¤ë±q -current ¤À¤ä¥X¨Ó¡A³o­Ó¤À¤ä¤w¸g§¹¥þ°h¥ð¤F¡C

Q: §Ú­n«ç»ò§@¥X¦Û¤vªº release¡H

A: °µ release ¥]¬A¤U­±³o¤T­Ó¨BÆJ¡G­º¥ý¡A°µ¥X¦³ vn ³o­ÓÅX°Êµ{ ¦¡ªº¥i¥Î kernel¡C§â¤U­±³o¤@¦æ¥[¨ì kernel ³]©wÀÉ¡AµM«á°µ¥X·sªº kernel ­«·s¶}¾÷¡G

        pseudo-device vn         #Vnode driver (turns a file into a device)
      



±µµÛ¡A§A¤â¤W­n¦³¾ã­Ó CVS repository¡C¥i¥H°Ñ¦Ò CVSUP ³o½g¤å³¹¡A¦ý¦b supfile ¤¤§â release ¦WºÙ³]¦¨ cvs¡A¦A§R±¼©Ò¦³ tag ©Î date ªºÄæ¦ì¡A¦p ¤U¡G

        *default prefix=/home/ncvs
        *default base=/a
        *default host=cvsup.FreeBSD.org
        *default release=cvs
        *default delete compress use-rel-suffix

        ## Main Source Tree
        src-all
        src-eBones
        src-secure

        # Other stuff
        ports-all
        www
        doc-all
      



µM«á°õ¦æ cvsup -g supfile §â©Ò¦³ªF¦è³£§ì¤U¨Ó...

³Ì«á¡AµwºÐ­n¦³¬Û·í¤jªºªÅ¶¡¨Ó°µ release¡C°²³]§A·Q§â¥¦©ñ¦b /some/big/filesystem ³o¸Ì¡A¤W­±³o­Ó¨Ò¤l¤]§â CVS repository ©ñ¦b /home/ncvs ¤F¡A±µµÛ¡G

        setenv CVSROOT /home/ncvs        # or export CVSROOT=/home/ncvs
        cd /usr/src/release
        make release BUILDNAME=3.0-MY-SNAP CHROOTDIR=/some/big/filesystem/release
      



¾ã­Ó release ·|°µ¦b /some/big/filesystem/release¡Cµ²§ô ®É /some/big/filesystem/release/R/ftp ³o­Ó¥Ø¿ý¥i¥Hª½±µ¥Î ¨Ó°µ¬° FTP ¦w¸Ë¤è¦¡ªº¨Ó·½¡C¦pªG·Q°µ¥X -current ¥H¥~¤À¤äªº SNAP¡A ¦b¤W­± make release ³o¤@¦æ¥[ RELEASETAG=SOMETAG¡CÁ|¨Ò¨Ó»¡¡A RELEASETAG=RELENG_2_2 ³o­Ó°Ñ¼Æ·|°µ­Ó§Y®Éªº 2.2-STABLE snapshot¡C

Q: «ç¼Ë¤~¯à°µ¥X¦Û¤v¥Îªº¦w¸ËºÏ¤ù¡H

A: «Ø¥ß¦w¸ËºÏ¤ù¡BÁÙ¦³°µ¥X source/binary archive¡A³£¬O¥Ñ /usr/src/release/Makefile ¸Ì­±ªº¦UºØ target ¦Û°Ê²£¥Í¡A³o ­ÓÀɮ׸̪º¸ê°TÀ³¸Ó¨¬¥H¶}©l¡C¦ý¬O³o­Ó¹Lµ{²o¯A¨ì make world¡A©Ò¥H·| ¥Î¨ì¬Û·í¦hªº®É¶¡©MµwºÐªÅ¶¡¡C

Q: ``make world'' §â­ì¨Ó¸Ëªº binary Àɳ£´«±¼¤F¡C

A: ¨S¿ù¡A´N¬O³o¼Ë¤l¡C¦p¦W¦r©Ò¥Ü¡A``make world'' ·|­«·s½s͍t²Î¤º«Ø ªº¨C­Ó binary ÀÉ¡A³o¼Ë¦bµ²§ô®É´N¥i½T©w¦³­Ó¤@­P¥B°®²bªºÀô¹Ò(©Ò¥H­n ªá¤W¦n¤@¬q®É¶¡)¡C

¦b°õ¦æ ``make world'' ©Î ``make install'' ®É¡A¦pªG¦³ ³] DESTDIR ³o­ÓÀô¹ÒÅܼơA·s²£¥Íªº binary ±N·|¸Ë¦b ${DESTDIR} ¤Uªº¦P¼Ë¥Ø¿ý¾ð¤¤¡C¦ý¦b¬Y¨Ç­× §ï shared library ©M­««Ø binary ªºµL¯S©w±¡ªp¤U¡A³o¼Ë°µ¥i¯à·|¨Ï ``make world'' ¥¢±Ñ¡C

Q: ¦b¨t²Î¶}¾÷®É¡A¥X²{ ``(bus speed defaulted)''¡C

A: Adaptec 1542 SCSI ¥d¤¹³\¨Ï¥ÎªÌ¥Î³nÅé½Õ¾ã¶×¬y±Æªº¦s¨ú³t«×¡C¦­ ´Áªº 1542 ÅX°Êµ{¦¡¸Õ¹Ï±N¥¦³]¦¨¥i¥Îªº³Ì§Ö³t«×¡A¦ý«á¨Óµo²{¦b¤@¨Ç ¾÷¾¹¤W¤£¯à¥Î¡A©Ò¥H²{¦b­n¦b kernel ³]©w¤¤¥[ ``TUNE_1542'' ³o­Ó¿ï¶µ¨Ó±Ò°Ê³o­Ó¥\¯à¡C¦b¤ä´©ªº¾÷¾¹¤W¥Î³o­Ó¿ï¶µ·|¨ÏµwºÐ¦s¨ú§ó §Ö¡A¦ý¦b¤£¤ä´©ªº¾÷¾¹¤W¦³¥i¯à·|·´±¼¸ê®Æ¡C

Q: §Úªººô¸ô³s½u¤£§Ö¡A¨º¥i¥H¸òµÛ current ªºµo®i¶Ü¡H

A: ¥i¥H¡AÂÇµÛ CTM ´N ¥i¥H¤£¥Î¤U¶Ç©Ò¦³ªº­ì©l½X¥Ø¿ý¾ð¡C

Q: §A¬O«ç»ò§âµo¦æª©¥»¤¤ªºÀɮפÁ¦¨¤@­Ó­Ó 240k ªº¤pÀɮסH

A: ¦b¥H BSD ¬°¥Dªº¸û·s¨t²Î¤¤¡Asplit ¦³­Ó ``-b'' ¿ï¶µ¡A¬O¥Î¨Ó §âÀÉ®×¥H¥ô·N¼Æ¥Ø byte ¤Á¶}¡C

³o¸Ì¬O /usr/src/Makefile ¤¤ªº¤@­Ó¨Ò¤l¡G

        bin-tarball:
        (cd ${DISTDIR}; \
        tar cf - . \
        gzip --no-name -9 -c | \
        split -b 240640 - \
        ${RELEASEDIR}/tarballs/bindist/bin_tgz.)
      



Q: §Ú¦b kernel ¸Ì¥[¤F¨Ç·s¥\¯à¡A­n§â¥¦±Hµ¹½Ö¡H

A: ½Ð¬Ý¤@¤U Handbook ¤¤¥[¤Jµ{¦¡½Xªº³¡¥÷¡C

¦P®É¤]·PÁ§Aªº¶O¤ß¡I

Q: ISA ªº Plug N Play ¥d¬O«ç»ò°»´ú©Mªì©l¤Æªº¡H

A: ¥Ñ Frank Durda IV ©Ò¼g¡G

²³æªº»¡¡A·í¥D¾÷µo¥X¬O§_¦³ PnP ¥dªº¸ß°Ý°T¸¹®É¡A©Ò¦³ªº PnP ·|¦b´X­Ó©T©wªº I/O port §@¦^À³¡C©Ò¥H·í°»´ú PnP ªºµ{¦¡¶}©l®É¡A¥¦ ·|¥ý°Ý¦³¨S¦³ PnP ¥d¦b¡A±µµÛ©Ò¦³ PnP ¥d·|¦b¥¦©ÒŪªº port ¥H¦Û¤v ªº«¬¸¹ # §@¦^µª¡A³o¼Ë°»´úµ{¦¡´N·|±o¨ì¤@­Ó wired-OR ``yes'' ªº¼Æ¦r¡A¨ä¤¤¦Ü¤Ö·|¦³¤@­Ó bit ¬O¥´¶}ªº¡CµM«á°»´úµ{¦¡·|­n¨D«¬¸¹ (¥Ñ Microsoft/Intel«ü©w)¤p©ó X ªº¥d``Â÷½u''¡A¦A¥h¬Ý¬O§_ÁÙ¦³¥d¦^ µª¦P¼Ëªº¸ß°Ý¡A¦pªG±o¨ì ``0''¡A´Nªí¥Ü¨S¦³«¬¸¹¤j©ó X ªº¥d¡C ²{¦bµ{¦¡·|°Ý¬O§_¦³«¬¸¹¤p©ó X ªº¥d¡A¦pªG¦³ªº¸Ü¡Aµ{¦¡¦A­n«¬¸¹¤j©ó X-(limit/4) ªº¥dÂ÷½u¡AµM«á­«ÂФW­±ªº°Ê§@¡C¥Î³oºØÃþ¦ü binary search ªº¤èªk¡A¦b¬Y½d³ò¤º§ä­Ó´X¦¸«á¡A°»´úµ{¦¡³Ì«á·|¦b¾÷¾¹¤¤°Ï¤À ¥X©Ò¦³ªº PnP ¥d¡A·j´M¦¸¼Æ¤]»·§C©ó¤@­Ó­Ó§äªº 2^64 ¦¸¡C

¤@±i¥dªº ID ¥Ñ¨â­Ó 32-bit(©Ò¥H¤W­±¬O 2Æ64) + 8bit °»¿ù ½X²Õ¦¨¡A²Ä¤@­Ó 32 bits ¬O¥Î¨Ó°Ï¤À¦U®a¼t°Óªº¡C³o¨Ç¼t°Ó¨S¦³¥X¨Ó¼á ²M¹L¡A¦ý¬Ý¨ÓÀ³°²³]¦P¤@®a¥Xªº¤£¦PºØÃþªº¥dªº¼t°Ó ID ¦³¥i¯à¤£¦P¡C ¥Î 32 bits ¥u¨Óªí¥Ü¤£¦P¼t°Óªº·Qªk¹ê¦b¦³ÂI¹LÀY¤F¡C

²Ä¤G­Ó 32 bits «h¬O«¬¸¹ #¡B¤A¤Óºô¸ô¦ì§}¡B©Î¤@¨Ç¨Ï³o±i¥d¿W ¯Sªº¸ê®Æ¡C°£«D²Ä¤@­Ó 32 bits ¤£¦P¡A§_«h¼t°Ó¤£¥i¯à§@¥X²Ä¤G­Ó 32 bit ¬Û¦Pªº¨â±i¥d¡C©Ò¥H¦b¤@¥x¾÷¾¹¤¤¥i¥H¦³¦P¼Ëªº¦n´X±i¥d¡AµM¦Ó¥L­Ì ¾ã­Ó 64 bits ÁÙ¬O·|³£¤£¤@¼Ë¡C

³o¨â­Ó 32 bit ¥Ã»·³£¤£¥i¯à¬°¹s¡A³o¨Ï±o³Ì¶}©l binary search ¤¤ ªº wired-OR ·|±o¨ì¤@­Ó«D¹s¼Æ¦r¡C

¤@¥¹¨t²Î°Ï¤À¥X©Ò¦³¥dªº ID¡A±µµÛ·|¸g¥Ñ¦P¼Ëªº port ¤@­Ó­Ó­«·s±Ò °Ê¨C±i¥d¡A±µµÛ§ä¥X¤wª¾¤¶­±¥d©Ò»Ýªº¸ê·½¡B¦³­þ¨Ç¥i¥H¿ïªº interrupt µ¥µ¥¡C©Ò¦³¥d³£·|³Q±½´y¤@¦¸¡A¨Ó¦¬¶°³o¨Ç¸ê®Æ¡C

³o¨Ç¸ê°T±µµÛ©MµwºÐ¤Wªº ECU ÀɮסB©Î MLB BIOS ¸Ìªº¸ê®Æµ²¦X¦b¤@ °_¡A³q±`¬Oºî¦X ECU ©M MLB ¸Ìªº BIOS PnP ¸ê®Æ¡A³o¨Ç¶gÃä¨Ã¤£¤ä´©¯u ¥¿ªº PnP¡AµM¦Ó°»´úµ{¦¡¦bÀˬd BIOS ©M ECU ¸ê®Æ«á¡A¥¦¥i¥HÁ×§K PnP ¶gÃä©M¨º¨Ç°»´ú¤£¨ìªº¬Û½Ä¬ð¡C

±µµÛ¦A«×«ô³X³o¨Ç PnP ¶gÃä¡A³o¦¸·|§â¥i¥Îªº I/O¡BDMA¡BIRQ ©M°O ¾ÐÅé¬M®gªº¦ì§}³£«ü©wµ¹¥¦­Ì¡C³o¨Ç¶gÃä´N·|¥X²{¦b©Ò«ü©wªº¦a¤è¡Aª½¨ì ¤U¤@¦¸­«·s¶}¾÷¬°¤î¡A¤£¹L¤]¨S¦³¤H»¡¤£¯à§â¥¦­ÌÀH®É²¾¨Ó²¾¥h¡C

¤W­±¦³¬Û·í¦hªºÂ²¤Æ¡A¦ý§AÀ³¸Ó¤w¸g¤F¸Ñ¤j­Pªº¹Lµ{¡C

Microsoft §âªí¥Ü¦Lªí¾÷ª¬ºAªº´X­Ó¥D­n port ®³¨Ó§@ PnP¡A¥L­Ìªº ÅÞ¿è¬O¨S¦³¤@±i¥d·|¦b³o¨Ç¦a¤è¸Ñ½X§@¬Û¤Ïªº I/O cycles¡C¦ý¬O§Ú§ä¨ì ¤@´Ú¦­´Á¤´¦bµû¦ô PnP ´£®×®Éªº IBM ­ì¼t printer board¡A¥¦ªº½T¥h¸Ñ ¹ï³o¨Çª¬ºA port ªº¼g¤J¸ê®Æ¡A¦ý¬O MS ``»¡¤F´Nºâ''¡C©Ò¥H¥¦­Ìªº½T¦³ ¹ï¦Lªí¾÷ª¬ºA port ¼g¤J¡AÁÙ¦³Åª¨ú¸Ó¦ì§} + 0x800¡B©M¥t¤@­Ó¦b 0x200 ¤Î 0x3ff ¤§¶¡ªº port¡C

Q: FreeBSD ¬O§_¦³¤ä´© x86 ¥H¥~ªº¾÷¾¹¬[ºc¡H

A: ¦³´X¸s¤H¤h¤w¸gªí¥Ü¹ïµo®i¦h¥­¥x FreeBSD ªº¿³½ì¡A¨ä¤¤ FreeBSD/AXP (ALPHA) §Y¬O¨ä¤¤¬Û·í¦¨¥\ªº¨Ò¤l¡A¥i¥H¦b ftp://ftp.FreeBSD.org/pub/FreeBSD/alpha ³o¸Ì¨ú±o¥¦ªº 3.0 SNAPshot ª©¥»¡CALPHA ª©ªº FreeBSD ¦b¶V¨Ó¶V¦hªº ALPHA ¾÷¾¹¤W ¨Ï¥Î¡A¨ä¤¤¥]¬A¤F AlphaStation¡BAXPpci¡BPC164¡BMiata ©M Multia ³o´XºØ¡C­nµ¥¨ì¨t²Î¦w¸Ë¤u¨ã§¹¥þ¡B¯à¥Î¥úºÐ¦w¸Ë¡B¥H¤Î¦³¨¬°÷¯à¥Îªº port/package ¤§«á¡A§Ú­Ì¤~¥´ºâ§â¥¦·í§@§¹¾ãªºª©¥»¡A©Ò¥H²{¦bÀ³¸Ó§â FreeBSD/AXP ·í§@ BETA «~½èªº³nÅé¡C­Y­n¬ÛÃöª¬ªpªº®ø®§¡A½Ð¥[¤J mailing list¡C

¤]¦³¤Hªí¥Ü¹L±N FreeBSD SPARC ª©¥»ªº¿³½ì¡A¦pªG§A·Q°Ñ¥[³o­Ó­pµe¡A ½Ð¥[¤J mailing list¡C¦pªG·Q­nª¾¹DÃö©ó ·s¥­¥xªº°Q½×¡A½Ð¥[¤J mailing list ¡C

Q: §Ú­è­è¼g¤F¬Y­Ó³]³ÆªºÅX°Êµ{¦¡¡A¯à¤£¯àµ¹¥¦¤@­Ó major number¡H

A: ³o­n¬Ý§A¬O§_¥´ºâ±N³o­ÓÅX°Êµ{¦¡¤½¶}¨Ï¥Î¡A¦pªG¬Oªº¸Ü¡A½Ð§â¥¦ªº­ì©l ½X°e¤@¥÷µ¹§Ú­Ì¡AÁÙ¦³ files.i386 ­×§ïªº³¡¥÷¡Bkernel ³]©w Àɼ˥»¡B¥H¤Î¥Î¨Ó²£¥Í³]³ÆÀɪº MAKEDEV¡C ¦pªG§A¤£¥´ºâ¡B©Î¦]¬°ª©Åv°ÝÃD¦Ó¤£¯à¤½¶}ªº¸Ü¡A§Ú­Ì¦³¯S¦a«O¯d character major number 32 ©M block major number 8 µ¹³o¤è­±ªº¨Ï¥Î¡A ª½±µ¥Î³o¨â­Ó´N¦n¤F¡C¤£½×¦p¦ó¡A§Ú­Ì³£·|«Ü·P¿E§A¯à¦b µoªíÅX°Êµ{¦¡ªº®ø®§¡C

Q: Ãö©ó©ñ¸m¥Ø¿ý©MÀÉ®× inode §@ªk¤Wªº¬Û²§

A: ¦b¦^µª¦³Ãö¥Ø¿ý©ñ¸m¤è¦¡¤£¦Pªº°ÝÃD¤W¡A§Ú¦b 1983 ¦~¼g¦n¥Ø«eªº§@ªk «á´N¨S¦³¦A§ïÅܹL¡A³oºØ¤è¦¡¬O°w¹ï­ì¥ýªº FFS Àɮרt²Î¡A«á¨Ó¤]¨S ¦³¹ï¥¦§@¥ô¦ó§ó°Ê¡C¥¦¦bÁ×§K cylinder group ³Q¶ñº¡³o¤è­±°µ±o¬Û·í ¦¨¥\¡A¦ý¬O´N¹³¦³¨Ç¤H¤w¸gª`·N¨ì¡A¥¦©M `find' ´N°t¦X±o¤£¤j¦n¡C¤j ³¡¥÷ªºÀɮרt²Î¬O¥Ñ¨º¨Ç¥Î depth first search(aka ftw) ²£¥Íªº archive »s³y¥X¨Ó¡A¸Ñ¥X¨Óªº¥Ø¿ý inode ·|¾î¸ó¦n´X­Ó cylinder group¡A¦pªG¥H«á­n°µ depth first search ªº¸Ü¡A³o¬O³ÌÁV¿|ªº±¡ªp¤§ ¤@¡C¦pªG§Ú­Ìª¾¹DÁ`¦@·|²£¥Í¦h¤Ö¥Ø¿ýªº¸Ü¡A¸Ñªk¬O¦b°µ¥ô¦ó¦s¨ú/¼g ¤J°Ê§@¤§«e¡A¦b¨C­Ó cylinder group ¤W¥ý³y¥X(©Ò¦³¥Ø¿ý¼Æ/cylinder greoup ªº¼Æ¥Ø)³o»ò¦hªº¥Ø¿ý¡C«Ü©úÅ㪺¡A§Ú­Ì¥²¶·­n¦³®Ú¾Ú¦a¥h²q³o ­Ó¼Æ¦r¡A´Nºâ¤@­Ó¹³ 10 ªº«Ü¤p©T©w¼Æ¥Ø¤]·|¨Ï®Ä²v¥H¯Å¼Æ¦¨ªø¡C°Ï¤À restore (§Y¸Ñ¶}¤W­zªº archive) ©M¤@¯ëÀÉ®×¾Þ§@ªº¤èªk¥i¥H¬O(²{¦b ¥Îªººtºâªk¥i¯à­n§ó±Ó·P)¡G¦pªG¤@¨Ç¥Ø¿ý(³Ì¦h 10 ­Ó)³£¦b 10 ¬í¤º²£ ¥Íªº¸Ü¡A¨º»ò´N§â³o¨Ç¥Ø¿ý»E¶°¦b¦P¤@­Ó cylinder group¡C¤£ºÞ«ç¼Ë¡A §Úªº¸gÅç«ü¥X³o¬O¤@­Ó¤w¸g¥R¥÷¹êÅç¹Lªº³¡¥÷¡C

Kirk McKusick, September 1998

Q: ¦p¦ó±q kernel panic ±o¨ì³Ì¦h¸ê°T¡H

A: [³o¸`¬O±q Bill Paul ¦b freebsd-current mailing list ¤Wµoªí ªº«H¤¤¸`¿ý¡ADag-Erling Coïdan Smørgrav ­×¥¿¤F¥´¦r¿ù»~¡B¦A¥[¤W¬A©·¸Ìªºª`¸Ñ¡C]

From: Bill Paul <wpaul@skynet.ctr.columbia.edu>
Subject: Re: the fs fun never stops
To: ben@rosengart.com
Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
Cc: current@FreeBSD.org
      



[<ben@rosengart.com> µoªí¤F¤U­±ªº panic °T®§]

> Fatal trap 12: page fault while in kernel mode
> fault virtual address   = 0x40
> fault code              = supervisor read, page not present
> instruction pointer     = 0x8:0xf014a7e5
                                ^^^^^^^^^^
> stack pointer           = 0x10:0xf4ed6f24
> frame pointer           = 0x10:0xf4ed6f28
> code segment            = base 0x0, limit 0xfffff, type 0x1b
>                         = DPL 0, pres 1, def32 1, gran 1
> processor eflags        = interrupt enabled, resume, IOPL = 0
> current process         = 80 (mount)
> interrupt mask          =
> trap number             = 12
> panic: page fault
      



·í§A¬Ý¨ì¹³³o¼Ëªº°T®§®É¡A¥u§â¥¦«þ¤@¥÷°e¤W¨Ó¬O¤£°÷ªº¡C§Ú¦b¤W ­±¯S¦a¼Ð©úªº instruction pointer ­È¬Û·í­«­n¡A¤£©¯ªº¬O¥¦·|¦]³] ©w¦Ó¤£¦P¡C´«¥y¸Ü»¡¡A³o­Ó­È·|¸ò§A¥Îªº kernel image ÀɦÓÅܰʡC¦p ªG¬O¥Î¬Y­Ó snapshot ª©¥»ªº GENERIC kernel¡A¤]³\¨ä¥L¤H¥i¥H°lÂÜ ¨ì¥X°ÝÃDªº¨ç¦¡¡A¦ý¦pªG§A¬O¥Î¦Û­qªº kernel¡A¨º»ò¥u¦³§A¤~¯à §i¶D§Ú­Ì°ÝÃD¥X¦b¨º¸Ì¡C

­n°µªº¨Æ¥]¬A³o¨Ç¡G

  • §â instruction pointer ªº­È°O¤U¨Ó¡Cª`·N¦b«e­±ªº 0x8: ¦b³o­Ó±¡ªp¤¤¨Ã¤£­«­n¡A§Ú­Ì­nªº¬O 0xf0xxxxxx¡C

  • ·í¨t²Î­«·s¶}¾÷«á¡A°õ¦æ³o¹D©R¥O¡G

    % nm /(³y¦¨ panic ªº kernel ÀÉ®×) | grep f0xxxxxx
              

    ¨ä¤¤ f0xxxxxx ´N¬O°O¤U¨Óªº instruction pointer ­È¡C¦³¥i¯à ¤£·|­è¦n§ä¨ì§¹¾ãªº³o­Ó¦r¦ê¡A³o¬O¦]¬° kernel symbol table ¸Ìªº¦U ­Ó symbol ¥u¬O¨ç¦¡ªº¶i¤JÂI¡A¦ý instruction pointer ©Ò«üªº¦ì§}¦³ ¥i¯à¬O¦b¨ç¦¡¤ºªº¬Y¤@³B¡A¦Ó¤£¤@©w¦b¶}ÀY¡C©Ò¥H¦pªG§ä¤£¨ì¾ã­Ó¦r¦ê¡A ¨º»ò§â instruction pointer ­Èªº³Ì«á¤@­Ó¼Æ¦r®³±¼¡A¦A¸Õ¤@¦¸¡G

    % nm /kernel.that.caused.the.panic | grep f0xxxxx
      

    ¦pªG³o¼Ë¤]§ä¤£¨ì¡A¨º´N§â¥t¤@­Ó¼Æ¦r¥h±¼¦A§ä¡A¤@ª½­«½Æ¨ì§ä¨ì¬°¤î¡A µ²ªG¬O¤@¦ê¥i¯à³y¦¨ panic ªº¨ç¦¡¦Cªí¡C³o¼Ë¤ñª½±µ§ä¨ì¥X°ÝÃDªº¨ç¦¡ ¨Ó±o®t¡A¦ý¦Ü¤Ö¦n¹L¤°»ò³£¨S¦³¡C



§Ú±`±`¬Ý¨ì¤H­ÌÅã¥Ü¤@¤j¤ù panic °T®§¡A¦ý«Ü¤Ö¬Ý¨ì¦³¤Hªá¤@ÂI®É¶¡ §â instruction pointer ©M kernel symbol table ¤¤ªº¨ç¦¡¤ñ¸û¤@¤U¡C

­n°lÂÜ¥X³y¦¨ panic ­ì¦]ªº³Ì¦n¤èªk¬O¥ý°µ¥X crash dump¡AµM«á¥Î gdb(1) ¦b¤W­±°µ stack trace¡C·íµM¡A³o­n¾a -current ¤¤ªº gdb(1) ¯à¹B§@¥¿±`¡AµM¦Ó§ÚµLªk«OÃÒ³o¤@ÂI¡C(°O±o¦³¤H»¡ ELF ªº gdb(1) ¦b kernel ªº crash dump ¤W¤£¯à¥¿±`¾Þ§@¡A¦b 3.0 ²æÂ÷ BETA ¶¥¬q®É³Ì¦n¦³¤H¥ýÀˬd³o¤è­±ªºª¬ªp¡A§K±o«Ü¦h¤H¦b¦¬¨ì 3.0 ¥úºÐ «áµÈ¬õ¤FÁy¡C)

¤£ºÞ¬O¨º¤@ºØ¡A§Ú³q±`¬O¥Î³o­Ó¤èªk¡G

  • ¼g¦n kernel ³]©wÀÉ¡C¦pªG§A»Ý­n¥Î kernel debugger¡A¦b³]©w Àɤ¤¥[¤W `options DDB' ³o­Ó¿ï¶µ¡C(·í§ÚÃhºÃ¦³¥X²{µL½a°j°é®É¡A³q ±`·|¥Î³o­Ó¨Ó³]©w¤¤Â_ÂI¡C)

  • ¥Î config -g KERNELCONFIG °µ¥X¥Î¨Ó½sĶªº¥Ø¿ý

  • cd /sys/compile/KERNELCONFIG; make

  • µ¥ kernel ½sĶ¥X¨Ó

  • cp kernel kernel.debug

  • strip -d kernel

  • mv kernel /kernel.orig/

  • cp kernel /

  • ­«·s¶}¾÷



[ª`·N¡G²{¦b FreeBSD 3.x kernel ¤º©w¬O ELF ®æ¦¡¡A©Ò¥HÀ³¸Ó ¥Î strip -g ¦Ó¤£¬O strip -d¡C¦pªG§Aªº kernel ¦]¬YºØ­ì ¦]¤´¬O a.out ®æ¦¡ªº¸Ü¡A«h¥Î strip -aout -d¡C]

ª`·N§A¤£·|¯uªº¥Î¥]¬A©Ò¦³ debug symbol ªº kernel ¨Ó¶}¾÷¡A ¥Î -g ½sĶ¥X¨Óªº kernel ¤j¤p«Ü®e©ö´N¶W¹L 10MB¡C¤£»Ý­n¥Î³o»ò ¤jªº kernel ¶}¾÷¡A±ß¤@ÂI gdb(1) ¤~·|»Ý­n¥¦(gdb(1) ·|¥Î ¨ì¸Ì­±ªº symbol table)¡C©Ò¥H§Ú­Ì¤~·|§â§¹¾ãªº kernel ½Æ»s¤@¥÷¡A±µ µÛ¥Î strip -d §R±¼ debug symbol¡A°µ¥X²Ä¤G­Ó kernel¡A³o­Ó¤~¯u ¥¿®³¨Ó¶}¾÷¡C

­n½T©w¯à§ì¨ì crash dump¡A¥ý½s¿è /etc/rc.conf¡A±N dumpdev «ü¨ì swap ¤À³Î°Ï¡C³o¼Ë rc(8) ·|¥Î dumpon(8) ¨Ó±Ò°Ê crash dump¡A§A¤]¥i¥H¤â°Ê¥Î dumpon(8)¡C¦b panic ¤§«á¡A crash dump ¥i¥H¥Î savecore(8) ¦s°_¨Ó¡F¦pªG /etc/rc.conf ¸Ì¦³³] dumpdev¡A¨º»ò­«·s¶}¾÷«á rc(8) ·|¦Û°Ê°õ¦æ savecore(8) §â crash dump ¦s¦b /var/crash¡C

ª`·N¡GFreeBSD ªº crash dump ³q±`©M¾÷¾¹¸Ìªº¹ê»Ú°O¾ÐÅé¤@¼Ë¤j¡A ´N¹³¦pªG¦³ 64MB °O¾ÐÅé¡Acrash dump ¤j¤p´N¬O 64MB¡C©Ò¥H­n½T©w /var/crash ¤U¦³¨¬°÷ªºªÅ¶¡¡A©Î¬O¥i¥H¤â°Ê°õ¦æ savecore(8) §â crash dump ©ñ¨ì¥t¤@­ÓªÅ¶¡¸û°÷ªº¥Ø¿ý¤U¡C¥t¤@ºØ¤]³\¥i¥H­­¨î crash dump ªº¤èªk¡A¬O¦b kernel ³]©wÀɤ¤¥Î options MAXMEM=(foo)¡A ±N kernel ¥i¥Îªº°O¾ÐÅé­­¨î¦b¦X²zªº¤j¤p¡CÁ|¨Ò¨Ó»¡¡A¦pªG§A¦³ 128MB ªº°O¾ÐÅé¡A¦ý¬O¥i¥H­­¨î kernel ¥u¯à¥Î 16MB ªº°O¾ÐÅé¡A³o¼Ë crash dump ´N¬O 16MB ¦Ó¤£¬O 128MB ¤F¡C

¤@¥¹µo²{¦³¤F crash dump¡A´N¥i¥H¥Î gdb(1) ¨Ó°µ stack trace ¡A¦p¤U©Ò¥Ü¡G

% gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0
(gdb) where
      



­nª`·N¥i¯à·|¥X²{¦n´X­Ó¿Ã¹õªº¥i¥Î¸ê°T¡A§A¥i¥H¥Î script(1) §â©Ò¦³¿é¥X³£¦s°_¨Ó¡C¥Î¥]¬A©Ò¦³ debug symbol ªº kernel ¨Ó°£¿ù¡A ³o¼ËÀ³¸Ó¥i¥Hª½±µÅã¥Ü panic ¬Oµo¥Í¦b¨º¤@¦æ¡C³q±`¬O¥Ñ¤U©¹¤WŪ stack strace¡A³o¼Ë¤~¯à¤@­Ó­Ó°lÂÜ¥X¦³­þ¨Ç°Ê§@¤Þ¨ì crash¡C¤]¥i¥H¥Î gdb(1) §â¦UºØÅܼƩε²ºcªº¤º®e¦L¥X¨Ó¡A¥HÀˬd¨t²Î crash ®Éªº ¹ê»Úª¬ºA¡C

¦n°Õ¡A¦pªG§A¦³²Ä¤G¥x¹q¸£¦Ó¥B¦³°÷ºÆ¨g¡A¥i¥H±N gdb(1) ³]©w ¦¨»·ºÝ°£¿ù¡C³o¼Ë§A¥i¥H¦b¤@¥x¾÷¾¹¤¤¥Î gdb(1) ¥h°£¿ù¥t¤@¥x¸Ìªº kernel¡A¥i¥H°õ¦æªº¥]¬A³]©w¤¤Â_ÂI¡B¦b kernel ­ì©l½X¤¤¤@¨B¨B°õ¦æµ¥ µ¥¡A´N¹³¦b¤@¯ë¨Ï¥ÎªÌµ{¦¡¤W°£¿ù¤@¼Ë¡C¥Ñ©ó¨S¦³¤°»ò¾÷·|¬°°£¿ù¦Ó³]¸m ¨â¥x¨Ã¾F¹q¸£¡A©Ò¥H§ÚÁÙ¨S¦³³o¼Ëª±¹L¡C

[Bill ªþª`¡G§Ú§Ñ¤F´£¨ì¤@ÂI¡G¦pªG§A¦³±Ò°Ê DDB ¦Ó kernel ¤] ¤w¸g¶i¤J°£¿ù¾¹¡A¥i¥H¦b DDB ©R¥O¦C¤U¥´ `panic'¡A±j­¢²£¥Í panic(ÁÙ ¦³ crash dump)¡C¤]¦³¥i¯à¦b panic ¶¥¬q®É¦A¶i¤J°£¿ù¾¹¡A¦pªG³o¼Ëªº¸Ü ¡A¿é¤J `continue'¡A±µµÛ¥¦´N·|§¹¦¨ crash dump¡C -ed]

Q: dlsym() ¹ï ELF °õ¦æÀɤ£¯à¥Î!

A: ¦b ELF ¤@¨t¦Cªº¤u¨ã¤¤¡A¤º©w¬O¤£·|Åý dynamic linker ¬Ý¨ì°õ¦æÀÉ ¸Ì©w¸q¤F­þ¨Ç symbol¡C©Ò¥H dlsym() ¨S¦³¿ìªk¥ÎÂǥѩI¥s dlopen(NULL, flags) ¨ú±oªº handle¡A¥Î¥¦¥h·j´M¦³¨º¨Ç symbol ¤@©w·|¥¢±Ñ¡C

¦pªG§A·Q­n¥Î dlsym() §ä¥X¬Y­Ó process ªº¥D°õ¦æÀɤ¤ ¦³­þ¨Ç symbol¡A«h­n¦b link ®É¹ï ELF linker ¥[¤W -export-dynamic ³o­Ó°Ñ¼Æ¡C

Q: ¼W¥[©Î´î¤Ö kernel ¯à©w§}ªºªÅ¶¡

A: ¨t²Îªº¤º©w¬O¡AFreeBSD 3.x kernel ¯à©w§}¨ì 256 MB¡A4.x «h¬O 1 GB¡C¦pªG¬Oºô¸ô­t²ü¬Û·í­«ªº¦øªA¾¹(´N¹³¤j«¬ FTP ©Î HTTP ¦øªA¾¹)¡A 256 MB ¥i¯à·|¤£¤j°÷¡C

­n«ç»ò¼W¥[©w§}ªÅ¶¡©O? ­n±q¨â¤è­±µÛ¤â¡C­º¥ý§i¶D kernel ¥»¨­­n «O¯d¸û¤jªÅ¶¡; ¨ä¦¸¡A¬JµM¬O¦b©w§}ªÅ¶¡ªº³Ì¤W­±¸ü¤J kernel¡A©Ò¥HÁÙ ­n½Õ§C¸ü¤Jªº¦ì§}¡A§_«h´N·|¶W¹L©w§}½d³ò¡C

¼W¥[ src/sys/i386/include/pmap.h ¸Ìªº NKPDE ­È «K¥i¹F¦¨²Ä¤@­Ó¥Ø¼Ð¡C1 GB ªº©w§}ªÅ¶¡·|¹³³o¼Ë¡G

#ifndef NKPDE
#ifdef SMP
#define NKPDE                   254     /* addressable number of page tables/pde's */
#else
#define NKPDE                   255     /* addressable number of page tables/pde's */
#endif  /* SMP */
#endif
      



­nºâ¥X NKPDE ªº¥¿½T­È¡A±N·Q­nªºªÅ¶¡¤j¤p(¥H megabyte ¬°³æ ¦ì)°£¥H 4¡A±µµÛ³æ CPU ¾÷¾¹´î 1¡AÂù CPU «h¬O´î 2¡C

­n¸Ñ¨M²Ä¤G­Ó°ÝÃD¡A¥²¶·¦Û¦æºâ¥X kernel ³Q¸ü¤Jªº¦ì§}¡G¨D¥X 0x100100000 ´î±¼©w§}ªÅ¶¡¤j¤pªº­È(¥H byte ¬°³æ¦ì)¡A¦p 1 GB ¤j¤p´N ¬O 0xc0100000¡C§â src/sys/i386/conf/Makefile.i386 ¸Ìªº LOAD_ADDRESS ³]¦¨³o­Ó­È¡A±µµÛ¦b src/sys/i386/conf/kernel.script ¤¤¡A±N section ¦Cªí³Ì«e­±ªº location counter ³]¦¨¬Û¦Pªº­È¡A¦p¤U¡G

OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(btext)
SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-freebsdelf/lib);
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  . = 0xc0100000 + SIZEOF_HEADERS;
  .interp     : { *(.interp)    }
      



µM«á­«·s config ©M°µ¥X·sªº kernel¡C¦b°õ¦æ¹³ ps(1)¡B top(1) ³oÃþµ{¦¡®É¥i¯à·|¸I¨ì°ÝÃD¡A°µ¤@¦¸ make world À³¸Ó´N¥i¥H¸Ñ¨M(©Î§â§ï¹Lªº pmap.h «þ¨ì /usr/include/vm/ ¤U¡A¦A¤â°Ê½sĶ libkvm¡Bps ©M top)¡C

ª`·N¡Gkernel ©Ò¯à©w§}ªºªÅ¶¡¤j¤p¥²¶·¬O 4 megabytes ªº­¿¼Æ¡C

[David Greenman ¥[¤W ³o¤@¬q¡G§Ú»{¬° kernel ©w§}ªÅ¶¡¤j¤pÀ³¸Ó¬O 2 ªº­¼¾­¡A¦ý¤£¤j½T ©w³o¤@ÂI¡Cªº±Ò°Êµ{¦¡·|°Ê¨ì high order address bits¡A°O±o¥¦°²³] ¦Ü¤Ö¦³ 256 MB¡C]