10.6 ×ÜÏßÄÚ´æÓ³Éä

¡¡¡¡ºÜ¶àÇé¿öÏÂÉ豸Çý¶¯³ÌÐòºÍÉ豸֮¼äµÄÊý¾Ý½»»»ÊÇͨ¹ýÄÚ´æ ½øÐеġ£ÓÐÁ½ÖÖ¿ÉÄܵıäÌ壺

¡¡¡¡(a) ÄÚ´æÎ»ÓÚÉ豸¿¨ÉÏ

¡¡¡¡(b) ÄÚ´æÎª¼ÆËã»úµÄÖ÷ÄÚ´æ

¡¡¡¡Çé¿ö(a)ÖУ¬Çý¶¯³ÌÐò¿ÉÄÜÐèÒªÔÚ¿¨ÉϵÄÄÚ´æÓëÖ÷´æÖ®¼äÀ´»Ø ¿½±´Êý¾Ý¡£ÎªÁ˽«¿¨ÉϵÄÄÚ´æÓ³Éäµ½Äں˵ÄÐ鵨ַ¿Õ¼ä£¬¿¨ÉÏÄÚ´æµÄ ÎïÀíµØÖ·ºÍ³¤¶È±ØÐë±»¶¨ÒåΪSYS_RES_MEMORY×ÊÔ´¡£ È»ºó×ÊÔ´¾Í¿ÉÒÔ±»·ÖÅä²¢¼¤»î£¬ËüµÄÐéµØÖ·Í¨¹ýʹÓà rman_get_virtual()»ñÈ¡¡£½ÏÀϵÄÇý¶¯³ÌÐò ½«º¯Êýpmap_mapdev()ÓÃÓÚ´ËÄ¿µÄ£¬ÏÖÔÚ ²»Ó¦µ±ÔÙÖ±½ÓʹÓô˺¯Êý¡£ËüÒѳÉΪ×ÊÔ´¼¤»îµÄÒ»¸öÄÚ²¿²½Öè¡£

¡¡¡¡´ó¶àÊýISA¿¨µÄÄÚ´æÅäÖÃΪÎïÀíµØÎ»ÓÚ640KB-1MB·¶Î§Ö®¼äµÄ ij¸öλÖá£Ä³Ð©ISA¿¨ÐèÒª¸ü´óµÄÄڴ淶Χ£¬Î»ÓÚ16MÒÔϵÄij¸ö λÖã¨ÓÉÓÚISA×ÜÏßÉÏ24λµØÖ·ÏÞÖÆ£©¡£ÕâÖÖÇé¿öÏ£¬Èç¹û»úÆ÷ÓÐ ±ÈÉ豸ÄÚ´æµÄÆðʼµØÖ·¸ü¶àµÄÄڴ棨»»¾ä»°Ëµ£¬ËüÃÇÖØµþ£©£¬Ôò ±ØÐëÔÚ±»É豸ʹÓõÄÄÚ´æÆðʼµØÖ·´¦ÅäÖÃÒ»¸öÄÚ´æ¿Õ¶´¡£Ðí¶à BIOSÔÊÐíÔÚÆðʼÓÚ14MB»ò15MB´¦ÅäÖÃ1MµÄÄÚ´æ¿Õ¶´¡£Èç¹ûBIOS ÕýÈ·µØ±¨¸æÄÚ´æ¿Õ¶´£¬FreeBSD¾ÍÄܹ»ÕýÈ·´¦ÀíËüÃÇ£¨´ËÌØÐÔ ÔÚÀÏBIOSÉÏ¿ÉÄÜ»á³öÎÊÌ⣩¡£

¡¡¡¡Çé¿ö(b)ÖУ¬Ö»ÊÇÊý¾ÝµÄµØÖ·±»·¢Ë͵½É豸£¬É豸ʹÓÃDMAʵ¼Ê ·ÃÎÊÖ÷´æÖеÄÊý¾Ý¡£´æÔÚÁ½¸öÏÞÖÆ£ºÊ×ÏÈ£¬ISA¿¨Ö»ÄÜ·ÃÎÊ16MBÒÔÏ µÄÄÚ´æ¡£Æä´Î£¬Ð鵨ַ¿Õ¼äÖÐÁ¬ÐøµÄÒ³ÃæÔÚÎïÀíµØÖ·¿Õ¼äÖпÉÄܲ» Á¬Ðø£¬É豸¿ÉÄܲ»µÃ²»½øÐзÖÉ¢/ÊÕ¼¯²Ù×÷¡£×ÜÏß×ÓϵͳΪÕâЩÎÊÌâ ÌṩÏÖ³ÉÏֳɵĽâ¾ö°ì·¨£¬Ê£ÏµıØÐëÓÉÇý¶¯³ÌÐò×Ô¼ºÍê³É¡£

¡¡¡¡DMAÄÚ´æ·ÖÅäʹÓÃÁËÁ½¸ö½á¹¹£¬ bus_dma_tag_t ºÍ bus_dmamap_t¡£ ±êÇ©£¨tag£©ÃèÊöÁËDMAÄÚ´æÒªÇóµÄÌØÐÔ¡£Ó³É䣨map£©±íʾ°´ÕÕÕâЩ ÌØÐÔ·ÖÅäµÄÄÚ´æ¿é¡£¶à¸öÓ³Éä¿ÉÒÔÓëͬһ±êÇ©¹ØÁª¡£

¡¡¡¡±êÇ©°´ÕÕ¶ÔÌØÐԵļ̳жø±»×éÖ¯³ÉÊ÷ÐͲã´Î½á¹¹¡£×Ó±êÇ©¼Ì³Ð¸¸ ±êÇ©µÄËùÓÐÒªÇ󣬿ÉÒÔÁîÆä¸üÑϸñ£¬µ«²»ÔÊÐí·Å¿íÒªÇó¡£

¡¡¡¡Ò»°ãµØ£¬Ã¿¸öÉ豸µ¥Ôª´´½¨Ò»¸ö¶¥²ã±êÇ©£¨Ã»Óи¸±êÇ©£©¡£Èç¹û ÿ¸öÉ豸ÐèÒª²»Í¬ÒªÇóµÄÄÚ´æÇø£¬ÔòΪÿ¸öÄÚ´æÇø¶¼»á´´½¨Ò»¸ö±êÇ©£¬ÕâЩ ±êÇ©×÷Ϊ¸¸±êÇ©µÄº¢×Ó¡£

¡¡¡¡Ê¹ÓñêÇ©´´½¨Ó³ÉäµÄ·½·¨ÓÐÁ½ÖÖ¡£

¡¡¡¡ÆäÒ»£¬·ÖÅäÒ»´ó¿é·ûºÏ±êǩҪÇóµÄÁ¬ÐøÄڴ棨ÒÔºó¿ÉÒÔ±»ÊÍ·Å£©¡£ ÕâÒ»°ãÓÃÓÚ·ÖÅäΪÁËÓëÉ豸ͨÐŶø´æÔÚÏà¶Ô½Ï³¤Ê±¼äµÄÄÇЩÄÚ´æÇø¡£ ½«ÕâÑùµÄÄÚ´æ¼ÓÔØµ½Ó³ÉäÖзdz£ÈÝÒ×£ºËü×ÜÊDZ»¿´×÷λÓÚÊʵ±ÎïÀí Äڴ淶ΧµÄÒ»Õû¿é¡£

¡¡¡¡Æä¶þ£¬½«ÐéÄâÄÚ´æÖеÄÈÎÒâÇøÓò¼ÓÔØµ½Ó³ÉäÖС£ÕâÆ¬ÄÚ´æµÄ ÿһҳ¶¼±»¼ì²é£¬¿´ÊÇ·ñ·ûºÏÓ³ÉäµÄÒªÇó¡£ÈçºÎ·ûºÏÔòÁôÔÚԭʼλÖᣠÈç¹û²»·ûºÏÔò·ÖÅäÒ»¸öеķûºÏÒªÇóµÄ ¡°·´µ¯Ò³Ãæ(bounce page)¡±£¬ÓÃ×÷ÖÐ¼ä´æ´¢¡£ µ±´Ó²»·ûºÏµÄÔ­Ê¼Ò³ÃæÐ´ÈëÊý¾Ýʱ£¬Êý¾ÝÊ×Ïȱ»¿½±´µ½·´µ¯Ò³Ã棬 È»ºó´Ó·´µ¯Ò³Ãæ´«µÝµ½É豸¡£µ±¶Áȡʱ£¬Êý¾Ý½«»á´ÓÉ豸µ½·´µ¯Ò³Ã棬 È»ºó±»¿½±´µ½ËüÃDz»·ûºÏµÄÔ­Ê¼Ò³Ãæ¡£Ô­Ê¼ºÍ·´µ¯Ò³ÃæÖ®¼äµÄ¿½±´ ´¦Àí±»³Æ×÷ͬ²½¡£ÕâÒ»°ãÓÃÓÚµ¥´Î´«ÊäµÄ»ù´¡Ö®ÉÏ£ºÃ¿´Î´«Êäʱ ¼ÓÔØ»º³åÇø£¬Íê³É´«Êä£¬Ð¶ÔØ»º³åÇø¡£

¡¡¡¡¹¤×÷ÔÚDMAÄÚ´æÉϵĺ¯ÊýÓУº

>¡£

  • flags - Æì±êµÄλͼ¡£¸ÐÐËȤµÄÆì±ê Ö»ÓУº

  • dmat - Ö¸Ïò·µ»ØµÄбêÇ©µÄ´æ´¢µÄ Ö¸Õë¡£

  • int bus_dma_tag_destroy(bus_dma_tag_t dmat)

    Ïú»Ù±êÇ©¡£³É¹¦Ôò·µ»Ø0£¬·ñÔò·µ»Ø´íÎóÂë¡£

    dmat - ±»Ïú»ÙµÄ±êÇ©¡£

  • int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, bus_dmamap_t *mapp)

    ·ÖÅä±êÇ©ËùÃèÊöµÄÒ»¿éÁ¬ÐøÄÚ´æÇø¡£±»·ÖÅäµÄÄÚ´æµÄ´óСΪ±êÇ©µÄ maxsize¡£³É¹¦Ôò·µ»Ø0£¬·ñÔò·µ»Ø´íÎóÂë¡£µ÷Óýá¹û±»ÓÃÓÚ»ñÈ¡ÄÚ´æµÄ ÎïÀíµØÖ·£¬µ«ÔÚ´Ë֮ǰ±ØÐëÓÃbus_dmamap_load() ½«Æä¼ÓÔØ¡£

  • void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)

    ÊÍ·ÅÓÉbus_dmamem_alloc()·ÖÅäµÄÄÚ´æ¡£ Ŀǰ£¬¶Ô·ÖÅäµÄ´øÓÐISAÏÞÖÆµÄÄÚ´æµÄÊÍ·ÅûÓÐʵÏÖ¡£Òò´Ë£¬½¨ÒéµÄ ʹÓÃÄ£ÐÍΪ¾¡¿ÉÄܳ¤Ê±¼äµØ±£³ÖºÍÖØÓ÷ÖÅäµÄÇøÓò¡£²»ÒªÇáÒ×µØ ÊÍ·ÅÄ³Ð©ÇøÓò£¬È»ºóÔÙ¶Ìʱ¼äµØ·ÖÅäËü¡£Õâ²¢²»Òâζ×Ų»Ó¦µ±Ê¹Óà bus_dmamem_free()£ºÏ£ÍûºÜ¿ìËü¾Í»á±» ÍêÕûµØÊµÏÖ¡£

  • int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)

    Ϊ±êÇ©´´½¨Ó³É䣬ÒÔºóÓÃÓÚ bus_dmamap_load()¡£³É¹¦Ôò·µ»Ø0£¬·ñÔò ·µ»Ø´íÎóÂë¡£

  • int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)

    Ïú»ÙÓ³Éä¡£³É¹¦Ôò·µ»Ø0£¬·ñÔò·µ»Ø´íÎóÂë¡£

  • int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int flags)

    ¼ÓÔØ»º³åÇøµ½Ó³ÉäÖÐ(Ó³É䱨ÐëÊÂÏÈÓÉ bus_dmamap_create()»òÕß bus_dmamem_alloc())´´½¨¡£»º³åÇøµÄËùÓÐ Ò³Ãæ¶¼»á±»¼ì²é£¬¿´ÊÇ·ñ·ûºÏ±êÇ©µÄÒªÇ󣬲¢ÎªÄÇЩ²»·ûºÏµÄ·ÖÅä ·´µ¯Ò³Ãæ¡£»á´´½¨ÎïÀí¶ÎÃèÊö·ûµÄÊý×飬²¢½«Æä´«µÝ¸ø»Øµ÷º¯Êý¡£ »Øµ÷º¯ÊýÒÔijÖÖ·½Ê½´¦ÀíÕâ¸öÊý×顣ϵͳÖеķ´µ¯»º³åÇøÊÇÊÜÏ޵ģ¬ Òò´ËÈç¹ûÐèÒªµÄ·´µ¯»º³åÇø²»ÄÜÁ¢¼´»ñµÃ£¬Ôò½«ÇëÇóÈë¶Ó£¬µ±·´µ¯ »º³åÇø¿ÉÓÃʱÔÙµ÷Óûص÷º¯Êý¡£Èç¹û»Øµ÷º¯ÊýÁ¢¼´Ö´ÐÐÔò·µ»Ø0£¬ Èç¹ûÇëÇó±»ÅŶӣ¬µÈ´ý½«À´Ö´ÐУ¬Ôò·µ»Ø ¡°EINPROGRESS¡±¡£ºóÒ»ÖÖÇé¿öÏ£¬ ÓëÅŶӵĻص÷º¯ÊýÖ®¼äµÄͬ²½ÓÉÇý¶¯³ÌÐò¸ºÔð¡£

    »Øµ÷º¯ÊýµÄÔ­ÐÍΪ£º

    void callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)

    ¶ÎÊý×éÖеÄÿһÏî°üº¬ÈçÏÂ×ֶΣº

  • void bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)

    unload the map.

  • void bus_dmamap_sync (bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)

    ÓëÉ豸½øÐÐÎïÀí´«Êäǰºó£¬½«¼ÓÔØµÄ»º³åÇøÓëÆä·´µ¯Ò³Ãæ½øÐÐͬ²½¡£ ´Ëº¯ÊýÍê³Éԭʼ»º³åÇøÓëÆäÓ³Éä°æ±¾Ö®¼äËùÓбØÐèµÄÊý¾Ý¿½±´¹¤×÷¡£ ½øÐд«Êä֮ǰºÍÖ®ºó±ØÐë¶Ô»º³åÇø½øÐÐͬ²½¡£

  • ¡¡¡¡ µ±Ç°PREREADºÍPOSTWRITEΪ¿Õ²Ù×÷£¬µ«½«À´¿ÉÄÜ»á¸Ä±ä£¬Òò´ËÇý¶¯³ÌÐò Öв»ÄܺöÂÔËüÃÇ¡£ÓÉbus_dmamem_alloc() »ñµÃµÄÄÚ´æ²»ÐèҪͬ²½¡£

    ¡¡¡¡ ´Óbus_dmamap_load()Öе÷Óûص÷º¯Êý֮ǰ£¬ ¶ÎÊý×éÊÇ´æ´¢ÔÚÕ»Öеġ£²¢ÇÒÊǰ´±êÇ©ÔÊÐíµÄ×î´óÊýÄ¿µÄ¶ÎÔ¤ÏÈ·ÖÅä ºÃµÄ¡£ÕâÑùÓÉÓÚi386Ìåϵ½á¹¹É϶ԶÎÊýÄ¿µÄʵ¼ÊÏÞÖÆÔ¼Îª250-300 £¨ÄÚºËջΪ4KB¼õÈ¥Óû§½á¹¹µÄ´óС£¬¶ÎÊý×éÌõÄ¿µÄ´óСΪ8×Ö½Ú£¬ºÍ ÆäËü±ØÐëÁô³öÀ´µÄ¿Õ¼ä£©¡£ÓÉÓÚÊý×é»ùÓÚ×î´óÊýÄ¿¶ø·ÖÅ䣬Òò´ËÕâ¸öÖµ ±ØÐë²»ÄÜÉèÖóɳ¬³öʵ¼ÊÐèÒª¡£ÐÒÔ˵ÄÊÇ£¬¶ÔÓÚ´ó¶àÊýÓ²¼þ¶øÑÔ£¬ ËùÖ§³ÖµÄ¶ÎµÄ×î´óÊýÄ¿µÍºÜ¶à¡£µ«Èç¹ûÇý¶¯³ÌÐòÏë´¦Àí¾ßÓзdz£¶à ·ÖÉ¢/ÊÕ¼¯¶ÎµÄ»º³åÇø£¬ÔòÓ¦µ±Ò»²¿·ÖÒ»²¿·ÖµØ´¦Àí£º¼ÓÔØ»º³åÇøµÄ Ò»²¿·Ö£¬´«Êäµ½É豸£¬È»ºó¼ÓÔØ»º³åÇøµÄÏÂÒ»²¿·Ö£¬Èç´Ë·´¸´¡£

    ¡¡¡¡ ÁíÒ»¸öʵ¼ù½áÂÛÊǶÎÊýÄ¿¿ÉÄÜÏÞÖÆ»º³åÇøµÄ´óС¡£Èç¹û»º³åÇøÖÐµÄ ËùÓÐÒ³ÃæÅöÇÉÎïÀíÉϲ»Á¬Ðø£¬Ôò·ÖƬÇé¿öÏÂÖ§³ÖµÄ×î´ó»º³åÇø³ß´ç Ϊ(nsegments * page_size)¡£ÀýÈ磬Èç¹ûÖ§³ÖµÄ¶ÎµÄ×î´óÊýĿΪ10£¬ ÔòÔÚi386ÉÏ¿ÉÒÔÈ·±£Ö§³ÖµÄ×î´ó»º³åÇø´óСΪ40K¡£Èç¹ûÏ£Íû¸ü´óµÄ ÔòÐèÒªÔÚÇý¶¯³ÌÐòÖÐʹÓÃÒ»Ð©ÌØÊâ¼¼ÇÉ¡£

    ¡¡¡¡ Èç¹ûÓ²¼þ¸ù±¾²»Ö§³Ö·ÖÉ¢/ÊÕ¼¯£¬»òÕßÇý¶¯³ÌÐòÏ£Íû¼´Ê¹ÔÚÑÏÖØ·ÖƬµÄ Çé¿öÏÂÈÔȻ֧³ÖijÖÖ»º³åÇø´óС£¬Ôò½â¾ö°ì·¨ÊÇ£ºÈç¹ûÎÞ·¨ÈÝÄÉÏÂԭʼ »º³åÇø£¬¾ÍÔÚÇý¶¯³ÌÐòÖзÖÅäÒ»¸öÁ¬ÐøµÄ»º³åÇø×÷ΪÖÐ¼ä´æ´¢¡£

    ¡¡¡¡ ÏÂÃæÊǵ±Ê¹ÓÃÓ³ÉäʱµÄµäÐ͵÷ÓÃ˳Ðò£¬¸ù¾Ý¶ÔÓ³ÉäµÄ¾ßÌåʹÓöø²»Í¬¡£ ×Ö·û->ÓÃÓÚÏÔʾʱ¼äÁ÷¡£

    ¡¡¡¡ ¶ÔÓÚ´ÓÁ¬½Óµ½·ÖÀëÉ豸£¬ÕâÆÚ¼äλÖÃÒ»Ö±²»±äµÄ»º³åÇø£º

    ¡¡¡¡ bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... -> -> bus_dmamap_unload -> bus_dmamem_free

    ¡¡¡¡¶ÔÓÚ´ÓÇý¶¯³ÌÐòÍⲿ´«µÝ½øÈ¥£¬²¢ÇÒ¾­³£±ä»¯µÄ»º³åÇø£º

              bus_dmamap_create ->
              -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
              -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
              ...
              -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
              -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
              -> bus_dmamap_destroy       
    


    ¡¡¡¡ µ±¼ÓÔØÓÉbus_dmamem_alloc()´´½¨µÄÓ³Éäʱ£¬´«µÝ ½øÈ¥µÄ»º³åÇøµÄµØÖ·ºÍ´óС±ØÐëºÍ bus_dmamem_alloc()ÖÐʹÓõÄÒ»Ñù¡£ÕâÖÖÇé¿öÏÂ¾Í ¿ÉÒÔ±£Ö¤Õû¸ö»º³åÇø±»×÷Ϊһ¸ö¶Î¶øÓ³É䣨Òò¶ø»Øµ÷¿ÉÒÔ»ùÓڴ˼ÙÉ裩£¬ ²¢ÇÒÇëÇó±»Á¢¼´Ö´ÐУ¨ÓÀÔ¶²»»á·µ»ØEINPROGRESS£©¡£ÕâÖÖÇé¿öÏ»ص÷º¯Êý ÐèÒª×÷µÄÖ»ÊDZ£´æÎïÀíµØÖ·¡£

    ¡¡¡¡ µäÐÍʾÀýÈçÏ£º

              static void
            alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
            {
              *(bus_addr_t *)arg = seg[0].ds_addr;
            }
    
              ...
              int error;
              struct somedata {
                ....
              };
              struct somedata *vsomedata; /* Ð鵨ַ */
              bus_addr_t psomedata; /* ÎïÀí×ÜÏßÏà¹ØµÄµØÖ· */
              bus_dma_tag_t tag_somedata;
              bus_dmamap_t map_somedata;
              ...
    
              error=bus_dma_tag_create(parent_tag, alignment,
               boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,
               /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,
               /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,
               &tag_somedata);
              if(error)
              return error;
    
              error = bus_dmamem_alloc(tag_somedata, &vsomedata, /* flags*/ 0,
                 &map_somedata);
              if(error)
                 return error;
    
              bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,
                 sizeof (struct somedata), alloc_callback,
                 (void *) &psomedata, /*flags*/0);       
    

    ¡¡¡¡ ´úÂë¿´ÆðÀ´Óе㳤£¬Ò²±È½Ï¸´ÔÓ£¬µ«ÄÇÊÇÕýÈ·µÄʹÓ÷½·¨¡£Êµ¼Ê½á¹ûÊÇ£º Èç¹û·ÖÅä¶à¸öÄÚ´æÇøÓò£¬Ôò×ܽ«ËüÃÇ×éºÏ³ÉÒ»¸ö½á¹¹²¢×÷ΪÕûÌå·ÖÅä £¨Èç¹û¶ÔÆëºÍ±ß½çÏÞÖÆÔÊÐíµÄ»°£©ÊÇÒ»¸öºÜºÃµÄÖ÷Òâ¡£

    ¡¡¡¡ µ±¼ÓÔØÈÎÒ⻺³åÇøµ½ÓÉbus_dmamap_create() ´´½¨µÄÓ³Éäʱ£¬ÓÉÓڻص÷¿ÉÄܱ»ÑÓ³Ù£¬Òò´Ë±ØÐë²ÉÈ¡ÌØÊâ´ëÊ©Óë»Øµ÷ º¯Êý½øÐÐͬ²½¡£´úÂë¿´ÆðÀ´ÏñÏÂÃæµÄÑù×Ó£º

              {
               int s;
               int error;
    
               s = splsoftvm();
               error = bus_dmamap_load(
                   dmat,
                   dmamap,
                   buffer_ptr,
                   buffer_len,
                   callback,
                   /*callback_arg*/ buffer_descriptor,
                   /*flags*/0);
               if (error == EINPROGRESS) {
                   /*
                    * Ö´ÐбØÒªµÄ²Ù×÷ÒÔÈ·±£Óë»Øµ÷µÄͬ²½¡£
                    * »Øµ÷±»È·±£Ö±µ½ÎÒÃÇÖ´ÐÐÁËsplx()»òtsleep()²Å»á±»µ÷Óá£
                    */
                  }
               splx(s);
              }       
    

    ¡¡¡¡ ´¦ÀíÇëÇóµÄÁ½ÖÖ·½·¨·Ö±ðÊÇ£º

    ¡¡¡¡ 1. Èç¹ûͨ¹ýÏÔʽµØ±ê¼ÇÇëÇóÒѾ­½áÊøÀ´Íê³ÉÇëÇó£¨ÀýÈçCAMÇëÇ󣩣¬Ôò ½«ËùÓнøÒ»²½µÄ´¦Àí·ÅÈë»Øµ÷Çý¶¯³ÌÐòÖлá±È½Ï¼òµ¥£¬»Øµ÷½áÊøºó»á ±ê¼ÇÇëÇó¡£Ö®ºó²»ÐèҪ̫¶à¶îÍâµÄͬ²½¡£ÓÉÓÚÁ÷¿ØÖƵÄÔ­Òò£¬¶³½áÇëÇó ¶ÓÁÐÖ±µ½ÇëÇóÍê³É²ÅÊÍ·Å¿ÉÄÜÊǸöºÃÖ÷Òâ¡£

    ¡¡¡¡ 2. Èç¹ûÇëÇóÊÇÔÚº¯Êý·µ»ØÊ±Íê³É£¨ÀýÈç×Ö·ûÉ豸ÉÏ´«Í³µÄ¶ÁдÇëÇ󣩣¬ ÔòÐèÒªÔÚ»º³åÇøÃèÊö·ûÉÏÉèÖÃͬ²½±êÖ¾£¬²¢µ÷Óà tsleep()¡£ºóÃæµ±»Øµ÷º¯Êý±»µ÷ÓÃʱ£¬Ëü½« Ö´Ðд¦Àí²¢¼ì²éͬ²½±êÖ¾¡£Èç¹ûÉèÖÃÁËͬ²½±êÖ¾£¬ËüÓ¦¸Ã·¢³öÒ»¸ö »½ÐѲÙ×÷¡£ÔÚÕâÖÖ·½·¨ÖУ¬»Øµ÷º¯Êý»òÕß½øÐÐËùÓɱØÐèµÄ´¦Àí£¨¾ÍÏñ Ç°ÃæµÄÇé¿ö£©£¬»òÕß¼òµ¥ÔÚ»º³åÇøÃèÊö·ûÖд洢¶ÎÊý×é¡£»Øµ÷Íê³É ºó£¬»Øµ÷º¯Êý¾ÍÄÜʹÓÃÕâ¸ö´æ´¢µÄ¶ÎÊý×é²¢½øÐÐËùÓеĴ¦Àí¡£

    ±¾ÎĵµºÍÆäËüÎĵµ¿É´ÓÕâÀïÏÂÔØ£ºftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

    Èç¹û¶ÔÓÚFreeBSDÓÐÎÊÌ⣬ÇëÏÈÔĶÁÎĵµ£¬Èç²»Äܽâ¾öÔÙÁªÏµ<questions@FreeBSD.org>.
    ¹ØÓÚ±¾ÎĵµµÄÎÊÌâÇë·¢ÐÅÁªÏµ <doc@FreeBSD.org>.