OSKit

Ŀ ¼

  1. OSKit
    1. Ï̻߳úÖÆ
      1. ǰÑÔ
      2. µÚÒ»Õ Ð÷ ÂÛ
      3. µÚ¶þÕ Ï̳߳õʼ»¯
      4. µÚÈýÕ Ïß³ÌͨÐÅ·ÖÎö
      5. µÚËÄÕ Ï̵߳÷¶È
      6. µÚÎåÕ OSKitµÄÓ¦ÓÃʵÀý
      7. µÚÁùÕ ½áÊøÓï
    2. ²¿¼þ¶ÔÏóÄ£ÐÍ
      1. ǰÑÔ
      2. µÚÒ»Õ OSKIT½éÉÜ
      3. µÚ¶þÕ COM¹æ·¶½éÉÜ
      4. µÚÈýÕ COM»úÖÆµÄʵÏÖ
      5. µÚËÄÕ ½Ó¿Ú×¢²á»úÖÆ
      6. µÚÎåÕ Æô¶¯¼°ÏµÍ³³õʼ»¯
      7. µÚÁùÕ ӦÓÃʵÀý
      8. µÚÆßÕ ½áÊøÓï
    3. °üװϵͳÇý¶¯³ÌÐò
      1. ǰ ÑÔ
      2. µÚÒ»Õ OSKit¸ÅÊö
      3. µÚ¶þÕ OS Environment¸ÅÊö
      4. µÚÈýÕ OS Environment°ü×°LinuxÇý¶¯³ÌÐòµÄ·½·¨·ÖÎö
      5. µÚËÄÕ OS Environment×ÔÐпª·¢Çý¶¯³ÌÐòµÄ·½·¨
      6. µÚÎåÕ OSKitµÄÓ¦ÓÃʵÀý
      7. µÚÁùÕ ½áÊøÓï


OSKit

¡¡¡¡OSKITÊÇÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×é±àдµÄÒ»Ì×ÓÃÓڼܹ¹²Ù×÷ϵͳÄںˡ¢·þÎñÆ÷ºÍÆäËûOS¼¶Èí¼þµÄ¿ò¼Ü¼°Ä£¿é»¯µÄ²¿¼þºÍ¿â³ÌÐò¡£OSKITµÄ±àдÕßÈÏΪ£¬²Ù×÷ϵͳÖÐÓкܴóÒ»²¿·ÖÄ£¿éÊÇϵͳ±ØÐëµÄ£¬µ«²¢²»ÊÇ¿ª·¢ÕßËù¸ÐÐËȤµÄ£¬ÀýÈçϵͳװÈëÄ£¿é£¬¸÷ÖÖ±ê×¼Çý¶¯Ä£¿éµÈ¡£Ê¹ÓÃOSKITµÄÄ¿µÄ¾ÍÊÇʹ²Ù×÷ϵͳµÄ¿ª·¢Õß¼¯Öо«Á¦¿ª·¢ËûÃDzÙ×÷ϵͳÖÐÓÐÌØÉ«µÄ£¬»òÕßËûÃǸÐÐËȤµÄ²¿·Ö£¬¶ø²»±Ø¿¼ÂÇһЩ·±Ëö¶ø·¦Î¶µÄϸ½Ú¡£ÎªÁË´ïµ½Õâ¸öÄ¿µÄ£¬OSKitÔÚÉè¼ÆÊ±½èÓÃÁËCOMµÄ˼Ï룬°Ñ²Ù×÷ϵͳµÄ¸÷¸ö²¿·ÖÉè¼Æ³É¾¡Á¿¶ÀÁ¢µÄCOMÄ£¿é£¬ÒÔ·½±ã²Ù×÷ϵͳµÄ¿ª·¢ÕßʹÓûòÌæ»»¡£Òò´Ë£¬µ±¿ª·¢ÈËԱʹÓÃÕâÌ×¹¤¾ßʱ£¬¿ÉÒÔ°ÑËüµ±×÷Ò»¸öÍêÕûµÄ²Ù×÷ϵͳÀ´Ê¹Óã¬Ò²¿ÉÒÔ¸ù¾ÝÐèҪʹÓÃÆäÖеÄÒ»²¿·Ö£¬Ëü»¹¿ÉÒÔ×÷ΪһÌ×¶¯Ì¬Á´½Ó¿â£¬ÓɲÙ×÷ϵͳ¼°Ö§³Ö³ÌÐò¶ÔËü½øÐе÷Óá£
[Ŀ¼]


Ï̻߳úÖÆ

OSKitµÄÏ̻߳úÖÆ Ŀ¼
2000Äê12ÔÂ12ÈÕ 23:07


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥

ǰ ÑÔ

µÚÒ»Õ Ð÷ ÂÛ
¡¡¡ì 1.1 ¼ò½é
¡¡¡ì 1.2 °²×°ÓëÅäÖÃOSKIT
¡¡¡ì 1.3 ʹÓÃOSKIT
¡¡¡ì 1.4 OSKIT µ¼º½Í¼
¡¡¡¡¡¡¡¡1.4.1 ½Ó¿Ú
¡¡¡¡¡¡¡¡1.4.2 º¯Êý¿â
¡¡¡¡¡¡¡¡1.4.3 ²¿¼þ¿â
¡¡¡¡¡¡¡¡1.4.4 Ö´Ðл·¾³

µÚ¶þÕ Ï̳߳õʼ»¯
¡¡¡ì 2.1 Ï̳߳õʼ»¯·ÖÎö
¡¡¡¡¡¡¡¡2.1.1 Ï̵߳Ĵ´½¨
¡¡¡¡¡¡¡¡2.1.2 Ï̵߳Ĵ洢
¡¡¡¡¡¡¡¡2.1.3 Ï̵߳ÄÊý¾Ý½á¹¹
¡¡¡ì 2.2 PTHREADS/PTHREAD_CREATE.C
¡¡¡¡¡¡¡¡2.2.1 ´´½¨Ïß³Ì
¡¡¡¡¡¡¡¡2.2.2 ´´½¨ÄÚ²¿Ïß³Ì
¡¡¡¡¡¡¡¡2.2.3 ΪÖ÷½ø³Ì´´½¨Ò»¸ö±¸·ÝÏß³Ì
¡¡¡¡¡¡¡¡2.2.4 ³õʼ»¯´´½¨Ï̵߳ÄÏß³Ì
¡¡¡¡¡¡¡¡2.2.5 ΪµÈ´ýºÍÐÝÃßµÄÏ̴߳´½¨Ò»¸öµÈ´ýʱ¼ä
¡¡¡ì 2.3 PTHREADS/PTHREAD_ATTR.C
¡¡¡¡¡¡¡¡2.3.1 Ï̳߳õʼ»¯µÄÊý¾Ý½á¹¹
¡¡¡¡¡¡¡¡2.3.2 Ïß³ÌÊôÐԵij·Ïú
¡¡¡¡¡¡¡¡2.3.3 ÉèÖÃÏ̵߳ľ¯½ä¶ÑÕ»´óС
¡¡¡¡¡¡¡¡2.3.4 µÃµ½¾¯½ä¶ÑÕ»µÄ´óС
¡¡¡¡¡¡¡¡2.3.5 ÉèÖÃÏ̵߳ķÖÀë״̬
¡¡¡¡¡¡¡¡2.3.6 µÃµ½Ï̵߳ķÖÀë״̬
¡¡¡¡¡¡¡¡2.3.7 ÉèÖÃÏ̵߳ļ̳йØÏµ
¡¡¡¡¡¡¡¡2.3.8 µÃµ½Ï̵߳ļ̳Ð״̬
¡¡¡¡¡¡¡¡2.3.9 ÉèÖÃÏ̵߳ĵ÷¶È²ÎÊý
¡¡¡¡¡¡¡¡2.3.10 µÃµ½Ï̵߳÷¶ÈµÄ²ÎÊý
¡¡¡¡¡¡¡¡2.3.11 ÉèÖÃÏ̵߳÷¶È²ßÂÔ
¡¡¡¡¡¡¡¡2.3.12 µÃµ½Ï̵߳÷¶È²ßÂÔ
¡¡¡¡¡¡¡¡2.3.13 ÉèÖöÑÕ»µØÖ·
¡¡¡¡¡¡¡¡2.3.14 µÃµ½¶ÑÕ»µÄµØÖ·
¡¡¡¡¡¡¡¡2.3.15 ÉèÖöÑÕ»µÄ´óС
¡¡¡¡¡¡¡¡2.3.16 µÃµ½¶ÑÕ»µÄ´óС
¡¡¡¡¡¡¡¡2.3.17 ÉèÖÃÏ̵߳ÄÓÅÏȼ¶
¡¡¡¡¡¡¡¡2.3.18 ×¼±¸½ÓÊܵ÷¶È
¡¡¡¡¡¡¡¡2.3.19 ÉùÃ÷Òª½øÐе÷¶ÈµÄÏß³Ì
¡¡¡¡¡¡¡¡2.3.20 ÉèÖÃmutexµÄÊôÐÔ
¡¡¡¡¡¡¡¡2.3.21 ³·ÏúmutexµÄÊôÐÔ
¡¡¡¡¡¡¡¡2.3.22 ÉèÖÃmuxtexµÄЭÒé
¡¡¡¡¡¡¡¡2.3.23 µÃµ½Ï̵߳÷¶ÈµÄmutexЭÒé
¡¡¡¡¡¡¡¡2.3.24 ÉèÖÃmutexµÄÖÖÀà
¡¡¡¡¡¡¡¡2.3.25µÃµ½mutexµÄÀàÐÍ
¡¡±¾ Õ С ½á

µÚÈýÕ Ïß³ÌͨÐÅ·ÖÎö
¡¡¡ì 3.1 Ï̼߳äͨÐÅ
¡¡¡¡¡¡¡¡3.1.1ÏûÏ¢¶ÓÁÐ
¡¡¡¡¡¡¡¡3.1.2ÐźÅ
¡¡¡ì 3.2 PTHREADS/PTHREAD_IPC.C
¡¡¡¡¡¡¡¡3.2.1 ÏûÏ¢·¢ËÍ:
¡¡¡¡¡¡¡¡3.2.2 sendµÄËã·¨
¡¡¡¡¡¡¡¡3.2.3 ÏûÏ¢½ÓÊÕ
¡¡¡¡¡¡¡¡3.2.4 receiveµÄËã·¨
¡¡¡ì 3.3 PTHREADS/PTHREAD_SIGNAL.C
¡¡¡¡¡¡¡¡3.3.1 ¼ì²â²¢¸ü¸Ä×èÈûµÄÐźÅ
¡¡¡¡¡¡¡¡3.3.2ɱÏß³ÌÐźÅ
¡¡¡¡¡¡¡¡3.3.3 ¹ØÏß³ÌËø
¡¡¡¡¡¡¡¡3.3.4 ÔÚÄ¿±êÏ̵߳ÄÐźŵȴý¶ÓÁÐÖмÓÒ»¸öÐźÅ
¡¡¡¡¡¡¡¡3.3.5 ÐźÅÍê³ÉµÄ¶¯×÷
¡¡¡¡¡¡¡¡3.3.6 ²âÊÔ»ò¸Ä±ä(»òÁ½Õß¼æÓÐ)Ö÷µ÷½ø³ÌµÄÐźÅÑÚÂë
¡¡¡¡¡¡¡¡3.3.7 ɱÏß³Ì
¡¡¡¡¡¡¡¡3.3.8 µÈ´ýÐźŵÄÏ̶߳ÓÁÐ
¡¡¡¡¡¡¡¡3.3.9 µÈ´ýÄÚ²¿ÐźÅ
¡¡¡¡¡¡¡¡3.3.10 Ï̵߳ȴýÐźÅ
¡¡¡¡¡¡¡¡3.3.11 Ï̵߳ȴýÐźÅ(Ò»°ãÖ¸ÄÚ²¿ÐźÅ)
¡¡¡¡¡¡¡¡3.3.12 Ï̵߳ȴýÐźÅ(ÓÐʱ¼äÏÞÖÆ)
¡¡¡¡¡¡¡¡3.3.13 Ï̵߳ȴýÐźţ¬Èç¹ûÎÞÐźŷ¢¸øËü£¬ÔòÎÞÏÞÆÚµÈ´ý
¡¡¡¡¡¡¡¡3.3.14 ´ÓÒ»¸öÏÝÈë·¢ËÍÐźŸøÏß³Ì
¡¡¡¡¡¡¡¡3.3.15 ·¢³öÏß³Ì×èÈûÐźÅ
¡¡¡¡¡¡¡¡3.3.16 ²»»á±»×èÈûµÄÐźŷ¢ËÍ
¡¡¡¡¡¡¡¡3.3.17 Ðźųõʼ»¯
¡¡¡ì 3.4 PTHREADS/PTHREAD_COND.C
¡¡¡¡¡¡¡¡3.4.1Ìõ¼þ±äÁ¿µÄ³õʼ»¯Êý¾Ý½á¹¹
¡¡¡¡¡¡¡¡3.4.2³·ÏúÌõ¼þ±äÁ¿
¡¡¡¡¡¡¡¡3.4.3 Ï̵߳ȴýÌõ¼þ±äÁ¿
¡¡¡¡¡¡¡¡3.4.4 °²È«µÄµÈ´ý
¡¡¡¡¡¡¡¡3.4.5 µÈ´ýÌõ¼þ±äÁ¿£¬µ«ÓÐʱ¼äÏÞÖÆ
¡¡¡¡¡¡¡¡3.4.6 µÈ´ý¾èÔùÌõ¼þ
¡¡¡¡¡¡¡¡3.4.7 µÈ´ýÌõ¼þ³¬Ê±
¡¡¡¡¡¡¡¡3.4.8 Ï̷߳¢ËÍÐźÅÌõ¼þ
¡¡¡¡¡¡¡¡3.4.9 Ï̹߳㲥Ìõ¼þ
¡¡±¾ Õ С ½á

µÚËÄÕ Ï̵߳÷¶È
¡¡¡ì 4.1 Ï̵߳÷¶ÈËã·¨·ÖÎö
¡¡¡¡¡¡¡¡4.1.1 Ï̵߳÷¶ÈËã·¨µÄ×ÜÌåÃèÊö
¡¡¡¡¡¡¡¡4.1.2 ÓÅÏȼ¶Äæ×ª·¨
¡¡¡ì 4.2 PTHREAD/PTHREAD_SCHEDULER.C
¡¡¡¡¡¡¡¡4.2.1Çå¿ÕµÈ´ýµ÷¶ÈµÄÏ̶߳ÓÁÐ
¡¡¡¡¡¡¡¡4.2.2µÃµ½µÈ´ý¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄÏ̵߳ÄÓÅÏȼ¶
¡¡¡¡¡¡¡¡4.2.3µÃµ½Ö¸ÏòÏÂÒ»¸öÒªÖ´ÐÐÏ̵߳ÄÖ¸Õë
¡¡¡¡¡¡¡¡4.2.4ÔÚÏ̵߳ÄÖ´ÐжÓÁеĶÓβ׷¼ÓÒ»¸öÏß³Ì
¡¡¡¡¡¡¡¡4.2.5ÔÚÏ̵߳ÄÖ´ÐжÓÁеĶÓÍ·×·¼ÓÒ»¸öÏß³Ì
¡¡¡¡¡¡¡¡4.2.6½«µÈ´ý¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄÏß³ÌÌá³ö¶ÓÁÐÖ´ÐÐ
¡¡¡¡¡¡¡¡4.2.7´ÓµÈ´ý¶ÓÁÐÖÐɾ³ý¶ÀÕ¼×ÊÔ´µÄÏß³Ì
¡¡¡¡¡¡¡¡4.2.8´ËʱÓõ½µÄµ÷¶ÈËã·¨
¡¡¡¡¡¡¡¡4.2.9½«Ò»¸öÏ̱߳äΪÔËÐÐ̬
¡¡¡¡¡¡¡¡4.2.10ÖÕÖ¹¸ÃÏß³ÌĿǰµÄµ÷¶ÈËã·¨
¡¡¡¡¡¡¡¡4.2.11Ϊһ¸öеÄÏ̴߳´½¨µ÷¶È²ÎÊý
¡¡¡¡¡¡¡¡4.2.12¸Ä±äÏ̵߳ĵ÷¶È״̬
¡¡¡¡¡¡¡¡4.2.13ÓÅÏȼ¶Ç¨ÒÆ
¡¡¡¡¡¡¡¡4.2.14»ùÓÚijÖÖÔ­Òò£¬Ï̱߳»Ëͻصȴý¶ÓÁÐ
¡¡¡¡¡¡¡¡4.2.15·µ»ØÓÅÏȼ¶×î¸ßµÄ´¦Óڵȴý״̬µÄÏß³Ì
¡¡¡¡¡¡¡¡4.2.16¸Ä±äÏ̵߳ÄÓÅÏȼ¶
¡¡¡¡¡¡¡¡4.2.17ÓÅÏȼ¶¼Ì³Ð
¡¡¡¡¡¡¡¡4.2.18²»¼Ì³ÐÓÅÏȼ¶
¡¡¡¡¡¡¡¡4.2.19ÓÅÏȼ¶µÝ¼õ
¡¡±¾ Õ С ½á

µÚÎåÕ OSKITµÄÓ¦ÓÃʵÀý Ò»¸ö¼òµ¥ÏµÍ³µÄÉè¼ÆÓëʵÏÖ
¡¡5.1Éè¼ÆÄ¿µÄ
¡¡5.2ϵͳµÄ¹¦ÄÜ
¡¡5.3 ÎÒÃÇ×Ô¼ºËùÍê³ÉµÄ¹¤×÷£º
¡¡¡¡¡¡¡¡5.3.1 ϵͳµÄÆô¶¯
¡¡¡¡¡¡¡¡5.3.2 Ï̹߳ÜÀí
¡¡¡¡¡¡¡¡5.3.3 ÍâÉ裨´®¿Ú£©
¡¡5.4 Óû§ÊÖ²á
¡¡¡¡¡¡¡¡5.4.1 °²×°
¡¡¡¡¡¡¡¡5.4.2 Óû§±à³Ì½Ó¿Ú
¡¡¡¡¡¡¡¡5.4.3 Ó¦ÓóÌÐòʾÀý
¡¡±¾ Õ С ½á

µÚÁùÕ ½áÊøÓï

ºó ¼Ç

[Ŀ¼]


ǰÑÔ

OSKitµÄÏ̻߳úÖÆ ǰÑÔ
2000Äê12ÔÂ18ÈÕ 22:28


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


¿ÎÌâÃû³Æ£º»ùÓÚÃæÏò¶ÔÏó²Ù×÷ϵͳ¿ª·¢Æ½Ì¨(OSKit)µÄ·ÖÎöÓë³ÌÐòÉè¼Æ
¿ÎÌâÀ´Ô´£º×ÔÄâÌâÄ¿

Èç¹û˵×ÔÓÉÈí¼þµÄ³öÏÖÊÇÒ»¸öżȻµÄ»°£¬ÄÇô£¬Ï¯¾íÈ«ÇòµÄLinuxÈȳ±ÔòÊÇÒ»¸öÆæ¼££¬ËüÕýÒÔÊÆ²»¿Éµ²µÄÇ÷ÊÆÑ¸ÃÍ·¢Õ¹£¬Æäǰ;²»¿ÉÏÞÁ¿¡£

LinuxÄÚºËÔ´´úÂëµÄ¿ª·Å¸øÏ£ÍûÉîÈë²Ù×÷ϵͳÄÚ²¿ÊÀ½çµÄÈËÃÇÌṩÁË¿ÉÄÜ£¬µ«ËæÖ®¶øÀ´µÄÎÊÌâÊÇ£¬µ±ÎÒÃÇÒª¿ª·¢×Ô¼ºµÄ²Ù×÷ϵͳʱ£¬ÓÉË­À´¶ÁϵͳµÄkernel²¿·ÖÄØ¡£¶ÔÕⲿ·ÖµÄ´¦Àí´ÓÂß¼­ÉÏ·ÖÎö²»ÍâºõÈýÖÖ·½Ê½£ºÈ«²¿±£Áô¡¢¶ÔÆä½øÐвüõ¡¢È«²¿ÍƵ¹ÖØÀ´¡£ºÜÏÔÈ»£¬×îºóÒ»ÖÖ·½·¨ÊDz»¿ÉÄܵ쬶øÈç¹ûÎÒÃDzÉÓõÄÊǵÚÒ»ÖÖ·½·¨£¬Æä½á¹ûµ±È»Ò»¶¨¿ÉÒÔÂú×ãÎÒÃǵÄÒªÇ󣬵«ÊÇ£¬×îºó±àÒë³öÀ´µÄºËÐĽ«Ê®·ÖµÄÅÓ´ó£¬ÓÈÆäÊǶÔǶÈëʽ²Ù×÷ϵͳµÄ¿ª·¢ÕßÀ´Ëµ£¬ÊDz»ÄÜÈÌÊܵģ¬ËùÒÔ£¬´ó¶àÊý¿ª·¢Õß²ÉÓõĵڶþÌõ·¡£

µ«ÊÇ£¬µÚ¶þÌõ·Ҳ·Çƽ̹µÄ´óµÀ£¬µÀÀíºÜ¼òµ¥£¬ÄãÒªÏë¶Ôkernel½øÐвüõ£¬Ê×ÏÈÄãÓ¦¸Ã½«È«²¿µÄÔ´´úÂëÔĶÁÒ»±é£¬²¢ÇÒ½«ÆäÖеÄÏà¹ØÐÔÀí˳£¬È»ºó²ÅÄÜ̸µ½²Ã¼õ£¬ËùÒÔ¹¤×÷Á¿Ò²Ê®·ÖµÄÅÓ´ó¡£

È»¶ø£¬OSKitµÄ³öÏָıäÁËÕâÒ»ÇУ¬ËüʹµÃÎÒÃDz»ÐèÒª½«¾«Á¦¼¯ÖÐÔÚkernelÔ´´úÂëµÄÔĶÁÉÏ£¬ÒòΪkernel²¿·ÖµÄÔ´³ÌÐòÒѾ­ÓÉOSKitµÄ¿ª·¢ÈËÔ±ÌæÄã·ÖÎö¹ýÁË£¬ËûÃǽ«Ô´ÂëÈ«²¿Ä£¿é»¯£¬²¢½«ËùÓÐÄ£¿éÖ®¼äµÄÏà¹ØÐÔдÔÚÁËÎĵµÖ®ÖУ¬³ÊÏÖÔÚÄãµÄÃæÇ°£¬ÕâÓëÄã×Ô¼º·ÖÎöÔ´´úÂëµÄ½á¹ûÊÇÒ»ÑùµÄ¡£

OSKit×î±¾ÖʵĶ«Î÷ºÍLinuxÒ»Ñù£¬ÌåÏÖÔÚ"×ÔÓÉ"ºÍ"¿ª·Å"µÄ˼Ï룬"×ÔÓÉ"Òâζ×ÅÊÀ½ç·¶Î§ÄÚµÄ֪ʶ¹²Ïí£¬ÓÉÓÚOSKit³öÏÖÔÚLinuxÖ®ºó£¬ÆäÉè¼ÆË¼Ïë¼Ì³ÐÁËLinuxµÄ¾«Ë裬ËùÒÔ˵ËüµÄ³öÏÖ²¢²»ÍêÈ«ÊÇÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×éµÄ¹¦ÀÍ£¬¶øÓ¦¸ÃÊÇ"×ÔÓÉ"µÄ½á¹û¡£"¿ª·Å"ÔòÒâζ×ÅOSKit¶ÔËùÓеÄÈ˶¼³¨¿ª´óÃÅ£¬ÔÚÕâÖÖ¿ª·Å¶ø×ÔÓɵÄÌìµØÀÄã¿ÉÒÔÖзַ¢»Ó×Ô¼ºµÄ´´Ôì²ÅÄÜ¡£

ÔÚºóÃæµÄ¼¸ÕÂÀÎÒ½«Ïò´ó¼ÒϵͳµØ½éÉÜÎÒµÄÈ«²¿Ñо¿³É¹û-OSKitµÄÏ̻߳úÖÆ£¬Ï£Íû¶ÁÕßÄÜÔÚ×î¶ÌµÄʱ¼äÄÚÁ˽âOSKit£¬¸üÏ£Íû´ó¼ÒÄܱ¾×Å"×ÔÓÉ"Óë"¿ª·Å"µÄ¾«Éñ¼ÓÈëµ½ÎÒÃǵÄÑо¿ÖÐÀ´£¬ÎªÖйúµÄ×ÔÓÉÈí¼þÊÂÒµ¹±Ï××Ô¼ºµÄÒ»·ÝÈÈÇé¡£

ÎÒдÕâÆªÂÛÎÄÁ¦Çó´ïµ½Ò»¸öÄ¿µÄ£¬ÄǾÍÊÇÈÃÕâÆªÂÛÎÄÔÚ¸ãÑо¿µÄÈËÑÛÀïÊÇÒ»±¾²Î¿¼Ê飬¶øÔÚ³ÌÐòÉè¼ÆÕßÑÛÖÐÊÇÒ»±¾º¯ÊýÊֲᣬ¼ÈÓÐÀíÂÛÖ¸µ¼£¬ÓÖ²»ÊÇ·º·ºµÄ¿Õ̸ÀíÂÛ¡£

ÓÉÓÚ±¾ÈËÄÜÁ¦ÓÐÏÞ£¬ÂÛÎÄÖеÄÓÐЩÊõÓï±í´ï¿ÉÄܲ»Í×£¬ÄÚÈÝÒ²¿ÉÄܲ»¹»×¼È·£¬¾´Çë¸÷λÀÏʦºÍͬѧÅúÆÀÖ¸Õý£¬±¾È˲»Ê¤¸Ð¼¤¡£


ÌÀº£¾© 2000Äê6ÔÂ14ÈÕ

[Ŀ¼]


µÚÒ»Õ Ð÷ ÂÛ

OSKitµÄÏ̻߳úÖÆ µÚÒ»ÕÂ
2000Äê12ÔÂ18ÈÕ 22:34


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚÒ»Õ Ð÷ ÂÛ


1.1 ¼ò½é

OSKitÊÇÓÉÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×é±àдµÄÒ»Ì×Ä£¿é»¯²¿¼þºÍ¿âº¯Êý£¬ÓÃÓڼܹ¹²Ù×÷ϵͳÄںˡ¢·þÎñÆ÷ÒÔ¼°ÆäËûµÄOS¼¶Èí¼þ¡£ÎÒÃÇÉèÏëһϣ¬ÔÚÒ»¸ö²Ù×÷ϵͳµÄÑз¢ÏîÄ¿ÖУ¬µ×²ãÄ£¿éµÄ¿ª·¢¹¤×÷»áռȥ´ó²¿·Öʱ¼ä£¬²¢ºÄ·Ñµô¿ª·¢ÈËÔ±µÄ´ó²¿·Ö¾«Á¦¡£¶øOSKitµÄ³öÏÖǡǡÃÖ²¹ÁËÕâ¸öȱÏÝ£¬ÆäÉè¼ÆÒâͼÊÇÌṩһÌ׿ÉÖØÓõÄÄ£¿é£¬ÈÃʹÓÃÕ߱ܿª¸´Ôӵĵײ㣬°Ñ¾«Á¦¼¯ÖÐÔÚËûÃǸÐÐËȤµÄÎÊÌâÉÏ£¬Ò²¾ÍÊÇ˵£¬µ±¿ª·¢ÈËÔ±Äõ½OSKitÖ®ºó£¬±ãÁ¢¿ÌÓµÓÐÁËÒ»¸öÍêÕû¶øÇÒ°²È«µÄºËÐÄ£¬Ê¹ËûÃÇ¿ÉÒÔ¼¯Öо«Á¦Ñз¢²Ù×÷ϵͳµÄ¸ß²ã´ÎÎÊÌ⣬Èç×÷Òµ¿ØÖÆ¡¢Ðé´æ¡¢IPC¡¢Îļþϵͳ¡¢ÏµÍ³°²È«ÒÔ¼°¸ß¼¶ÓïÑÔ£¨ÈçJava¡¢Lisp»òML£©µÈ¡£ÕâÑù¿ÉÒÔ´ó´ó·á¸»²Ù×÷ϵͳµÄÓ¦Óò㣬ΪÓû§Ìṩ¸ü¶à¸üºÃµÄ·þÎñ£¬Ìá¸ß²Ù×÷ϵͳµÄÔËÐÐЧÂÊ£¬ÔöÇ¿²Ù×÷ϵͳµÄ°²È«ÐÔºÍÎȶ¨ÐÔ£¬´Ó¶øÊ¹ÄãµÄ²Ù×÷ϵͳ¸ü¼Ó¾ßÓÐ÷ÈÁ¦¡£

¶ÔÓÚÕ¾ÔÚ²Ù×÷ϵͳ¼¼Êõ×îÇ°ÑØµÄ¶àÏ̱߳à³ÌºÍ³ÉÊìµÄ×÷Òµ¿ØÖÆÏµÍ³£¬ÒÔ¼°Ê±ÏÂ×îÁ÷ÐеÄǶÈëʽ²Ù×÷ϵͳ£¬OSKit¶¼ÌṩÁËÖ§³Ö¡£Í¨¹ý¼¸¸öÔÂÒÔÀ´¶ÔÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×éÍøÕ¾µÄ×·×Ù£¬ÎÒÃÇ×¢Òâµ½OSKitµÄ°æ±¾´óԼÿÈý¸öÔ¾͸üÐÂÒ»´Î£¬ÎÒÃÇÔÚ±ÏÒµÉè¼Æ³õÆÚÄõ½µÄÊÇ99Äê7Ôµİ汾£¬¶øÎÒÃÇдÑÝʾ³ÌÐòÊÇÓõÄ2000Äê5Ôµİ汾£¬ÔÚ´ËÆÚ¼äÓÖ³öÏÖÁË99Äê12Ô°æºÍ2000Äê2Ô°棬¶øÇÒÔÚÿ´Î·¢²¼µÄ°æ±¾Àï¶¼ÓÐÐí¶àеÄËã·¨¹«²¼£¬»¹ÓÐÐí¶àÀϰ汾ÖеÄBUG±»Ð޸ģ»Õâ˵Ã÷OSKit²»µ«Ò»Ö±´¦ÓÚ²Ù×÷ϵͳ¿ª·¢Æ½Ì¨µÄ×îÇ°ÑØ£¬¶øÇÒÆä×ÔÉíÒ²ÔÚ²»¶ÏµÄÍêÉÆ¡£

ͨ¹ý¶ÔOSKitÉîÈëϸÖµķÖÎöÓëÑо¿£¬ÎÒÃÇ·¢ÏÖÓÌËû´óѧµÄ¿ª·¢ÈËÔ±ÃÇ´ÓÒ»¿ªÊ¼¾ÍÈ·¶¨ÁË×Ô¼ºµÄÄ¿±ê£¬ÄǾÍÊǶÔOSKit½øÐÐÄ£¿é»¯£¬·Â·ðWindowsÖеĶ¯Ì¬Á¬½Ó¿âÒ»Ñù£¬ÈúóÀ´Õß¼´Ê¹²»Ê¹ÓÃOSKitÖеÄijһ²¿·Ö£¬ÈÔÈ»¿ÉÒÔʹÓÃÆäÓಿ·ÖÀ´Íê³ÉËûÃǵÄÄ¿±ê¡£ÕâÑùµÄÉè¼ÆË¼Â·Ê®·ÖÁé»î£¬Îª¿ª·¢ÕߺÍʹÓÃÕß¶¼ÌṩÁ˱ãÀû¡£


1.2 °²×°ÓëÅäÖÃOSKit

µ±ÎÒÃÇ´ÓÓÌËû´óѧµÃµ½OSkitµÄÎåÔ°æÊ±£¬ËüÊǸöѹËõ°ü£¬Ê¹ÓÃtarÔÚlinuxϽ⿪ºó£¬¾ÍµÃµ½ÁËÔ´Â룬ÕâÐèÒªÎÒÃÇÔÚlinuxÏÂÖØÐ±àÒë¡£

Ŀǰ£¬±àÒëOSKitÐèÒªÒÔÏµĹ¤¾ß£º

GNU make
GNU CC (gcc) 2.95.2°æ¡£

×¢Ò⣺µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇʹÓõÄRedhat Linux 6.2ÖеÄGCC²¢²»ÊÇ2.95.2£¬Èç¹ûÒª³É¹¦±àÒëOSKit£¬ÐèÒªÏȽ«ÎÒÃǵÄGCCÉý¼¶¡£µ±È»£¬Èç¹ûÄãʹÓõÄÊÇTurbo linux 6.0µÄ»°£¬ËüÌṩµÄ¾ÍÊÇGCC 2.95.2¡£

ÔÚ¿ªÊ¼±àÒëOSKit֮ǰ£¬ÎÒÃDZØÐë×¢ÒâÒ»µã£¬ÄǾÍÊÇÒª¶ÔÔ´Âë½øÐÐÒ»µã¸Ä¶¯£¬ÈÃËüÖ§³Öʵʱ²Ù×÷£¬¼´½« /oskit20000505/threads/MakeFlage Öеģº
# OSKIT_CFLAGS + = -DPTHREAD_SCHED_EDF -DPTHREAD_REALTIME ÖеÄ×¢ÊÍ·ûºÅ # È¥µô¡£

ÓÉÓÚÎÒÃǵĻ·¾³ÊÇLinux£¬ËùÒÔÂÛÎÄÖеĸùĿ¼ÓÃ"/"±íʾ£¬¶ø²»ÊÇWindowsÖеÄ"\"¡£

ÓÉÓÚÎÒÃÇÊÇÔÚintel 586ÉϱàÒë,¶øÎÒÃǵÄÄ¿±ê»úÒªÖ§³Öµ½intel 386£¬ËùÒÔÎÒÃÇÓ¦¸ÃÔÚOSKitµÄĿ¼Ï¼üÈ룺

./configure ¨D¨Dhost=i586 ¨D¨Dtarget=i386
´Ëºó¼üÈëmake£¬±àÒëOSKit¡£

µ±OSKit±àÒëºÃÒÔºó£¬Äã¿ÉÒÔÓÃ"make install"ÃüÁîÀ´°²×°Ëü¡£ÔÚȱʡµÄÇé¿öÏ£¬ÕâЩ¿â»á±»°²×°µ½/usr/local/libÖУ¬¶øÍ·Îļþ»á±»°²×°µ½/usr/local/includeÖУ¬³ý·ÇÄãÔÚÅäÖÃʱʹÓÃÁË--prefixÑ¡ÏîÀ´Ö¸¶¨Ëü¡£ËùÓеÄOSKitÍ·Îļþ¶¼°²×°ÔÚoskit/×ÓĿ¼ÖУ¨ÀýÈç/usr/local/include/oskit£©£¬²»»áºÍÒѾ­´æÔÚµÄÈκÎÍ·Îļþ³åÍ»¡£¼´Ê¹Êǿⱻ°²×°ÔÚÖ÷¿âµÄĿ¼ÖУ¨Èç/usr/local/lib£©£¬ËùÓеĿâÎļþ¶¼ÓÐǰ׺oskit_£¬Õâ¿ÉÒÔ±ÜÃâºÍÆäËü²»Ïà¹ØµÄ¿â»ìÏýÔÚÒ»Æð¡£


1.3 ʹÓÃOSKit

Ò»¿ªÊ¼£¬ÎªÁËÄÜÈôó¼Ò¾¡¿ìÊìϤOSKit£¬ÓÌËû´óѧµÄÑз¢ÈËÔ±ÃǸø³öÁËÐí¶àºÜ¾ß´ú±íÐÔµÄÀý×Ó¹©Ê¹ÓÃÕß½øÐÐÊÔÑ飬¶øÎÒÃǵĿÎÌâ×éÒ²±àдÁËÒ»¸öСÐ͵IJÙ×÷ϵͳ£¬¹©Ñ§Ï°Ñо¿Ö®Óá£

OSKitÖпâµÄÉè¼ÆÊǺܾ­µäµÄ£¬¿ª·¢ÕßÃÇ»¨·ÑÁË´óÁ¿Ê±¼äÇå³þµØ±ê³öÁËÿ¸ö¿âÓëÆäËü¿âµÄÒÀÀµ¹ØÏµ£¬ÕâʹµÃOSKit²»µ«±£ÁôÁ˲Ù×÷ϵͳµÄԭ֭ԭ棬¶øÇÒ»¹°Ñ¿âÖ®¼äµÄÏà¹ØÐÔ½µµÍµ½ÁË×îµÍÏÞ¶È£¬Ê¹µÃʹÓÃÕß¿ÉÒÔËæÒâÔö¼õÆäÖеĿ⺯Êý¡£Êµ¼ÊÉÏ£¬ÔںܶàÇé¿öÏ£¬ÌرðÊÇÔÚijЩº¯Êý¿âÖУ¬ÎªÁËÓÐЧµÄʹÓÃOSKit£¬±ØÐëÌæ»»µôÆäÖеÄһЩº¯Êý»ò·ûºÅ£¬ÒÔÊÊÓ¦ÎÒÃǵÄÖ´Ðл·¾³¡£ÒªÖØÔØÄ³¸ö¿âÖеĺ¯Êý»òÕß·ûºÅ£¬Ö»ÒªÔÚÄãµÄºËÐÄ»òÓ¦ÓóÌÐòÖÐÔÙ¶¨ÒåÒ»±é¾Í¿ÉÒÔÁË£¬LINK³ÌÐò»áÈ·±£È¥Ê¹ÓÃÄãËù¶¨ÒåµÄº¯ÊýºÍ·ûºÅ¡£ÓÉÓÚÔÚLinuxϵıàÒëÆ÷ÊÇ¿¿¶ÁÈ¡MakefileÎļþÀ´È·¶¨±àÒëÁ¬½ÓµÄ¶ÔÏóÒÔ¼°¹æÔò£¬ËùÒÔÎÒÃÇÈÏΪֱ½ÓÐÞ¸ÄMakefileÎļþÒª±ÈÐÞ¸ÄOSKitÔ´Âë¸ü¼Ó·½±ã¶øÇÒ°²È«£¬ÕâÓëWindowsÏµĹ¤³ÌÎļþÊ®·ÖÏàËÆ¡£

Èç¹ûʹÓÃOSKitËùÌṩµÄÄ£¿é»¯²¿¼þºÍ¿âº¯Êý±àд³öÁË×Ô¼ºµÄ²Ù×÷ϵͳºËÐÄ´úÂ룬²¢ÇÒ¶ÔÔÚLINUXÏÂÓÃGCC±àÒëÔ´ÂëÓÐËùÁ˽âµÄ»°£¬¾Í¿ÉÒÔ½èÖúOSKitΪʹÓÃÕßÌṩµÄÒ»ÕûÌ׺ËÐÄÖÆ×÷ÃüÁîºÍLINUXÌṩµÄGCCÀ´Éú³É×Ô¼ºµÄºËÐÄÎļþzImage£¬È»ºóʹÓÃLINUXÃüÁîDD½«ºËÐÄдÈëÒ»ÕÅ1.44MBµÄÈíÅÌ£¬ÖØÐÂÆô¶¯¼ÆËã»ú£¬´ÓÈíÅÌÒýµ¼¾Í¿É½øÈëÎÒÃÇ×Ô¼º±àдµÄ²Ù×÷ϵͳÁË¡£

ÁíÍ⣬¿¼Âǵ½Óû§»·¾³¸´ÔÓ¶àÑùµÄʵ¼ÊÇé¿ö£¬OSKit»¹ÌṩÁ˶ÔÐí¶àÖÖ²Ù×÷ϵͳµÄÖ§³Ö£¬°üÀ¨Linux¡¢Mach ¡¢BSD»òÕßMS-DOS£¬µ±ÎÒÃÇÓÃGCC½«Ô´Âë±àÒë³É"filename.o"µÄ¸ñʽ֮ºó£¬Ê¹ÓÃOSKitÌṩµÄ²»Í¬µÄºËÐÄÖÆ×÷ÃüÁîÀ´Éú³É²»Í¬²Ù×÷ϵͳϵĺËÐÄ£¬Æä¾ßÌåʵÏÖÊÇÓÉmkbsdimage¡¢mklinuximageºÍmkdosimageÀ´Íê³ÉµÄ¡£ÕâЩ½Å±¾ÔÚOSKitµÄ°²×°ºÍÅäÖý׶λá¸ù¾ÝÄãÖ¸¶¨µÄ»·¾³×Ô¶¯°²×°Íê±Ï¡£ÔÚÿһ¸ö½Å±¾ÔËÐеÄʱºò¶¼Óи÷×Ô²»Í¬µÄ²ÎÊý¡£


1.4 OSKit µ¼º½Í¼

OSKitËùÌṩµÄ¹¦Äܱ»·Ö³ÉÈýÀࣺ½Ó¿Ú¡¢º¯Êý¿âºÍ²¿¼þ¿â

1.4.1 ½Ó¿Ú

OSKitµÄ½Ó¿Ú·Ç³£ÇåÎú£¬²¢ÇÒÊÇÃæÏò¶ÔÏóµÄ¡£ÕâЩ½Ó¿ÚÈ«²¿±»¶¨ÒåÔÚCÓïÑÔµÄÍ·ÎļþÖУ¬ÎÒÃÇ·Ö±ð¶ÔÆä¼ÓÁ˱ØÒªµÄ×¢ÊÍ£¬ÒÔ·½±ãʹÓÃÕß¿ìËÙÕÆÎÕOSKit¡£ÕâЩ½Ó¿Ú±»OSKitµÄ¸÷¸ö²¿¼þ¹²Ïí£¬´Ó¶øÌåÏÖÁ˸÷²¿¼þÖ®¼äµÄÒ»ÖÂÐÔ¡£²Ù×÷ϵͳµÄ¿ª·¢ÈËÔ±¼È¿ÉÒÔÖ±½ÓʹÓÃËü£¬Ò²¿ÉÒÔÔÚÆäÉ϶¨ÒåÄ¿±ê²Ù×÷ϵͳµÄ½Ó¿Ú½á¹¹¡£

1.4.2 º¯Êý¿â

OSKitµÄº¯Êý¿âÒÔCÓïÑÔÖÐÃæÏòº¯ÊýµÄ·½Ê½Ìṩ»ù±¾µÄ·þÎñ¡£Ò»¸ö¿âÖеĺ¯Êý¶ÔÁíÒ»¸ö¿âÖк¯ÊýµÄÒÀÀµ¹ØÏµÒѾ­±»½µÖÁ×îµÍµÄ³Ì¶È£¬Èç¹ûÕâÖÖÒÀÀµÊDz»¿É±ÜÃâµÄ»°£¬ÄÇËûÃÇÒѾ­±»ºÜÇå³þµØ±ê×¢³öÀ´£¬Õ¹ÏÖ¸øÁ˲Ù×÷ϵͳµÄ¿ª·¢ÈËÔ±¡£º¯Êý¿âºÜÉÙʹÓÃOSKitµÄÃæÏò¶ÔÏóµÄCOM½Ó¿Ú£¬È¡¶ø´úÖ®µÄÊÇÔÚCµÄÍ·ÎļþÖж¨Òå×Ô¼ºµÄÃæÏòº¯ÊýµÄ½Ó¿Ú¡£ÕâÖÖÉè¼Æ²ßÂÔΪ²Ù×÷ϵͳ¿ª·¢ÈËÔ±ÌṩÁËÁé»îÐԺͼ«´óµÄ¼¼ÊõÖ§³Ö£»ÒªÊÊÓ¦ÈκÎÌØÊâµÄ²Ù×÷ϵͳ»·¾³£¬µ×²ãµÄOSKit¹¤¾ß±ØÐë¾ßÓпÉÀ©Õ¹ÐÔ¡£

1.4.3 ²¿¼þ¿â

OSKitµÄ²¿¼þ¿âʹʹÓÃÕßÄÜÕ¾ÔÚ¸ü¸ßµÄ²ã´ÎÀ´±à³Ì£¬¼´ÃæÏò¶ÔÏóµÄ"ºÚºÐ"·½Ê½¡£¾¡¹ÜOSKitµÄ"²¿¼þ"ÔÚȱʡÇé¿öÏÂÒ²ÊDZ»´ò°ü³ÉΪÆÕͨµÄÁ´½Ó¿â£¬µ«ËüÃǵĽṹÔòÊDZ»Éè¼Æ³ÌÃæÏò¶ÔÏóµÄ£¬¶ø²»ÊÇ´«Í³µÄÃæÏòº¯ÊýµÄ·½Ê½¡£ÓëOSKitµÄº¯Êý¿âÏà±È£¬²¿¼þ¿âͨ³£Ö»¶ÔÍ⿪·ÅһЩÏà¹ØµÄ¹«Óõ÷Óýӿڣ¬¶ø²»ÊÇ´óÁ¿µÄ¹¦ÄÜ¡£ÀýÈ磬ÔÚLinuxºÍBSDµÄÇý¶¯³ÌÐò²¿¼þ¿âÀÿһ¸öÍêÕûµÄÇý¶¯³ÌÐò½ö³ÊÏÖΪһ¸öµ¥¶ÀµÄº¯Êýµ÷Óã¬Õâ¸öµ÷ÓÃÓÃÀ´³õʼ»¯²¢×¢²áÇý¶¯³ÌÐò¡£

1.4.4 Ö´Ðл·¾³

OSKitÖеÄÐí¶à²¿¼þÔÚºËÐĺÍÓû§·½Ê½Ï¶¼¿ÉÒÔʹÓã¬Õâ¾ÍÐèÒª¶Ô²¿¼þµÄÖ´Ðл·¾³×÷³ö¶¨Ò壬ÀýÈ粿¼þʲôʱºò¿ÉÒÔǶÌ×½øÈëµÈ¡£´ËÍ⣬OSKITʹÓÃÁËÐí¶àÆäËü²Ù×÷ϵͳµÄ´úÂ룬ÀýÈçÉ豸Çý¶¯³ÌÐòºÍÍøÂçЭÒéÕ»£¬¶¼ÊÇÔ­·â²»¶¯µÄ´ÓÔ­ÓеĺËÐÄÈçBSDºÍLinuxÖнèÓÃÀ´µÄ£¬OSKitͨ¹ý¸½¼Ó´úÂëÄ£ÄâԭʼִÐл·¾³Ê¹µÄÕâЩִÐÐÄ£¿é±ÈËüÃÇԭʼִÐл·¾³¸ü¼òµ¥£¬Óû§Ò²²»ÐèÒªÏêϸÁ˽âÔ­Ö´Ðл·¾³µÄϸ½Ú¡£ÏÂÃæ¶ÔOSKITµÄÿÖÖÖ´ÐÐÄ£¿é½øÐмòµ¥µÄ½éÉÜ¡£

´¿Ö´ÐÐÄ£¿é£ºÕâÊÇOSKitÖ´Ðл·¾³ÖÐ×î¼òµ¥µÄÒ»¸öÄ£¿é£¬ÕâЩ²¿¼þ»òº¯ÊýÖÐûÓÐÈ«¾Ö±äÁ¿»ò¾²Ì¬±äÁ¿£¬Ö»Ê¹Óúʹ¦ÀíÓÉÄ¿±ê»·¾³´«µÝÀ´µÄÊý¾Ý¡£ÀýÈ纯Êýstrlen,Ëüֻͨ¹ýÄ¿±ê»·¾³´«µÝ¸øËüµÄ×Ö·û´®Ö¸ÕëÇó³ö×Ö·û´®µÄ³¤¶È£¬²¢½«Æä·µ»Ø£¬ËüÖ»½Ó´¥²ÎÊýÊý¾ÝÓò£¬¶ø²»Ó°ÏìÄ¿±ê»·¾³¡£µ±ÕâЩº¯ÊýʹÓõÄÊý¾Ý¼¯ÊÇ·ÖÀëµÄ£¬ËüÃÇ¿ÉÒÔ°²È«µØÍ¬Ê±±»µ÷Ó㬶ø²»ÐèҪͬ²½£¬·´Ö®Ôò²»ÐС£ÀýÈç¶ÔÖØµþµÄÄ¿±ê»º³åÇø²¢·¢Ê¹ÓÃmemcpyµ÷ÓÃʱ²»°²È«µÄ¡£

·Ç´¿Ö´ÐÐÄ£¿é£ºÕâЩģ¿éÖÐʹÓÃÁËÈ«¾Ö±äÁ¿»òÓпÉÄܸıäÈ«¾Ö¹²Ïí״̬£¬ÀýÈçliboskit_kern£¨ºËÐÄÖ§³Ö¿â£©ÖеÄÐí¶àº¯Êý½¨Á¢ºÍ·ÃÎÊÈ«¾Ö´¦ÀíÆ÷¼Ä´æÆ÷ºÍÊý¾Ý½á¹¹£¬Òò´ËËüÃÇÊÇ·Ç´¿Ö´ÐÐÄ£¿é¡£·Ç´¿Ö´ÐÐÄ£¿éÓÐÒÔÏÂÌØµã£º·Ç´¿º¯ÊýºÍ²¿¼þ¿ÉÄÜÒÀÀµÓÚÈ«¾Ö״̬£¬ÈçÈ«¾Ö±äÁ¿£¬¾²Ì¬±äÁ¿£¬´¦ÀíÆ÷ÖеÄÌØÊâ¼Ä´æÆ÷µÈ¡£³ý·ÇÓÐÃ÷È·µÄÉùÃ÷£¬·Ç´¿º¯ÊýºÍ²¿¼þÊDz»¿ÉÖØÈëµÄ£¬²¢ÇÒÔËÓÃÔÚ¶àÏß³ÌϵͳÖÐÒ²ÊDz»°²È«µÄ¡£ÎªÁËÔÚÒ»¸ö¶àÏß³Ì/¶à´¦ÀíÆ÷»·¾³ÖÐʹÓÃÕâЩº¯ÊýºÍ²¿¼þ£¬Ä¿±ê²Ù×÷ϵͳ±ØÐëÌṩÊʵ±µÄͬ²½´úÂë¡£

×èÈûÄ£¿é£ºËüÀ©Õ¹ÁË·Ç´¿Ä£¿éÀ´Ö§³Ö·ÇÇÀÏȵĶàỊ̈߳¬ÕâЩģ¿éÖÐÓÐÒ»Àà¿ÉÖØÈëµÄº¯Êý³ÆÎª×èÈûº¯Êý£¬ÔÚÕâÄ£¿éÖУ¬³ý·ÇÃ÷È·ÉùÃ÷Ϊ·Ç×èÈûº¯Êý£¬·ñÔòº¯ÊýÊÇ×èÈûµÄ¡£ÎªÁËÔÚÒ»¸öÍêÈ«ÇÀÏȵġ¢¿ÉÖжϵĻòÕß¶à´¦ÀíÆ÷µÄ»·¾³ÖÐʹÓÃ×èÈûÄ£¿é£¬±ØÐëÔÚ½øÈëÄ£¿éǰ¼ÓËø£¬ÔÚÍ˳öÄ£¿éʱ½«ËøÊÍ·Å¡£

¿ÉÖжÏ×èÈûÄ£¿é£ºÔÚËüÖ®ÖÐÿ¸ö²¿¼þ¶¼ÊÇÒ»¸öµ¥Ï̵߳ÄÖ´ÐÐÓò£¬ÔÚÒ»¸ö¸ø¶¨µÄʱ¿Ì£¬Ö»ÓÐÒ»¸ö£¨ÐéÄâµÄ»òÕßÎïÀíµÄ£©CPU¿ÉÒÔÖ´Ðв¿¼þÖеĴúÂë¡£ÀýÈ磺ÔÚÒ»¸ö¶à´¦ÀíÆ÷ϵͳÖУ¬ÔÚ½ø³Ì¼¶±ðÏ£¬ÈÎÒâʱ¿ÌÔÚÒ»¸ö²¿¼þ¼¯ÄÚÖ»ÓÐÒ»¸öCPU±»ÔÊÐíÖ´ÐУ»ÕâÄܹ»Í¨¹ýÔÚ²¿¼þǰºó·ÅÖÃÈ«¾ÖËøÀ´ÊµÏÖ¡£

ÔÚÒ»¶Îʱ¼äÄÚ£¬²¿¼þÖпÉÒÔ´æÔÚ¶à¸ö»î¶¯½ø³Ì£¬µ«ÔÚijʱ¿ÌÖ»ÓÐÒ»¸ö½ø³Ì±»Ö´ÐС£Ä¿±ê²Ù×÷ϵͳ¸øÃ¿¸ö»î¶¯½ø³ÌÌṩһ¸ö¶ÀÁ¢¶ÑÕ»£¬Õâ¸ö¶ÑÕ»ÔÚ×èÈûº¯ÊýÔËÐÐʱ±»±£Áô¡£Ö»ÓÐÔÚ²Ù×÷Íê³Éºó£¬¶Ô²¿¼þµÄµ÷Ó÷µ»ØÊ±²Å·ÅÆú¸Ã¶ÑÕ»¡£²¿¼þÖеĴúÂë×ÜÊÇÔËÐÐÔÚÁ½¸ö¼¶±ðÖÐÖ®Ò»£¬½ø³Ì¼¶»òÖжϼ¶¡£ÓÐÒâ˼µÄÊÇһЩ²¿¼þµÄº¯ÊýºÍ·½·¨Ö»ÄÜÔÚ½ø³Ì¼¶±ð±»µ÷Ó㬶øÁíһЩֻÄÜÔÚÖжϼ¶±ð±»µ÷Ó㬻¹ÓеÄÄÜÔÚÈκμ¶±ð±»µ÷Óᣵ÷ÓõÄϸ½ÚÊôÓÚ½Ó¿ÚÃèÊöµÄÒ»²¿·Ö¡£

²¿¼þÖÐÎÞÂÛ½ø³Ì¼¶±ð»òÖжϼ¶±ðµÄ²Ù×÷¶¼Äܱ»²¿¼þÖеÄÖжϴ¦Àí³ÌÐòÖжϣ¬³ý·Ç´úÂëµ÷ÓÃosenv_intr_disableÆÁ±ÎÁËÖжϡ£µ±²¿¼þÔÚ½ø³Ì¼¶ÔËÐÐʱ£¬OSKIT¼Ù¶¨ÖжϿª·Å£¬²¿¼þÔÚ´¦Àí¹ý³ÌÖпÉÄÜÁÙʱÆÁ±ÎµôÖжϣ¬µ«±ØÐëÔÚ·µ»Øµ½Ä¿±ê²Ù×÷ÏµÍ³Ç°ÖØÐ¼¤»î¡£Í¬Ñù£¬µ±²¿¼þÔÚÖжϼ¶ÔËÐÐʱ£¬OSKIT¼Ù¶¨Öжϱ»ÆÁ±Î£¬µ«ÊDz¿¼þ¿ÉÒÔÔÚÄ¿±ê²Ù×÷ϵͳÔÊÐíÆäËüÖжϼ¶±ðµÄ»î¶¯Öжϸò¿¼þÊ±ÖØÐ¼¤»îÖжϡ£

µ±Ä¿±ê²Ù×÷ϵͳÔÚÒ»¸ö²¿¼þÄÚÖжÏÒ»¸ö½ø³Ì¼¶±ðµÄ»î¶¯Ê±£¬ÔÚ¼ÌÐøÕâ¸ö»î¶¯Ç°£¬²Ù×÷ϵͳ±ØÐëÖ´ÐÐÍêÕâ¸öÖжϼ¶±ðµÄ»î¶¯¡£Í¬Àí£¬ÈôÒ»¸öÖжϼ¶µÄ»î¶¯±»Öжϣ¬ÄÇô×î½üµÄÖжϼ¶±ðµÄ»î¶¯±ØÐëÔÚ¼ÌÐøÇ°Ò»¸öÖжϼ¶±ðµÄ»î¶¯Ö®Ç°Íê³É¡£²¿¼þÖÐÔËÐÐÔÚÖжϼ¶±ðµÄ´úÂë²»Äܵ÷ÓÃÄ¿±ê²Ù×÷ϵͳÌṩµÄ×èÈû»Øµ÷º¯Êý£»Ö»ÓзÇ×èÈûµÄ»Øµ÷º¯ÊýÄܹ»ÔÚÖжϼ¶±ð±»µ÷Óá£


[Ŀ¼]


µÚ¶þÕ Ï̳߳õʼ»¯

¡¶OSKitµÄÏ̻߳úÖÆ µÚ¶þÕ¡·


OSKitµÄÏ̻߳úÖÆ µÚ¶þÕÂ2000Äê12ÔÂ18ÈÕ22:59


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚ¶þÕ Ï̳߳õʼ»¯


Ç°ÃæÎÒÃÇÔø¾­Ì¸µ½£¬ÔÚOSKitÖÐ×ÊÔ´·ÖÅäºÍµ÷¶ÈµÄµ¥Î»ÊÇÏ̶߳ø²»ÊÇ´«Í³ÒâÒåÉϵĽø³Ì£¬ËùÒÔÎÒÃÇÓбØÒª»¨´óÁ¿µÄʱ¼ä¶ÔÆäÏ̻߳úÖÆ×öÈ«ÃæµÄ·ÖÎö¡£µ±È»£¬Òª·ÖÎöÏ̲߳¿·Ö£¬Ê×ÏÈÓ¦¸Ã´ÓÏ̵߳ijõʼ»¯ÈëÊÖ£¬È»ºó²ÅÄÜÉæ¼°µ½Ï̼߳äµÄͨÐÅÒÔ¼°Ï̵߳÷¶È£¬ËùÒÔ±¾Õ½«Ïò¸÷Î»È«ÃæÏµÍ³µØ½éÉÜOSKitµÄÏ̳߳õʼ»¯¡£

ΪÁËÈôó¼ÒÄÜÇå³þµØÕÆÎÕOSKitµÄÏ̲߳¿·Ö£¬ÔÚÒÔºóµÄÈýÕÂÄÚ£¬ÎÒ½«²ÉÓÃÀíÂÛʵ¼ÊÏà½áºÏµÄÂÛÊö·½Ê½£¬¼´ÔÚÿÕµĿªÊ¼ÏÈÂÛÊö±¾ÕÂËùÒªÌÖÂÛµÄÏ̻߳úÖÆ£¬ÒÔÆÚÈôó¼ÒÔÚ¸ÅÄîÉ϶Ա¾ÕÂÓÐ×ÜÌåÉϵÄÈÏʶ£¬È»ºóÔÙÕë¶ÔOSKitµÄÔ´´úÂë×ö½øÒ»²½µÄ²ûÊö£¬Ï£ÍûÄÜÀíÂÛʵ¼ùË«·áÊÕ¡£


2.1 Ï̳߳õʼ»¯·ÖÎö

2.1.1Ï̵߳Ĵ´½¨

ÔÚOSKitÖУ¬Óû§´´½¨Ò»¸öÐÂÏ̵߳ÄΨһ·½·¨¾ÍÊǵ÷Óô´½¨Ï̵߳ÄÏß³Ìpthread_create¡£

ÄÚºËΪϵͳµ÷ÓÃpthread_createÍê³ÉÈçϲÙ×÷£º

(1) ΪÐÂÏß³ÌÔÚÏ̱߳íÏîÖзÖÅäÒ»¸ö¿Õ²Û¡£
(2) ¸³¸ø×ÓÏß³ÌÒ»¸öΨһµÄ±êʶºÅ
(3)ÖÆ×÷Ò»¸ö¸¸Ïß³ÌÉÏÏÂÎĵÄÂß¼­¸±±¾¡£ÓÉÓÚÏ̵߳ÄijЩ²¿·Ö£¬ÈçÕýÎÄÇø£¬¿ÉÄܱ»¼¸¸öÏß³ÌËù¹²Ïí£¬ËùÒÔÄÚºËÖ»ÒªÔö¼Óij¸öÇøµÄÒýÓüÆÊý¼´¿É£¬¶ø²»ÓÃÕæµÄ½«¸ÃÇø¿½±´µ½Ò»¸öеÄÄÚ´æÎïÀíÇø¡£
(4)Ôö¼ÓÓë¸ÃÏß³ÌÏà¹ØµÄÎļþ±íºÍË÷Òý½Úµã±íµÄÒýÓÃÊý¡£
(5) Ïò¸¸Ï̷߳µ»Ø×ÓÏ̵߳ÄÏ̺߳š£

ϵͳ¶ÔÒ»¸öÓû§¿ÉÒÔͬʱÔËÐеÄÏß³ÌÊýÓÐÒ»¸öÏÞÖÆ£¨Õâ¸öÏÞÖÆÊÇ¿ÉÒԸıäµÄ£©£¬Òò¶øÈκÎÓû§²»ÄÜʹÓùý¶àµÄÏ̱߳íÏ²»È»µÄ»°£¬¾Í»á·Á°­ÆäËûÓû§´´½¨ÐÂỊ̈߳¬¶øÇÒ£¬OSKitΪÁË·ÀÖ¹ËÀËø£¬¹æ¶¨ÁËÆÕͨÓû§²»ÄÜÕ¼ÓÃÏ̱߳íÏîÖеÄ×îºóÒ»¸öỊ̈߳¬ÕâÌõ¹æ¶¨ÊÇ´ÓUNIXÖÐÑÝ±ä¶øÀ´µÄ¡£

2.1.2Ï̵߳Ĵ洢

OSKitµÄÏ̴߳洢·½°¸ÓëUNIXÊ®·ÖÏàËÆ£¬ÓÉÈý¸öÂß¼­¶Î×é³É£¬ËüÃÇÊÇÕýÎĶΡ¢Êý¾Ý¶ÎºÍÕ»¡£ÕýÎĶκ¬ÓÐÒ»¸öÏß³ÌËùÖ´ÐеÄÖ¸ÁºÏ£¬ÕýÎĶεĵØÖ·°üÀ¨ÕýÎĵØÖ·£¨ÓÃÓÚ·ÖÖ§ºÍ×Ó³ÌÐòµ÷Óã©¡¢Êý¾ÝµØÖ·£¨ÓÃÓÚ´æÈ¡È«¾ÖÊý¾Ý±äÁ¿£©ºÍÕ»µØÖ·£¨ÎªÁË´æÈ¡×Ó³ÌÐòµÄÊý¾Ý½á¹¹£©¡£

Èô»úÆ÷½«Éú³ÉµÄµØÖ·¿´×÷ÎïÀí´æ´¢Æ÷ÖеĵØÖ·£¬ÄÇô£¬Á½¸öÏß³ÌÔÚËüÃÇËùÉú³ÉµÄµØÖ·¼¯ºÏÖØµþÁ˵ÄÇé¿öÏ£¬ÊDz»¿ÉÄܲ¢·¢Ö´Ðеġ£ËäÈ»±àÒëÆ÷¿ÉÒÔ²úÉúÔÚ³ÌÐòÖ®¼ä²»ÖصþµÄµØÖ·£¬µ«ÕâÑùµÄ³ÌÐò¶ÔÓÚͨÓüÆËã»úÊÇÐв»Í¨µÄ£¬ÒòΪһÖÖ»úÆ÷ÉϵĴ洢ÈÝÁ¿ÊÇÓÐÏ޵쬶øËùÓпÉÄܱ»±àÒëµÄ³ÌÐò¼¯ºÏÊÇÎÞÏ޵ġ£²ÉÈ¡´ËÖÖ·½·¨¿ÉÒÔÔںܴó³Ì¶ÈÉϱÜÃâÊý¾ÝµÄ¶ªÊ§¡£

2.1.3Ï̵߳ÄÊý¾Ý½á¹¹

ÒÔÏÂÎÒÁгöÁËOSKitÖÐÏ̵߳ÄÍêÕûµÄÊý¾Ý½á¹¹£¬ÆäÖд󲿷ÖÊÇ´ÓUNIXÖм̳ÐÀ´µÄ£¬µ«Ò²ÓÐһЩÊÇOSKit×Ô¼ºµÄ£¬ÀýÈ磬ΪÁËÖÆ×÷Àý×Ó³ÌÐòËùÌṩµÄCPU×ÊÔ´·ÖÅäµÄ²¿·Ö¡£

ΪÁËʹ¸÷λһĿÁËÈ»£¬ÎÒ¶Ô´ËÊý¾Ý½á¹¹×öÁËÈ«²¿×¢ÊÍ£¬²¢°´ÕÕÆä²»Í¬Ó¦ÓÃÁìÓò»®·Ö³ÉÁ˼¸¸ö²¿·Ö£¬·Ö±ð¼ÓÔÚÁËÏÂÃæµÄ×¢ÊÍÖ®ÖС£

queue_chain_t¡¡¡¡ runq;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* ÊͷŶÓÁÐÁ´ */
pcb_t¡¡¡¡¡¡¡¡¡¡¡¡ *ppcb;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /*Ö¸ÏòPCBµÄÖ¸Õë */
oskit_u32_t¡¡¡¡¡¡ pstk;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/*Ö¸ÏòËù·ÖÅäµÄ¶ÑÕ»µÄÖ¸Õë*/
void¡¡¡¡¡¡¡¡¡¡¡¡¡¡*(*func)(void *);¡¡¡¡/* Ö¸ÏòÖ´Ðк¯ÊýµÄÖ¸Õë*/
size_t¡¡¡¡¡¡¡¡¡¡¡¡ssize;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* Ëù·ÖÅäµÄ¶ÑÕ»µÄ´óС*/
size_t¡¡¡¡¡¡¡¡¡¡¡¡guardsize;¡¡¡¡¡¡¡¡¡¡ /*¾¯½ä¶ÑÕ»µÄ´óС */
pthread_t¡¡¡¡¡¡¡¡ tid;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* Ï̺߳Š*/
oskit_u32_tflags;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* Ïß³Ì״̬±êÖ¾ */
pthread_lock_t¡¡¡¡lock;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* Ëø*/
queue_chain_t¡¡¡¡ chain;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* ¶ÓÁÐÁ´ */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ preempt;¡¡¡¡¡¡¡¡¡¡¡¡ /*Ïß³ÌÓÅÏȼ¶ */
/*ÒÔÏÂÓÃÓÚ¶ÔËÀËøµÄ´¦Àí*/
pthread_mutex_t¡¡ mutex;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* »¥³âλ(ËÀËø±£»¤)*/
pthread_cond_t¡¡¡¡cond;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* µÈ´ýËÀËø±êÖ¾=1 */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ dead;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/*ËÀËøÁË */
/*Àý×ÓËùÓõ½µÄ×ÊÔ´*/
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ cputime;¡¡¡¡¡¡¡¡¡¡¡¡ /* Õ¼ÓÃCPUµÄʱ¼ä */
intcpticks;¡¡¡¡¡¡¡¡¡¡¡¡ /* ÉÏÒ»ÃëËùÕ¼µÄ½ÚÅÄÊý */
oskit_u32_t¡¡¡¡¡¡ pctcpu;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* CPUµÄÕ¼ÓÃÂÊ*/
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ childtime;¡¡¡¡¡¡¡¡¡¡ /* ×ÓÏß³ÌËùÕ¼ÓõÄCPUµÄ¿ªÏú*/
/*·¢ËÍÐÅÏ¢ËùÓõıäÁ¿*/
pthread_lock_t¡¡¡¡waitlock;¡¡¡¡¡¡¡¡¡¡¡¡/* µÈ´ýËø*/
oskit_u32_twaitflags;¡¡¡¡¡¡¡¡¡¡ /* µÈ´ý±ê־λ */
pthread_cond_t¡¡¡¡*waitcond;¡¡¡¡¡¡¡¡¡¡ /* µÈ´ýÌõ¼þ±äÁ¿*/
struct osenv_sleeprec¡¡¡¡*sleeprec;¡¡¡¡/*Ò»¸öosenv_sleepÖеÄÏß³Ì*/
/*ÒÔÏÂÊǽø³ÌͨѶҪÓõ½µÄ*/
void¡¡¡¡¡¡¡¡¡¡¡¡¡¡*msg;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* Ö¸ÏòÒª·¢Ë͵ÄÏûÏ¢µÄÖ¸Õë*/
oskit_size_t¡¡¡¡¡¡msg_size;¡¡¡¡¡¡¡¡¡¡¡¡/* ÏûÏ¢µÄ´óС */
pthread_t¡¡¡¡¡¡¡¡ tid;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /*Ï̺߳Š*/
void¡¡¡¡¡¡¡¡¡¡¡¡¡¡*reply;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* Ö¸ÏòÏìÓ¦ÐÅÏ¢µÄÖ¸Õë*/
oskit_size_t¡¡¡¡¡¡reply_size;¡¡¡¡¡¡¡¡¡¡/* ÏìÓ¦ÄÚÈݵĴóС*/
queue_head_t¡¡¡¡¡¡senders;¡¡¡¡¡¡¡¡¡¡¡¡ /* ·¢ËͶÓÁÐÖеķ¢ËÍÕß */
queue_chain_tsenders_chain;¡¡¡¡¡¡ /* ·¢ËͶÓÁÐÖ¸Õë */
/* ÒÔÏÂÊÇËùÓõ½µÄʱÖÓ */
structoskit_timer¡¡*condtimer;
/* Ï̵߳ÄÐÝÃߺͻ½ÐÑÊÇÓÃÒ»¸öµ¥¶ÀµÄ¼ÆÊ±Æ÷ʵÏÖµÄ */
structoskit_timer¡¡*sleeptimer;
/* ÒÔÏÂÊÇËùÓõ½µÄÐźŠ*/
pthread_lock_t¡¡¡¡siglock;¡¡¡¡¡¡¡¡¡¡¡¡ /*±£»¤ËøÐźŠ*/
sigset_t¡¡¡¡¡¡¡¡¡¡sigmask;¡¡¡¡¡¡¡¡¡¡¡¡ /* ×èÈûÐźÅ*/
sigset_t¡¡¡¡¡¡¡¡¡¡sigpending;¡¡¡¡¡¡¡¡¡¡/* δ¾öÐźŠ*/
sigset_t¡¡¡¡¡¡¡¡¡¡sigwaiting;¡¡¡¡¡¡¡¡¡¡/*µÈ´ýÐźŵÄÐźŠ*/
oskit_u32_t¡¡¡¡¡¡ eip;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* Ò³´¦Àí¹ÊÕÏÐźŠ*/
/* ¼üֵͨ³£ÊÇÒ»¸ö¹Ì¶¨µÄ¶ÓÁÐ*/
void¡¡¡¡¡¡¡¡¡¡¡¡¡¡*keyvalues[PTHREAD_KEYS_MAX]; /* ¼üÖµ */
/* ÒÔÏÂÓÃÓÚÇå³ý²Ù×÷*/
pthread_cleanup_t¡¡*cleanups;¡¡¡¡¡¡¡¡¡¡/* Çå³þ²Ù×÷Á´*/
char¡¡¡¡¡¡¡¡¡¡¡¡¡¡cancelstate;¡¡¡¡¡¡¡¡ /* È¡Ïû״̬ */
char¡¡¡¡¡¡¡¡¡¡¡¡¡¡canceltype;¡¡¡¡¡¡¡¡¡¡/*È¡ÏûÀàÐÍ */
/* ÒÔÏÂÊǵ¥¶ÀÓÃÓÚµ÷¶ÈµÄËø*/
pthread_lock_t¡¡¡¡schedlock;
void¡¡¡¡¡¡¡¡¡¡¡¡¡¡*rtai_priv;
intpolicy;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* µ÷¶È²ßÂÔ */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ priority;¡¡¡¡¡¡¡¡¡¡¡¡/* µ±Ç°µÄÓÅÏȼ¶ */
structscheduler_entry¡¡*scheduler;¡¡¡¡/* µ÷¶È³ÌÐòÈë¿Ú */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ policy;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* µ÷¶È²ßÂÔ*/
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ priority;¡¡¡¡¡¡¡¡¡¡¡¡/* µ±Ç°ÓÅÏȼ¶ */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ base_priority;¡¡¡¡¡¡ /*³õʼÓÅÏȼ¶ */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ticks;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* µ÷¶ÈËùʡϵĽÚÅÄ*/
oskit_timespec_t¡¡start;¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /* Ï´ÎÔËÐеÄʱ¼ä*/
oskit_timespec_t¡¡deadline;¡¡¡¡¡¡¡¡¡¡¡¡/* Ï´ÎÔËÐеÄʱ¼ä*/
oskit_timespec_t¡¡period;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* Á½´ÎÖ´ÐмûµÄ¼ä¸ô*/
queue_head_t¡¡¡¡¡¡waiters;¡¡¡¡¡¡¡¡¡¡¡¡ /* ÕýÔڵȴýµÄÏß³Ì */
queue_chain_twaiters_chain;¡¡¡¡¡¡ /* Ï̶߳ÓÁÐÁ´ */
struct pthread_thread¡¡*waiting_for;¡¡ /* ËùµÈ´ýµÄÏß³Ì*/
struct pthread_thread¡¡*inherits_from; /* Ï̴߳Ӻμ̳Ð*/
/*ÒÔÏÂÊÇCPUµÄ¼Ì³Ð*/
struct pthread_thread¡¡*scheduler;¡¡¡¡ /* Ï̵߳÷¶È³ÌÐòÈË¿Ú*/
schedmsg_t¡¡¡¡¡¡¡¡unblockmsg;
schedmsg_queue_t¡¡*msgqueue;
sched_wakecond_t¡¡wakeup_cond;/* »½ÐÑÌõ¼þ */
schedflags_t¡¡¡¡¡¡schedflags;¡¡¡¡¡¡¡¡¡¡/* ±êÖ¾ */
intdonate_rc;¡¡¡¡¡¡¡¡¡¡ /* ´Ó¾èÔùÏ̷߳µ»ØµÄÖµ */
int¡¡¡¡¡¡¡¡¡¡¡¡¡¡ timeout;¡¡¡¡¡¡¡¡¡¡¡¡ /* ºÁÃë*/
queue_head_t¡¡¡¡¡¡donors;¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* ¾èÔù×ÊÔ´µÄÏß³Ì */
queue_chain_tdonors_chain;¡¡¡¡¡¡¡¡/* ¾èÔù¶ÓÁÐÁ´ */
struct pthread_thread¡¡*donating_to;¡¡ /* ±»¾èÔùµÄÏß³Ì*/
struct pthread_thread¡¡*inherits_from; /* Ï̴߳Ӻμ̳Р*/
structpthread_thread¡¡*nextup;¡¡¡¡¡¡¡¡/* ÏÂÒ»¸öÒªÖ´ÐеÄÏß³Ì */


2.2 pthreads/pthread_create.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÏ̴߳´½¨»úÖÆ£¬ËüÊÇÈ«²¿Ï̵߳ĸùÔ´ËùÔÚ£¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÏ̴߳´½¨µÄ¡£ÎÒÈÏΪÔÚÉÏÒ»½ÚµÄÀíÂÛÖ¸µ¼Ï¶ԴúÂë½øÐзÖÎö£¬Òª±È·º·ºµÄ²ûÊöÀíÂÛ¸üÈÝÒ×ÈöÁÕß½ÓÊÜ£¬¸üÄܼÓÉîÔÚ¶ÁÕßÄÔº£ÖеÄÓ¡Ïó¡£

2.2.1 ´´½¨Ïß³Ì
˵Ã÷£ºÕâ¾ÍÊÇÎÒÃÇÔÚµÚÒ»½ÚÖÐÌáµ½µÄ´´½¨Ï̵߳ĺ¯Êý£¬ËùÓÐÓÉÓû§Íê³ÉµÄ´´½¨Ï̵߳IJÙ×÷£¬¶¼Òªµ÷ÓÃËüÀ´ÊµÏÖ¡£
intpthread_create ( pthread_t *tid, const pthread_attr_t *attr,
void * (*function )( void * ), void *argument )
tid: Ö¸ÏòÏ̴߳洢λÖõÄÖ¸Õë
attr:Ö¸ÏòÏß³ÌÊôÐÔµÄÖ¸Õë
*(*function)(void *): µ±Ï̳߳õʼ»¯Ê±Ëùµ÷Óõĺ¯Êý
*argument: º¯Êý¹¦ÄÜ

2.2.2´´½¨ÄÚ²¿Ïß³Ì
˵Ã÷£º¸Ãº¯ÊýÓÃÓÚϵͳºËÐIJ¿·Ö´´½¨ºËÐÄỊ̈߳¬¶øÒ»°ãµÄÓû§Ã»Óе÷ÓÃËüµÄȨÀû£¬Ö»ÓÐϵͳºËÐIJſÉÒÔµ÷Óá£
pthread_thread_t*pthread_create_internal ( void * ( *function)( void *), void *argument,constpthread_attr_t *attr)
×¢£ºÄÚ²¿Ï̴߳´½¨Ê±£¬½«×èÈûËùÓеÄÐźÅ
sigfillset(pthread->sigmask)

2.2.3ΪÖ÷½ø³Ì´´½¨Ò»¸ö±¸·ÝÏß³Ì
˵Ã÷£º³öÓÚϵͳ°²È«µÄÔ­Òò£¬OSKit¶¨ÒåÁ˴˺¯Êý£¬ÓÃÓÚ¶ÔÖ÷Ï߳̽øÐб¸·Ý¡£ÓÉÓÚÏ̴߳´½¨×ÓỊ̈߳¬×ÓÏß³ÌÓÖ´´½¨×Ô¼ºµÄ×ÓỊ̈߳¬Èç´ËÏÂÈ¥£¬½«²úÉúÒ»¸öÒÔÖ÷Ïß³ÌΪ¸ù½ÚµãµÄÊ÷Ðνṹ£¬ËùÒÔÒ»µ©Ö÷Ï̶߳ªÊ§£¬½«ÓпÉÄܵ¼ÖÂϵͳ±ÀÀ££¬ËùÒÔÓ¦¶ÔÆä½øÐб¸·Ý¡£
pthread_thread_t*pthread_init_mainthread ( pthread_thread_t *pthread )

2.2.4³õʼ»¯´´½¨Ï̵߳ÄÏß³Ì
˵Ã÷£ºÕâºÍUNIXÖÐÄǸö´´½¨½ø³ÌµÄ½ø³ÌÓÐЩÀàËÆ£¬ËüΨһµÄ¹¤×÷¾ÍÊÇΪÖ÷Ï̴߳´½¨×ÓỊ̈߳¬²¢ÇÒ£¬Ã¿¸öÏ̶߳¼°üº¬Ò»¸ö¸ÃÏ̡߳£
pthread_thread_t*thread_init_mainthread ( pthread_thread_t *pthread )

2.2.5ΪµÈ´ýºÍÐÝÃßµÄÏ̴߳´½¨Ò»¸öµÈ´ýʱ¼ä
˵Ã÷£ºÓÉÓÚµ÷¶ÈµÄÔ­Òò£¬Ò»°ãÏ̲߳»¿ÉÄÜÒ»Ö±Õ¼ÓÃCPU£¬Ò²²»¿ÉÄÜÓÀÔ¶±»¹ÒÆð£¬ËùÒÔOSKitΪ¹æ¶¨Ï̵߳ĵȴýʱ¼ä¶¨ÒåÁ˴˺¯Êý¡£
voidpthread_prepare_timer ( pthread_thread_t *pthread )


2.3 pthreads/pthread_attr.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÏß³ÌÊôÐԵijõʼ»¯»úÖÆ£¬ËüÓëÉÏÒ»½ÚµÄÏ̴߳´½¨¹²Í¬×÷Ó㬹涨ÁËÏß³ÌÔÚ´´½¨Ö®³õµÄÊôÐÔ£¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÏß³ÌÊôÐԵijõʼ»¯¡£

2.3.1Ï̳߳õʼ»¯µÄÊý¾Ý½á¹¹
˵Ã÷£ºÏµÍ³ÔÚ´´½¨ÐÂÏ̵߳Äʱºò£¬»áµ÷Óô˺¯ÊýÀ´¹æ¶¨±»´´½¨Ï̵߳ÄÊôÐÔ£¬ËùÒԴ˺¯ÊýÔÚÏß³ÌÊôÐÔ»úÖÆÖÐÕ¾ÓÐ×îÖ÷ÒªµÄµØÎ»£¬ÊÇÒ»ÇÐÏß³ÌÊôÐÔº¯Êýµ÷ÓõÄԴȪ£¬Ï£Íû¶ÁÕ߸øÒÔ³ä·ÖµÄÖØÊÓ¡£
intpthread_attr_init ( pthread_attr_t *attr )
¡¡¡¡attr->detachstate =PTHREAD_CREATE_JOINABLE; /* Ïß³ÌÓëÆäËûÏ̹߳ØÁª*/
¡¡¡¡attr->priority =PRIORITY_NORMAL; /* Ï̵߳ÄÓÅÏȼ¶ */
¡¡¡¡attr->stacksize = PTHREAD_STACK_MIN; /*Ïß³ÌËùÕ¼¶ÑÕ»µÄ */
¡¡¡¡attr->guardsize = DEFAULT_STACKGUARD; /* ¾¯½ä¶ÑÕ»µÄ´óС */
¡¡¡¡attr->stackaddr = 0; /* ¶ÑÕ»µÄ´óС */
¡¡¡¡attr->policy = SCHED_RR; /*Ï̵߳÷¶ÈÀàÐÍ */
¡¡¡¡attr->inherit = PTHREAD_EXPLICIT_SCHED; /* Ï̼̳߳ÐÀàÐÍ */
¡¡¡¡×¢£ºmemset µÄÊý¾Ý½á¹¹ /* \oskit\libc\string\memset.c */
¡¡¡¡void *memset(void *tov, intc, size_t len)
¡¡¡¡{¡¡¡¡register char *to = tov;
¡¡¡¡¡¡¡¡ while (len-- >0)
¡¡¡¡¡¡¡¡ *to++ = c;
¡¡¡¡¡¡¡¡ return tov;
¡¡¡¡}
¡¡¡¡tov: Ö¸ÏòÄÚ´æµÄÊ×µØÖ· c: ·ÖÅäÀàÐÍ len:·ÖÅ䳤¶È

2.3.2Ïß³ÌÊôÐԵij·Ïú
˵Ã÷£ºÕâ¸öº¯ÊýÊÇÉÏÒ»¸öº¯ÊýµÄÄæ²Ù×÷£¬ÔÚ³·ÏúÒ»¸öÏ̵߳Äͬʱ£¬ÆäÊôÐÔÒ²Ó¦ÏàÓ¦µØ±»³·Ïú£¬ËùÒÔOSKit¶¨ÒåÁ˴˺¯ÊýÀ´ÊµÏָù¦ÄÜ¡£
intpthread_attr_destroy ( pthread_attr_t *attr )
¡¡¡¡memset((void *) attr, -1,sizeof(*attr)); /* ³·ÏúÖ¸Õë²¢ÊÍ·ÅÄÚ´æ*/

2.3.3ÉèÖÃÏ̵߳ľ¯½ä¶ÑÕ»´óС
˵Ã÷£º¾¯½ä¶ÑÕ»ÔÚ²Ù×÷ϵͳÖб»¹ã·ºÊ¹Óã¬ËüÊÇÔ´ÓÚUNIXµÄ½ø³Ì¼äͨÐÅ£¬ÔÚUNIXϵͳÖУ¬½ÓÊܽø³ÌµÄÏûÏ¢»º³å¿ÉÄÜСÓÚ·¢Ëͽø³Ì¡£ËùÒÔ£¬µ±ÏûÏ¢µ½À´µÄʱºò£¬ÎªÁ˱ÜÃâÒç³öÔì³ÉµÄÐÅÏ¢¶ªÊ§£¬ÏµÍ³´´½¨Á˾¯½ä¶ÑÕ»£¬ÓÃÀ´´æ´¢Òç³öµÄÏûÏ¢¡£¶øOSKit°ÑËüÓÃÓÚÏ̼߳äͨÐŵı£»¤£¬µ«Ó÷¨ÓëUNIX´óͬСÒì¡£
intpthread_attr_setguardsize ( pthread_attr_t *attr, size_t guardsize )

2.3.4µÃµ½¾¯½ä¶ÑÕ»µÄ´óС
˵Ã÷£ºÓÉÓÚOSKitΪÿ¸ö½ÓÊÜÏß³ÌÉèÖþ¯½ä¶ÑÕ»£¬ËùÒÔ¶¨Òå´Ëº¯Êý£¬ÎªµÄÊÇϵͳÄÜ·½±ãµÄµÃµ½Ã¿¸ö½ÓÊÜÏ̵߳ľ¯½ä¶ÑÕ»µÄ´óС£¬ÕâͬÑùÊdzöÓÚ¶Ô°²È«µÄ¿¼ÂÇ¡£
intpthread_attr_getguardsize ( const pthread_attr_t *attr, size_t *guardsize )

2.3.5ÉèÖÃÏ̵߳ķÖÀë״̬
˵Ã÷£ºÉϱßÔø¾­Ìáµ½£¬ÏµÍ³ÖеÄÏß³ÌÊ÷£¬¶øÏß³ÌÓëÏß³ÌÖ®¼äºÜ¿ÉÄܲ¢²»ÊÇÍêÈ«¶ÀÁ¢µÄ£¬¼´Ê¹ËûÃÇ´¦ÓÚ²»Í¬µÄ²ã´Î£¬Ò²¿ÉÄÜÓÐÒ»¶¨µÄÏà¹ØÐÔ»ò»¥³âÐÔ£¬ËùÒÔ¶¨Òå´Ëº¯ÊýÓÃÀ´¹æ¶¨Ïß³ÌÖ®¼äµÄ»¥³âÐÔ£¬¼´·ÖÀë״̬ÊÇÍêÈ«ÓбØÒªµÄ¡£
intpthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )

2.3.6µÃµ½Ï̵߳ķÖÀë״̬
˵Ã÷£ºÔڹ涨ÁË·ÖÀë״̬֮ºó£¬ÈôAÏß³ÌÒªÓëBÏ̷߳¢Éú¹ØÁªµÄʱºò£¬Ëü±ØÐëÏÈ¿´¿´BÏß³ÌºÍÆäËûÏ̵߳ĹØÏµ£¬ËùÒÔÒª¶¨Òå´Ëº¯ÊýÀ´µÃµ½BÏß³ÌÓëÆäËûÏ̵߳ķÖÀë״̬£¬Ìṩ¸øA£¬È»ºóAÔÚ¸ù¾Ý¾ßÌåÇé¿ö¾ö¶¨ÊÇ·ñÓëB·¢Éú¹ØÏµ¡£
intpthread_attr_getdetachstate ( const pthread_attr_t *attr, int *detachstate)
¡¡¡¡*detachstate = attr->detachstate;

2.3.7ÉèÖÃÏ̵߳ļ̳йØÏµ
˵Ã÷£ºµ±Ï̴߳´½¨×ÓÏ̵߳Äʱºò£¬ÉϱßÎÒÌáµ½µÄÄǸö´´½¨Ï̵߳ÄÏ̻߳áΪËûÃǸ¸×ÓÖ®¼ä¹æ¶¨¼Ì³Ð¹ØÏµ£¬¼´×ÓÏ̼̳߳и¸Ï̡߳£
intpthread_attr_setinheritsched ( pthread_attr_t *attr, int inheritstate)
¡¡¡¡attr->inherit = inheritstate;

2.3.8µÃµ½Ï̵߳ļ̳Ð״̬
˵Ã÷£ºµ±ÏµÍ³ÒªÔÚ¸´ÔÓµÄÏß³ÌÊ÷Öеõ½¼Ì³Ð¹ØÏµµÄʱ£¬µ÷Óô˺¯Êý±ãÄÜ´ïµ½Ô¤ÆÚµÄÄ¿µÄ¡£OSKit¶¨Òå´Ëº¯Êý£¬ÎªµÄÊÇÄÜÔÚ¸´ÔÓµÄÏß³ÌÊ÷ÖÐÒ»ÑÛ¿´´©Ä³Á½¸öÏß³ÌÖ®¼äµÄ¹ØÏµ¡£
intpthread_attr_getinheritsched ( const pthread_attr_t *attr, int *inheritstate)
¡¡¡¡*inheritstate = attr->inherit;

2.3.9ÉèÖÃÏ̵߳ĵ÷¶È²ÎÊý
˵Ã÷£ºOSKitÌṩÁ˶àÖÖÏ̵߳÷¶È·½Ê½¹©Ñ¡Ôñ£¬¶øÇÒ»¹ÎªÃ¿¸öÏß³ÌÔÚ´´½¨µÄʱºò¹æ¶¨ÁËÒ»ÖÖµ÷¶ÈËã·¨£¬ÏµÍ³ÔÚ´´½¨Ï̵߳Äʱºòµ÷ÓÃÏÂÃæµÄº¯ÊýÀ´Íê³ÉÕâÏ×÷¡£
intpthread_attr_setschedparam ( pthread_attr_t *attr,const struct sched_param*param )
¡¡¡¡int pri¡¡¡¡¡¡¡¡¡¡¡¡= param->priority;
¡¡¡¡attr->start¡¡¡¡¡¡¡¡=param->start; /* Ï߳̿ªÊ¼²ÎÊý */
¡¡¡¡attr->period ¡¡¡¡¡¡= param->period; /*Ï̵߳ÄÖÜÆÚ */
¡¡¡¡attr->deadline¡¡¡¡ = param->deadline; /* Ïß³ÌÔËÐеÄ×îÖÕʱÏÞ */

2.3.10µÃµ½Ï̵߳÷¶ÈµÄ²ÎÊý
˵Ã÷£ºÔÚOSKitÖУ¬Ã¿¸öÏ̶߳¼ÓÐÆä×ÔÉíµÄµ÷¶È·½Ê½£¬»»¾ä»°Ëµ£¬¾ÍÊÇÏ̵߳ĵ÷¶È·½Ê½·Â·ðÊÇÏ̵߳ÄÒ»¸öÊôÐÔ£¬ÔÚ´´½¨Ï̵߳Äʱºò¾ÍËæÏ̱߳»¹æ¶¨ÁË£¬ËùÒÔµ÷¶È³ÌÐò¿ÉÒÔͨ¹ýÏÂÃæµÄº¯ÊýÀ´µÃµ½Ä³¸öÏ̵߳ĵ÷¶ÈËã·¨ºÍ´ËʱËüµÄÓÅÏȼ¶¡£
intpthread_attr_getschedparam ( pthread_attr_t *attr, struct sched_param *param)
¡¡¡¡param->priority = attr->priority;

2.3.11ÉèÖÃÏ̵߳÷¶È²ßÂÔ
˵Ã÷£ºÔÚijЩ·½Ã棬Ï̵߳ĵ÷¶È²ßÂÔµÄÈ·ºÜÏñÏ̵߳ÄÊôÐÔ£¬µ«ËüÈ´ÊÇ¿ÉÒÔÔÚµ÷¶ÈÖб»¸ü¸ÄµÄ£¬ÏµÍ³¿ÉÒÔµ÷Óô˺¯ÊýÍê³É¶ÔÏ̵߳÷¶È²ßÂÔµÄÖØ¶¨Òå¡£ÕâÑùµÄ¹æ¶¨£¬Ê¹µÃÏ̵߳÷¶ÈÁé»îÁËÐí¶à£¬µ±È»ÕâÖÖÁé»îÊÇÓÃÔö¼Óϵͳ¿ªÏúµÄ´ú¼Û»»»ØÀ´µÄ£¬µ«È´ÊÇÖµµÃµÄ¡£
intpthread_attr_setschedpolicy ( pthread_attr_t *attr, int policy )
¡¡¡¡switch(policy) {
¡¡¡¡¡¡¡¡case SCHED_FIFO:¡¡¡¡¡¡¡¡¡¡¡¡/* Ïȵ½ÏÈ´¦Àí */
¡¡¡¡¡¡¡¡caseSCHED_RR:¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* ʱ¼äƬÂÖת */
¡¡¡¡¡¡¡¡case SCHED_EDF¡¡¡¡¡¡¡¡¡¡¡¡¡¡/* ÏÈËÀÏÈ´¦Àí */
¡¡¡¡¡¡¡¡caseSCHED_RMS:¡¡¡¡¡¡¡¡¡¡¡¡ /* ЧÂÊÓÅÏÈ */
¡¡¡¡¡¡¡¡¡¡¡¡ attr->policy = policy;
break;
¡¡¡¡¡¡¡¡case SCHED_DECAY:
¡¡¡¡¡¡¡¡¡¡¡¡ printf("pthread_attr_setschedpolicy:"
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡"SCHED_DECAY not supported yet\n");
¡¡¡¡}

2.3.12µÃµ½Ï̵߳÷¶È²ßÂÔ
˵Ã÷£º¸ºÔðµ÷¶ÈµÄÏß³Ìͨ¹ý¸Ãº¯ÊýµÃµ½±»µ÷¶ÈÏ̵߳ĵ÷¶È²ßÂÔ£¬È»ºóÔÙ¸ù¾Ý´ËʱϵͳÄÚµÄÇé¿ö£¬¾ö¶¨ÊÇ·ñ¸Ä±äÆäµ÷¶ÈËã·¨¡£
intpthread_attr_getschedpolicy ( const pthread_attr_t *attr, int *policy)
¡¡¡¡*policy = attr->policy;

2.3.13ÉèÖöÑÕ»µØÖ·
˵Ã÷£ºµ÷Óô˺¯Êý£¬¿ÉÒÔʵÏÖ¶ÔÏß³ÌÊôÐÔ¶ÑÕ»µÄµ×²ã²Ù×÷£¬¼´ÉèÖÃÖ¸Ïò¸Ã¶ÑÕ»µÄÖ¸Õ룬²¢±£´æÆðÀ´£¬ÎªÒÔºóµÄ²Ù×÷µì¶¨»ù´¡¡£
intpthread_attr_setstackaddr ( pthread_attr_t *attr, oskit_u32_t stackaddr)
¡¡¡¡attr->stackaddr = stackaddr;

2.3.14 µÃµ½¶ÑÕ»µÄµØÖ·
˵Ã÷£º·µ»ØÖ¸ÏòÏß³ÌÊôÐÔ¶ÑÕ»µÄÖ¸Õë¡£
intpthread_attr_getstackaddr(const pthread_attr_t *attr, oskit_u32_t*stackaddr)
¡¡¡¡*stackaddr = attr->stackaddr;

2.3.15ÉèÖöÑÕ»µÄ´óС
˵Ã÷£ºÓÉÓÚϵͳÖеÄÏ̹߳¦ÄÜ¡¢´óС¸÷²»Ïàͬ£¬ËùÒÔÆäÊôÐÔ¶ÑÕ»µÄ´óСҲ²»¾¡Ïàͬ£¬µ÷Óô˺¯Êý¿ÉÒÔÉèÖÃÏß³ÌÊôÐÔ¶ÑÕ»´óС¡£
intpthread_attr_setstacksize ( pthread_attr_t *attr, size_t stacksize)
¡¡¡¡attr->stacksize = stacksize;

2.3.16 µÃµ½¶ÑÕ»µÄ´óС
˵Ã÷£º·µ»ØÄ³¸öÏ̶߳ÑÕ»µÄ´óС¡£
int pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize )
¡¡¡¡*stacksize =attr->stacksize;

2.3.17ÉèÖÃÏ̵߳ÄÓÅÏȼ¶
˵Ã÷£ºÔÚ²Ù×÷ϵͳµÄÏ̵߳÷¶ÈÖУ¬ÓÅÏȼ¶µ÷¶ÈµÄʹÓÃ×îΪ¹ã·º£¬OSKit¶¨ÒåÁËÏÂÃæµÄº¯ÊýÀ´¹æ¶¨Ï̵߳ÄÓÅÏȼ¶¡£
intoskit_pthread_attr_setprio ( pthread_attr_t *attr, int pri)
¡¡¡¡attr->priority = pri;

2.3.18×¼±¸½ÓÊܵ÷¶È
˵Ã÷£ºÓÉÓÚ¶à̬ÐÔÔ­Òò£¬²»ÊÇËùÓеÄÏ̶߳¼Òª²ÎÓëµ÷¶È£¬Ö»ÊÇijЩÏ̲߳μӣ¬ËùÒÔ£¬ÏµÍ³±ØÐëµ÷Óô˺¯Êý£¬¸æË߸ÃÏß³Ì×¼±¸²Î¼Óµ÷¶È£¬¶ø±»µ÷¶ÈµÄ·½Ê½ÔÚÉϱߵöº¯ÊýÀïÒѾ­¹æ¶¨ºÃÁË¡£
intpthread_attr_setopaque ( pthread_attr_t *attr, oskit_u32_t opaque)
¡¡¡¡attr->opaque = opaque;

2.3.19 ÉùÃ÷Òª½øÐе÷¶ÈµÄÏß³Ì
˵Ã÷£ºµ÷Óô˺¯ÊýÊÇΪÁ˸æËßϵͳ£¬ÄÄЩÏß³ÌÊÇÒª±»µ÷¶ÈµÄ¡£
intpthread_attr_setscheduler ( pthread_attr_t *attr, pthread_t tid)
¡¡¡¡attr->scheduler = tid;

2.3.20ÉèÖÃmutexµÄÊôÐÔ
˵Ã÷£ºÔÚOSKitÖУ¬¹ã·ºÊ¹ÓÃÁËmutex£¬Ö÷ÒªÊÇΪÁ˸üºÃµÄʹÓÃÁÙ½ç×ÊÔ´£¬ÓÐЧµØ±ÜÃâÁËËÀËø£¬»»¾ä»°Ëµ£¬mutex¾ÍÏñÁÙ½ç×ÊÔ´µÄÊýÁ¿Ò»Ñù£¬Ïß³Ì¶ÔÆä½øÐÐPV²Ù×÷¡£¶øµ±Ò»¸öÏß³ÌÕ¼ÓÐÁËÒ»¸ömutex£¬²¢ÇÒÔÚûÊÍ·ÅËü֮ǰ¸ÃÏß³ÌÓÖ´´½¨ÁË×ÓỊ̈߳¬´Ëʱ£¬×ÓÏß³ÌÀíËùµ±È»µØ´Ó¸¸Ïß³ÌÊÖÖм̳ÐÁËmutexµÄËùÓÐȨ£¬OSKit¶¨ÒåÁËÏÂÃæµÄº¯ÊýÀ´ÊµÏÖËùÐðÊöµÄ¹¦ÄÜ¡£
intpthread_mutexattr_init ( pthread_mutexattr_t *attr)
¡¡¡¡attr->priority_inherit = PTHREAD_PRIO_NONE; /* THREAD_PRIO_NONE=0 */

2.3.21³·ÏúmutexµÄÊôÐÔ
˵Ã÷£ºµ±Õ¼ÓÐmutexµÄÏß³Ì·ÅÆúÁËËüµÄʱºò£¬µ÷Óøú¯ÊýÀ´³·ÏúmutexµÄÊôÐÔ¡£
intpthread_mutexattr_destroy ( pthread_mutexattr_t *attr )
¡¡¡¡memset((void *)attr, -1, sizeof(*attr));

2.3.22ÉèÖÃmuxtexµÄЭÒé
˵Ã÷£ºmutexµÄʹÓò¢²»ÊǼòµ¥µÄÕ¼ÓÃÓë³·Ïú£¬OSKit»¹ÌṩÁ˸ü¼ÓÍêÉÆµÄmutexЭÒ飬Ëü¸ù¾ÝinheritµÄ²»Í¬£¬½«mutex¶àÑù»¯¡£
intthread_mutexattr_setprotocol ( pthread_mutexattr_t *attr, int inherit)
¡¡¡¡switch (inherit) {
¡¡¡¡¡¡¡¡case PTHREAD_PRIO_NONE:
¡¡¡¡¡¡¡¡casePTHREAD_PRIO_INHERIT:
¡¡¡¡¡¡¡¡¡¡¡¡attr->priority_inherit =inherit;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡¡¡default:
¡¡¡¡¡¡¡¡¡¡¡¡returnEINVAL;
¡¡¡¡}
×¢£ºÔÚÏ̵߳÷¶Èʱ£¬¸ù¾ÝmutexЭÒé²úÉúmutex±äÁ¿£¬½«Ḭ̈߳´ÕÕÓÅÏȼ¶ÅŶÓ

2.3.23 µÃµ½Ï̵߳÷¶ÈµÄmutexЭÒé
˵Ã÷£ººÃÏñ¶ÔЭÒéµÄ½âÎöÒ»Ñù£¬µ÷Óô˺¯Êý£¬¿ÉÒÔ·µ»Ø¸ÃÏ̵߳Ämutex¡£
intpthread_mutexattr_getprotocol ( const pthread_mutexattr_t *attr, int*inherit)
¡¡¡¡*inherit = attr->priority_inherit;

2.3.24ÉèÖÃmutexµÄÖÖÀà
˵Ã÷£ºmutexÔÚOSKitÖÐÊÇ¿ÉÒÔ¶àÖÖ¶àÑùµÄ£¬Í¨¹ýµ÷ÓÃÏÂÃæµÄº¯Êý£¬¿ÉÒԹ涨Ï̵߳½µ×Õ¼ÓÃÁËÄÄÖÖmutex¡£
intpthread_mutexattr_settype ( pthread_mutexattr_t *attr, int type )
¡¡¡¡switch(type) {
¡¡¡¡¡¡¡¡case PTHREAD_MUTEX_NORMAL: /* ÆÕͨ */
¡¡¡¡¡¡¡¡casePTHREAD_MUTEX_ERRORCHECK: /* ´íÎó¼ì²é */
¡¡¡¡¡¡¡¡case PTHREAD_MUTEX_RECURSIVE: /* µÝ¹é*/
¡¡¡¡¡¡¡¡case PTHREAD_MUTEX_DEFAULT: /* ĬÈÏ */
¡¡¡¡¡¡¡¡¡¡¡¡attr->type =type;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡¡¡default:
¡¡¡¡¡¡¡¡¡¡¡¡return EINVAL;
¡¡¡¡}

2.3.25µÃµ½mutexµÄÀàÐÍ
˵Ã÷£ºµ±ÏµÍ³ÏëÒªÖªµÀij¸öÏß³ÌÕ¼ÓõÄÊÇʲôÀàÐ͵Ämutexʱ£¬µ÷Óô˺¯ÊýÀ´·µ»ØmutexµÄÀàÐÍ¡£
intpthread_mutexattr_gettype ( const pthread_mutexattr_t *attr, int *type)
¡¡¡¡*type = attr->type;


±¾ Õ С ½á

±¾Õ´ÓÏ̵߳Ĵ´½¨¡¢´æ´¢ºÍÊý¾Ý½á¹¹µ½¸÷ÖÖÊôÐÔÒÔ¼°¶ÔËüÃǵIJÙ×÷(ÉèÖᢳ·ÏúºÍµÃµ½)ÈëÊÖ£¬ÏµÍ³µØ²ûÊöÁËOSKitÏ̻߳úÖÆµÄ¸ùÔ´--Ï̳߳õʼ»¯¡£

ÔÚµÚÒ»½ÚÖ÷Òª´ÓÈý¸ö½Ç¶È¹éÄÉÁËOSKitÖÐÏß³ÌËùÉæ¼°µÄ¸ÅÄËüÃÇÊÇ´´½¨¡¢´æ´¢ÒÔ¼°Ï̵߳ÄÊý¾Ý½á¹¹¡£µÚ¶þ½ÚÖÐÒÔÔ´´úÂëÖеÄ/pthreads/pthread_creat.c ΪÀý£¬ËµÃ÷Á˵ÚÒ»½ÚÖиÅÄîµÄ¾ßÌåʵÏÖ¡£µÚÈý½ÚÒÔÔ´´úÂëÖÐµÄ /pthreads/pthread_attr.cΪÀý£¬ËµÃ÷ÁËOskit¶ÔÏß³ÌÊôÐÔµÄÈ«²¿²Ù×÷£¬°üÀ¨Ï̳߳õʼ»¯µÄÊý¾Ý½á¹¹¡¢ÊôÐԵij·Ïú¡¢Ïß³Ì¼ä¹ØÏµ¡¢¶ÔmutexµÄ²Ù×÷ÒÔ¼°¶ÔÊôÐÔ¶ÑÕ»µÄ²Ù×÷µÈ¡£

[Ŀ¼]


µÚÈýÕ Ïß³ÌͨÐÅ·ÖÎö

¡¶OSKitµÄÏ̻߳úÖÆ µÚÈýÕ¡·


OSKitµÄÏ̻߳úÖÆ µÚÈýÕÂ2000Äê12ÔÂ25ÈÕ22:11


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚÈýÕ Ïß³ÌͨÐÅ·ÖÎö


ÖÚËùÖÜÖª£¬ÔÚLinuxÖУ¬½ø³ÌΪÁËÄÜÔÚͬһÏîÈÎÎñÉÏЭµ÷¹¤×÷£¬±Ë´ËÖ®¼ä±ØÐëÄܹ»½øÐÐͨÐÅ¡£ÀýÈ磬ÔÚÒ»¸öshell¹ÜµÀÖУ¬µÚÒ»¸ö½ø³ÌµÄÊä³ö±ØÐë´«Êäµ½µÚ¶þ¸ö½ø³Ì£¬ÕâÑùÑØ×ŹܵÀ´«µÝÏÂÈ¥¡£Òò´ËÔÚÐèҪͨÐŵĽø³ÌÖ®¼ä£¬Ó¦¸ÃʹÓÃÒ»Öֽṹ½ÏºÃµÄͨÐÅ·½Ê½¡£

LinuxÖ§³ÖÐí¶à²»Í¬ÐÎʽµÄ½ø³Ì¼äͨÐÅ»úÖÆ£¬ÔÚÌØ¶¨µÄÇé¿öÏ£¬ËüÃǸ÷ÓÐ×Ô¼ºµÄÓÅȱµã£¬ÈçÀûÓùܵÀ½øÐÐͨÐŵÄ×î´óȱµã¾ÍÊÇ£¬Ö»ÓгÉΪϵͳµ÷ÓÃpipeµÄ½ø³ÌµÄ×ÓËïºó´úµÄ½ø³Ì²Å¿ÉÒÔʹÓùܵÀ£¬Òò´Ë£¬Ï໥Î޹صĽø³Ì²»ÄÜͨ¹ý¹ÜµÀͨÐÅ¡£

OSKitµÄ¿ª·¢ÈËÔ±Ãdzä·Ö¿¼ÂÇÁ˸÷ÖÖͨÐÅ·½Ê½µÄÀû±×£¬Ñﳤ±Ü¶Ì£¬²ÉÓÃÁËÈçϵÄÁ½ÖÖÏ̼߳äͨÐÅ·½Ê½£ºÏûÏ¢¶ÓÁкÍÐźÅÁ¿¡£ËäÈ»Õ⻹Óкܶ಻×ãÖ®´¦£¬µ«½ÏÖ®SystemVÒÔÓÐËù¸Ä½ø¡£


3.1 Ï̼߳äͨÐÅ

3.1.1ÏûÏ¢¶ÓÁÐ

OSKitÌṩµÄÏûÏ¢¶ÓÁлúÖÆÓÚUNIXÊ®·ÖÏàËÆ£¬Ò»¸öºÍ¶à¸öÏ߳̿ÉÏòÏûÏ¢¶ÓÁÐдÈëÏûÏ¢£¬¶øÒ»¸ö»ò¶à¸öÏ߳̿ɴÓÏûÏ¢¶ÓÁÐÖжÁÈ¡ÏûÏ¢£¬ÕâÖÖÏ̼߳äͨÐŵĻúÖÆ¾ÍÏñ¿Í»§»ú/·þÎñÆ÷Ò»Ñù£¬¿Í»§»úÏò·þÎñÆ÷·¢ËÍÇëÇóÏûÏ¢£¬·þÎñÆ÷¶ÁÈ¡ÏûÏ¢²¢Ö´ÐÐÏàÓ¦µÄÇëÇó¡£

OSKit½«ÏûÏ¢ÃèÊö³ÉÔÚÄں˵ØÖ·¿Õ¼äµÄÒ»¸öÄÚ²¿Á´±í£¬Ã¿Ò»¸öÏûÏ¢¶ÓÁÐÓÉÒ»¸öIPC±êʶºÅΨһµÄ±êʶ¡£

3.1.2ÐźÅ

¾¡¹Ü´ó¶àÊýÏ̼߳äͨÐÅÊǼƻ®ºÃµÄ£¬µ«ÊÇͬʱ»¹ÐèÒª´¦Àí²»¿ÉÔ¤ÖªµÄͨÐÅÎÊÌâ¡£ÀýÈ磬Óû§Ê¹ÓÃÎı¾±à¼­Æ÷ÒªÇóÁгöÒ»¸ö´óÎļþµÄÈ«²¿ÄÚÈÝ£¬µ«Ëæ¼´ËûÈÏʶµ½¸Ã²Ù×÷²¢²»ÖØÒª£¬ÕâÊǾÍÐèÒªÒ»ÖÖ·½·¨À´ÖÐÖ¹±à¼­Æ÷µÄ¹¤×÷£¬±ÈÈç˵£¬ÎÒÃÇ¿ÉÒÔ°´DEL¼üÀ´ÊµÏÖ¡£°´DEL¼üʵ¼ÊÉÏÊÇÏò±à¼­Æ÷·¢ËÍÒ»¸öÐźţ¬±à¼­Æ÷ÊÕµ½´ËÐźűãÁ¢¼´Í£Ö¹´òÓ¡ÎļþµÄÄÚÈÝ¡£ÐźŻ¹¿ÉÒÔÓÃÀ´±¨¸æÓ²¼þ²¶»ñµ½µÄÌØ¶¨µÄÖжϣ¬Èç·Ç·¨Ö¸ÁîºÍ¸¡µãÔËËãÒç³ö¡¢³¬Ê±Ò²Í¨¹ýÐźÅʵÏֵġ£

ÔÚOSKitÖУ¬ÐźÅÊÇÒ»ÖÖÖØÒªµÄÏ̼߳äͨÐÅ»úÖÆ£¬Ïß³Ìͨ¹ýÐźÅÖªµÀϵͳÖÐÕýÔÚ³öÏÖµÄʼþ¡£ÐźŵÄÒ»¸öÌØµã¾ÍÊÇËüµÄÒì²½ÐÔ£¬Õâ±íʾÏß³ÌÔÚËüµÄÖ´ÐÐÆÚ¼äµÄÈκÎʱºò¶¼¿ÉÒÔ½ÓÊܵ½Ðźţ¬ÉõÖÁ¿ÉÄܵ±Ïß³ÌÕýÔÚÖ´ÐÐϵͳµ÷ÓõÄʱºò½Óµ½Ðźţ¬Òò´Ë£¬Ï̱߳ØÐëËæÊ±ÎªÏàÓ¦ÐźÅ×÷ºÃ×¼±¸¡£

ÏÂÃæÎÒÃÇÔÙ̸̸ÐźŵÄÉú³ÉÓë½»¸¶£¬µ±ÒýÆðÐźŵÄʼþÊ״γöÏÖʱ£¬¾ÍÈÏΪÐźÅΪÏ̶߳øÉú³É£¬Ò²¾ÍÊÇ˵Ðźű»·¢Ë͵½Ï̡߳£ÕâÀàʼþµÄÀý×Ó£¬°üÀ¨£ºÊ±¼äƬµ½Ê±£¬Öն˼¤»î£¬Ó²¼þ¹ÊÕϵļì²â£¬kill()µÄµ÷Óá£ÔÚijЩÇé¿öÏ£¬Ò»¸öʼþΪ¶à¸ö¿ÉÒÔΪ¶à¸öÏß³ÌÉú³ÉÐźš£Ã¿¸öÏ̲߳ÉÓÃÑùÓ¦µÄ¶¯×÷À´ÏìӦϵͳ¶¨ÒåµÄÿÖÖÐźÅ(¼ûÐźÅÁ¿±í3.1)¡£

ÔÚÐźŵÄÉú³ÉÓë½»¸¶Ö®¼ä£¬¸ÃÐźű»¹ÒÆð£¬µ«ÔÚÓû§Ò»¼¶ÊǼì²â²»µ½Õâ¸ö¼ä¸ôµÄ¡£Ã¿¸öÏ̶߳¼ÓµÓÐÒ»¸öÐźÅÑÚÂë(sig_mask)£¬Ëü¹æ¶¨Á˵±Ç°±»×èÈû¶ø²»Äܽ»¸¶¸øÏ̵߳ÄÐźż¯¡£Ï̵߳ÄÐźÅÑÚÂëÊÇ´Ó¸¸Ï̼̳߳жøÀ´µÄ¡£ÎÒÇ°ÃæÌáµ½sigaction(),sigprocmask( )ºÍsigsuspend( )º¯Êý£¬¶¼ÊǶÔÐźÅÑÚÂëµÄ²Ù×÷¡£

Ðźŵ͝×÷ÓëÐźÅÓйص͝×÷·ÖΪÈýÖÖ£ºSIG_DFL,SIG_IGN»òÖ¸Ïòº¯ÊýµÄÖ¸Õë¡£ÔÚ×ʼ£¬½øÈëmain()֮ǰ£¬ËùÓÐÐźŶ¼½«±»ÖóÉSIG_DFL»òSIG_IGN¡£

(1)SIG_DFLÐźÅרÓõÄĬÈ϶¯×÷:
¡¡¡¡(a)Èç¹ûĬÈ϶¯×÷ÊÇÔÝÍ£Ị̈߳¬Ôò¸ÃÏ̵߳ÄÖ´Ðб»ÔÝʱ¹ÒÆð¡£µ±Ïß³ÌÔÝÍ£ÆÚ¼ä£¬·¢Ë͸øÏ̵߳ÄÈκθ½¼ÓÐźŶ¼²»½»¸¶£¬Ö±µ½¸ÃÏ߳̿ªÊ¼Ö´ÐУ¬µ«ÊÇSIGKILL³ýÍâ¡£
¡¡¡¡(b)°Ñ¹ÒÆðÐźŵÄÐźŶ¯×÷ÉèÖóÉSIG_DFL£¬ÇÒÆäĬÈ϶¯×÷ÊǺöÂÔÐźÅ(SIGCHLD)¡£

(2)SIG_IGNºöÂÔÐźÅ
¡¡¡¡(a)¸ÃÐźŵĽ»¸¶¶ÔÏß³ÌûÓÐÓ°Ïì
¡¡¡¡(b)ϵͳ²»ÔÊÐí°ÑSIGKILL»òSIGTOPÐźŵ͝×÷ÉèÖÃΪSIG_DFL

(3)Ö¸Ïòº¯ÊýµÄÖ¸Õë--²¶»ñÐźÅ
¡¡¡¡(a)ÐźÅÒ»¾­½»¸¶£¬½ÓÊÕÏ߳̾ÍÔÚÖ¸¶¨µØÖ·ÉÏÖ´ÐÐÐźŲ¶»ñ³ÌÐò¡£ÔÚÐźŲ¶»ñº¯Êý·µ»Øºó£¬½ÓÊÜÏ̱߳ØÐëÔÚ±»Öжϵã»Ö¸´Ö´ÐС£
¡¡¡¡(b)ÓÃCÓïÑÔº¯Êýµ÷Óõķ½·¨½øÈëÐźŲ¶×½³ÌÐò:
¡¡¡¡¡¡¡¡void func(signo)
¡¡¡¡¡¡¡¡int signo;
¡¡¡¡¡¡¡¡func()ÊÇÖ¸¶¨µÄÐźŲ¶×½º¯Êý£¬signoÊÇÕý±»½»¸¶ÐźŵıàÂë
¡¡¡¡(c)Èç¹ûSIGFPE,SIGILL»òSIGSEGVÐźŲ»ÊÇÓÉC±ê×¼¶¨ÒåµÄkill()»òraise()º¯ÊýËùÉú³É£¬Ôò´ÓÐźÅSIGFPE,SIGILL,SIGSEGVµÄÐźŲ¶»ñº¯ÊýÕý³£·µ»ØºóÏ̵߳ÄÐÐΪÊÇ䶨ÒåµÄ¡£
¡¡¡¡(d)ϵͳ²»ÔÊÐíÏ̲߳¶»ñSIGKILLºÍSIGSTOPÐźš£
¡¡¡¡(e)Èç¹ûÏß³ÌΪSIGCHLDÐźŽ¨Á¢ÐźŲ¶»ñº¯Êý£¬¶ø¸ÃÏß³ÌÓÐδ±»µÈ´ýµÄÒÔÖÕÖ¹µÄ×ÓÏß³Ìʱ£¬Ã»Óй涨ÊÇ·ñÒªÉú³ÉSIGCHLDÐźÅÀ´Ö¸Ã÷ÄǸö×ÓÏ̡߳£

ÿһÖÖÐźŶ¼±»OSKit¸øÓèÁËÒ»¸ö·ûºÅÃû£¬¶ÔÓÚ32λµÄi386ƽ̨¶øÑÔ£¬Ò»¸ö×Ö32룬Òò¶øÐźÅÓÐ32ÖÖ¡£ÏÂÃæµÄ±í¸ø³öÁ˳£ÓõķûºÅÃû¡¢ÃèÊöºÍËüÃǵÄÐźÅÖµ¡£

·ûºÅÃû¡¡¡¡ÐźÅÖµÃèÊö¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ·ñ·ûºÏPOSIX
SIGHUP¡¡¡¡1¡¡¡¡¡¡ÔÚ¿ØÖÆÖÕ¶ËÉϼì²âµ½¹Ò¶Ï»ò¿ØÖÆÏß³ÌËÀÍö¡¡¡¡ÊÇ
SIGINT¡¡¡¡2¡¡¡¡¡¡½»»¥×¢ÒâÐźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGQUIT3¡¡¡¡¡¡½»»¥ÖÐÖ¹Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGILL¡¡¡¡4¡¡¡¡¡¡¼ì²âµ½·Ç·¨Ó²¼þµÄÖ¸Áî¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGTRAP5¡¡¡¡¡¡´ÓÏÝÚåÖлØË·¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGABRT6¡¡¡¡¡¡Òì³£ÖÕÖ¹Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGEMT¡¡¡¡7¡¡¡¡¡¡EMTÖ¸Áî¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGFPE¡¡¡¡8¡¡¡¡¡¡²»ÕýÈ·µÄËãÊõ²Ù×÷Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGKILL9¡¡¡¡¡¡ÖÕÖ¹Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGBUS¡¡¡¡10¡¡¡¡ ×ÜÏß´íÎó¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGSEGV¡¡ 11¼ì²âµ½·Ç·¨µÄÄÚ´æµ÷Óá¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGSYS¡¡¡¡12¡¡¡¡ ϵͳcallµÄ´íÎó²ÎÊý¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGPIPE¡¡ 13ÔÚÎÞ¶ÁÕߵĹܵÀÉÏд¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGALRM¡¡ 14¡¡¡¡ ±¨Ê±Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGTERM¡¡ 15ÖÕÖ¹Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGURG¡¡¡¡16¡¡¡¡ IOÐŵÀ½ô¼±Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGSTOP¡¡ 17ÔÝÍ£Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGTSTP¡¡ 18¡¡¡¡ ½»»¥ÔÝÍ£Ðźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGCONT¡¡ 19Èç¹ûÔÝÍ£Ôò¼ÌÐø¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGCHLD¡¡ 20¡¡¡¡ ×ÓÏß³ÌÖÕÖ¹»òÔÝÍ£¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ
SIGTTIN¡¡ 21ºǫ́Ïß³Ì×éÒ»³ÉÔ±ÊÔͼ´Ó¿ØÖÆÖÕ¶ËÉ϶Á³ö¡¡¡¡ÊÇ
SIGTTOU¡¡ 22¡¡¡¡ ºǫ́Ïß³Ì×éµÄ³ÉÔ±ÊÔͼдµ½¿ØÖÆÖÕ¶ËÉÏ¡¡¡¡¡¡ÊÇ
SIGIO¡¡¡¡ 23ÔÊÐíI/OÐźŠ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGXCPU¡¡ 24¡¡¡¡ ³¬³öCPUʱÏÞ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ·ñ
SIGXFSZ25¡¡¡¡ ³¬³öÎļþ´óСÏÞÖÆ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGVTALRM 26¡¡¡¡ Ðéʱ¼ä¾¯±¨Æ÷¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGPROF27¡¡¡¡ ²àÃæÊ±¼ä¾¯±¨Æ÷¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGWINCH¡¡28¡¡¡¡ ´°¿Ú´óСµÄ¸ü¸Ä¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGINFO29¡¡¡¡ ÏûÏ¢ÇëÇó¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡·ñ
SIGUSR1 ¡¡30¡¡¡¡ ±£Áô×÷ΪÓû§×Ô¶¨ÒåµÄÐźÅ1¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ÊÇ
SIGUSR2¡¡31¡¡¡¡ ±£Áô×÷ΪÓû§×Ô¶¨ÒåµÄÐźš¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ÊÇ

ÇëÇó°´Ä¬ÈϵĹæÔò½øÐÐÐźŴ¦Àí
SIG_DFL (void (*)(int))0
ÇëÇóºöÂÔÐźÅ
SIG_IGN (void (*)(int)) 1
×¢Ò⣺ÐźŶÓÁÐÖÐ×î¶àÔÊÐíÓÐ64¸öÐźÅ


3.2 pthreads/pthread_ipc.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÏûÏ¢¶ÓÁÐÐÍÏß³ÌͨÐÅ»úÖÆ£¬ÏûÏ¢¶ÓÁÐÊÇÏß³ÌͨÐŵÄÖ÷ÒªÊֶΣ¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÐźŶÓÁУ¬´Ó¶ø½øÐÐÏß³ÌͨÐŵġ£

3.2.1ÏûÏ¢·¢ËÍ:
˵Ã÷£ºµ±Ò»¸öÏß³ÌÒªÏòÁíÒ»¸öÏ̷߳¢ËÍÏûÏ¢µÄʱºò£¬OSKitʹÓÃÏÂÃæ¶¨ÒåµÄº¯ÊýÀ´ÊµÏÖÒ»¸öÏß³ÌÏòÁíÒ»¸öÏ̴߳«µÝÏûÏ¢¡£
oskit_error_toskit_ipc_send ( pthread_t dst,void *msg,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡oskit_size_t msg_size,oskit_s32_t timeout)
¡¡¡¡dst:Ä¿±êµØÖ·¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡*msg:Ö¸ÏòÏûÏ¢µÄÖ¸Õë
¡¡¡¡msg_size:ÏûÏ¢´óС(32λÎÞ·ûºÅÕûÐÎ)¡¡¡¡¡¡¡¡timeout:³¬Ê±

3.2.2sendµÄËã·¨
·¢ËÍÒ»¸öͬ²½ÏûÏ¢,Ö±µ½½ÓÊÕÕß·¢ËÍÖÕÖ¹ÏûÏ¢»ò³¬Ê±²Å½áÊø
Ϊ±ÜÃâËÀËø,¸øÃ»¸öÈ˼ÓÒ»¸öËø,²¢¹ØÖжϡ£
assert_interrupts_enabled();
disable_interrupts( );
pthread_lock(target->waitlock);
ͨ¹ýÌõ¼þ,¼ì²âÄ¿±êÏß³ÌÊÇ·ñÔڵȴý½ÓÊÜ:
Ìõ¼þ: a:Ä¿±êÏ̵߳ĵȴý±êÖ¾ THREAD_WS_IPCRECV_WAIT(Ï߳̽ÓÊյȴýλ)
¡¡¡¡¡¡ b:Ä¿±êÏ̺߳ŴæÔÚ
c:Ä¿±êÏ̵߳ÈÓÚÈÎÒâÒ»¸öÏß³Ì
¡¡¡¡¡¡ d:ÏûÏ¢´óС²»Îª0
Ìõ¼þ³ÉÁ¢: a  ( b || c)  d== 1 ²Å¿ÉÒÔ·¢ËÍ
¡¡¡¡¡¡if (target->waitflags THREAD_WS_IPCRECV_WAIT
¡¡¡¡¡¡¡¡¡¡(target->ipc_state.tid ==pthread->tid||target->ipc_state.tid== ANYTID))
¡¡¡¡¡¡{ if(msg_size)
¡¡¡¡¡¡¡¡¡¡{Memcpy(target->ipc_state.msg,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡msg,MIN(msg_size,target->ipc_state.msg_size));
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if(msg_size > target->ipc_state.msg_size)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡err =OSKIT_ERANGE;
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
°ÑÊý¾ÝµÄ´óСºÍ·¢ËÍÕßµÄID¸æËß½ÓÊÜÏß³Ì:
target->ipc_state.msg_size= msg_size;
target->ipc_state.tid =pthread->tid;
Çå³ý½ÓÊÜλ:
target->waitflags =~THREAD_WS_IPCRECV_WAIT;
pthread_unlock ( target->waitlock);
×¢Òâ: flagA  = ~flagBʵ¼ÊÉϾÍÊǽ«flagBÖеÈÓÚ1µÄλÔÚflagBÖÐÇå0
·¢ËͶÓÁÐ:
queue_enter (target->ipc_state.senders,pthread,pthread_thread_t*,
ipc_state.senders_chain)
target->ipc_state.senders:·¢ËÍÏ̵߳ÄIDpthread:
pthread_thread_t*:Ö¸ÏòÏûÏ¢µÄÖ¸ÕëÊÇpthread_thread_tÀàÐÍ
ipc_state.senders_chain:·¢ËͶÓÁеÄÖ¸Õë
¶ÓÁмä²ÎÊý´«µÝ:
pthread->ipc_state.msg= msg; /* ÏûÏ¢ */
pthread->ipc_state.msg_size = msg_size; /* ÏûÏ¢µÄ³¤¶È*/
pthread->ipc_state.tid = dst; /* ÏûÏ¢µÄÄ¿µÄµØÖ· */
pthread->waitflags =THREAD_WS_IPCSEND_WAIT;
/* ÏûϢĿµÄµÈ´ýλÖÃ1 */

3.2.3ÏûÏ¢½ÓÊÕ
˵Ã÷£ºµ±Ò»¸öÏß³ÌÒª´ÓÆäÏûÏ¢¶ÓÁÐÖпªÊ¼½ÓÊÜÏûÏ¢µÄʱºò£¬OSKitÌṩÁËÏÂÃæµÄº¯Êý¹©Ï̵߳÷Óá£
oskit_error_toskit_ipc_recv ( pthread_t src,void *msg,
¡¡¡¡¡¡¡¡¡¡oskit_size_t msg_size,oskit_size_t *actual,oskit_s32_t timeout )
¡¡¡¡src: ·¢ËÍÏ̵߳ÄID *msg: Ö¸ÏòÏûÏ¢µÄÖ¸Õë
¡¡¡¡msg_size: ÏûÏ¢´óС(32λÎÞ·ûºÅÕûÐÎ)
¡¡¡¡actual: ʵ¼ÊÏûÏ¢µÄ´óС timeout: ³¬Ê±

3.2.4receiveµÄËã·¨
µÈ´ý´Ó·¢ËÍÏß³ÌÀ´µÄÏûÏ¢
ͨ¹ýÌõ¼þ,¼ì²âÊÇ·ñ½ÓÊÜÏûÏ¢
a:Óеȴý·¢Ë͵ÄÏß³Ì
b:Ï̵߳ȴýλTHREAD_WS_IPCSEND_WAIT(·¢Ë͵ȴý±êÖ¾)
c:·¢ËÍÏ̴߳æÔÚ
Ìõ¼þ³ÉÁ¢:a(b||c)
¡¡¡¡¡¡pthread_lock(source->waitlock);
¡¡¡¡¡¡if(source->waitflags  THREAD_WS_IPCSEND_WAIT
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡source->ipc_state.tid == pthread->tid){
¡¡¡¡¡¡¡¡¡¡¡¡*actual = MIN(msg_size, source->ipc_state.msg_size);
¡¡¡¡¡¡¡¡¡¡¡¡if(*actual) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡memcpy(msg, source->ipc_state.msg,*act0ual);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (source->ipc_state.msg_size >msg_size)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡err =OSKIT_ERANGE;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
Èç¹ûûÓеȴý·¢Ë͵Ľø³Ì,ÔòÈýÓÊܽø³ÌµÈ´ý
µ±·¢ËͶÓÁÐΪ¿ÕÇÒtimeout=0ʱ½âËø,Èç¹û·¢ËÍÁ˵«Ã»½ÓÊÜ£¬ÔòÖØÐ³õʼ»¯·¢Ëͽø³Ì£¬ÖØÐ·¢ËÍ¡£


3.3 pthreads/pthread_signal.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÐźÅÁ¿ÐÍÏß³ÌͨÐÅ»úÖÆ£¬ÐźÅÁ¿ÊÇÏß³ÌͨÐŵÄÁíÒ»¸öÖØÒªµÄÊֶΣ¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÐźÅÁ¿£¬´Ó¶ø½øÐÐÏß³ÌͨÐŵġ£

3.3.1¼ì²â²¢¸ü¸Ä×èÈûµÄÐźÅ
˵Ã÷£ºµ±Ò»¸öÐźű»·¢ËͳöÀ´µÄʱºò£¬²¢²»Ò»¶¨ÂíÉÏÄܵõ½ÏàÓ¦£¬Ò»°ãÀ´Ëµ£¬ËüÒª±»×èÈûÒ»¶Îʱ¼ä£¬µ«ÏµÍ³Ò²ÊǾͲ»¹ÜÕâЩ×èÈûÐźÅÁË£¬ÏµÍ³»á¶¨Ê±Ö´ÐдËỊ̈߳¬ÓÃÒÔ¼ì²â×èÈûµÄµ½µ×ÊÇʲôÐźţ¬ËüµÄº¬ÒåÊÇʲô£¬È»ºó¸ù¾ÝÐèÇó×÷³ö¾ö¶¨£¬¿ÉÒÔ½«ÐźÅ×èÈû»òÕßÏìÓ¦¡£
intpthread_sigmask ( int how, const sigset_t *set, sigset_t *oset )
¡¡¡¡how:SIG_BLOCK SIG_UNBLOCK SIG_SETMASK
¡¡¡¡set:Èç¹ûÊÇ¿ÕÖ¸Õ룬ÔòÖ¸ÏòÏÂÒ»¸öÐźÅ
¡¡¡¡oset:Èç¹ûÊÇ¿ÕÖ¸Õ룬ÔòÖ¸ÏòÉÏÒ»¸öÐźżÇ¼

3.3.2ɱÏß³ÌÐźÅ
˵Ã÷£ºOSKitÒÔ¼°ËùÓеIJÙ×÷ϵͳ£¬¶¼°üº¬Õâ¸öº¯Êý£¬ÒòΪËüÊDzÙ×÷ϵͳËù±ØÐë¾ß±¸µÄ»ù±¾¹¦ÄÜ£¬Ò²¾ÍÊÇ˵£¬µ±Ò»¸öÏ̳߳öÓÚÎÞÏìӦ״̬ºÜ³¤Ê±¼ä£¬»òÕßÒòΪÆäËûµÄʲôԭÒòÏ̲߳»Äܵõ½Ö´ÐУ¬Ôòµ÷ÓÃËü£¬½«¸ÃÏß³ÌɱËÀ¡£
intpthread_kill(pthread_t tid, int signo)

3.3.3¹ØÏß³ÌËø
˵Ã÷£ºµ±Ï߳̽ÓÊܵ½ÁËÏûÏ¢ºóµÄÏìÓ¦¹ý³ÌÖУ¬ÓÐЩʱºòÊDz»Ï£Íû±»ÆäËûµÄÏ̴߳ò¶ÏµÄ£¬ËùÒÔOSKitÌṩÁ˴˺¯Êýµ÷Óã¬ÓÃÀ´½«Ïß³ÌËøÆðÀ´£¬Ò²¿ÉÒÔÀí½âΪ½«Ï̱߳£»¤ÁËÆðÀ´¡£
intpthread_kill_locked ( pthread_thread_t *pthread, int signo )

3.3.4ÔÚÄ¿±êÏ̵߳ÄÐźŵȴý¶ÓÁÐÖмÓÒ»¸öÐźÅ
˵Ã÷£ºÔÚÐźŷ¢ËͺͽÓÊܵĹý³ÌÖУ¬Ï̼߳äͨѶ²¢²»Ò»¶¨ÊÇͬ²½µÄ£¬´Ëʱ£¬OSKitÌṩÁËÒ»¸öÏûÏ¢µÈ´ý¶ÓÁУ¬½«²»Äܼ°Ê±µÃµ½ÏìÓ¦µÄÏûÏ¢ÓÃÖ¸ÕëÁ´½Ó³ÉΪһ¸öÀàËÆÓëÁ´±íµÄÊý¾Ý½á¹¹¡£µ±½ÓÊÜÏß³ÌÒªÏìÓ¦ÐźŵÄʱºò¿ÉÒÔÖ±½Ó´ÓÏûÏ¢¶ÓÁÐÀïÌáÈ¡£¬ÕâÑù×÷¼È¿ÉÒÔÌá¸ßͨÐÅЧÂÊ£¬ÓпÉÒÔÔö¼ÓͨÐŵÄÎȶ¨ÐÔ¡£
intsigaddset ( pthread->sigpending, signo )

3.3.5ÐźÅÍê³ÉµÄ¶¯×÷
˵Ã÷£ºÔÚÓÃÐźŷ½Ê½Í¨ÐŵÄʱºò£¬Ï̼߳䴫µÝµÄÐźŲ¢²»ÊÇÒª×öµÄ¶¯×÷£¬¶øÊǶ¯×÷µÄ´úÂ룬¶øÊ²Ã´ÐźŶÔӦʲô¶¯×÷£¬»¹ÒªÓд˺ºËµÀ´½øÐнâÎö£¬ÕâÑù×÷ÊÇΪÁ˹淶Ï̼߳äͨÐÅ£¬Í¬Ê±»¹¿ÉÒÔ½ÚÔ¼¿Õ¼ä£¬½ÚÊ¡·¢ËͺͽÓÊܵÄʱ¼ä£¬´Ó¶ø´ó´óÌá¸ßϵͳµÄЧÂÊ¡£
intsigaction ( int sig, const struct sigaction *act, struct sigaction *oact)
¡¡¡¡sig£ºÖ¸¶¨ÐźŠact£ºÖ¸ÏòÓëÖ¸¶¨ÐźÅÏòÁªÏµµÄ¹æ¶¨ÐźŶ¯×÷µÄ½á¹¹
¡¡¡¡oact£ºÖ¸Ïò´æ´¢ÏÈǰÓë¸ÃÐźÅÏàÁªÏµµÄ¶¯×÷µÄ½á¹¹

3.3.6²âÊÔ»ò¸Ä±ä(»òÁ½Õß¼æÓÐ)Ö÷µ÷½ø³ÌµÄÐźÅÑÚÂë
˵Ã÷£ºËùνÑÚÂë¾ÍÊÇÐÅºÅµÄÆÁ±ÎÂ룬±ÈÈç˵£¬µ±Ò»¸öÐźű»·¢Ë͵Äʱºò£¬Ëü±»×Ô¶¯¼ÓÔØµ½½ÓÊÕÏ̵߳ÄÐźÅÑÚÂëÖУ¬Èç¹û´ËʱÓÖÏò¸ÃÏ̷߳¢ËÍÁËͬÑùµÄÐźţ¬Ôò×èÈû¸ÃÐźţ¬ÖªµÀǰһ¸öÐźÅÏìÓ¦Íê±Ï¡£
OSKit²ÉÓÃÏÂÃæµÄº¯ÊýÍê³ÉµÄ¶ÔÐÅÏ¢ÑÚÂëµÄ²âÊԺ͸ı䡣
intsigprocmask ( int how, const sigset_t *set, sigset_t *oset )
¡¡¡¡how:Ö¸Ã÷¸Ä±äÐźż¯µÄ·½Ê½
¡¡¡¡SIG_BLOCK: ½á¹ûÊǵ±Ç°¼¯Óëʵ²ÎsetËùÖ¸ÏòµÄÐźż¯µÄÁªºÏ
¡¡¡¡SIG_UNBLOCK:½á¹û¼¯Êǵ±Ç°¼¯Óëʵ²ÎsetËùÖ¸ÏòµÄÐźż¯µÄ²¹¼¯µÄ½»
¡¡¡¡SIG_SETMASK: ½á¹û¼¯ÊÇʵ²ÎsetËùÖ¸ÏòµÄÐźż¯
¡¡¡¡set:Ö¸ÏòÒªÓÃÀ´¸Ä±äµ±Ç°±»×èÈûµÄÐźż¯ oset: ´æ´¢µ±Ç°µÄÑÚÂë

3.3.7ɱÏß³Ì
˵Ã÷£º´Ëº¯ÊýºÍÇ°Ãæ½éÉܹýµÄɱÏß³ÌÐźŲ¢²»ÍêȫһÑù£¬Ô´Ïß³ÌÊÇͨ¹ý¿´ÊÇ·ñÓÐÏòÄ¿µÄÏ̷߳¢ÐźŵÄȨÏÞ£¬Èç¹ûÓеϰ¾ÍɱµôËü
intkill ( pid_t pid, int signo )
¡¡¡¡pid: Ä¿±êÏß³Ì signo: ËùÒª·¢µÄÐźÅ

3.3.8µÈ´ýÐźŵÄÏ̶߳ÓÁÐ
˵Ã÷£ºÓÉÓÚÏ̼߳äͨÐŲ»Ò»¶¨Í¬²½µÄÔ­Òò£¬µ÷Óô˺¯Êý´´½¨Ðźŵȴý¶ÓÁÐÊÇÊ®·ÖÓбØÒªµÄ¡£
int sigqueue( pid_t pid, int signo, const union sigval value )

3.3.9µÈ´ýÄÚ²¿ÐźÅ
˵Ã÷£ºOSKit½«ÐźŷÖΪÄÚ²¿ÐźźÍÍⲿÐźţ¬ÕâÊÇÊ®·ÖÓÐÒâÒåµÄ£¬ÒòΪºÜ¶àÇé¿öÏ£¬ËüÃǵĴ¦Àí·½Ê½ÊDz»Ò»ÑùµÄ£¬ÓеÄÍⲿÏûÏ¢¿ÉÒÔ²»¼ÓÀí²Ç£¬µ«Ò»°ãÀ´Ëµ£¬ÄÚ²¿ÏûÏ¢ÊÇÒ»¶¨Òª¼°Ê±ÏìÓ¦µÄ£¬ÏµÍ³Í¨¹ýµ÷ÓÃÏÂÃæµÄº¯ÊýʵÏÖÁ˵ȴýÒ»¸öÄÚ²¿Ðźţ¬Ò»µ©µÈµ½£¬ÂíÉÏÏìÓ¦¡£
oskit_error_toskit_sigwait_internal ( const sigset_t *set,siginfo_t
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡*info,constoskit_timespec_t *timeout )
¡¡¡¡sigset_t: ÐźÅ×°Öã¬ÎÞ·ûºÅÕûÐÍ
¡¡¡¡siginfo_t:ÐźÅÐÅÏ¢²»»á±»ÍⲿµÄÐźŴò¶Ï

3.3.10Ï̵߳ȴýÐźÅ
˵Ã÷£ºÔÚÏ̵߳÷¶Èʱ£¬µ÷¶È³ÌÐò¾­³£»á·¢ËÍ´ËÐźÅÈÃÖ´ÐÐÍê±ÏµÄÏ̵߳ȴý»¹Ã»Ö´ÐÐÍêµÄỊ̈߳¬ÕâÊÇΪÁ˱£³ÖÏß³ÌÖ®¼äµÄͬ²½¡£
intsigwait ( const sigset_t *set, int *sig )

3.3.11 Ï̵߳ȴýÐźÅ(Ò»°ãÖ¸ÄÚ²¿ÐźÅ)
˵Ã÷£ºÍ¬ÑùµÄ£¬ºËÐÄÄÚµÄÏß³ÌÒ»ÑùÒ²Òª±£³Öͬ²½¡£
intsigwaitinfo ( const sigset_t *set, siginfo_t *info )

3.3.12Ï̵߳ȴýÐźÅ(ÓÐʱ¼äÏÞÖÆ)
˵Ã÷£º´ËÍâΪÁËÍêÉÆÏµÍ³µÄÏ̹߳ÜÀí£¬OSKit»¹ÌṩÁËÕâÌõº¯Êý£¬ÓÃÀ´É趨Ï̵߳ĵȴýʱ¼ä£¬Èç¹ûÔڹ涨µÄʱ¼äÄÚûÓÐÐźŵ½À´µÄ»°£¬Ôò²»Ôٵȴý¡£
intsigtimedwait ( const sigset_t *set,siginfo_t *info,
¡¡¡¡¡¡¡¡¡¡const structoskit_timespec *timeout )

3.3.13Ï̵߳ȴýÐźţ¬Èç¹ûÎÞÐźŷ¢¸øËü£¬ÔòÎÞÏÞÆÚµÈ´ý
˵Ã÷£ºµ«ÓеÄʱºò£¬Ïß³ÌÒªµÈ´ýµÄÐźŶÔÓÚ¸ÃÏß³ÌÀ´ËµÊÇÊ®·ÖÖØÒªµÄ£¬ËùÒÔËü½«ÎÞÏÞÆÚµÄµÈ´ýÏÂÈ¥£¬Í¬Ê±µ÷¶È³ÌÐò»á½«¸ÃÏß³Ì×èÈûÆðÀ´¡£
intsigsuspend ( const sigset_t *sigmask)

3.3.14´ÓÒ»¸öÏÝÈë·¢ËÍÐźŸøÏß³Ì
˵Ã÷£ºµ±ÏµÍ³ÄÚ²¿·¢ÉúÏÝÈëµÄʱºò£¬ÏµÍ³»á¸øÕýÔÚÖ´ÐеÄÏ̷߳¢ËÍÐźţ¬OSKitÕýÊǵ÷ÓÃÁ˴˺¯ÊýÀ´ÊµÏÖ¡£
voidoskit_libc_sendsig ( int sig, int code, struct sigcontext *scp )

3.3.15·¢³öÏß³Ì×èÈûÐźÅ
˵Ã÷£ºÈç¹ûµ±Ç°ÕýÔÚÖ´ÐеÄÏß³ÌÓÉÓÚijÖÖÍ»·¢Çé¿ö±»×èÈûÁË£¬Ëü½«µ÷Óô˺¯Êý£¬À´Í¨ÖªÓëÆäÏà¹ØµÄÏ̡߳£
voidoskit_deliver_pending_signals ( void )

3.3.16²»»á±»×èÈûµÄÐźŷ¢ËÍ
˵Ã÷£ºÔÚ²Ù×÷ϵͳÖУ¬ÓÐÐí¶àÊ®·ÖÖØÒªµÄÏûÏ¢ÊDz»Äܱ»×èÈûµÄ£¬OSKitËùÌṩµÄ´ËÌõº¯Êýµ÷ÓñãÊÇÓÃÀ´·¢ËÍ´ËÖÖÐźŵġ£
voidreally_deliver_signal ( int sig, siginfo_t *info, struct sigcontext *scp )

3.3.17Ðźųõʼ»¯
˵Ã÷£ºÓëÏß³ÌÀàËÆ£¬ÐźŲ¢²»ÊÇ´ÓÌì¶ø½µ£¬ËüÒ²ÒªÏȽøÐгõʼ»¯£¬È»ºóÔÙ·¢Ë͸ø½ÓÊÜÏ̡߳£
voidpthread_init_signals ( )


3.4 pthreads/pthread_cond.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÏß³ÌͨÐŵÄÌõ¼þ±äÁ¿£¬ËüÊÇÏß³ÌͨÐŵÄÖØÒª×é³É²¿·Ö£¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÏß³ÌͨÐŵÄÌõ¼þ±äÁ¿¡£

3.4.1Ìõ¼þ±äÁ¿µÄ³õʼ»¯Êý¾Ý½á¹¹
˵Ã÷£ºÔÚOSKitµÄÏ̼߳äͨÐÅ»úÖÆÖУ¬¾­³£Óõ½Ìõ¼þ±äÁ¿¡£ËùνÌõ¼þ±äÁ¿£¬¾ÍÊÇÁ½¸öÏß³Ìͨ¹ýÌõ¼þ±äÁ¿À´´ïµ½Í¬²½¡£ÀýÈ磬AÏß³ÌÎÒÃÇÈÃËüµÈ´ýÒ»¸öÌõ¼þ±äÁ¿£¬BÏß³ÌÎÒÃÇÈÃËü·¢ËÍÒ»¸öÐźţ¬Âú×ãAÏß³ÌËùµÈ´ýµÄÌõ¼þ£¬ÕâÑù¾ÍʵÏÖÁËA¡¢BÏß³ÌÖ®¼äµÄͬ²½¡£
intpthread_cond_init ( pthread_cond_t *c, const pthread_condattr_t *attr)
¡¡¡¡pthread_cond_t: Ìõ¼þ±äÁ¿ pthread_condattr_t: Ìõ¼þ±äÁ¿ÊôÐÔ

3.4.2³·ÏúÌõ¼þ±äÁ¿
˵Ã÷£ºÌõ¼þ±äÁ¿²¢²»ÊÇÓÀÔ¶·¢Éú×÷Óõģ¬ËùÒÔÓд´½¨¾ÍµÃÓг·Ïú£¬OSKitÕýÊǵ÷ÓÃÁËÕâ¸öº¯ÊýÀ´ÊµÏÖÌõ¼þ±äÁ¿³·Ïú¡£
intpthread_cond_destroy(pthread_cond_t *c)

3.4.3Ï̵߳ȴýÌõ¼þ±äÁ¿
˵Ã÷£ºOSKitÉ趨Ìõ¼þ±äÁ¿¾ÍÊÇΪÁËͨ¹ýÈÃÏ̵߳ȴýËü£¬´Ó¶øÊµÏÖÏß³ÌÖ®¼äµÄÏ໥Эµ÷¡£
intpthread_cond_wait ( pthread_cond_t *c, pthread_mutex_t *m)
¡¡¡¡pthread_mutex_t£ºÎªÊ²Ã´¶øµÈ´ý

3.4.4°²È«µÄµÈ´ý
˵Ã÷£ºµÈ´ýÌõ¼þ±äÁ¿µÄ·½Ê½Ò²ÊǶàÖÖ¶àÑù£¬´Ëº¯ÊýÌṩµÄÊÇÒ»ÖÖ°²È«µÄµÈ´ý·½Ê½£¬¼´µÈ´ýÌõ¼þ±äÁ¿µÄÏ̲߳»»á±»Öжϡ£
intpthread_cond_wait_safe ( pthread_cond_t *c, pthread_mutex_t *m )
¡¡¡¡×¢£º²»»á±»ÖжÏ

3.4.5µÈ´ýÌõ¼þ±äÁ¿£¬µ«ÓÐʱ¼äÏÞÖÆ
˵Ã÷£ºÁíÒ»ÖֵȴýÌõ¼þ±äÁ¿µÄ·½Ê½ÊÇÔÚÒ»¶¨µÄʱ¼äÏÞÖÆÄڵȴý£¬Ò»µ©³¬Ê±£¬Ï̱߳ã·ÅÆú¶Ô¸ÃÌõ¼þ±äÁ¿µÄÇëÇó¡£
intpthread_cond_timedwait ( pthread_cond_t *c, pthread_mutex_t
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡*m,oskit_timespec_t *abstime )
¡¡¡¡struct oskit_timespec{
¡¡¡¡¡¡¡¡¡¡¡¡oskit_time_t tv_sec; /* Ãë */
¡¡¡¡¡¡¡¡¡¡¡¡oskit_s32_t tv_nsec; /* ÄÉÃë*/
¡¡¡¡};

3.4.6µÈ´ý¾èÔùÌõ¼þ
˵Ã÷£ºÔÚ²Ù×÷ϵͳÖÐÏß³ÌÖ®¼ä×ÜÓÐһЩ±È½ÏÓÐȤµÄµ÷¶ÈËã·¨£¬¾èÔù¾ÍÊÇÆäÖÐÖ®Ò»£¬ÔÚOSKitÀ³öÓÚͬһ¸öµÈ´ýÄ¿µÄµÄÏß³ÌÖ®¼ä£¬ÎªÁË×ÜÌåÉϵÄ×îÓÅ»¯£¬Ä³Ð©Ï߳̿ÉÒÔ½«×Ô¼ºÕ¼ÓеÄ×ÊÔ´¾èÔù¸øÆäËûỊ̈߳¬ÈÃÆä¾¡ÔçÂú×ãÖ´ÐеÄÌõ¼þ¡£
intpthread_cond_donate_wait ( pthread_cond_t *c, pthread_mutex_t
¡¡¡¡¡¡¡¡¡¡¡¡¡¡*m,oskit_timespec_t *abstime, pthread_t donee_tid )
¡¡¡¡pthread_tdonee_tid£º±»¾èÔùÏ̺߳Å

3.4.7µÈ´ýÌõ¼þ³¬Ê±
˵Ã÷£º´Ëº¯ÊýÊÇOSKitµÄ³ö´íÐÅÏ¢£¬ËüÊÇÔڵȴýÌõ¼þ±äÁ¿³¬Ê±µÄÇé¿öϲű»µ÷Óõġ£
oskit_error_tpthread_condwait_timeout ( struct oskit_iunknown *listener, void *arg )

3.4.8Ï̷߳¢ËÍÐźÅÌõ¼þ
˵Ã÷£ºÔÚÏ̼߳äͨÐÅÖУ¬Ï̲߳¢²»ÊÇʲôʱºò¶¼¿ÉÒÔ·¢ËÍÐźŵģ¬OSKit¶¨ÒåÁËÏÂÃæÕâ¸öº¯Êý£¬¹æ¶¨ÁËÐźŷ¢ËÍÊÇËùÒªµÈ´ýµÄÌõ¼þ£»»»¾ä»°Ëµ¾ÍÊÇÖ»ÓÐÂú×ãÁ˴˺¯Êýµ÷ÓÃËùÉ趨µÄÌõ¼þ£¬Ïß³ÌÖ®¼ä²Å¿É½øÐÐͨÐÅ¡£
intpthread_cond_signal ( pthread_cond_t *c )

3.4.9Ï̹߳㲥Ìõ¼þ
˵Ã÷£ºÓÐЩʱºò£¬Ä³Ð©Ïß³ÌÐèÒª¶ÔϵͳÖÐËùÓеÄÏ̷߳¢ËÍͬһÌõÏûÏ¢£¬ÕâÑù¾ÍÓõ½ÁËOSKitÌṩµÄÏ̹߳㲥µÄº¯Êý¡£
intpthread_cond_broadcast ( pthread_cond_t *c )


±¾ Õ С ½á

±¾Õ´ÓÏ̼߳äµÄÁ½ÖÖͨÐÅ»úÖÆÈëÊÖ£¬ÏµÍ³µØ²ûÊöÁËOSKitµÄÏß³ÌͨÐÅ»úÖÆ¡£

ÔÚµÚÒ»½ÚÖ÷ÒªÃèÊöÁËOSKitËùÓõ½µÄÁ½ÖÖÏ̼߳äͨÐÅ»úÖÆ£¬ÒÔ¼°ËüΪʲôûÓÐʹÓÃUNIXÖеĹܵÀͨÐÅ£¬ÁíÍ⣬ÎÒ»¹ÒÔ±í¸ñµÄÐÎʽÏêϸÁгöÁËOSKitÌṩµÄ¸÷ÖÖÐźÅÁ¿¡¢ÒÔ¼°ËüÃÇÓëPOSIX±ê×¼Ö®¼äµÄ¹ØÏµ¡£µÚ¶þ½ÚÖÐÒÔÔ´´úÂëÖеÄ/pthreads/pthread_ipc.c ΪÀý£¬ËµÃ÷Á˵ÚÒ»½ÚÖÐÏûÏ¢¶ÓÁеľßÌåʵÏÖ¡£µÚÈý½ÚÒÔÔ´´úÂëÖÐµÄ /pthreads/pthread_signal.cΪÀý£¬ËµÃ÷ÁËOskitµÚÒ»½ÚÖÐÐźÅÁ¿µÄ¾ßÌåʵÏÖ¡£µÚËĽÚÖÐÓÖÒÔÔ´´úÂë/pthreads/pthread_cond.cΪÀý£¬²ûÊöÁËÌõ¼þ±äÁ¿µÄ¸ÅÄîÒÔ¼°ÓÃÌõ¼þ±äÁ¿½øÐи¨ÖúͨÐŵľßÌåʵÏÖ¡£

[Ŀ¼]


µÚËÄÕ Ï̵߳÷¶È

¡¶OSKitµÄÏ̻߳úÖÆ µÚËÄÕ¡·


OSKitµÄÏ̻߳úÖÆ µÚËÄÕÂ2000Äê12ÔÂ25ÈÕ22:20


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚËÄÕ Ï̵߳÷¶È

Ï̵߳÷¶ÈÊDzÙ×÷ϵͳÄÚºËÖеÄÖ÷ÒªÄÚÈÝÖ®Ò»£¬Ëü¶ÔÕû¸ö²Ù×÷ϵͳµÄÖ´ÐÐЧÂÊÖÁ¹ØÖØÒª¡£OSKitµ±È»Ò²°üÀ¨´ËÏîÄÚÈÝ£¬¶øÇÒÓÉÓÚÏ̵߳ĵ÷¶È¸ü¼ÓƵ·±£¬ËùÒÔµ÷¶È³ÉѧÕⲿ·ÖÔÚ²Ù×÷ϵͳÖеıÈÖØÒª±ÈËüÔÚUNIXÖдóÐí¶à¡£


4.1 Ï̵߳÷¶ÈËã·¨·ÖÎö

4.1.1 Ï̵߳÷¶ÈËã·¨µÄ×ÜÌåÃèÊö

ÔÚ·ÖʱϵͳÖУ¬Äں˸øÃ¿¸öÏ̷߳ÖÅäÒ»¶ÎCPUʱ¼ä£¬Õâ¶Îʱ¼ä³ÆÎªÊ±¼äƬ£¬µ±Õâ¶Îʱ¼ä¹ýÈ¥Ö®ºó£¬Äں˽«µ÷¶ÈÁíÒ»¸öÏß³ÌÈÃÆä±äΪִÐÐ̬¡£Õâ¾ÍÊÇËùνµÄʱ¼äƬÂÖת·¨¡£

ÓëUNIXÖеÄÏ̵߳÷¶ÈÊ®·ÖÏàËÆµÄÊÇ£¬OSKitµÄµ÷¶È³ÌÐòÒ²²ÉÓÃÁËÒ»ÖÖ±»³ÆÎª¶à¼¶·´À¡Ñ­»·µ÷¶È£¬´ËÖÖËã·¨ÊôÓÚ²Ù×÷ϵͳµ÷¶È³ÌÐòÖÐ×î³£ÓõÄÒ»ÖÖ¡£ÆäºËÐÄ˼ÏëÊÇ£ºÄں˸øÏ̷߳ÖÒ»¸öʱ¼äƬ£¬²¢°Ñ¸ÃÏ̷߳´À¡»ØÈô¸ÉÓÅÏȼ¶¶ÓÁÐÖеÄijһ¸ö¡£Ò»¸öÏß³ÌÔÚ½áÊøËü֮ǰ£¬¿ÉÄÜÐèÒª¶à´Îͨ¹ý¶à´ÎµÄ"·´À¡Ñ­»·"¡£µ±ÄÚºË×÷ÉÏÏÂÎÄÇл»ºÍ»Ö¸´µÄʱºò£¬µ÷¶È³ÌÐò±ØÐë±£Ö¤¸ÃÏ̴߳ÓÔ­À´¹ÒÆðµÄµØ·½¼ÌÐøÖ´ÐУ¬·ñÔòÕâÖÖµ÷¶ÈËã·¨ÊDz»ÄܲÉÓõġ£

Òò´Ë£¬ÎÒÈÏΪÓбØÒªÏò´ó¼ÒÖØÉêÒ»ÏÂÏ̵߳ÄÉÏÏÂÎÄÇл»ºÍ»Ö¸´¡£Ê×ÏÈ£¬ËùνÏ̵߳ÄÉÏÏÂÎÄÊÇÖ¸ÓÉÓû§µØÖ·¿Õ¼äµÄÄÚÈÝ¡¢Ó²¼þ¼Ä´æÆ÷µÄÄÚÈÝÒÔ¼°Óë¸ÃÏß³ÌÓйصÄÄÚºËÊý¾Ý½á¹¹×é³ÉµÄ¡£¸ü¼ÓÑϸñµÄ½²£¬Ï̵߳ÄÉÏÏÂÎÄÊÇÓÉËüµÄÓû§¼¶ÉÏÏÂÎÄ¡¢¼Ä´æÆ÷ÉÏÏÂÎÄÒÔ¼°ÏµÍ³¼¶ÉÏÏÂÎÄ×é³É¡£

4.1.2 ÓÅÏȼ¶Äæ×ª·¨

OSKitÖвÉÓÃÁ˲Ù×÷ϵͳÉè¼ÆÖбȽϾ«²ÊµÄÓÅÏȼ¶Äæ×ªËã·¨£¬¼´ÔÚÒ»¸öÓÅÏȼ¶½ÏµÍµÄÏß³ÌÕ¼ÓÐmutexµÄͬʱ£¬ÁíÒ»¸öÓÅÏȼ¶½Ï¸ßµÄÏß³ÌÓÖÀ´ÉêÇë´Ëmutex£¬ÕâÑù£¬ÓÅÏȼ¶½Ï¸ßµÄÏ߳̾ͱ»±ÈËûµÍµÄÏß³Ì×èÈû¡£

´ËʱÎÒÃÇÒýÈëÁËÓÅÏȼ¶Äæ×ªËã·¨£¬Ò²¾ÍÊÇ˵£¬µ±ÉÏÊöÇé¿ö·¢ÉúµÄʱºò£¬Ï̵߳÷¶È³ÌÐò¾Í½«ÓÅÏȼ¶½ÏµÍµÄÏ̵߳ÄÓÅÏȼ¶ÌáÉýÖÁÓë½Ï¸ßÓÅÏȼ¶Ïß³ÌÒ»Ñù£¬ÕâÑù¿ÉÒÔʹµÃÕ¼ÓÐmutexµÄÏ߳̿ìËÙÖ´ÐС£

Èç¹ûÏÖÔÚÐèÒªµ÷¶ÈµÄÏ̲߳»Ö¹Á½¸öµÄ»°£¬¸ÃËã·¨ÔÊÐí½øÐеݹ飬Ҳ¾ÍÊÇ˵£¬ÄǸöÓÅÏȼ¶µÍµÄÏß³ÌÖ´Ðл¹ÐèÒªÁíÍâÒ»¸ömutex£¬¶ø´Ëmutex±»ÁíÒ»¸öÓÅÏȼ¶¸üµÍµÄÏß³ÌÕ¼ÓУ¬ËùÒÔ£¬µ÷¶È³ÌÐò¾ÍÒÀ´ÎÌáÉýÓÅÏȼ¶µÍµÄÏ̵߳ÄÓÅÏȼ¶£¬Õâ¾ÍÊǵݹéÌáÉý¡£

µ«ÊÇ£¬Èç¹ýÎÒÃÇÖ§³ÖµÝ¹éÌáÉýÓÅÏȼ¶µÄ»°£¬¾Í¿ÉÄܳöÏÖËÀËø£¬ËùÒÔÎÒÃÇÓÖ±ØÐëÒýÈëÒ»Ì×¼ìÑéËÀËøµÄ³ÌÐò£¬Õâ´ó´óÔö¼ÓÁ˲Ù×÷ϵͳºËÐĵĴóСºÍϵͳµÄ¿ªÏú£¬µ«Ê¹µÃ²Ù×÷ϵͳ¸ü¼ÓÍêÉÆ£¬²¢¿ÉÒÔ´¦ÀíʵʱÏ̡߳£


4.2 pthread/pthread_scheduler.c

´ËÔ´ÂëÎļþ°üÀ¨ÁËÒ»Ì×ÍêÕûµÄÏ̵߳÷¶È»úÖÆ£¬OSKitµÄÈ«²¿Ï̵߳÷¶ÈËã·¨¶¼¼¯ÖÐÔÚÁËÕâ¸öÎļþÖ®ÖУ¬Í¨¹ýÔĶÁÏÂÃæµÄº¯Êý·ÖÎö£¬½«Ê¹¶ÁÕßÁ˽âOSKitµ½µ×ÊÇÓÃʲôº¯ÊýÀ´¾ßÌåʵÏÖÏ̵߳÷¶ÈµÄ£¬²¢ÇÒÄܶÔÎÒÔÚÇ°ÃæÐðÊöµÄ¸ÅÄîµÄÀí½âÓÐËù¼ÓÉî¡£

4.2.1Çå¿ÕµÈ´ýµ÷¶ÈµÄÏ̶߳ÓÁÐ
˵Ã÷£ºÎªÁËÄÜÈôó¼ÒÕæÕý´Ó¸ÅÄîÉÏÁ˽â´Ëº¯ÊýµÄ×÷Óã¬ÎÒÏëÓбØÒªÏÈ˵Ã÷Ò»ÏÂʲôÊÇÏ̵߳ȴý¶ÓÁС£ÓÉÓÚµ÷¶È³ÌÐòÔÚ²Ù×÷ϵͳÖÐÒ²ÊÇ×÷Ϊһ¸öÏ̳߳öÏֵ쬲¢ÇÒͬһʱ¼ä£¬ËüÖ»Äܵ÷¶ÈÒ»¸öỊ̈߳¬ËùÒԾͻáÔì³ÉÓÐÐí¶àÏ̵߳ȴýµ÷¶Èµ«ÎÞ·¨½ÓÊܵ÷¶ÈµÄÇé¿ö£¬OSKitÌṩµÄÕâ¸öº¯ÊýÕýÃÖ²¹ÁËÕâ¸öȱÏÝ£¬Ëû½«ËùÓеĵȴýµ÷¶ÈµÄÏß³ÌÓÃÁ´±íµÄÐÎʽÁ´½ÓÔÚÒ»Æð£¬Õâ¾ÍÊÇËùνµÄµÈ´ýµ÷¶ÈµÄÏ̶߳ÓÁС£ÏÔÈ»£¬Çå¿ÕËüʵ¼ÊÉϾÍÊÇÊÍ·ÅÁ´±íµÄÖ¸Õë¡£
staticinline int posix_runq_empty ( void )

4.2.2µÃµ½µÈ´ý¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄÏ̵߳ÄÓÅÏȼ¶
˵Ã÷£ºµ±µ÷¶ÈÏß³ÌÍê³ÉÊÖÍ·µÄ¹¤×÷£¬Òª¶ÔÏÂÒ»¸öÏ߳̽øÐе÷¶Èʱ£¬¾Í½«ÃæÁÙÒ»¸öÎÊÌ⣬µ½µ×Ó¦¸Ãµ÷¶ÈÄĸöµÈ´ýµ÷¶ÈµÄỊ̈߳¿OSKitÌṩµÄÕâ¸öº¯Êý¿ÉÒÔ·µ»Ø´ËʱÔڵȴý¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄỊ̈߳¬¹©µ÷¶ÈÏ̵߳÷¶È¡£
staticinline int posix_runq_maxprio ( void )return PRIORITY_MAX - ( prio - 1 );

4.2.3µÃµ½Ö¸ÏòÏÂÒ»¸öÒªÖ´ÐÐÏ̵߳ÄÖ¸Õë
˵Ã÷£ºµ±Ä³¸öÏß³ÌҪתִÐÐ̬µÄʱºò£¬µ÷¶È³ÌÐò²¢²»ÖªµÀÕâ¸öÏß³Ì¹ÒÆðÔÚÁËʲôµØ·½£¬ÎÒÃÇ¿ÉÒÔͨ¹ýµ÷ÓÃOSKitÌṩµÄÕâ¸öº¯ÊýÀ´ÕÒµ½Ö¸ÏòÒªÖ´ÐÐÏ̵߳ÄÖ¸Õë¡£
staticinline int posix_runq_onrunq ( pthread_thread_t *pthread )

4.2.4ÔÚÏ̵߳ÄÖ´ÐжÓÁеĶÓβ׷¼ÓÒ»¸öÏß³Ì
˵Ã÷£º½«ÓÅÏȼ¶×îµÍµÄỊ̈߳¬»òÕßÊÇÓÉÓÚÆäËûÔ­ÒòÒª×îºóÖ´ÐеÄÏß³ÌÌí¼Óµ½Ïß³ÌÖ´ÐжÓÁеÄ×îºó¡£
staticinline void posix_runq_insert_tail ( pthread_thread_t *pthread )

4.2.5ÔÚÏ̵߳ÄÖ´ÐжÓÁеĶÓÍ·×·¼ÓÒ»¸öÏß³Ì
˵Ã÷£º½«ÓÅÏȼ¶×î¸ßµÄÏ̻߳òÕßÊÇÓÉÓÚijÖÖÔ­ÒòÒªÏÖÖ´ÐеÄÏß³ÌÌí¼Óµ½Ïß³ÌÖ´ÐжÓÁеÄ×îÇ°Ãæ¡£
staticinline void posix_runq_insert_head ( pthread_thread_t *pthread )

4.2.6½«µÈ´ý¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄÏß³ÌÌá³ö¶ÓÁÐÖ´ÐÐ
˵Ã÷£ºµ±²Ù×÷ϵͳҪִÐÐÔÚÏß³ÌÖ´ÐжÓÁÐÀïµÈ´ýÏ̵߳Äʱºò£¬ÀíËùµ±È»Ó¦¸Ã´ÓÍ·¿ªÊ¼£¬ÎÒÃÇ¿¼µ÷Óд˺¯ÊýÀ´ÊµÏÖÏ̳߳ö¶ÔÖ´ÐеŦÄÜ¡£
staticinline pthread_thread_t * posix_runq_dequeue ( void )
¡¡¡¡×¢£º ·µ»ØÖ¸ÏòÏÂÒ»¸öµÈ´ýÏ̵߳ÄÖ¸Õë

4.2.7´ÓµÈ´ý¶ÓÁÐÖÐɾ³ý¶ÀÕ¼×ÊÔ´µÄÏß³Ì
˵Ã÷£ºÎªÁËʹ²Ù×÷ϵͳÄܹ»ÔÚ×ÜÌå×îÓÅ»¯µÄǰÌáÏÂÔËÐУ¬OSKit¹æ¶¨²»ÔÊÐíijһ¸öÏ̳߳¤Ê±¼ä¶Àռϵͳ×ÊÔ´£¬Èç¹û·¢ÏÖ´ËÀàʱ¼ä£¬¾Í¿ÉÒÔµ÷ÓÃÕâ¸öº¯ÊýÀ´½«¶ÀÕ¼×ÊÔ´µÄÏ̴߳ÓÖ´ÐжÓÁÐÖÐɾ³ý£¬ÒÔ±£³ÖÏ̵߳÷¶ÈµÄ¹«Æ½ºÏÀí¡£
staticinline void posix_runq_remove ( pthread_thread_t *pthread )

4.2.8´ËʱÓõ½µÄµ÷¶ÈËã·¨
˵Ã÷£ºÔÚÇ°ÃæµÄÕ½ÚÀÎÒÔø¾­Ìáµ½£¬Ï̵߳ĵ÷¶ÈËã·¨·Â·ðÆäÊôÐÔÒ»Ñù£¬ÔÚ³õʼ»¯µÄʱºò¾Í¸³¸øÁËËü£¬µ«ËüÈ´ÊÇ¿ÉÒÔ¸ü¸ÄµÄ£¬OSKit¾ÍÊÇͨ¹ýµ÷ÓÃÏÂÃæµÄÕâ¸öº¯ÊýÀ´ÊµÏÖÔÚÏ̴߳´½¨Ö®ºóÀ´¸Ä±äµ÷¶ÈËã·¨µÄ¡£
intposix_sched_schedules ( int policy )
¡¡¡¡if ( policy == SCHED_RR || policy ==SCHED_FIFO )
¡¡¡¡¡¡¡¡return 1;
¡¡¡¡return 0;

4.2.9½«Ò»¸öÏ̱߳äΪÔËÐÐ̬
˵Ã÷£ºÖÚËùÖÜÖª£¬Ïß³ÌÔÚϵͳÖÐÒ»°ãÓÐÈýÖÖ״̬£¬OSKitͨ¹ýµ÷Óøú¯ÊýʵÏÖÏß³ÌתִÐÐ̬µÄ¹¦ÄÜ¡£
intposix_sched_setrunnable ( pthread_thread_t *pthread )

4.2.10ÖÕÖ¹¸ÃÏß³ÌĿǰµÄµ÷¶ÈËã·¨
˵Ã÷£ºÕâÓÖÊÇÔÚÏ̴߳´½¨Ö®ºó¸Ä±äÆäµ÷¶ÈËã·¨µÄÒ»ÖÖº¯Êýµ÷Óã¬ËüµÄ¹¦ÄÜÊÇÖÐÖ¹¸ÃÏß³ÌĿǰµÄµ÷¶ÈËã·¨¡£
voidposix_sched_disassociate ( pthread_thread_t *pthread )
{
¡¡¡¡if(posix_runq_onrunq(pthread)) {
¡¡¡¡¡¡¡¡/* * On the scheduler queue, so its notrunning. */
¡¡¡¡¡¡¡¡posix_runq_remove ( pthread );
¡¡¡¡}
}

4.2.11Ϊһ¸öеÄÏ̴߳´½¨µ÷¶È²ÎÊý
˵Ã÷£ºËùνµ÷¶È²ÎÊý¾ÍÊǵ÷¶È³ÌÐò¾ö¶¨ÊÇ·ñÖ´ÐÐij¸öÏ̵߳ÄÒÀ¾Ý¡£ÀýÈ磬ijÓû§Ì¬Ïß³Ì×î½üʹÓÃCPUʱ¼äµÄͳ¼ÆµÈ¡£
voidposix_sched_init_schedstate ( pthread_thread_t *pthread,const struct sched_param*param )

4.2.12¸Ä±äÏ̵߳ĵ÷¶È״̬
˵Ã÷£ºÈç¹ûÆäµ÷¶È²ÎÊý·ûºÏµ÷¶ÈÌõ¼þ£¬µ÷¶È³ÌÐò»áͨ¹ýµ÷ÓÃOSKitÌṩÕâ¸öº¯ÊýÀ´¸Ä±ä´ËÏ̵߳ĵ÷¶È״̬£¬²¢½«ËüתΪ׼±¸µ÷¶È̬¡£´Ëʱ¸ÃÏ̱߳»Ëø×¡£¬¶øÇÒÒª¹ØÖжÏ
intposix_sched_change_state ( pthread_thread_t *pthread , const struct sched_param*param )

4.2.13ÓÅÏȼ¶Ç¨ÒÆ
˵Ã÷£ºÕâÊÇÎÒÔÚÉÏÃæÌáµ½µÄÓÅÏȼ¶Äæ×ª·¨µÄ¾ßÌåʵÏÖ£¬OSKit¾ÍÊÇͨ¹ýµ÷ÓÃËüÀ´Íê³É¶ÔÏß³ÌÓÅÏȼ¶µÄ¶¯Ì¬±ä¸üµÄ¡£
intposix_sched_priority_bump ( pthread_thread_t *pthread, int newprio)
¡¡¡¡×¢Ò⣺ÕâÖ»ÊÇÔÝʱµÄ£¬½ö½öÊÊÓÃÓÚʵʱÏß³Ì

4.2.14»ùÓÚijÖÖÔ­Òò£¬Ï̱߳»Ëͻصȴý¶ÓÁÐ
˵Ã÷£ºµ±Ïß³ÌÔÚ²Ù×÷ϵͳÖÐÖ´ÐеÄʱºò£¬ÍêÈ«ÓпÉÄÜÓÉÓÚÓû§µÄÔ­ÒòÔì³Éµ±Ïß³ÌÖ´ÐÐÍêËüµÄʱ¼äƬºó·µ»ØÖ´ÐжÓÁÐʱ£¬Î»ÖøıäÁË¡£Ï±ßÊÇÎÒ¶ÔOSKitÌṩµÄ¼¸ÖָıäÔ­ÒòµÄ×¢½â¡£
intposix_sched_dispatch ( resched_flags_t reason, pthread_thread_t *pthread)
¡¡¡¡switch (reason) {
¡¡¡¡¡¡¡¡case RESCHED_USERYIELD:posix_runq_insert_tail(pthread);
¡¡¡¡¡¡¡¡¡¡¡¡/* Èç¹ûÓÉÓû§Ôì³ÉÏß³ÌΪ¿ÕÏÐ̬£¬Ôò²åÈë¶Óβ */
¡¡¡¡¡¡¡¡caseRESCHED_YIELD: posix_runq_insert_head(pthread);
¡¡¡¡¡¡¡¡¡¡¡¡/* Èç¹ûÓÉÓû§Ôì³ÉÏß³ÌΪ¿ÕÏÐ̬£¬Ôò²åÈë¶Óβ*/
¡¡¡¡¡¡¡¡case RESCHED_PREEMPT:
¡¡¡¡¡¡¡¡¡¡¡¡/* ¸ù¾ÝÏß³ÌÓµÓеÄÓÅÏȼ¶ºÍÆäµ÷¶ÈËã·¨À´¾ßÌå·ÖÎö */
¡¡¡¡¡¡¡¡¡¡¡¡if(pthread->policy == SCHED_RR) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (--pthread->ticks == 0){
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡posix_runq_insert_tail(pthread);
¡¡¡¡¡¡¡¡¡¡¡¡/*Èç¹ûÊÇʱ¼äƬÂÖת·¢µ÷¶ÈÇÒÖ»ÓÐÒ»¸öticks£¬Ôò²åÈë¶Óβ */
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡pthread->ticks =SCHED_RR_INTERVAL;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡else
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡posix_runq_insert_head(pthread);
¡¡¡¡¡¡¡¡¡¡¡¡/*ËäÈ»ÊÇʱ¼äƬÂÖת·¨£¬µ«ÓµÓеÄticks²»Ö¹Ò»¸ö£¬Ôò²åÈë¶ÔÍ· */
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡else if (pthread->policy== SCHED_FIFO)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡posix_runq_insert_head(pthread);
¡¡¡¡¡¡¡¡¡¡¡¡/*Èç¹ûÊÇÏÈÀ´ÏÈ´¦Àí·¨£¬Ôò²åÈë¶ÔÍ· */
¡¡¡¡¡¡¡¡case RESCHED_INTERNAL: /* ʹÏ̱߳äΪ¿ÕÏÐ̬*/
¡¡¡¡¡¡¡¡default:
¡¡¡¡¡¡¡¡¡¡¡¡if (pthread == IDLETHREAD)
¡¡¡¡¡¡¡¡¡¡¡¡/*Í£Ö¹ËùÓеĵ÷¶ÈËã·¨£¬½«Ï̱߳ä³É¿ÕÏÐ̬ */
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡panic("posix_sched_dispatch:Idlethread!\n");
¡¡¡¡}

4.2.15·µ»ØÓÅÏȼ¶×î¸ßµÄ´¦Óڵȴý״̬µÄÏß³Ì
˵Ã÷£ºµ±µ÷¶È³ÌÐòÒª½«Ò»¸ö³öÓڵȴý״̬µÄÏ̼߳ÓÈëµ½Ö´ÐжÓÁÐÖеÄʱºò£¬¾ÍÐèÒªÓÐÒ»¸öº¯Êý£¬ËüÄÜ·µ»ØÓÅÏȼ¶×î¸ßµÄµÈ´ýỊ̈߳¬ÏÂÃæµÄº¯ÊýÕýºÃ¾ÍÍê³ÉÁËÕâÏîÈÎÎñ¡£
pthread_thread_t* posix_sched_thread_next ( void )
¡¡¡¡{¡¡¡¡if ( posix_runq_empty( ))
¡¡¡¡¡¡¡¡¡¡¡¡return 0;
¡¡¡¡¡¡¡¡ return posix_runq_dequeue( );
¡¡¡¡}

4.2.16¸Ä±äÏ̵߳ÄÓÅÏȼ¶
˵Ã÷£ºÊµÖÊÊǽ«Ï̴߳ӶÓÁÐÖÐɾ³ý£¬ÖØÐ¸³¸øÓÅÏȼ¶£¬ÔÙ²åÈëµ½¶Óβ¡£
OSKIT_INLINEvoid threads_change_priority (pthread_thread_t *pthread, int newprio)

4.2.17ÓÅÏȼ¶¼Ì³Ð
˵Ã÷£ºËùνÓÅÏȼ¶¼Ì³Ð£¬ÆäÀíÂÛµÄʵÖʾÍÊÇËùÓгöÓڵȴý״̬µÄỊ̈߳¬Ôڵȴý¹ý³ÌÖУ¬ËüµÄÓÅÏȼ¶»áËæÊ±¼äµÄÍÆÒÆÂýÂýÌá¸ß¡£
voidpthread_priority_inherit ( pthread_thread_t *pwaiting_for )

4.2.18²»¼Ì³ÐÓÅÏȼ¶
˵Ã÷£ºÕâÆäʵÓëÉÏÒ»¸öÓÅÏȼ¶¼Ì³ÐÕýºÃÏà·´£¬ÎÞÂ۵ȴýÁ˶೤ʱ¼ä£¬Ï̵߳ÄÓÅÏȼ¶¶¼²»»áÒò´Ë¶ø¸Ä±ä¡£
voidpthread_priority_uninherit ( pthread_thread_t *punblocked )

4.2.19ÓÅÏȼ¶µÝ¼õ
˵Ã÷£ºÈç¹ûÒ»¸öÏß³Ì×ÜÊÇ´¦ÓÚÖ´ÐÐ״̬£¬Ôò³öÓÚ×ÜÌå×îÓÅ»¯µÄ¿¼ÂÇ£¬OSKit»áµ÷Óô˺¯Êý½«ÆäÓÅÏȼ¶Ö𲽵ݼõ£¬´Ó¶øÊ¹µÃ¸ü¶àµÄÏß³ÌÓб»Ö´ÐеĿÉÄÜ¡£
voidpthread_priority_decreasing_recompute ( pthread_thread_t *pthread)


±¾ Õ С ½á

±¾Õ´ÓÏ̵߳÷¶ÈµÄÒ»°ãÐÔ¸ÅÀ¨µ½¾ßÌåʵÏÖ£¬ÏµÍ³µØ²ûÊöÁËOSKitµÄÏ̵߳÷¶È»úÖÆ¡£

ÔÚµÚÒ»½ÚÖ÷ÒªÊǶÔÒ»°ãµÄÏ̵߳÷¶È¸ÅÄîµÄÃèÊö£¬²¢ÇÒ¶ÔOSKitÖÐ×îΪ¾«²ÊµÄÓÅÏȼ¶Äæ×ª·¨µÄÀíÂÛ×÷ÁËÏêϸµÄÂÛÊö¡£µÚ¶þ½ÚÖÐÒÔÔ´´úÂëÖеÄpthreads/pthread_scheduler.cΪÀý£¬´ÓµÈ´ýµ÷¶ÈµÄÏ̶߳ÓÁС¢Ï̵߳ÄÖ´ÐжÓÁе½ÓÅÏȼ¶¼Ì³Ð¡¢ÓÅÏȼ¶µÝ¼õµÈ£¬ÍêÕûµÄ²ûÃ÷ÁËOSKitµÄÏ̵߳÷¶È»úÖÆ¡£

[Ŀ¼]


µÚÎåÕ OSKitµÄÓ¦ÓÃʵÀý

¡¶OSKitµÄÏ̻߳úÖÆ µÚÎåÕ¡·


OSKitµÄÏ̻߳úÖÆ µÚÎåÕÂ2000Äê12ÔÂ25ÈÕ22:31


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚÎåÕ OSKitµÄÓ¦ÓÃʵÀý Ò»¸ö¼òµ¥ÏµÍ³µÄÉè¼ÆÓëʵÏÖ


5.1Éè¼ÆÄ¿µÄ

OSKitÊÇÒ»¸öÓÃÀ´°ïÖúÎÒÃÇÑз¢²Ù×÷ϵͳµÄ¹¤¾ß£¬Èç¹ûÄãÏë¸üºÃµÄÕÆÎÕËü£¬³ýÁË¶ÔÆä±¾Éí½øÐзÖÎöÖ®Í⣬»¹ÓÐÒ»¸ö¸ü¼Óʵ¼ÊµÄ·½·¨£¬ÄǾÍÊÇÀûÓÃÕâ¸ö¹¤¾ß¿ª·¢Ò»¸öÎÒÃÇ×Ô¼ºµÄ²Ù×÷ϵͳ¡£

ÎÒÃÇ¿ª·¢Õâ¸öϵͳµÄ³õÖÔÖ÷ÒªÊÇΪÁËѧϰ£¬Òò´Ë²¢Ã»ÓÐÏë°ÑËüÉè¼Æ³ÉÏñWindows¡¢UNIXÄÇô¸´ÔÓ¡£ÎÒÃǵÄÄ¿±êÊǺÜÃ÷È·µÄ£¬ÄǾÍÊÇÔÚ´óÖ¸ãÃ÷°×OSKitÓ¦µ±ÈçºÎʹÓÃÖ®ºó£¬×öÒ»´Î³¢ÊÔ£¬Óý϶̵Äʱ¼ä£¬Éè¼Æ³öÒ»¸ö¾ßÓÐһЩ×î»ù±¾¹¦ÄܵÄϵͳ¡£Õâ¶ÔÓÚÎÒÃÇ¿ÎÌâ×éµÄÿÃû³ÉÔ±À´Ëµ£¬¶¼Òâζ×ÅÌôÕ½¡£


5.2ϵͳµÄ¹¦ÄÜ

Õâ¸öϵͳ֧³ÖЩʲô£¿ÕâÊÇÔÚ¿ªÊ¼Éè¼ÆÖ®Ç°ÎÒÃÇÒªÊ×ÏÈÈ·¶¨µÄÒ»¸öÎÊÌâ¡£ÏÂÃæÁгöÁËһЩÎÒÃÇÏ£ÍûʵÏֵŦÄÜ¡£

ͨ¹ýMultiboot»òÕßLILO½øÐÐϵͳÒýµ¼£ºÕâ¸öϵͳ¿ÉÒÔͨ¹ýËùÓÐÖ§³ÖMultibootµÄÒýµ¼³ÌÐò½øÐÐÒýµ¼£¬»òÕßͨ¹ýÒýµ¼LinuxµÄLILO½øÐÐÒýµ¼¡£Òýµ¼·½Ê½¿ÉÒÔ¸ù¾ÝÓû§µÄÒªÇó£¬Ñ¡ÔñÊÇͨ¹ýÈíÅÌ»¹ÊÇÓ²ÅÌ¡£

¶àỊ̈߳ºÓû§¿ÉÒÔͨ¹ýÎÒÃÇÌṩµÄϵͳµ÷Ó㬴´½¨»òɱËÀ×Ô¼ºµÄÏ̡߳£ÓÉÓÚ²¢²»Ö§³ÖÎļþϵͳ£¬Òò´ËеÄÏ߳̿ÖÅÂÖ»ÄÜÊÇÒ»¸öº¯ÊýÁË¡£´ÓÀíÂÛÉϽ²£¬ÎÒÃÇ¿ÉÒÔÈÃÕâ¸öϵͳ֧³ÖºÜ¶àỊ̈߳¬µ«ÒòΪÕâ½ö½öÊÇÒ»¸ö¼òµ¥µÄÑÝʾÐÔϵͳ£¬Òò´ËÎÒÃǰÑÏß³ÌÊýÏÞÖÆÔÚ32¸ö£¬µ±È»Õâ¸öÊý×ÖÒ²¿É¸ù¾ÝÓû§µÄÐèÇóÈÎÒâ¸ü¸Ä¡£

½ø³Ì¼äͨÐÅ£ºÕâ¸öϵͳ¿ÉÒÔÖ§³ÖһЩ¼òµ¥µÄ½ø³Ì¼äͨÐÅ»úÖÆ£¬±ÈÈçÐźÅÁ¿¡¢ÏûÏ¢¶ÓÁеȵȡ£

ÍâÉ裺ÔÚÖÚ¶àµÄÍâÉèÖ®ÖУ¬ÎÒÃÇÑ¡ÔñÁËÓ¦Ó÷¶Î§±È½Ï¹ãµÄ´®¿Ú¡£ÀûÓÃĿǰOSKitËùÌṩµÄ»úÖÆ£¬Ö§³Ö¸ü¶àµÄÉ豸ÊDz»³ÉÎÊÌâµÄ£¬µ«¼ÓÔÚÕâ¸öϵͳÖÐÒâÒå²¢²»Ê®·ÖµÄ´ó¡£ÁíÍ⣬ÐèҪǿµ÷µÄÊÇ£¬·ÃÎÊ´®¿ÚµÄ·½·¨£¬ÊÇÓÉÎÒÃÇ×Ô¼º¹æ¶¨£¬²»ÔÊÐíÓû§¸ü¸Ä¡£

¼òµ¥µÄÄÚ´æ¹ÜÀí£ºÓ¦ÓóÌÐòÐèÒªµÄÄÚ´æ¿ÉÒÔͨ¹ýmallocº¯Êý¶¯Ì¬ÉêÇë¡£


×ÜÌå¹¹Ïë

ÔڸòÙ×÷ϵͳÖУ¬ÎÒÃǹ涨Óû§Ö»ÄÜ´´½¨Óû§¼¶Ị̈߳¬ËùÓжÔÓÚºËÐĵIJÙ×÷¶¼½«ÓÉϵͳÀ´Íê³É¡£Ï̲߳ÉÓÃRRµ÷¶ÈËã·¨£¬Ò²¾ÍÊÇʱ¼äƬÂÖת·¨£¬²¢ÔÊÐíÇÀÕ¼£¬Ïß³ÌÔÚ¸ÃϵͳÖÐÓÐËÄÖÖ״̬£¬ËüÃÇÊÇÔËÐÐ̬¡¢×èÈû̬¡¢Ë¯Ãß̬ºÍ¾ÍÐ÷̬£¬Óû§¿ÉÒÔÉ趨ºÍ¸Ä±äÏ̵߳ÄÓÅÏȼ¶¡£ÔÚÏß³ÌÖÐÓû§¿ÉÒÔ¶¯Ì¬ÉêÇëÄڴ棬µ«ÊÇÐèÒªÓÉÓû§À´ÊÍ·Å¡£Ï̼߳äÌṩ¼òµ¥µÄͨÐÅ»úÖÆ£¬°üÀ¨ÐźÅÁ¿ºÍÏûÏ¢¶ÓÁС£

ÔÚÉ豸·½Ã棬¶ÔÓÚÖÕ¶Ë£¬±¾ÏµÍ³½«Ìṩ¼òµ¥µÄÊäÈëÊä³ö¹¦ÄÜ¡£¶ø¶ÔÓÚ´®¿ÚµÄ¹¦ÄÜ£¬±¾ÏµÍ³¿ÉÒÔÍêÕûµÄʵÏÖ£¬Ò²¾ÍÊÇ˵£¬Óû§¼È¿ÉÒÔ´Ó´®¿Ú¶ÁÒ²¿ÉÒÔÏò´®¿Úд¡£

ΪÁË·½±ãÆð¼û£¬ÎÒÃÇΪÕâ¸öϵͳÆðÒ»¸öºÜ¼òµ¥µÄÃû×Ö£¬½Ðacos£¬Õâ¸öÃû×Ö²¢Ã»ÓÐʲôʵ¼ÊµÄÒâÒ壬½ö½öΪÁË½ÐÆðÀ´·½±ã¡£

ËäÈ»OSKitÒѾ­ÎªÎÒÃÇÌṩÁ˺ܶàÉè¼Æ²Ù×÷ϵͳËù±ØÐëµÄ¹¦ÄÜ£¬±ÈÈçÄÚ´æ·ÖÅäÖеÄmallocº¯Êý£¬Í¨¹ýMultibootÒýµ¼µÈµÈ¡£È»¶ø£¬ÈÔÓÐÐí¶à¹¤×÷ÊÇÒªÓÉÎÒÃÇ×Ô¼ºÍê³É¡£


5.3 ÎÒÃÇ×Ô¼ºËùÍê³ÉµÄ¹¤×÷£º

5.3.1 ϵͳµÄÆô¶¯

ÕâÀïÎÒÃÇËù˵µÄϵͳÆô¶¯£¬²¢²»ÊÇָͨ³£ÈËÃÇËù˵µÄͨ¹ýÈíÅÌ»òÓ²ÅÌÒýµ¼£¬¶øÊÇÔÚÒýµ¼½áÊøÖ®ºó£¬²Ù×÷ϵͳµÄºËÐĽø³ÌÈçºÎÆô¶¯µÚÒ»¸öÓû§½ø³Ì¡£Í¨³££¬ÔÚUNIXϵͳÖУ¬ÄÚºËÆô¶¯Ö®ºó£¬Äں˳ÌÐò»áÈ¥Ö´ÐÐÎļþϵͳÉϵÄinit³ÌÐò£¬Õâ¸ö³ÌÐòÊÇÕû¸ö²Ù×÷ϵͳÖеĵÚÒ»¸öÓû§½ø³Ì£¬Ê£ÏµĽø³Ì£¬¶¼±ØÐëͨ¹ýÕâ¸ö½ø³Ì²ÅÄÜÆô¶¯¡£ÔÚacosÖУ¬ÎÒÃǹ涨£¬Óû§±ØÐëÒªÌṩһ¸öacos_init() º¯Êý£¬ÏµÍ³ÔÚÆô¶¯³õʼ»¯¹¤×÷È«²¿Íê³ÉÖ®ºó£¬acos_init( )º¯Êý½«±»×÷ΪϵͳÖеĵÚÒ»¸ö½ø³ÌÆô¶¯¡£ÕâÖ®ºóµÄ¹¤×÷£¬¾ÍÍêÈ«ÓÉÓû§À´Íê³ÉÁË¡£

µ±½ø³Ìacos_init( ) ½áÊøÊ±£¬Õû¸öϵͳҲ½«ÖÕÖ¹ÔËÐС£

ÔÚacos_init( )Æô¶¯Ö®Ç°£¬¾¿¾¹»¹ÓÐÄÄЩÊÂÇéÐèÒª×öÄØ£¿ÏÂÃæÎÒÃǾÍÁгöÒª×öµÄÊÂÇ飺

¶ÔÕû¸öϵͳ½øÐгõʼ»¯£¬×¢²áÉ豸£¬¼ì²âÉ豸£¬³õʼ»¯É豸ÐèÒªµÄÊý¾Ý½á¹¹£¬³õʼ»¯Ï߳̿⣬´´½¨Ïß³ÌÐèÒªµÄÊý¾Ý½á¹¹¡£

5.3.2 Ï̹߳ÜÀí

Ëùν²Ù×÷ϵͳµÄÏ̹߳ÜÀí£¬Ò»°ã°üÀ¨ÁËһϵÄÈý´ó²¿·Ö£ºÏ̵߳Ĵ´½¨£¬Ï̼߳äͨÐźÍÏ̵߳÷¶È¡£

Ï̵߳Ĵ´½¨°üÀ¨Á˳õʼ»¯Ï̺߳ʹ´½¨Ï̵߳ÄÊôÐÔ¡£

Ï̼߳äͨÐÅÖУ¬ÎÒÃÇʹÓÃÁËÐźÅÁ¿£¬Ìõ¼þ±äÁ¿¡£

ÔÚÏ̵߳÷¶ÈÖУ¬Óû§Ïß³ÌÖ»ÄÜʹÓÃʱ¼äƬÂÖת·¨×÷Ϊµ÷¶ÈËã·¨£¬²¢Çҹ涨ÔÚµ÷¶È¹ý³ÌÖе÷¶ÈËã·¨²»ÔÊÐí¸ü¸Ä¡£

5.3.3 ÍâÉ裨´®¿Ú£©

ÔÚUNIXϵͳÖУ¬ËùÓеÄÉ豸¶¼¿ÉÒÔͨ¹ýÎļþϵͳ½øÐзÃÎÊ£¬¶Á¡¢Ð´É豸¾ÍÏñ¶ÁдÎļþÒ»Ñù¡£ÔÚÎÒÃÇÉè¼ÆµÄÕâ¸öacosÖУ¬²¢Ã»ÓжÔÎļþϵͳÌṩ֧³Ö£¬Ò²²»ÌṩÏñ¶ÁдÎļþϵͳһÑùµÄ·½·¨À´·ÃÎÊÉ豸¡£µ«ÊÇ£¬ÎÒÃÇÌṩһÌ×»ù±¾µÄº¯Êý£¬¹©Óû§Ï̶߳Դ®¿Ú½øÐжÁд²Ù×÷£¬ÕâЩº¯ÊýרÃÅÓÃÓÚ´¦Àí´®¿Ú¡£

Ò»¸öÉ豸ÔÚͬһʱ¿ÌÖ»Äܱ»Ò»¸öÏß³ÌʹÓã¬Òò´Ë£¬ÔÚʹÓÃÉ豸ÒÔǰҪÉêÇ룬ֻÓÐÉêÇë³É¹¦µÄÏ̲߳ÅÄܹ»Ê¹ÓÃÉ豸¡£


5.4 Óû§ÊÖ²á

5.4.1 °²×°

Óû§ÐèÒªÔÚLinuxϼüÈë tar -zxvf acos-0.0.1.tar.gz ¡£
./setup,ÏêϸµÄ°²×°ÐÅÏ¢Çë²Î¼ûREADMEÎļþ¡£
½øÈëusr/local/bin/acosÖ®ºó£¬¸ù¾ÝÎÒÃÇËùÌṩµÄAPIÊÖ²á±àд×Ô¼ºµÄÓ¦ÓóÌÐò£¬È»ºó½«ÕâЩӦÓóÌÐòµÄÔ´Îļþ±àÒë³ÉÒ»¸ö"filename.o",Óû§Í¨¹ýÖ´ÐÐacbuildfilename.oÃüÁӦÓóÌÐòÁ´Èë²Ù×÷ϵͳÄںˣ¬¸ù¾ÝÄãËùʹÓõĺËÐĸñʽִÐÐmkXXXimageÃüÁîÉú³ÉËùÐèÒªµÄºËÐÄÓ³Ïñ£¬Ñ¡ÔñÇ¡µ±µÄ×°Èë³ÌÐò×°ÈëÆô¶¯ºËÐÄÓ³Ïñ¡£

5.4.2 Óû§±à³Ì½Ó¿Ú

Èç¹ûÄú¶Ô²Ù×÷ϵͳµÄ¸ÅÄîÓÐËùÁ˽⣬²¢ÏêϸÔĶÁÁËÎÒÃÇΪÄúÌṩµÄ¼¼ÊõÎĵµÖ®ºó£¬±ã¿ÉÒÔÀûÓÃÓû§±à³Ì½Ó¿Ú×ÔÐпª·¢ÁË¡£ÒÔÏÂÎÒ½«Ïò¸÷λÏêϸ½éÉÜÿ¸ö½Ó¿ÚËùÌṩµÄ¹¦ÄÜ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£

Ò»¡¢¹ÜÀíÏ̵߳ÄAPI

1.1 ³õʼ»¯Ïß³Ì
ac_init_pthreads( );

1.2 Ï̴߳´½¨
ac_thread_create ( void *name, void *arg,
int *out_thread_id);

1.3 ÉèÖÃÏ̵߳ÄÓÅÏȼ¶
ac_thread_setprio(int thread_id, int pri);

1.4 ³·ÏúÏß³Ì
ac_thread_cancel(int thread_id);

1.5 Ïß³ÌÐÝÃß
ac_thread_sleep(ac_s64_t millisecond);

1.6 ½«¸ÃÏß³ÌÓëijһ¸öÏß³ÌÏà¹ØÁª
ac_thread_join(int tid, void **status);

1.7 ³·Ïú¸ÃÏß³ÌÓëijÏ̵߳ĹØÁª
pthread_attr_setdetachstate ( pthread_attr_t *attr, intdetachstate )

¶þ¡¢¹ÜÀí»¥³âÁ¿µÄAPI

2.1 ³õʼ»¯»¥³âÁ¿
ac_mutex_init ( ac_pthread_mutex_t* mutex,
ac_pthread_mutexattr_t* attr);

2.2 ÉèÖû¥³âÁ¿Ð­Òé
ac_mutexattr_setprotocol ( ac_pthread_mutexattr_t* attr, intprotocol);

2.3 ÉèÖû¥³âÁ¿ÀàÐÍ
ac_mutexattr_settype ( ac_pthread_mutexattr_t* attr, inttype);

2.4³õʼ»¯»¥³âÁ¿ÊôÐÔ
ac_mutexattr_init(ac_pthread_mutexattr_t* attr);

2.5»¥³âÁ¿¼ÓËø
ac_mutex_lock(ac_pthread_mutex_t *mutex);

2.6»¥³âÁ¿½âËø
ac_mutex_unlock(ac_pthread_mutex_t *mutex);

2.7³·Ïú»¥³âÁ¿
ac_mutex_destroy(ac_pthread_mutex_t *mutex);

Èý¡¢¹ÜÀíIPCµÄAPI

3.1ÏûÏ¢·¢ËÍ£¨ IPC»úÖÆ £©
ac_ipc_send ( int thread_id, void* msg,ac_size_tmsgsize,ac_s32_t timeout);

3.2ÏûÏ¢½ÓÊÜ£¨ IPC»úÖÆ £©
ac_ipc_recv(int thread_id, void* msg,ac_size_tmsgsize,ac_size_t *actual, ac_s32_t timeout);

3.3ÏûÏ¢µÈ´ý£¨ IPC»úÖÆ £©
ac_ipc_wait(int *src_id, void *msg,ac_size_tmsgsize,ac_size_t *actual, ac_s32_t timeout);

3.4½ÓÊÜͬ²½ÏûÏ¢
ac_ipc_reply(int desthread, void *msg, ac_size_t msg_size);

3.5·¢ËÍͬ²½ÏûÏ¢
ac_ipc_call(int dst, void *send_msg, ac_size_tsend_msg_size,
¡¡¡¡void *recv_msg, ac_size_t recv_msg_size,
¡¡¡¡ac_size_t*actual,ac_s32_t timeout);

ËÄ¡¢¹ÜÀíÌõ¼þ±äÁ¿µÄAPI

4.1Ìõ¼þ±äÁ¿³õʼ»¯
ac_cond_init(ac_pthread_cond_t *cond, ac_pthread_condattr_t*attr);

4.2ijÏ̵߳ȴýÌõ¼þ±äÁ¿
ac_cond_wait(ac_pthread_cond_t *cond, ac_pthread_mutex_t*mutex);

4.3»½Ðѵȴý¸ÃÌõ¼þ±äÁ¿µÄÏß³Ì
ac_cond_signal(ac_pthread_cond_t *cond);

4.4·ûºÏÌõ¼þ±äÁ¿µÄÏ̹߳㲥
ac_cond_broacast(ac_pthread_cond_t *cond);

Îå¡¢Ó²¼þ²¿·Ö

5.1´ò¿ª´®¿Ú
ac_serial_open(int serial_num, ac_u32_t flags);

5.2¼àÌý´®¿Ú
ac_serial_listen(int serial_num, ac_u32_t flags);

5.3¹Ø±Õ´®¿Ú
ac_serial_close(ac_ttystream_t* a_stream);

5.4´Ó´®¿Ú¶Á
ac_serial_read(ac_ttystream_t* s, void *buf, ac_u32_t len,ac_u32_t*out_actual);

5.5Íù´®¿Úд
ac_serial_write(ac_ttystream_t* s, const void *buf,ac_u32_t len,ac_u32_t *out_actual);


5.4.3 Ó¦ÓóÌÐòʾÀý

ΪÁËÄÜÈø÷λÀÏʦ¶ÔÎÒÃǵÄÑÝʾϵͳһĿÁËÈ»£¬ÎÒÃÇÌØµØÑ¡È¡ÁËÔÚ²Ù×÷ϵͳÖбȽÏÓдú±íÐÔµÄ4¸öÀý×Ó¹©´ó¼ÒÐÀÉÍ£¬ËüÃÇÊÇ£¬ÕÜѧ¼ÒËã·¨£¬Ê±ÖÓÑÝʾ£¬Ï̵߳÷¶ÈºÍÖжÏÏìÓ¦¡£

ËùÐèµÄ×ÊÔ´£ºÑÝʾǰÈý¸öÀý×ÓÐèҪһ̨intel386»ò¸üеļÆËã»ú£¬Ò»ÕÅ1.44MBµÄÈíÅÌ£»ÑÝʾµÚËĸöÀý×Ó³ýÁËÉÏÊöÉ豸֮Í⣬»¹ÐèÒªÒ»¸ù´®¿ÚÏߣ¬Ò»Ì¨×°ÓÐWindows9xµÄ¼ÆËã»ú×÷·¢ËÍ»ú£¬²¢ÔÚÆäÉϰ²×°ÓÐÄÜÏò´®¿Ú·¢ËÍÐÅÏ¢µÄÈí¼þ¡£

1.ÕÜѧ¼ÒËã·¨

ÕÜѧ¼ÒËã·¨Ò²³ÆÕÜѧ¼Ò½ø²ÍµÄͬ²½ÎÊÌ⣬×îÔçÊÇÔÚ1965ÄêÓÉDijkstraÌá³ö²¢½â¾öµÄ¡£ÏÂÃæÎҾͼòµ¥ÃèÊöÒ»ÏÂÕâ¸ö¾­µäIPCÎÊÌâµÄ´óÒ⣺7¸öÕÜѧ¼ÒÎ§×øÔÚÒ»ÕÅÔ²×ÀÖÜΧ£¬Ã¿¸öÕÜѧ¼ÒÃæÇ°ÓÐÒ»¸öµúͨÐÄÃæ£¬ÓÉÓÚÃæÌõºÜ»¬£¬ËùÒÔÒªÓÃÁ½°Ñ²æ×Ó²ÅÄܼÐס¡£ÏàÁÚÁ½¸öµú×ÓÖ®¼äÓÐÒ»°Ñ²æ×Ó¡£ÕÜѧ¼ÒµÄÉú»î°üÀ¨ÈýÖÖ״̬£º¼´³Ô·¹£¬Ë¼¿¼ºÍ°¤¶ö£¬µ±Ò»¸öÕÜѧ¼Ò¾õµÃ¶öʱ£¬ËûÊÔͼ·ÖÁ½´ÎȥȡËû×ó±ßºÍÓұߵIJæ×Ó£¬Ã¿´ÎÄÃÒ»°Ñ£¬µ«²»·Ö´ÎÐò¡£Èç¹û³É¹¦µØ»ñµÃÁËÁ½°Ñ²æ×Ó£¬Ëû¾Í¿ªÊ¼³Ô·¹£¬³ÔÍêÒÔºó·Åϲæ×Ó¼ÌÐøË¼¿¼¡£ÕâÀïµÄÎÊÌâÊÇ£ºÎªÃ¿Ò»¸öÕÜѧ¼Òдһ¶Î³ÌÐòÀ´ÃèÊöÆðÐÐΪ£¬ÒªÇó²»ÄÜËÀËø¡£

ÔÚÕâ¸öÀý×ÓÖÐÎÒÃÇÉ趨ÁË7¸öÕÜѧ¼Ò£¬ÇÒ²»ÔÊÐíÕÜѧ¼Ò¶öËÀ¡£ÎÒÃÇΪÿ¸öÕÜѧ¼Ò´´½¨Ò»¸öỊ̈߳¬°Ñ²æ×Ó¿´×÷Ìõ¼þ±äÁ¿£¬ÈÃÏ̵߳ȴýÌõ¼þ±äÁ¿£¬Èç¹ûÂú×ãÌõ¼þ£¬ÔòÏß³ÌÖ´ÐÐ(ÕÜѧ¼ÒµÄ³Ô·¹×´Ì¬)£¬Ö´ÐÐÒ»¶¨Ê±¼äÖ®ºó£¬ÊÍ·ÅÌõ¼þ±äÁ¿£¬½øÈëÐÝÃß״̬£¨ÕÜѧ¼ÒµÄ˼¿¼×´Ì¬£©£¬µ±ÐÝÃßʱ¼ä¹ýÈ¥Ö®ºó£¬Ï̱߳»»½ÐÑ£¬ÖØÐµȴýÌõ¼þ±äÁ¿£¨ÕÜѧ¼ÒµÄ°¤¶ö״̬£©¡£

2£®Ê±ÖÓÑÝʾ

¼ÆËã»úÊÇÒÔÑϸñ¾«È·µÄʱ¼ä½øÐÐÊýÖµÔËËãºÍÊý¾Ý´¦ÀíµÄ£¬×î»ù±¾µÄʱ¼äµ¥ÔªÊÇʱÖÓÖÜÆÚ£¬OSKit×îС¿ÉÒÔ¾«È·µ½ÄÉÃëÒ»¼¶£¬ÆäʱÖÓϵͳµÄÌØµãÊÇÔÊÐíÔÚϵͳʱÖÓÖ®ÉÏ´´½¨×Ô¼ºµÄʱÖÓ£¬ÓÃÓÚ¿ØÖÆÖÜÆÚÐÔÏ̡߳£

ÎÒÃǵÄÑÝʾϵͳµÄÔ´´úÂë¿´ËÆ±È½Ï¼òµ¥£¬µ«Êµ¼ÊÉÏÈ´Êǽ¨Á¢ÔÚÒ»¸öÅÓ´óµÄʱ¼äϵͳ֮Éϵģ¬Õâ¸öʱ¼äϵͳÊÇÕû¸ö²Ù×÷ϵͳ»î¶¯µÄ¶¯Á¦¡£

ÎÒÃǵÄÑÝʾ³ÌÐò½«ÑÝʾ¿ØÖƼÆËã»úµÄʱÖÓ¼ÆÊ±( ÿ400ºÁÃëÏÔʾһ´Î )£¬¼ÆÊ±10´Îºó·µ»Ø³õʼ²Ëµ¥¡£

3£®Ï̵߳÷¶È

Ôڴ˸öÑÝʾ³ÌÐòÖУ¬Ò»¿ªÊ¼ÓÐÁ½¸öỊ̈߳¬ËüÃÇËù²ÉÈ¡µÄµ÷¶ÈËã·¨ÊÇʱ¼äƬÂÖת·¨£¬Óë´Ëͬʱ»¹ÓÐÒ»¸öÓÅÏȼ¶×î¸ßµÄÏß³ÌÔÚÐÝÃߣ¬Ëüÿ400ºÁÃë˯ÐÑÒ»´Î£¬´ò¶Ï´Ëʱ´¦ÓÚÔËÐÐ״̬µÄỊ̈߳¬ÄǸöÓÅÏȼ¶×î¸ßµÄÏß³ÌתִÐÐ̬£¬µÈËüÖ´ÐÐÍêËüµÄʱ¼äƬ֮ºó£¬Ç°Á½¸öÏ̼߳ÌÐøÖ´ÐС£

4£®ÖжÏÏìÓ¦

Õâ¸öÀý×ÓÑÝʾÁ˲Ù×÷ϵͳ¶ÔÍâÉèµÄÖ§³Ö£¬ÎÒÃÇÑ¡ÔñÁË´®¿Ú¡£ÑÝʾÕâ¸öÀý×Ó£¬ÐèÒªÁ½Ì¨¼ÆËã»úºÍÒ»¸ù´®¿ÚÏߣ¬ÆäÖÐһ̨¼ÆËã»ú°²×°ÎÒÃǵÄÑÝʾϵͳ£¬Áíһ̨ÐèÒªÓÐÒ»¸öÏò´®¿Ú·¢ËÍÐÅÏ¢µÄÈí¼þ£¬´ËÈí¼þÎÒÃÇÊÇÓÃDelphi±àдµÄ£¬ÔËÐÐÔÚWindows98ϵͳÏ£¬Á½Ì¨¼ÆËã»úÓÃÎÒÃÇ×Ô¼ºÖÆ×÷µÄ´®¿ÚÏßÏàÁ¬¡£ÑÝʾ³ÌÐòµÄÒ»¿ªÊ¼£¬ÓÐÁ½¸öÓÅÏȼ¶ÏàͬµÄÏß³ÌÔÚʱ¼äƬÂÖת¡£µ±ÎÒÃÇ´ÓÁíһ̨װÓÐWindows98µÄ»úÆ÷ÉϸøÑÝʾ»ú·¢ËÍÐÅϢʱ£¬Ô­À´´¦ÓÚÔËÐÐ״̬µÄÁ½¸öÏ̱߳»Öжϣ¬ÑÝʾ»ú»á³É¹¦µÄÊÕµ½·¢ËÍ»ú·¢Ë͵ÄÐÅÏ¢£¬È»ºóµÈ´ý²Ù×÷ÈËÔ±µÄ´¦Àí£¬ÊÇ·ñ¼ÌÐøÔËÐиÃÀý×Ó»òÕßÍ˳ö¡£


±¾ Õ С ½á

±¾ÕÂÊÇΪ×îºóÌṩ¸ø¸÷λÀÏʦÐÀÉ͵ÄÑÝʾϵͳËùдµÄ£¬Õë¶Ôÿ¸öÀý×Ó£¬ÏÈ´ÓÀíÂÛÉÏÂÛÊöÁËËüµÄ¸ÅÄîÒÔ¼°ÎÒÃÇÊÇÔõôʵÏֵģ¬È»ºó¸½ÉÏÁ˲¿·Ö³ÌÐò¡£

×¢Ò⣺ÓÉÓÚÑÝʾϵͳËùʹÓõÄOSKitµÄϵͳµ÷Óûù±¾ÔÚǰÈýÕÂÒѾ­ÖðÒ»×öÁËÏêϸµÄ½éÉÜ¡£

[Ŀ¼]


µÚÁùÕ ½áÊøÓï

¡¶OSKitµÄÏ̻߳úÖÆ µÚÁùÕ¡·


OSKitµÄÏ̻߳úÖÆ µÚÁùÕÂ2000Äê12ÔÂ25ÈÕ22:34


×÷ Õߣº ÌÀº£¾©


µ¼Ê¦£º³ÂË·Ó¥


µÚÁùÕ ½áÊøÓï

OSKitµÄÏ̻߳úÖÆ¼È×ñÕÕÁËPOSIX±ê×¼£¬ÓÖÔÚһЩµØ·½ÓÐËùÍ»ÆÆ£¬ÖîÈçʵʱ²¿·Ö£¬ÕâЩ¶¼ÊÇ¿ª·¢ÈËÔ±¶Ô²Ù×÷ϵͳÒÔ¼°×ÔÓÉÈí¼þµÄ¹±Ïס£

OSKitËäÈ»»¹ÓÐÐí¶àµÄ²»×㣬µ«ÓÉÓÚËü³öÏÖÔÚLinuxÖ®ºó£¬ËùÒÔÆäÐí¶àÉè¼ÆË¼ÏëÃÖ²¹ÁËLinuxÖеIJ»×㣨±ÈÈçÔÚÏß³ÌͨÐŲ¿·ÝOSKit¾ÍûÓÐÕÕ°áLinux£¬¶øÊÇÑﳤ±Ü¶Ì£¬È¥µôÁ˹ܵÀÐÍͨÐÅ·½Ê½£©£¬¶øÓÖÓÉÓÚOSKitÿÈý¸öÔ¸üÐÂÒ»´Î£¬²»¶ÏµÄÔö¼ÓһЩеÄËã·¨ºÍÉè¼ÆË¼Â·£¨Èç¶Ôʵʱ²Ù×÷ϵͳµÄÖ§³Ö£¬ÕâÔÚLinuxÏÂÊǺÜÉÙ³öÏֵģ¬ÕâÊÇÒòΪLinuxµÄÉè¼ÆÕßÃDz¢²»ÈÏΪʵʱ²Ù×÷ÔÚµ¥»úϵͳµÄÈÕ³£Ó¦ÓÃÖÐÄÜÕ¼¶à´óµÄ±ÈÖØ£¬µ«OSKitµÄÉè¼ÆÕßÃÇ´Ó²Ù×÷ϵͳÍêÕûÐԵĽǶȳö·¢£¬ÎªÎÒÃÇÌṩÁËÐí¶àʵʱµÄϵͳµ÷Óã©£¬ÕâʹµÃËü×ÜÄÜÕ¾ÔÚ²Ù×÷ϵͳÉè¼ÆµÄ×îÇ°ÑØ¡£

Æäʵ£¬×ÔÓÉÈí¼þµÄ÷ÈÁ¦Ô¶Ô¶³¬¹ýÁË΢ÈíµÄÊÓ´°£¬µ«ÏÖÔڵĿª·¢ÈËÔ±×ÜÊǰÑÒ»²¿·Ö¾«Á¦¼¯ÖÐÔÚÁ˶ÔkernelµÄ²Ã¼ôÖ®ÉÏ£¬¶øOSKitµÄ³öÏÖǡǡÃÖ²¹ÁËÕâÏîȱÏÝ£¬·Â·ðΪ×ÔÓÉÈí¼þÊÂÒµµÄÌڷɲåÉÏÁËһ˫³á°ò£¬Ê¹µÃÎÒÃǸü¼ÓÓÐÀíÓÉÏàÐÅ×ÔÓÉÈí¼þÊÂÒµÖÕ½«Å·¢Õ¹¡£

OSKitÔÚÃÀ¹úµÄһЩ´óѧÀïÒѾ­µÃµ½Á˵ÄÓ¦ÓеÄÖØÊÓ£¬²¢ÓÐÒ»¸öÑо¿×éÓÃOSKit¿ª·¢Íê³ÉÁËÒ»¸öJAVAOS,¶øÇÒÔÚÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×éµÄÖ÷Ò³ÉÏ£¬»¹ÓÐÒ»¸öרÃŵÄÁ´½Ó£¬ÀïÃæ¶¼ÊÇÓÃOSKit¿ª·¢µÄÏîÄ¿¼ò½é£¬¿É¼ûÆäÒѾ­ÓÐÁËÒ»¶¨µÄÓÃ;¡£µ«ÔÚÖйúµÄ´óѧÀÁ˽â³Ì¶È»¹Ô¶Ô¶²»¹»£¬¾ÝÎÒÃÇËùÖª£¬Ä¿Ç°Ö»ÓÐÖпÆÔºµÄÒ»¸ö¿ÎÌâ×éÓÃOSKitÍê³ÉÁËÒ»¸öСÐ͵IJÙ×÷ϵͳ¡£

ÖÚËùÖÜÖª£¬¹úÄÚÔÚ×ÔÓÉÈí¼þÁìÓòµÄ³É¾ÍÊÇÔ¶Ô¶ÂäºóÓÚ¹úÍâµÄ£¬ËùÒÔÎÒÃÇ¿ÎÌâ×é¶ÔOSKit×öÁËÒ»¶¨µÄ·ÖÎöºÍ̽Ë÷£¬ËãÊÇÅ×שÒýÓñ£¬Ï£Íû¹úÄÚ²Ù×÷ϵͳµÄ°®ºÃÕßÃÇÄܸøÓè³ä·ÖÖØÊÓ¡£ÈÃÎÒÃǹ²Í¬Å¬Á¦£¬ÍƽøÖйú×ÔÓÉÈí¼þÊÂÒµµÄ·¢Õ¹¡£


ºó ¼Ç

ÒÔÉÏÊÇÎÒ¶ÔÎÒÃÇ¿ÎÌâ×éËù×öÑо¿¹¤×÷£¬ÒÔ¼°ÎÒ¸öÈ˹¤×÷µÄ½éÉÜ¡£Í¨¹ý¼¸¸öÔÂÒÔÀ´ÎÒ¶ÔOSKitµÄ·ÖÎöºÍÑо¿£¬¼ÓÉîÁ˶ԲÙ×÷ϵͳԭÀíµÄÈÏʶ£¬²¢¶ÔÆäʵÏÖÓÐÁ˾ßÌåµÄÈÏʶ£¬Ìá¸ßÁËÎҵķÖÎöÄÜÁ¦£¬·á¸»ÁËʵ¼ù¾­Ñé¡£

ÎÒÖÔÐĵظÐлÎҵĵ¼Ê¦³ÂË·Ó¥ÀÏʦ¸øÓèÎÒµÄϤÐÄÖ¸µ¼£¬ÕÅÀö·ÒÒÔ¼°ÕÔСÁÖÀÏʦҲ¸øÓèÎÒÃÇ¿ÎÌâ×éÒÔÈÈÐĵİïÖú£¬ÎÒÃǶÔ901½ÌÑÐÊÒµÄÈ«ÌåÀÏʦ±íʾÖÔÐĵĸÐл¡£


²Î¿¼ÎÄÏ×

·OSKITÎĵµ£ºhttp://www.cs.utah.edu/projects/flux/oskit/
·¡¶²Ù×÷ϵͳµÄÉè¼ÆÓëʵÏÖ¡·,±±¾©Àí¹¤´óѧ³ö°æÉ磬ÕÅÀö·ÒÖø
·¡¶COMÔ­ÀíÓëÓ¦Óá·£¬Ç廪´óѧ³ö°æÉ磬Å˰®ÃñÖø
·¡¶¼ÆËã»ú»·¾³µÄ¿ÉÒÆÖ²²Ù×÷ϵͳ½çÃæPOSIX.1¡·,µç×Ó¹¤Òµ³ö°æÉ磬ÖÐÈí×ܹ«Ë¾µÚ¶þ¿ª·¢²¿Òë
·¡¶Linux²Ù×÷ϵͳÄں˷ÖÎö¡·£¬ÈËÃñÓʵç³ö°æÉ磬³ÂÀò¾ý±àÖø
·¡¶Linux±à³Ì°×ƤÊé¡·£¬»úе¹¤Òµ³ö°æÉ磬£¨ÃÀ£©David A.RuslingµÈÖø£¬ÖìçæµÈÒë
·¡¶²Ù×÷ϵͳ©UÉè¼ÆÓëʵÏÖ£¨µÚ¶þ°æ£©¡·£¬OPERATING SYSTEMS Design and Implementation£¨SecondEdition£©,µç×Ó¹¤Òµ³ö°æÉç,ANDREW S.TANENBAUM,ALBERT S. WOODUHULL Öø£¬ÍõÅô£¬ÓȽúÔª£¬ÖìÅô£¬°½ÇàÔÆÒëУ
·¡¶UNIX²Ù×÷ϵͳÉè¼ÆÓëʵÏÖ¡·µç×Ó¹¤Òµ³ö°æÉ磬À¹úÖ÷±à
·¡¶UNIX²Ù×÷ϵͳÉè¼Æ¡·The Design of the UNIX Operation System,»úе¹¤Òµ³ö°æÉ磬£¨ÃÀ£©Maurice J.Bsvh Öø ÍõÐñµÈÒë
·¡¶ÊµÓÃUNIX±à³Ì¡·, »úе¹¤Òµ³ö°æÉ磬£¨ÃÀ£©Kay A. Robbins,Steven Robbins Öø£¬Áõ×ÚÌïµÈÒë
·¡¶Advance Programming in the UNIX Environment¡·,(ÃÀ) W. Richard Stevens
·¡¶Linux ÉϵÄC ±à³Ì¡·£¬ÖйúµçÁ¦³ö°æÉ磬»³Ê¯¹¤×÷ÊÒ±àÖø
·¡¶Linux´ÓÈëÃŵ½¾«Í¨¡·£¬The Linux A-Z,µç×Ó¹¤Òµ³ö°æÉ磬£¨Ó¢£©Phil Cornes Öø,ͯÊÙ±òµÈÒ룬ÏĵÀ²ØÉóУ
·¡¶Linux ²Ù×÷ϵͳ¼°ÊµÑé½Ì³Ì¡·£¬»úе¹¤Òµ³ö°æÉ磬ÀîÉÆÆ½µÈ±àÖø
·¡¶Linux ³£Óü¼Êõ´óÈ«¡·£¬Linux Complete,µç×Ó¹¤Òµ³ö°æÉ磬£¨ÃÀ£© Grant Taylor Öø£¬ÇñÖÙÅ˵ÈÒë
·¡¶¼ÆËã»ú²Ù×÷ϵͳԭÀíÓë¼¼Êõ¡·,Î÷°²½»Í¨´óѧ³ö°æÉ磬½ÀöÄÈ£¬ÆëÓ£¬°×¶÷»ªÖ÷±à
·¡¶UNIXͨÐÅÓëInternet¡·,UNIX Communications and the Internet (µÚÈý°æ)£¬ÉòÆæ£¬Íõ½¡ ÀîÁáµÈÒë
·¡¶LinuxȨÍþÖ¸ÄÏ¡·£¬ÖйúµçÁ¦³ö°æÉ磬»³Ê¯¹¤×÷ÊÒ±àÖø
·¡¶Using Threads in Interactive Systems:A Case Study¡·, HASUDR, C., JACOBI,C.,THEIMER
·¡¶POSIX Programmer's Guide¡·,O'Reilly, LEWINE


[Ŀ¼]


²¿¼þ¶ÔÏóÄ£ÐÍ

OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ Ä¿Â¼
2000Äê11ÔÂ30ÈÕ 19:38


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥

Ŀ¼
----------------------------------------------
ǰÑÔ

µÚÒ»Õ OSKIT½éÉÜ
1.1 OSKIT¸ÅÊö
1.2 OSKITµÄ×é³É
1.3 OSKITµÄÉè¼ÆÔ­Ôò
1.4 OSKITµÄÅäÖÃ
1.5 OSKITµÄ±àÒë
1.6 OSKITµÄʹÓÃ
1.7 OSKitµÄÖ´Ðл·¾³

µÚ¶þÕ COM¹æ·¶½éÉÜ
2.1 COMµÄ»ù±¾¸ÅÄî
2.1.1 ×é¼þ¼¼Êõ
2.1.2 ʲôÊÇCOM
2.1.3 COM½á¹¹
2.1.4¿Í»§/·þÎñÆ÷Ä£ÐÍ
2.2 COM¶ÔÏó
2.2.1 COM¶ÔÏóµÄ±êʶ£­CLSID
2.3 COM½Ó¿Ú
2.3.1 ½Ó¿ÚµÄ¶¨ÒåºÍ±êʶ
2.3.2 ½Ó¿ÚµÄÒ»Ð©ÌØµã
2.4 Iunknown½Ó¿Ú
2.4.1 ÒýÓüÆÊý
2.4.2 ʵÏÖÒýÓüÆÊý
2.4.3 ½Ó¿Ú²éѯ
2.4.4 COM¶ÔÏóµÄ½Ó¿ÚÔ­Ôò
2.5 COMÌØÐÔ
2.5.1ÓïÑÔÎÞ¹ØÐÔ
2.5.2 ½ø³Ì͸Ã÷ÌØÐÔ
2.5.3 ¿ÉÖØÓÃÐÔ

µÚÈýÕ OSKITÖÐCOM»úÖÆµÄʵÏÖ
3.1 OSKITÖÐCOMµÄ»ù±¾¶¨Òå
3.2 ʵÀý·ÖÎöIunknown½Ó¿ÚµÄʵÏÖ
3.2.1 C»·¾³¶ÔÏóµÄ½á¹¹
3.2.2 C»·¾³½Ó¿Ú¼°Æä¶ÔIunknown½Ó¿ÚµÄʵÏÖ

µÚËÄÕ OSKITÖеĽӿÚ×¢²á»úÖÆ
4.1 ¸ÅÊö
4.2 Êý¾Ý¿â¶ÔÏó
4.3 ·þÎñ½Ó¿ÚµÄ¶¨Òå
4.4 Êý¾Ý¿â·þÎñ½Ó¿ÚµÄʵÏÖ
4.4.1 ´´½¨Êý¾Ý¿â
4.4.2 ÔÚÊý¾Ý¿âÖÐ×¢²á½Ó¿Ú
4.4.3 ÔÚÊý¾Ý¿âÖÐ×¢Ïú½Ó¿Ú
4.4.4 ²éÕÒÓÃijiid×¢²áµÄµÚÒ»¸ö½Ó¿Ú
4.4.5 ²éÕÒÓÃijiid×¢²áµÄËùÓнӿÚ
4.4.6 ¿Ë¡Êý¾Ý¿â

µÚÎåÕ OSKITµÄÆô¶¯¼°ÏµÍ³³õʼ»¯
5.1 ¸ÅÊö
5.2 ºËÐÄ×°Èë³ÌÐò£­Multiboot
5.2.1 Multiboot¼ò½é
5.2.2 Multiboot¹æ·¶
5.2.3 Multiboot½øÐгõʼ»¯µÄ²½Öè
5.3 OSKITÖÐÈí¼þ»·¾³µÄ³õʼ»¯
5.3.1 Èí¼þ»·¾³³õʼ»¯µÄ²½Öè
5.3.2 Èí¼þ»·¾³³õʼ»¯µÄʵÏÖ

µÚÁùÕÂOSKitµÄÓ¦ÓÃʵÀý£ºÒ»¸ö¼òµ¥ÏµÍ³µÄÉè¼ÆÓëʵÏÖ
6.1Éè¼ÆÄ¿µÄ
6.2ϵͳµÄ¹¦ÄÜ
6.3ÎÒÃÇ×Ô¼ºËùÍê³ÉµÄ¹¤×÷£º
6.3.1ϵͳµÄÆô¶¯
6.3.2Ï̹߳ÜÀí
6.3.3 ÍâÉ裨´®¿Ú£©
6.3.4 Ó¦ÓóÌÐòʾÀý

µÚÆßÕ ½áÊøÓï

ºó ¼Ç

²Î¿¼ÎÄÏ×

[Ŀ¼]


ǰÑÔ

¡¶OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ Ç°ÑÔ¡·


OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ Ç°ÑÔ2000Äê11ÔÂ30ÈÕ19:38


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥

¿ÎÌâÃû³Æ£º»ùÓÚÃæÏò¶ÔÏóµÄ²Ù×÷ϵͳ¿ª·¢Æ½Ì¨(OSKit)µÄ·ÖÎöÓë³ÌÐòÉè¼Æ

¿ÎÌâÀ´Ô´£º×ÔÄâÌâÄ¿

Èç¹û˵×ÔÓÉÈí¼þµÄ³öÏÖÊÇÒ»¸öżȻµÄ»°£¬ÄÇô£¬Ï¯¾íÈ«ÇòµÄLinuxÈȳ±ÔòÊÇÒ»¸öÆæ¼££¬ËûÕýÒÔÊÆ²»¿Éµ²µÄÇ÷ÊÆÑ¸ÃÍ·¢Õ¹£¬Æäǰ;²»¿ÉÏÞÁ¿¡£

LinuxÄÚºËÔ´´úÂëµÄ¿ª·Å¸øÏ£ÍûÉîÈë²Ù×÷ϵͳÄÚ²¿ÊÀ½çµÄÈËÃÇÌṩÁË¿ÉÄÜ£¬µ«ËæÖ®¶øÀ´µÄÎÊÌâÊÇ£¬µ±ÎÒÃÇÒª¿ª·¢×Ô¼ºµÄ²Ù×÷ϵͳʱ£¬ÓÉË­À´¶ÁϵͳµÄkernel²¿·ÖÄØ¡£¶ÔÕⲿ·ÖµÄ´¦Àí´ÓÂß¼­ÉÏ·ÖÎö²»ÍâºöÈýÖÖ·½Ê½£ºÈ«²¿±£Áô£¬¶ÔÆä½øÐвüõ£¬È«²¿ÍƵ¹ÖØÀ´£¬ºÜÏÔÈ»£¬×îºóÒ»ÖÖ·½·¨ÊDz»¿ÉÄܵ쬶øÈç¹ûÎÒÃDzÉÓõÄÊǵÚÒ»ÖÖ·½·¨£¬Æä½á¹ûµ±È»Ò»¶¨¿ÉÒÔÂú×ãÎÒÃǵÄÒªÇ󣬵«ÊÇ£¬×îºó±àÒë³öÀ´µÄºËÐĽ«Ê®·ÖµÄÅÓ´ó£¬ÓÈÆäÊǶÔǶÈëʽ²Ù×÷ϵͳµÄ¿ª·¢ÕßÀ´Ëµ£¬ÊDz»ÄÜÈÌÊܵģ¬ËùÒÔ£¬´ó¶àÊý¿ª·¢Õß²ÉÓõĵڶþÌõ·¡£

µ«ÊÇ£¬µÚ¶þÌõ·Ҳ·Çƽ̹µÄ´óµÀ£¬µÀÀíºÜ¼òµ¥£¬ÄãÒªÏë¶Ôkernel½øÐвüõ£¬Ê×ÏÈÄãÓ¦¸Ã½«È«²¿µÄÔ´´úÂëÔĶÁÒ»±é£¬²¢ÇÒ½«ÆäÖеÄÏà¹ØÐÔÀí˳£¬È»ºó²ÅÄÜ̸µ½²Ã¼õ£¬ËùÒÔ¹¤×÷Á¿Ò²Ê®·ÖµÄÅÓ´ó¡£

È»¶ø£¬OSKitµÄ³öÏָıäÁËÕâÒ»ÇУ¬ËüʹµÃÎÒÃDz»ÐèÒª½«¾«Á¦¼¯ÖÐÔÚkernelÔ´´úÂëµÄÔĶÁÉÏ£¬ÒòΪkernel²¿·ÖµÄÔ´³ÌÐòÒѾ­ÓÉOSKitµÄ¿ª·¢ÈËÔ±ÌæÄã·ÖÎö¹ýÁË£¬ËûÃǽ«Ô´ÂëÈ«²¿Ä£¿é»¯£¬²¢½«ËùÓÐÄ£¿éÖ®¼äµÄÏà¹ØÐÔдÔÚÁËÎĵµÖ®ÖУ¬³ÊÏÖÔÚÄãµÄÃæÇ°£¬ÕâÓëÄã×Ô¼º·ÖÎöÔ´´úÂëµÄ½á¹ûÊÇÒ»ÑùµÄ¡£

OSKit×î±¾ÖʵĶ«Î÷ºÍLinuxÒ»Ñù£¬ÌåÏÖÔÚ"×ÔÓÉ"ºÍ"¿ª·Å"µÄ˼Ï룬"×ÔÓÉ"Òâζ×ÅÊÀ½ç·¶Î§ÄÚµÄ֪ʶ¹²Ïí£¬ÓÉÓÚOSKit³öÏÖÔÚLinuxÖ®ºó£¬ÆäÉè¼ÆË¼Ïë¼Ì³ÐÁËLinuxµÄ¾«Ë裬ËùÒÔ˵ËüµÄ³öÏÖ²¢²»ÍêÈ«ÊÇÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×éµÄ¹¦ÀÍ£¬¶øÓ¦¸ÃÊÇ"×ÔÓÉ"µÄ½á¹û¡£"¿ª·Å"ÔòÒâζ×ÅOSKit¶ÔËùÓеÄÈ˶¼³¨¿ª´óÃÅ£¬ÔÚÕâÖÖ¿ª·Å¶ø×ÔÓɵÄÌìµØÀÄã¿ÉÒÔÖзַ¢»Ó×Ô¼ºµÄ´´Ôì²ÅÄÜ¡£

ÔÚºóÃæµÄ¼¸ÕÂÀÎÒ½«Ïò´ó¼ÒϵͳµØ½éÉÜÎÒµÄÈ«²¿Ñо¿³É¹û-OSKitµÄCOM»úÖÆ¼°³õʼ»¯¹ý³Ì£¬Ï£Íû¶ÁÕßÄÜÔÚ×î¶ÌµÄʱ¼äÄÚÁ˽âOSKit£¬¸üÏ£Íû´ó¼ÒÄܱ¾×Å"×ÔÓÉ"Óë"¿ª·Å"µÄ¾«Éñ¼ÓÈëµ½ÎÒÃǵÄÑо¿ÖÐÀ´£¬ÎªÖйúµÄ×ÔÓÉÈí¼þÊÂÒµ¹±Ï××Ô¼ºµÄÒ»·ÝÈÈÇé¡£

ÓÉÓÚ±¾ÈËÄÜÁ¦ÓÐÏÞ£¬ÂÛÎÄÖеÄÓÐЩÊõÓï±í´ï¿ÉÄܲ»Í×£¬ÄÚÈÝÒ²¿ÉÄܲ»¹»×¼È·£¬¾´Çë¸÷λÀÏʦºÍͬѧÅúÆÀÖ¸Õý£¬±¾È˲»Ê¤¸Ð¼¤¡£

ÕâÆªÂÛÎÄÖ÷ÒªÂÛÊöÁËËIJ¿·ÖÄÚÈÝ£º
µÚÒ»²¿·Ö£ºOSKit¼ò½é
µÚ¶þ²¿·Ö£ºCOM¹æ·¶½éÉÜ
µÚÈý²¿·Ö£ºOSKitÖÐCOM»úÖÆµÄʵÏÖ
µÚËIJ¿·Ö£ºOSKitµÄÆô¶¯¼°³õʼ»¯¹ý³Ì

ºéÄþ2000Äê6ÔÂ19ÈÕ

[Ŀ¼]


µÚÒ»Õ OSKIT½éÉÜ

¡¶OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚÒ»Õ¡·


OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚÒ»ÕÂ2000Äê11ÔÂ30ÈÕ19:55


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥

µÚÒ»Õ OSKIT½éÉÜ

1.1 OSKIT¸ÅÊö
¡¡¡¡OSKITÊÇÃÀ¹úÓÌËü´óѧ¼ÆËã»ú¿ÆÑ§ÏµFLUXÑо¿×é±àдµÄÒ»Ì×ÓÃÓڼܹ¹²Ù×÷ϵͳÄںˡ¢·þÎñÆ÷ºÍÆäËûOS¼¶Èí¼þµÄ¿ò¼Ü¼°Ä£¿é»¯µÄ²¿¼þºÍ¿â³ÌÐò¡£OSKITµÄ±àдÕßÈÏΪ£¬²Ù×÷ϵͳÖÐÓкܴóÒ»²¿·ÖÄ£¿éÊÇϵͳ±ØÐëµÄ£¬µ«²¢²»ÊÇ¿ª·¢ÕßËù¸ÐÐËȤµÄ£¬ÀýÈçϵͳװÈëÄ£¿é£¬¸÷ÖÖ±ê×¼Çý¶¯Ä£¿éµÈ¡£Ê¹ÓÃOSKITµÄÄ¿µÄ¾ÍÊÇʹ²Ù×÷ϵͳµÄ¿ª·¢Õß¼¯Öо«Á¦¿ª·¢ËûÃDzÙ×÷ϵͳÖÐÓÐÌØÉ«µÄ£¬»òÕßËûÃǸÐÐËȤµÄ²¿·Ö£¬¶ø²»±Ø¿¼ÂÇһЩ·±Ëö¶ø·¦Î¶µÄϸ½Ú¡£ÎªÁË´ïµ½Õâ¸öÄ¿µÄ£¬OSKitÔÚÉè¼ÆÊ±½èÓÃÁËCOMµÄ˼Ï룬°Ñ²Ù×÷ϵͳµÄ¸÷¸ö²¿·ÖÉè¼Æ³É¾¡Á¿¶ÀÁ¢µÄCOMÄ£¿é£¬ÒÔ·½±ã²Ù×÷ϵͳµÄ¿ª·¢ÕßʹÓûòÌæ»»¡£Òò´Ë£¬µ±¿ª·¢ÈËԱʹÓÃÕâÌ×¹¤¾ßʱ£¬¿ÉÒÔ°ÑËüµ±×÷Ò»¸öÍêÕûµÄ²Ù×÷ϵͳÀ´Ê¹Óã¬Ò²¿ÉÒÔ¸ù¾ÝÐèҪʹÓÃÆäÖеÄÒ»²¿·Ö£¬Ëü»¹¿ÉÒÔ×÷ΪһÌ×¶¯Ì¬Á´½Ó¿â£¬ÓɲÙ×÷ϵͳ¼°Ö§³Ö³ÌÐò¶ÔËü½øÐе÷Óá£

1.2OSKITµÄ×é³É
¡¡¡¡OSKIT°Ñ¸ø¿ª·¢ÕßÌṩµÄ¹¦ÄÜ·ÖΪÈý¸ö²¿·Ö£º½Ó¿Ú¡¢º¯Êý¿âºÍ²¿¼þ¿â¡£
¡¡¡¡OSKITµÄ½Ó¿Ú·Ç³£ÇåÎú£¬¶øÇÒÊÇÃæÏò¶ÔÏóµÄ£¬Ëü²ÉÓÃÁ˲¿¼þ¶ÔÏóÄ£ÐÍ£¨COM£©µÄ¼Ü¹¹£¬ÔÚÎÄÕµĺóÐø²¿·Ö»á¶ÔOSKITÖеÄCOM½Ó¿ÚµÄ×éÖ¯ºÍ½á¹¹½øÐÐÏêϸµÄÌÖÂÛ¡£
¡¡¡¡OSKITµÄº¯Êý¿âʹÓô«Í³µÄCÓïÑÔ£¬²¢²ÉÓÃÃæÏòº¯ÊýµÄ·½Ê½ÏòÓû§Ìṩ·þÎñ¡£ÀýÈç»ù±¾µÄC¿âº¯Êý£¬ÕâЩº¯ÊýÒ×ÓÚʹÓúͿØÖÆ£¬Ä¿±ê²Ù×÷ϵͳÄܷܺ½±ãµÄʹÓÃÆäÖеÄij¸öº¯Êý£¬¶øÇÒ¸÷¸öº¯ÊýÖ®¼äµÄÒÀÀµ¹ØÏµÒѱ»Ëõ¼õÖÁ×îС¡£ÕâЩº¯Êý¿âÖкÜÉÙʹÓÃOSKit×Ô¼ºµÄCOM½Ó¿Ú£¬È¡¶ø´úÖ®µÄÊÇÔÚÆÕͨµÄCÍ·ÎļþÖж¨ÒåÃæÏòº¯ÊýµÄ½Ó¿Ú¡£ÕâÖÖÉè¼Æ²ßÂÔΪ²Ù×÷ϵͳÉè¼ÆÈËÔ±ÌṩÁË×î´ó³Ì¶ÈµÄÖ§³ÖºÍÁé»îÐÔ£¬ÒÔÊʺÏÈκÎÌØÊâµÄ²Ù×÷ϵͳ»·¾³¡£
¡¡¡¡ÏÂÃæÊÇOSKITĿǰÌṩµÄÖ÷Òªº¯Êý¿âÁÐ±í£¬ÒÔ¼°ËüÃǵļò½é£º
¡¡¡¡liboskit_c£ºÒ»¸ö¼òµ¥µÄ×îСÏ޶ȵÄC¿â£¬ËüÔÚÒ»¸öÊÜÏÞÖÆµÄOS»·¾³ÖÐÌṩÁËͨÓõÄC¿âÖ§³Ö£¬²¢Ê¹¶Ô»·¾³ºÍÆäËûÄ£¿éµÄÒÀÀµ´ïµ½×îСÏÞ¶È¡£ÔÚÐèÒªÒ»¸ö¸üÍêÕûµÄ¡¢ÀàPOSIXµÄCº¯Êý¿âµÄÇé¿öÏ£¬¿ÉÒÔʹÓÃFreeBSDµÄCº¯Êý¿â£¬ÉõÖÁÊÇÓÃ×Ô¼º±àдµÄº¯Êý¿âÀ´´úÌæÕâ¸ö×îС»¯µÄC¿â¡£
¡¡¡¡liboskit_kern£º½¨Á¢Ò»¸ö»ù±¾µÄ²Ù×÷ϵͳÄÚºËÔËÐл·¾³ËùÐèµÄÄÚºËÖ§³Ö´úÂ룬¸Ãº¯Êý¿âΪÏÝÈëºÍÖжϵÈÌṩȱʡµÄ´¦Àí³ÌÐò¡£Õâ¸ö¿â°üÀ¨ºÜ¶àÔÚдºËÐÄ´úÂëʱ·Ç³£ÓÐÓõÄͨÓù¤¾ß£¬Èç·ÃÎÊij¸öCPU¼Ä´æÆ÷£¬½¨Á¢²¢Î¬»¤Ò³±í£¬ÔÚ²»Í¬µÄ´¦ÀíÆ÷ģʽ¼äת»»µÈ¡£
¡¡¡¡liboskit_smp£ºÄÚºËÖ§³Ö´úÂ룬Õâ¸ö¿â¿É½¨Á¢Ò»¸ö±ãÓÚ²Ù×÷ϵͳʹÓõĶദÀíÆ÷ϵͳ»·¾³¡£
¡¡¡¡liboskit_com£º´¦ÀíCOM½Ó¿ÚµÄ¹¤¾ßº¯ÊýºÍÒ»Ì×ͨÓõİü×°²¿¼þ¡£
¡¡¡¡liboskit_dev£ºÕâ¸ö¿âÌṩÁËÇý¶¯³ÌÐòºÍÓÉÆäËü²Ù×÷ϵͳÒýÈëµÄ²¿¼þ£¨ÈçÍøÂç¡¢Îļþϵͳ£©ÔÚOSKitÖÐʹÓÃʱËùÐèÒªµÄת»»º¯ÊýµÄȱʡʵÏÖ£¬ÕâЩº¯Êý¹¤×÷ÔÚOSKitÇý¶¯³ÌÐò¿ò¼ÜÖ®ÖС£ÕâЩº¯ÊýµÄȱʡʵÏÖÊÇΪʹÓÃÁËliboskit_kern¿âµÄ¼òµ¥ÄÚºËËùÉè¼ÆµÄ£¬¿ª·¢ÕßÔÚ±ØÒªÊ±¿ÉÒÔÖØÐ´²¿·Ö»òÈ«²¿º¯Êý¡£
¡¡¡¡OSKITµÄ²¿¼þ¿âÌṩÁËÒ»¸öÒ»°ãÇé¿öϸü¸ß²ãµÄ¹¦ÄÜ£¬ÕâÖÖ¹¦ÄÜÒÔÒ»ÖÖ¸ü¼Ó±ê×¼¡¢¾«ÐÄÐÞÕûµÄ¡¢ÃæÏò¶ÔÏóµÄ"ºÚºÐ"·½Ê½Éè¼Æ¡£¾¡¹ÜOSKitµÄ"²¿¼þ"ȱʡÇé¿öÏÂÒ²ÊDZ»´ò°ü³ÉΪÆÕͨµÄÁ´½Ó¿â£¬µ«ËüÃǵĽṹÔòÊDZ»Éè¼Æ³ÉÃæÏò¶ÔÏóµÄ£¬¶ø²»ÊÇ´«Í³µÄÃæÏòº¯ÊýµÄ·½Ê½¡£ÓëOSKitµÄº¯Êý¿âÏà±È£¬²¿¼þ¿âͨ³£Ö»¶ÔÍ⿪·ÅһЩÏà¹ØµÄ¹«Óõ÷Óýӿڣ¬¶ø²»ÊÇ´óÁ¿µÄ¹¦ÄÜ¡£ÀýÈ磬ÔÚLinuxºÍBSDÇý¶¯³ÌÐò²¿¼þ¿â£¬Ã¿Ò»¸öÍêÕûµÄÇý¶¯³ÌÐò½öʵÏÖ³ÉΪһ¸öµ¥¶ÀµÄº¯Êýµ÷Óã¬Õâ¸öµ÷ÓÃÓÃÀ´³õʼ»¯²¢×¢²áÇý¶¯³ÌÐò¡£Ä¿±êϵͳͨ¹ýOSKitµÄÃæÏò¶ÔÏóµÄCOM½Ó¿ÚÀ´ÓëÕâЩ²¿¼þ½øÐн»»¥£¬ÕâÔÊÐíºÜ¶à²¿¼þ¼°²¿¼þµÄʵÀý¹²´æ£¬²¢ÒÔ²Ù×÷ϵͳ¿ª·¢ÈËÔ±¶¨ÒåµÄ·½Ê½½»»¥¡£ÕâÖÖÉè¼ÆµÄ²ßÂÔÓÐÀûÓÚ½«ÒÑÓÐϵͳ£¨ÈçBSDºÍLinux£©ÖеĴúÂë²¢ÈëOSKit£¬ÄÇʱ£¬Òþ²ØÔ­Óл·¾³µÄϸ½ÚÒª±ÈÌṩÁé»îÐÔ¸üÖØÒª¡£
¡¡¡¡ÏÂÃæÊÇĿǰOSKitËùÌṩµÄÖ÷Òª²¿¼þ¿âµÄ¸ÅÒª¡£
¡¡¡¡liboskit_posix£ºÔö¼Ó¶ÔÓÃPOSIX¹¹ÔìµÄϵͳͨ³£»áʵÏÖµÄϵͳµ÷ÓõÄÖ§³Ö¡£ÀýÈ磺open¡¢readºÍwriteµÈ¡£ÕâЩPOSIX²Ù×÷±»Ó³Éäµ½ÏàÓ¦µÄOSKitCOM½Ó¿ÚÉÏ¡£×îС»¯µÄC¿âºÍFreeBSDC¿â¶¼ÒÀÀµPOSIX¿âÀ´ÌṩËùÐèÒªµÄϵͳ¼¶²Ù×÷¡£
¡¡¡¡liboskit_freebsd_c£ºÔ´ÓÚFreeBSDµÄÍêÕûµÄÀàPOSIXC¿â£¬ÌṩÁ˶Ե¥Ï̺߳ͶàÏ̵߳ÄÖ§³Ö¡£ÔÚÐèÒªÖ§³ÖÀàPOSIXº¯Êý»òḬ̈߳²È«Ê±£¬Õâ¸ö¿â¿ÉÒÔÓÃÀ´Ìæ»»×îС»¯µÄC¿â¡£
¡¡¡¡liboskit_freebsd_m£ºÍêÕûµÄ±ê×¼Êýѧ¿â¡£¿ÉÒÔÌṩ¸¡µãÊýÖ§³Ö¡£
¡¡¡¡liboskit_fsnamespace£ºÎļþϵͳÃû×Ö¿Õ¼ä¿â£¬ÎªÓ¦ÓóÌÐòÌṩÁËÃüÃû½Ó¿Ú£¬¿ÉÒÔ½«¶àÖÖ²¿¼þµÄ¾ø¶ÔºÍÏà¶Ô·¾¶Ãûת»»³ÉΪoskit_fileºÍoskit_dirµÄCOM¶ÔÏó¡£
¡¡¡¡liboskit_rtld£ºÔËÐÐʱÁ´½Ó¡¢×°Èë¿â£¬ÔÊÐíELF¸ñʽµÄOSKitÄÚºË×°Èë¹²Ïí¿â¡£
¡¡¡¡liboskit_lmm£ºÒ»¸öÁé»îµÄ´æ´¢¹ÜÀí¿â£¬Ëü¿ÉÒÔ¹ÜÀíÎïÀíÄÚ´æ»òÐéÄâÄÚ´æ¡£
¡¡¡¡liboskit_amm£ºµØÖ·Ó³Éä¹ÜÀí¿â£¬ÓÃÓÚ¹ÜÀíϵͳ×ÊÔ´¡£
¡¡¡¡liboskit_svm£º¼òµ¥Ðé´æ¿â£¬ËüʹÓÃAMM¿â¶¨ÒåÁËÒ»¸ö¼òµ¥µÄÓÃÓÚµ¥¶ÀµØÖ·¿Õ¼äµÄÐé´æ½Ó¿Ú£¬ÌṩÄÚ´æ±£»¤ºÍΪ¿éÉ豸ÈçÒ»¸öÓ²ÅÌ·ÖÇø½øÐзÖÒ³¡£
¡¡¡¡liboskit_threads£ºÕâ¸ö¿âÌṩÁ˶àÏ̵߳ÄÄÚºËÖ§³Ö£¬°üÀ¨POSIXÏ̡߳¢Í¬²½¡¢µ÷¶ÈºÍÕ»±£»¤¡£
¡¡¡¡liboskit_diskpart£ºÒ»¸öÄܹ»Ê¶±ð¶àÖÖ³£¼ûµÄ´ÅÅÌ·ÖÇø·½°¸²¢Éú³ÉÒ»¸öÍêÕûÓ³ÉäµÄͨÓÿ⡣Õâ¸ö¿âÌṩÁËÒ»¸ö¼òµ¥µÄ·½·¨ÈòÙ×÷ϵͳ¿ÉÒÔÕÒµ½ËüËù"¸ÐÐËȤµÄ"´ÅÅÌ·ÖÇø¡£
¡¡¡¡liboskit_fsread£ºÒ»¸ö¼òµ¥Ö»¶ÁÎļþϵͳ½âÊͿ⣬Ëü¿ÉÓÃÓÚ²»Í¬µÄÎļþϵͳ£¬°üÀ¨BSDFFS¡¢Linuxext2fsºÍMINIXµÄÎļþϵͳ¡£Ëüͨ³£Óëliboskit_diskpartÒ»ÆðʹÓã¬Îª²Ù×÷ϵͳÌṩ´ÓÓ²ÅÌ»òÈíÅÌÉ϶ÁÈ¡³ÌÐòºÍÊý¾ÝµÄ¹¦ÄÜ¡£Õâ¸ö¿âÒ²¿ÉÓÃÓÚ¹¹Ôì×°Èë³ÌÐò¡£
¡¡¡¡liboskit_exec£ºÒ»¸öͨÓõĿÉÖ´ÐгÌÐò½âÊÍÆ÷ºÍ×°ÈëÆ÷£¬ËüÖ§³ÖÁ÷ÐеĿÉÖ´ÐгÌÐò¸ñʽ£¬Èça.outºÍELF¡£
¡¡¡¡liboskit_linux_fs£º¶ÔLinuxÄÚºË2.0.29°æµÄÎļþϵͳ²¿·Ö´úÂë½øÐаü×°¡£
¡¡¡¡liboskit_netbsd_fs£º¶ÔNetBSD1.2°æµÄÎļþϵͳ²¿·Ö´úÂë½øÐаü×°¡£
¡¡¡¡liboskit_memfs£ºÒ»¸ö¼òµ¥µÄ»ùÓÚÄÚ´æµÄÎļþϵͳ£¬¶ÔÍâÌṩÁ˱ê×¼µÄOSKitÎļþϵͳ½Ó¿Ú¡£
¡¡¡¡liboskit_freebsd_net£º¶ÔFreeBSD2.1.7.1°æÍøÂç´úÂëµÄ°ü×°¡£
¡¡¡¡liboskit_linux_dev£º¶ÔLinuxÄÚºË2.0.29°æµÄÉ豸Çý¶¯³ÌÐò½øÐаü×°¡£½«Æä°ü×°ÔÚOSKitµÄÉ豸Çý¶¯¼Ü¹¹ÖС£
¡¡¡¡liboskit_freebsd_dev£º¶ÔFreeBSD2.1.7.1°æµÄÉ豸Çý¶¯³ÌÐò½øÐаü×°¡£½«Æä°ü×°ÔÚOSKitµÄÉ豸Çý¶¯¼Ü¹¹ÖС£

1.3OSKITµÄÉè¼ÆÔ­Ôò
¡¡¡¡¾¡¹Üµ±Ç°OSKITµÄÄ¿±êƽ̨ÊÇX86Ìåϵ£¬µ«½«À´Ëü»á±»ÒÆÖ²µ½ÆäËüµÄÌåϵ£¬ÈçStrongArm¡£
¡¡¡¡OSKITµÄ½Ó¿Ú±»¾¡¿ÉÄܵØÉè¼Æ³É±ãÓÚÒÆÖ²¡£¾¡¹ÜºÜ´óÒ»²¿·ÖµÄOSKit´úÂëÊÇÓëÆ½Ì¨Ïà¹ØµÄ£¬µ«ËüºÜ¶àµÄ¹¦Äܽӿڶ¼ÊÇͨÓõ쬲¢ÇÒ¿ÉÒÔÔںܶàÆäËüµÄÌåϵ½á¹¹»òƽ̨ÉÏʹÓá£ÀýÈ磬OSKitµÄÉ豸Çý¶¯³ÌÐò½Ó¿ÚÊÇÍêÈ«¿ÉÒÔÒÆÖ²µÄ¡£
¡¡¡¡OSKITÔÚÿһ¸ö¿âÖмǼģ¿é¼äµÄÒÀÀµÐÅÏ¢¡£¶ÔÓÚº¯Êý¿â£¬ÕâÒâζ×ÅÒª±êÃ÷²»Í¬µÄº¯Êý¼äµÄÒÀÀµ¹ØÏµ£»¶ÔÓÚ²¿¼þ¿â£¬ÕâÒâζ×ÅÒª±êÃ÷ÿһ¸ö¿âÖв»Í¬²¿¼þ¼¯Ö®¼äµÄÒÀÀµ¹ØÏµ¡£

1.4OSKITµÄÅäÖÃ
¡¡¡¡OSKit×ñ´ÓGNUµÄÅäÖᢱàÒëºÍ°²×°Ï°¹ß£º¿ÉÒԲο¼Ô´´úÂë¸ùĿ¼ÖеÄINSTALLÎļþ£¬ÔÚ¸ÃÎļþÖÐÓÐʹÓÃGNUÅäÖÃÎļþµÄͨÓ÷½·¨¡£¼òµ¥µÄ˵£¬ÐèÒªÔËÐÐOSKit¸ùĿ¼ÖеÄÅäÖÃÎļþ£¬Õâ¸öÎļþ½«»á¹À¼Æ³öµ±Ç°ÏµÍ³µÄÀàÐÍÒÔ¼°¸÷ÖÖËùÐ蹤¾ß£¨ÈçC±àÒëÆ÷£©µÄλÖá£OSKit¿ÉÒÔÅäÖóÉÔÚËü×Ô¼ºµÄĿ¼ÖбàÒ룬ֻҪÔÚOSKitÔ´ÂëµÄ¸ùĿ¼ÖÐÓÃ./configureÃüÁî¾Í¿ÉÒÔÁË¡£»òÕß¿ÉÒÔ½«OSKit±àÒë²¢°²×°µ½Ò»¸öµ¥¶ÀµÄÄ¿±êĿ¼ÖУ¬Èç¹ûÐèÒªÕâÑù£¬Ö»ÒªÔÚÄǸöеÄĿ¼ÖÐÔËÐÐÅäÖÃÎļþ¾Í¿ÉÒÔÁË¡£ÀýÈ磬µ±Ô´Îļþ´æÔÚNFS·ÖÇøÉÏʱ£¬Ê¹ÓÃÒ»¸öµ¥¶ÀµÄÄ¿±êĿ¼£¬¿ÉÈÃÄã°ÑÄ¿±êÎļþ·ÅÔÚ±¾µØµÄÓ²ÅÌÉÏ¡£
¡¡¡¡´ËÍ⣬OSKitµÄÅäÖû¹¿ÉÒÔ±£Áô¶à·Ý£¨µ±È»ÊÇÔÚ²»Í¬µÄĿ¼ÖУ©£¬Ã¿Ò»Ì×ÅäÖÃÓÐ×Ô¼ºµÄÄ¿±êÎļþ£¬µ«¹²ÏíÒ»·Ý´úÂë¡£
¡¡¡¡µ±ÐèҪΪÁíÒ»ÖÖÌåϵ½á¹¹¶ÔOSKit½øÐн»²æ±àÒëʱ£¬ÐèÒªÖ¸¶¨ËÞÖ÷»ú£¨ÐèÒªÔËÐÐOSKitµÄ»úÆ÷£©µÄÀàÐͺͱàÒë»ú£¨±àÒëOSKitµÄ»úÆ÷£©µÄÀàÐÍ£¬Õâ¿ÉÒÔÓÃconfigureÖеÄ-build=machineºÍ-host=machineÑ¡ÏîÀ´ÊµÏÖ¡£ÓÉÓÚOSKitÊÇÒ»¸öµ¥¶ÀµÄÈí¼þ°ü£¬²¢ÇÒ²»Ê¹ÓÃÈκÎËü×Ô¼ºÒÔÍâµÄ°üº¬ÎļþºÍ¿âÎļþ£¬Òò´ËËÞÖ÷»úµÄ²Ù×÷ϵͳ²¿¼þÓëOSKitµÄÅäÖò¢Ã»ÓÐÖ±½ÓµÄ¹ØÁª¡£È»¶ø£¬ÔÚÅäÖýű¾ÔËÐÐʱ»áÐèÒªÒÔ¶ÔËÞÖ÷»úµÄÖ¸¶¨×÷Ϊһ¸öǰ׺À´Ñ°ÕÒ¸÷ÖÖ½»²æ±àÒ빤¾ß¡£ÀýÈ磬Èç¹ûÖ¸¶¨"-host=i486-linux"£¬ÅäÖýű¾»áȥѰÕÒÃûΪi486-inux-gcc¡¢i486-linux-arºÍi486-linux-ldµÈµÄ±àÒ빤¾ß¡£ÔÚÆäËü¹¤¾ßÖУ¬¾ßÌåʹÓÃÄÄÒ»¸ö¹¤¾ß£¬ÓÉÄ¿±êÎļþµÄ¸ñʽÀ´¾ö¶¨£¨Èçix86-linux-*¹¤¾ß¿ÉÒÔ½¨Á¢ELF¸ñʽ£¬¶øix86-mach-*¹¤¾ß½¨Á¢a.out¸ñʽ£©¡£
¡¡¡¡OSKitµÄÅäÖýű¾Ö§³ÖºÜ¶à»ù±¾µÄÑ¡ÏҪµÃµ½Ò»·ÝÍêÕûµÄÑ¡ÏîÁÐ±í£¬¿ÉÒÔÔËÐÐ./configure-help¡£³ýÁËÕâЩ»ù±¾µÄÃüÁîÖ®Í⣬ÅäÖýű¾»¹Ö§³ÖÏÂÃæµÄÕâЩOSKitÌØÓеÄÑ¡Ï
¡¡¡¡-enable-debug£ºÔÚ±àÒëʱʹÓÃÕâ¸öÑ¡Ï½«»á°Ñµ÷ÊÔÐÅÏ¢°üº¬½øÀ´£¬Õâ»áÓ°ÏìһЩÔËÐеÄÐÔÄÜ£¬µ«µ±´íÎóÓпÉÄÜ·¢Éúʱ£¬»áÌá¸ß¼ì²â´íÎóµÄËÙ¶È¡£
¡¡¡¡-enable-profiling£ºÉú³ÉÆÊÎö°æµÄOSKit¿â£¬ÎªÁËÓëϰ¹ßµÄ±ê×¼±£³ÖÒ»Ö£¬ÆÊÎö°æµÄ¿â½«»áÓÐ-p×÷Ϊºó׺¡£
¡¡¡¡-disable-asserts£º²»Ê¹ÓÃassert()µ÷ÓÃ
¡¡¡¡-enable-unixexamples£ºÉú³ÉÔÚUnixµÄÓû§Ì¬ÏÂÔËÐÐOSKitµÄһЩ²¿¼þµÄÖ§³Ö´úÂëºÍÀý×Ó³ÌÐò£¬Ä¿Ç°Ö§³ÖFreeBSDºÍLinux¡£
¡¡¡¡-enable-doc£ºÔÚ±àÒëʱÉú³ÉOSKitµÄÎĵµ¡£ÕâÑù×ö³ýÁËÒª»¨·ÑºÜ¶àʱ¼äÒÔÍ⣬»¹ÐèÒªLaTexºÍdvips¡£ÒѾ­Éú³ÉµÄ.psºÍ.html¸ñʽµÄÎĵµÔÚÔ´ÂëĿ¼ÖС£
¡¡¡¡ÔÚ¿ªÊ¼Êµ¼Ê±àÒëOSKit֮ǰ£¬¿ÉÒÔ×öÒÔϵÄһЩÊÂÇéºöÂÔÄÇЩ²»ÐèÒªµÄ²¿·Ö£¬Ê¹±àÒ빤×÷Íê³ÉµÄ¸ü¿ìһЩ£º
¡¡¡¡ÐÞ¸Ä<oskit/dev/linux_ethernet.h>£¬Ê¹ÆäÖ»°üÀ¨ÐèÒªµÄÐС£³ýÁË¿ÉÒÔÈñàÒëËٶȸü¿ìÒÔÍ⣬¶ÔÓÚijЩ²»¼æÈݵÄÓ²¼þ£¬Ò²ÐèÒªÕâÑù×ö£¬ÒÔ·ÀÖ¹ËÀ»ú¡£
¡¡¡¡ÐÞ¸Ä<oskit/dev/linux_scsi.h>£¬Ê¹ÆäÖ»°üÀ¨ÐèÒªµÄÇý¶¯³ÌÐò¡£
¡¡¡¡ÐÞ¸Ä<oskit/fs/linux_filesystem.h>£¬Ê¹ÆäÖ»°üº¬ÐèÒªµÄÎļþϵͳ¡£
¡¡¡¡ÐÞ¸ÄÔ´Âë¸ùĿ¼ÏµÄGNUmakefile£¬É趨SUBDIRS£¬Ê¹ÆäÖ»ÓÐÐèÒªµÄĿ¼¡£Ö»ÓÐÔÚ¶ÔOSKitÓÐÁËһЩʹÓþ­ÑéÖ®ºó²¢ÇÒÖªµÀÄãÐèÒªÄÄЩĿ¼ÒԺ󣬲ſÉÒÔÕâÑù×ö¡£Ö±½ÓÔÚGNUmakefile.inÖÐÖ¸¶¨subdirsÒ²¿ÉÒÔ´ïµ½ÕâÑùµÄÄ¿µÄ£¬ÄÇÑù×öµÄºÃ´¦ÊÇ·ÀÖ¹ÒÔºóÔٴνøÐÐÅäÖÃʱ¸²¸ÇÔø¾­×ö¹ýµÄÐ޸ġ£
¡¡¡¡É趨»·¾³±äÁ¿CFLAGSΪ-O1-pipe¡£Õâ»áÈñàÒëÆ÷ÔÚ±àÒëʱËù×öµÄÓÅ»¯¹¤×÷±È½ÏÉÙ£¬²¢ÇÒÔÚ±àÒëÆ÷²»°ÑÁÙʱÎļþдµ½ÄÚ´æÐéÄâµÄÎļþϵͳʱÌá¸ß±àÒëµÄËÙ¶È¡£

1.5 OSKITµÄ±àÒë
¡¡¡¡Ä¿Ç°£¬±àÒëOSKitÐèÒªÒÔÏµĹ¤¾ß£º
¡¡¡¡GNU make
¡¡¡¡GNU CC (gcc)2.95.2°æ¡£½Ïа汾µÄgccºÍegcsÓ¦µ±Ò²¿ÉÒÔʹÓ㬵«Ã»ÓвâÊÔ¹ý¡£
¡¡¡¡GNU binutils 2.8.x»ò2.9.1 with BFD2.9.1¡£
¡¡¡¡Òª±àÒëOSKit£¬¿ÉÒÔµ½Ô´ÂëµÄ¸ùĿ¼£¨»òÕßÊÇÓû§Ö¸¶¨µÄ¶ÀÁ¢µÄÄ¿±êĿ¼£©ÖÐÔËÐÐGNUmake£¨ÔÚLinuxϵͳÉÏÊÇmake£¬ÔÚBSDϵͳÉÏÊÇgmake£©¡£Çë×¢ÒâOSKitÐèÒªGNUmake£¬²»ÄÜÓÃÆäËüµÄmake¹¤¾ßÀ´´úÌæËü¡£ÎªÁË·ÀÖ¹»ìÏý£¬OSKitµÄmakefile¶¼ÃüÃûΪGNUmakefile£¬¶ø²»ÊÇMakefile£¬ÕâÑùµÄ»°£¬µ±Óû§´íÎóµØÔËÐÐÁËÆäËüµÄmake¹¤¾ßʱ£¬Ëü½«±¨¸æÕÒ²»µ½makefileµÄ´íÎ󣬶ø²»ÊÇһЩÆäËüµÄ´íÎó¡£
¡¡¡¡ÒªÏëÖ»±àÒë»òÖØÐ±àÒëOSKitµÄÒ»²¿·Ö´úÂ루ÀýÈçij¸ö¿â£©£¬Ö»Ðè½øÈë·ÅÖøò¿·ÖµÄÄ¿±êĿ¼£¬È»ºóÔÚ¸ÃĿ¼ÖÐÔËÐÐGNUmake¡£¸ùĿ¼ÖеÄGNUmakefileʵ¼ÊÉϲ»×öÈκÎÊÂÇ飬ֻÊÇÔÚÆäËü¸÷¸öĿ¼Öеݹéµ÷ÓÃmakeÃüÁһЩOSKitĿ¼µÄ±àÒëÐèÒªÆäËüµÄ²¿·ÖÊ×Ïȱ»±àÒ룬ÀýÈçºËÐĵÄÀý×ÓÔÚËüÃÇÐèÒªµÄOSKit¿â±»±àÒë֮ǰÊÇÎÞ·¨±àÒëµÄ¡£µ«OSKitµÄ´ó²¿·Ö¿â¶¼¿ÉÒÔÔÚÍêÈ«²»ÐèÒªÆäËü¿âµÄÇé¿öϱ»±àÒë¡£
¡¡¡¡µ±OSKit±àÒëºÃÒÔºó£¬Óû§¿ÉÒÔÓÃ"makeinstall"ÃüÁîÀ´°²×°Ëü¡£È±Ê¡µÄÇé¿öÏ£¬ÕâЩ¿â»á±»°²×°µ½/usr/local/libÖУ¬¶øÍ·Îļþ»á±»°²×°µ½/usr/local/includeÖУ¬³ý·ÇÓû§ÔÚÅäÖÃʱʹÓÃÁË-prefixÑ¡ÏîÀ´Ö¸¶¨Ä¿±êĿ¼¡£ËùÓеÄOSKitÍ·Îļþ¶¼°²×°ÔÚoskit/×ÓĿ¼ÖУ¨ÀýÈç/usr/local/include/oskit£©£¬ÕâʹËüÃDz»»áºÍÒѾ­´æÔÚµÄÈκÎÍ·Îļþ³åÍ»¡£¼´Ê¹ÊÇOSKit¿â±»°²×°ÔÚÖ÷¿âµÄĿ¼ÖУ¨Èç/usr/local/lib£©£¬ËùÓеÄOSKit¿âÎļþ¶¼ÓÐǰ׺oskit_£¬Õâ¿É±ÜÃâÓëÆäËü²»Ïà¹ØµÄ¿âÏà»ìÏý¡£ÀýÈ磬OSKitµÄ×îС»¯C¿âÃüÃûΪliboskit_c.a£¬¶ø²»ÊÇlibc.a£¬ÕâʹÓû§¿ÉÒÔÔÚͬÑùµÄĿ¼Öа²×°Ò»¸öʵ¼ÊµÄC¿â¡£
¡¡¡¡±ê×¼µÄmake±äÁ¿ÈçCFLAGSºÍLDFLAGS±»OSKitµÄBuild¹¤¾ßËùʹÓ㬵«ÊÇÔÚOSKitµÄmakefileÖÐûÓж¨Ò壬ËüÃÇ¿ÉÒÔÔÚÃüÁîÐÐÉϱ»Ê¹Óá£ÀýÈ磬Äã¿ÉÒÔÓÃÃüÁî"makeCFLAGS="-save-temps""À´Ê¹GCC°ÑËü±àÒë¹ý³ÌÖвúÉúµÄÖмäÎļþÁôÔÚÄ¿±êĿ¼ÖУ¨ÎÒÃÇÄÚ²¿¹æ¶¨£¬OSKitµÄmakefileÖеıäÁ¿¶¼ÒÔOSKIT_×÷Ϊǰ׺¡££©

1.6OSKITµÄʹÓÃ
¡¡¡¡ÒªÊ¹ÓÃOSKit£¬¿ÉÒÔÔÚ¿ª·¢ºËÐÄʱʹÓÃOSKitÌṩµÄ²¿¼þ¿â¡¢º¯Êý¿â£¬²¢ÔÚ±àÒëʱ½«ËùʹÓõĿâÁ´½Óµ½ºËÐÄÓ³ÏóÖС£ÔÚOSKitµÄexamplesĿ¼ÏÂÓÐÐí¶àµÄÀý×ÓºËÐÄ£¬¿ª·¢Õß¿ÉÒÔͨ¹ý²é¿´ÒÔ¼°ÔËÐÐÕâЩºËÐÄÀ´Ñ§Ï°OSKitÖи÷ÖÖ¿âºÍÓ³ÏóMakefielsµÄ±àд·½·¨¡£
¡¡¡¡OSKitÖеĿⶼ½øÐÐÁ˺ܺõÄÉè¼Æ£¬Óû§¿ÉÒÔ¸ù¾ÝÐèÒªÌæ»»ÆäÖеÄÈκÎÒ»¸ö¿â£¬ÓÉÓÚÔÚOSKitµÄÎĵµÖжÔÿ¸ö¿âÓëÆäËü¿âµÄÒÀÀµ¹ØÏµ½øÐÐÁËÏêϸµÄ˵Ã÷£¬Òò´ËÓû§¿ÉÒÔºÜÇáËɵÄÌæ»»µôij¸ö²¿¼þ£¬¶ø²»»á´øÀ´Âé·³¡£Êµ¼ÊÉÏ£¬ÔںܶàÇé¿öÏ£¬ÌرðÊÇÔÚijЩº¯Êý¿âÖУ¬ÎªÁËÓÐЧµÄʹÓÃOSKit£¬ÊDZØÐëÒªÌæ»»µôÆäÖеÄһЩº¯Êý»òÕß·ûºÅµÄ¡£ÒªÖØÔØÄ³¸ö¿âÖеĺ¯Êý»òÕß·ûºÅ£¬Ö»ÒªÔÚºËÐÄ»òÓ¦ÓóÌÐòÖÐÔÙ¶¨ÒåÒ»±é¾Í¿ÉÒÔÁË£¬Á´½Ó³ÌÐò»áÈ·±£È¥Ê¹ÓÃËù¶¨ÒåµÄº¯ÊýºÍ·ûºÅ¡£OSKITÉè¼ÆÕßÇ¿ÁÒ½¨ÒéʹÓÃÁ´½ÓµÄ·½·¨È¥Ìæ»»µôOSKitµÄij¸ö²¿¼þ£¬¶ø²»ÊÇÖ±½ÓÐÞ¸ÄOSKitµÄÔ´Â루³ýÁËÐÞ¸ÄÔ´ÂëÖеÄBug£©¡£±£³Ö×Ô¼ºµÄºËÐĺÍOSKit·Ö¿ª£¬»áʹÉý¼¶µ½Ð°汾µÄOSKit¸ü¼ÓÈÝÒס£
¡¡¡¡µ±Íê³ÉºËÐĵıàд¹¤×÷ºó£¬Ê¹ÓÃgccÖеģ­cÑ¡Ïî°ÑºËÐÄÔ´Âë±àÒë³ÉÒ»¸ö»ò¶à¸ö.oÎļþ£¬È»ºó´´½¨GnumakerulesÎļþ£¬°ÑдºÃµÄ.oÎļþÓëºËÐÄÖÐʹÓÃµÄÆäËü¿âÎļþ°´gccµÄ¹æ·¶Ð´ÈëÕâ¸öÎļþÖС£ÔËÐÐmake£¬ÕâЩÎļþ»á±»Á´½Ó³ÉÒ»¸öºËÐÄ¡£
¡¡¡¡Æô¶¯ºËÐÄÓм¸ÖÖ·½·¨£ºµ±OSKitÅäÖóÉÔÚLinux»òÆäËüµÄʹÓÃELF¿ÉÖ´ÐÐÎļþ½á¹¹µÄÖ÷»úÉÏʹÓÃʱ£¬¾Í¿ÉÒÔʹÓÃOSKITÌṩµÄmklinuximage½«ºËÐÄÖÆ×÷³ÉÒ»¸ö±ê×¼µÄ¿ÉÒÔ´ÓLILO»òÆäËüLinuxÒýµ¼³ÌÐòÒýµ¼µÄÄÚºËÓ³Ïó¡£µ±OSKitÅäÖóÉÔÚMach»òBSDϵͳÉϹ¤×÷ʱ£¬¾Í¿ÉÒÔʹÓÃOSKITÌṩµÄmkbsdimage½¨Á¢Ò»¸öa.out¸ñʽµÄÓ³Ïó£¬Õâ¸öÓ³Ïó¿ÉÒÔ´ÓÈκÎBSD»òMachµÄÒýµ¼³ÌÐòÒýµ¼¡£ÐèҪעÒâµÄÊÇmkbsdimageÐèÒªGNU ldÄܹ»Õý³£µÄ¹¤×÷£¬ÔÚBSDϵͳÉÏ£¬Í¨³£¶¼ÊDz»Ê¹ÓÃGNUµÄldµÄ£¬Óû§±ØÐëÒª×Ô¼ºÊÖ¶¯±àÒë²¢°²×°GNUµÄld¡£µ±Ä¿±ê»úÒÔDOSΪ»ù´¡£¨Èçi386-msdos»òi386-moss£©Ê±£¬¾ÍҪʹÓÃmkdosimage¡£ºÍmkbsdimageÒ»Ñù£¬mkdosimageÒ²ÐèÒªGNUµÄld£¬±ØÐëÒªÊ×ÏȰ²×°GNUµÄld£¬²¢ÇÒ½«ÆäÅäÖóÉΪ¿ÉÒÔ½»²æ±àÒëMS-DOSµÄÎļþ£¬È»ºómkdosimage²ÅÄÜÕý³£µÄ¹¤×÷¡£´ËÍ⣬OSKIT»¹ÌṩÁËmkmbimage½Å±¾£¬ÓëÆäËüµÄ½Å±¾²»Í¬£¬Ëü²»»á×öÈκεÄת»»£¬ËüÖ»ÊÇÔÊÐí½«ÄÚºËÓëÆäËüµÄÎļþºÏ³ÉÒ»¸öMultiBoot£¨ÓйØMultibootµÄÎÊÌ⣬Çë¼ûµÚÎåÕ£©Ó³Ïó£¬Õâ¸öÓ³Ïó¿ÉÒÔºÍMultiBootÒýµ¼³ÌÐò£¨ÈçGRUBºÍNetBoot£©Ò»ÆðʹÓá£Èç¹ûÔÚÄãµÄϵͳÉϰ²×°ÁËPerl£¬¾Í¿ÉÒÔÓÃÒ»¸öͬÑù¹¦ÄܵijÌÐòmkmb2À´´úÌæËü£¬Õâ¸ö³ÌÐò¹¤×÷µÄ¸ü¿ìһЩ¡£ËüµÄÓô¦ºÍmkmbimageÊÇÒ»ÑùµÄ¡£
¡¡¡¡µ±ÓÃOSKITÖÆ×÷µÄºËÐÄÆô¶¯Ê±¿ÉÒÔ¸½¼ÓÃüÁîÐвÎÊý£¬²»Í¬µÄÒýµ¼³ÌÐò¿ÉÒÔ½«ËüÃÇת»¯³É×Ô¼ºµÄÃüÁîÐиñʽ£¬OSKIT¶ÔÃüÁîÐвÎÊý¹æ¶¨Á˸ñʽ£º
¡¡¡¡progname[<boot-opts and env-vars> -]<args tomain>
¡¡¡¡×¢Ò⣬Èç¹ûûÓÐ"-"µÄ»°£¬ËùÓеIJÎÊý¶¼½«±»´«µÝ¸ømainº¯Êý¡£
¡¡¡¡È±Ê¡µÄOSKitMultibootÆô¶¯´úÂë»á°ÑÕâЩ×Ö·û´®×ª»»³ÉΪC·ç¸ñµÄargv/argc²ÎÊý£¬»·¾³±äÁ¿Êý×飬ºÍ¼Ç¼ÔÚÈ«¾Ö±äÁ¿oskit_bootargv/osit_bootargcÖÐµÄÆô¶¯²ÎÊý¡£
¡¡¡¡argv/argcºÍ»·¾³±äÁ¿Êý×é»á´«µÝ¸ømain³ÌÐò£¬ºóÕßͨ³£×÷Ϊһ¸öÃûΪenvpµÄµÚÈý²ÎÊý¡£oskit_bootargv/oskit_bootargcÖеÄÒýµ¼²ÎÊý»á±»È±Ê¡µÄOSKit¿ØÖÆÌ¨Æô¶¯´úÂë½âÊÍ£¬²¢ÇÒÏÂÃæµÄ±êÖ¾ÓÐ×ÅÌØÊâµÄÒâÒ壺
¡¡¡¡-h£ºÊ¹Óô®¿Ú×÷Ϊ¿ØÖÆÌ¨£¬²Î¿¼-f±êÖ¾¡£¾ßÌåʹÓõĴ®¿ÚÓÉlibkernÖеÄbase_console.cÖеıäÁ¿cons_com_portÀ´¿ØÖÆ¡£
¡¡¡¡-d£º¼¤»îͨ¹ý´®¿ÚʹÓÃGDB£¬¾ßÌåʹÓõĴ®¿ÚÓÉlibkernÖеÄbase_console.cÖеıäÁ¿cons_com_portÀ´¿ØÖÆ¡£Õâ¸ö´®¿Ú¿ÉÒÔ²»Í¬ÓÚ¿ØÖÆÌ¨µÄ´®¿Ú£¬Êµ¼ÊÉÏ×îºÃÊÇÕâÑù¡£
¡¡¡¡-p£º¼¤»îÆÊÎö¹¦ÄÜ¡£²Ù×÷ϵͳµÄÄں˱ØÐëÊDZàÒë³ÉΪ֧³ÖÆÊÎö¹¦Äܵġ£
¡¡¡¡-k£º´ò¿ªkillswitchÖ§³Ö£¬ÕâÔÊÐíÏòµÚ¶þ¸ö´®¿ÚÉÏ´«ËÍ×Ö·ûÒÔÖÐÖ¹Äں˵ÄÔËÐС£
¡¡¡¡-f£ºµ±Ê¹ÓÃÒ»¸ö´®ÐеĿØÖÆÌ¨Ê±£¬Ê¹Æä¹¤×÷ÔÚ115200µÄËÙÂʶø²»ÊÇȱʡµÄ9600¡£ÕâÊÇUtahµÄÀ©Õ¹¶ø²¢²»ÔÚBSDÖ®ÖС£
¡¡¡¡ÕâЩ²ÎÊý¶¼ÊÇÒÔBSDΪÖÐÐÄÖ¸¶¨µÄ£¬ÕâÊÇÒòΪÔÚÓÌËü´óѧOSKITµÄÉè¼ÆÕßͨ³£¶¼ÊÇÓÃFreeBSDµÄÒýµ¼³ÌÐòÒýµ¼Äںˡ£
¡¡¡¡´ËÍ⣬Èç¹ûʹÓÃÁËNetBootÒýµ¼³ÌÐò£¬ÔÚoskit_bootargvÖл¹»áÓÐÁíÒ»¸ö²ÎÊý£º
¡¡¡¡-retaddraddress
¡¡¡¡Õâ¸ö²ÎÊýÖ¸¶¨Ò»¸öOSKit¿ÉÒÔÌøµ½²¢ÇÒ½«¿ØÖÆÈ¨»¹¸øNetBootµÄÎïÀíÄÚ´æµØÖ·¡£LibkernÖеÄbas_console.cÖеÄȱʡµÄ_exitº¯ÊýÔÚÍ˳öʱʹÓÃÕâ¸öÖµ¡£

1.7OSKitµÄÖ´Ðл·¾³
¡¡¡¡OSkitÖеÄÐí¶à²¿¼þÔÚºËÐĺÍÓû§·½Ê½Ï¶¼¿ÉÒÔʹÓã¬Õâ¾ÍÐèÒª¶Ô²¿¼þµÄÖ´Ðл·¾³×÷³ö¶¨Ò壬ÀýÈ粿¼þʲôʱºò¿ÉÒÔǶÌ×½øÈëµÈ¡£´ËÍ⣬OSKITʹÓÃÁËÐí¶àÆäËü²Ù×÷ϵͳµÄ´úÂ룬ÀýÈçÉ豸Çý¶¯³ÌÐòºÍÍøÂçЭÒéÕ»£¬¶¼ÊÇÔ­·â²»¶¯µÄ´ÓÔ­ÓеĺËÐÄÈçBSDºÍLinuxÖнèÓÃÀ´µÄ£¬OSKITͨ¹ý¸½¼Ó´úÂëÄ£ÄâԭʼִÐл·¾³Ê¹µÃÕâЩִÐÐÄ£¿é±ÈËüÃÇԭʼִÐл·¾³¸ü¼òµ¥£¬Óû§Ò²²»ÐèÒªÏêϸÁ˽âÔ­Ö´Ðл·¾³µÄϸ½Ú¡£ÏÂÃæ¶ÔOSKITµÄÿÖÖÖ´ÐÐÄ£¿é½øÐмòµ¥µÄ½éÉÜ¡£
¡¡¡¡´¿Ö´ÐÐÄ£¿é¡£ÕâÊÇOSKITÖ´Ðл·¾³ÖÐ×î¼òµ¥µÄÄ£¿é¡£ÕâЩ²¿¼þ»òº¯ÊýÖÐûÓÐÈ«¾Ö±äÁ¿»ò¾²Ì¬±äÁ¿£¬Ö»Ê¹Óúʹ¦ÀíÄ¿±ê»·¾³´«µÝµÄÊý¾Ý¡£ÀýÈ纯Êýstrlen£¬Ëüֻͨ¹ýÄ¿±ê»·¾³´«µÝ¸øËüµÄ×Ö·û´®Ö¸ÕëÇó³ö×Ö·û´®µÄ³¤¶È£¬²¢½«Æä·µ»Ø£¬ËüÖ»½Ó´¥²ÎÊýÊý¾ÝÓò¶ø²»Ó°ÏìÄ¿±ê»·¾³¡£µ±ÕâЩº¯ÊýʹÓõÄÊý¾Ý¼¯ÊÇ·ÖÀëµÄ£¬ËüÃÇ¿ÉÒÔ°²È«µØÍ¬Ê±±»µ÷Ó㬶ø²»ÐèҪͬ²½£¬·´Ö®Ôò²»ÐС£ÀýÈç¶ÔÖØµþµÄÄ¿±ê»º³åÇø²¢·¢Ê¹ÓÃmemcpyµ÷ÓÃÊDz»°²È«µÄ¡£
¡¡¡¡·Ç´¿Ö´ÐÐÄ£¿é¡£ÕâЩģ¿éÖÐʹÓÃÁËÈ«¾Ö±äÁ¿»òÓпÉÄܸıäÈ«¾Ö¹²Ïí״̬£¬ÀýÈçliboskit_kern£¨ºËÐÄÖ§³Ö¿â£©ÖеÄÐí¶àº¯Êý½¨Á¢ºÍ·ÃÎÊÈ«¾Ö´¦ÀíÆ÷¼Ä´æÆ÷ºÍÊý¾Ý½á¹¹£¬Òò´ËËüÃÇÊÇ·Ç´¿Ö´ÐÐÄ£¿é¡£·Ç´¿Ö´ÐÐÄ£¿éÓÐÒÔÏÂÌØµã£º
¡¡¡¡*·Ç´¿º¯ÊýºÍ²¿¼þ¿ÉÄÜÒÀÀµÓÚÈ«¾Ö״̬£¬ÈçÈ«¾Ö±äÁ¿¡¢¾²Ì¬±äÁ¿¡¢´¦ÀíÆ÷ÖÐÌØÊâ¼Ä´æÆ÷µÈ¡£
¡¡¡¡*³ý·ÇÓÐÃ÷È·µÄÉùÃ÷£¬·Ç´¿º¯ÊýºÍ²¿¼þÊDz»¿ÉÖØÈëµÄ£¬²¢ÇÒÔËÓÃÔÚ¶àÏß³ÌϵͳÖÐÒ²ÊDz»°²È«µÄ¡£ÎªÁËÔÚÒ»¸ö¶àÏß³Ì/¶à´¦ÀíÆ÷»·¾³ÖÐʹÓÃÕâЩº¯ÊýºÍ²¿¼þ£¬Ä¿±ê²Ù×÷ϵͳ±ØÐëÌṩÊʵ±µÄͬ²½´úÂë¡£
¡¡¡¡×èÈûÄ£¿é¡£ËüÀ©Õ¹ÁË·Ç´¿Ä£¿éÒÔÖ§³Ö·ÇÇÀÕ¼µÄ¶àỊ̈߳¬ÕâЩģ¿éÖÐÓÐÒ»Àà¿ÉÖØÈëµÄº¯Êý³ÆÎª×èÈûº¯Êý£¬ÔÚÕâÄ£¿éÖУ¬³ý·ÇÃ÷È·ÉùÃ÷Ϊ·Ç×èÈûº¯Êý£¬·ñÔòº¯ÊýÊÇ×èÈûµÄ¡£ÎªÁËÔÚÒ»¸ö¿ÉÇÀÕ¼µÄ¡¢¿ÉÖжϵĻòÕß¶à´¦ÀíÆ÷µÄ»·¾³ÖÐʹÓÃ×èÈûÄ£¿é£¬±ØÐëÔÚ½øÈëÄ£¿éǰ¼ÓËø£¬ÔÚÍ˳öÄ£¿éʱ½«ËøÊÍ·Å¡£
¡¡¡¡¿ÉÖжÏ×èÈûÄ£¿é¡£ÔÚËüÖ®ÖÐÿ¸ö²¿¼þ¶¼ÊÇÒ»¸öµ¥Ï̵߳ÄÖ´ÐÐÓò£¬ÔÚÒ»¸ö¸ø¶¨µÄʱ¿Ì£¬Ö»ÓÐÒ»¸ö£¨ÐéÄâµÄ»òÕßÎïÀíµÄ£©CPU¿ÉÒÔÖ´Ðв¿¼þÖеĴúÂë¡£ÀýÈ磺ÔÚÒ»¸ö¶à´¦ÀíÆ÷ϵͳÖУ¬ÔÚ½ø³Ì¼¶£¬ÈÎÒâʱ¿ÌÔÚÒ»¸ö²¿¼þ¼¯ÄÚÖ»ÓÐÒ»¸öCPU±»ÔÊÐíÖ´ÐУ»ÕâÄܹ»Í¨¹ýÔÚ²¿¼þǰºó·ÅÖÃÈ«¾ÖËøÀ´ÊµÏÖ¡£
¡¡¡¡´ËÍ⣬OSKitµÄÖ´Ðл·¾³»¹ÓÐÒÔÏÂÌØµã£º
¡¡¡¡ÔÚÒ»¶Îʱ¼äÄÚ£¬²¿¼þÖпÉÒÔ´æÔÚ¶à¸ö»î¶¯½ø³Ì£¬µ«ÔÚijʱ¿ÌÖ»ÓÐÒ»¸ö½ø³Ì±»Ö´ÐС£
¡¡¡¡Ä¿±ê²Ù×÷ϵͳ¸øÃ¿¸ö»î¶¯½ø³ÌÌṩһ¸ö¶ÀÁ¢¶ÑÕ»£¬Õâ¸ö¶ÑÕ»ÔÚ×èÈûº¯ÊýÔËÐÐʱ±»±£Áô¡£Ö»ÓÐÔÚ²Ù×÷Íê³Éºó£¬¶Ô²¿¼þµÄµ÷Ó÷µ»ØÊ±²Å·ÅÆú¸Ã¶ÑÕ»¡£
¡¡¡¡²¿¼þÖеĴúÂë×ÜÊÇÔËÐÐÔÚÁ½¸ö¼¶±ðÖÐÖ®Ò»£¬½ø³Ì¼¶»òÖжϼ¶¡£ÓÐÒâ˼µÄÊÇһЩ²¿¼þµÄº¯ÊýºÍ·½·¨Ö»ÄÜÔÚ½ø³Ì¼¶±»µ÷Ó㬶øÁíһЩֻÄÜÔÚÖжϼ¶±»µ÷Ó㬻¹ÓеÄÄÜÔÚÈκμ¶±ð±»µ÷Óᣵ÷ÓõÄϸ½ÚÊôÓÚ½Ó¿ÚÃèÊöµÄÒ»²¿·Ö¡£
¡¡¡¡²¿¼þÖÐÎÞÂÛ½ø³Ì¼¶»òÖжϼ¶µÄ²Ù×÷¶¼Äܱ»²¿¼þÖеÄÖжϴ¦Àí³ÌÐòÖжϣ¬³ý·Ç´úÂëµ÷ÓÃosenv_intr_disableÆÁ±ÎÁËÖжϡ£
¡¡¡¡µ±²¿¼þÔÚ½ø³Ì¼¶ÔËÐÐʱ£¬OSKIT¼Ù¶¨ÖжϿª·Å£¬²¿¼þÔÚ´¦Àí¹ý³ÌÖпÉÄÜÁÙʱÆÁ±ÎµôÖжϣ¬µ«±ØÐëÔÚ·µ»Øµ½Ä¿±ê²Ù×÷ÏµÍ³Ç°ÖØÐ¼¤»î¡£Í¬Ñù£¬µ±²¿¼þÔÚÖжϼ¶ÔËÐÐʱ£¬OSKIT¼Ù¶¨Öжϱ»ÆÁ±Î£¬µ«ÊDz¿¼þ¿ÉÒÔÔÚÄ¿±ê²Ù×÷ϵͳÔÊÐíÆäËüÖжϼ¶±ðµÄ»î¶¯Öжϸò¿¼þÊ±ÖØÐ¼¤»îÖжϡ£
¡¡¡¡µ±Ä¿±ê²Ù×÷ϵͳÔÚÒ»¸ö²¿¼þÄÚÖжÏÒ»¸ö½ø³Ì¼¶µÄ»î¶¯Ê±£¬ÔÚ¼ÌÐøÕâ¸ö»î¶¯Ç°£¬²Ù×÷ϵͳ±ØÐëÖ´ÐÐÍêÕâ¸öÖжϼ¶±ðµÄ»î¶¯¡£Í¬Àí£¬ÈôÒ»¸öÖжϼ¶µÄ»î¶¯±»Öжϣ¬ÄÇô×î½üµÄÖжϼ¶±ðµÄ»î¶¯±ØÐëÔÚ¼ÌÐøÇ°Ò»¸öÖжϼ¶±ðµÄ»î¶¯Ö®Ç°Íê³É¡£
¡¡¡¡²¿¼þÖÐÔËÐÐÔÚÖжϼ¶±ðµÄ´úÂë²»Äܵ÷ÓÃÄ¿±ê²Ù×÷ϵͳÌṩµÄ×èÈû»Øµ÷º¯Êý£»Ö»ÓзÇ×èÈûµÄ»Øµ÷º¯ÊýÄܹ»ÔÚÖжϼ¶±ð±»µ÷Óá£


[Ŀ¼]


µÚ¶þÕ COM¹æ·¶½éÉÜ

¡¶OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚ¶þÕ¡·


OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚ¶þÕÂ2000Äê12ÔÂ3ÈÕ21:33


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥


µÚ¶þÕ COM¹æ·¶½éÉÜ

OSKit×÷ΪһÌ׿ª·¢²Ù×÷ϵͳµÄ¹¤¾ß£¬Æä×î´óµÄÌØÉ«ÊÇÔÚ²Ù×÷ϵͳµÄÕûÌåÉè¼ÆÖвÉÓÃÁËCOMµÄ˼Ï룬½«²Ù×÷ϵͳÖи÷¸ö²»Í¬¹¦ÄܵIJ¿·ÖÉè¼Æ³É¶ÀÁ¢µÄCOMÄ£¿é£¬Ê¹µÃ²Ù×÷ϵͳµÄ¿ª·¢ÕßÄܷܺ½±ãµØ°´ÕÕCOMµÄ¹æ·¶¿ª·¢³ö·ûºÏ×Ô¼ºÐèÒªµÄ¹¦ÄÜÄ£¿é£¬½«OSKITÖеÄÏàӦģ¿éÌæ»»£¬µ«È´ÄܼÌÐøÊ¹ÓÃOSKITÖÐµÄÆäËüÄ£¿é¡£¶øÇÒ¶Ôÿ¸öCOMÄ£¿éÄÚ²¿µÄ½Ó¿ÚÒ²¿ÉÒÔ½øÐиÄд£¬Ìí¼ÓÆäδʵÏֵŦÄÜ£¬É¾³ý²»±ØÒªµÄ¹¦ÄÜ£¬×îÖÕʵÏÖÕæÕýÂú×ã×Ô¼ºÒªÇóµÄ²Ù×÷ϵͳ¡£ÕâЩOSKITÌØÐÔµÄʵÏÖÎÞÒ»²»ÊÇÓÐÀµÓÚCOMµÄ»úÖÆ¡£Òò´Ë£¬±¾Õ¶ÔCOMÖеĻù±¾¸ÅÄîºÍCOM¹æ·¶½øÐмòµ¥µÄ½éÉÜ¡£

2.1 COMµÄ»ù±¾¸ÅÄî

ÓÉÓÚCOMÊÇÓÉ×é¼þ¼¼Êõ·¢Õ¹¶øÀ´£¬Òò´ËÔÚ½éÉÜCOM»úÖÆÖ®Ç°ÓбØÒªÏȶÔ×é¼þ½øÐбØÒªµÄ˵Ã÷£¬È»ºóÔÙ¶ÔCOMµÄ»ù±¾¸ÅÄî½øÐÐ˵Ã÷¡£

2.1.1 ×é¼þ¼¼Êõ

ÔÚ¼ÆËã»úÈí¼þ·¢Õ¹µÄÔçÆÚ£¬Ò»¸öÓ¦ÓÃϵͳÍùÍùÊÇÒ»¸öµ¥¶ÀµÄÓ¦ÓóÌÐò¡£Ó¦ÓÃÔ½¸´ÔÓ£¬³ÌÐò¾ÍÔ½ÅÓ´ó£¬ÏµÍ³¿ª·¢µÄÄѶÈÒ²¾ÍÔ½´ó¡£¶øÇÒ£¬Ò»µ©ÏµÍ³µÄij¸ö°æ±¾Íê³Éºó£¬ÔÚϸö°æ±¾³öÀ´Ö®Ç°£¬Ó¦ÓóÌÐò²»»áÔÙÓÐËù¸Ä±ä¡£¶ø¶ÔÓÚÅÓ´óµÄ³ÌÐòÀ´½²£¬¸üа汾µÄÖÜÆÚºÜ³¤£¬ÔÚÁ½¸ö°æ±¾Ö®¼ä£¬Èç¹ûÓÉÓÚ²Ù×÷ϵͳ·¢ÉúÁ˱仯£¬»òÕßÓ²¼þƽ̨ÓÐÁ˱仯£¬ÔòÓ¦ÓÃϵͳ¾ÍºÜÄÑÊÊÓ¦ÕâÖֱ仯¡£ËùÒÔÕâÀ൥ÌåÓ¦ÓóÌÐòÒѾ­²»ÄÜÂú×ã¼ÆËã»úÈíÓ²¼þµÄ·¢Õ¹ÐèÒª¡£

´ÓÈí¼þÄ£ÐͽǶÈÀ´¿¼ÂÇ£¬Ò»¸öºÜ×ÔÈ»µÄÏë·¨¾ÍÊǰÑÒ»¸öÅÓ´óµÄÓ¦ÓóÌÐò·Ö³É¶à¸öÄ£¿é£¬Ã¿¸öÄ£¿é±£³ÖÒ»¶¨µÄ¹¦ÄܶÀÁ¢ÐÔ£¬ÔÚЭͬ¹¤×÷ʱ£¬Í¨¹ýÏ໥֮¼äµÄ½Ó¿ÚÍê³Éʵ¼ÊµÄÈÎÎñ¡£ÎÒÃǰÑÿһ¸öÕâÑùµÄÄ£¿é³ÆÎª×é¼þ£¬Ò»¸öÉè¼ÆÁ¼ºÃµÄÓ¦ÓÃϵͳÍùÍù±»ÇзֳÉһЩ×é¼þ£¬ÕâЩ×é¼þ¿ÉÒÔµ¥¶À¿ª·¢£¬µ¥¶À±àÒ룬ÉõÖÁµ¥¶Àµ÷ÊԺͲâÊÔ¡£µ±ËùÓеÄ×é¼þ¿ª·¢Íê³Éºó£¬°ÑËüÃÇ×éºÏÔÚÒ»Æð¾ÍµÃµ½ÁËÍêÕûµÄÓ¦ÓÃϵͳ¡£µ±ÏµÍ³µÄÈíÓ²¼þ»·¾³·¢Éú±ä»¯»òÕßÓû§µÄÐèÇóÓÐËù¸ü¸Äʱ£¬²¢²»ÐèÒª¶ÔËùÓеÄ×é¼þ½øÐÐÐ޸쬶øÖ»Ðè¶ÔÊÜÓ°ÏìµÄ×é¼þ½øÐÐÐ޸ģ¬È»ºóÖØÐÂ×éºÏµÃµ½ÐµÄÉý¼¶Èí¼þ¡£ÕâÖÖ×é¼þ»¯³ÌÐòÉè¼Æ¼¼Êõ£¬²»Í¬ÓÚ´«Í³µÄ½á¹¹»¯³ÌÐòÉè¼Æ¼¼Êõ£¬Ò²²»Í¬ÓÚÏÖÔÚ±»¹ã·º²ÉÓõÄÃæÏò¶ÔÏó³ÌÐòÉè¼Æ¼¼Êõ¡£¿ÉÒÔ˵£¬×é¼þ»¯³ÌÐòÉè¼ÆÎ»ÓÚÕâÁ½ÕßÖ®ÉÏ£¬Ëü¸ü×¢ÖØÓÚϵͳµÄÈ«¾Ö£¬ÒªÇó´ÓϵͳµÄÈ«·½Î»½øÐп¼²ì¡£

2.1.2 ʲôÊÇCOM

COM£¬¼´×é¼þ¶ÔÏóÄ£ÐÍ£¬ÊÇÒ»ÖÖÒÔ×é¼þΪ·¢²¼µ¥ÔªµÄ¶ÔÏóÄ£ÐÍ£¬ÕâÖÖÄ£ÐÍʹ¸÷Èí¼þ×é¼þ¿ÉÒÔÓÃÒ»ÖÖͳһµÄ·½Ê½½øÐн»»¥¡£COM¼ÈÌṩÁË×é¼þÖ®¼ä½øÐн»»¥µÄ¹æ·¶£¬Ò²ÌṩÁËʵÏÖ½»»¥µÄ»·¾³£¬ÒòΪ×é¼þ¶ÔÏóÖ®¼ä½»»¥µÄ¹æ·¶²»ÒÀÀµÓÚÈκÎÌØ¶¨µÄÓïÑÔ£¬ËùÒÔCOMÒ²¿ÉÒÔÊDz»Í¬ÓïÑÔЭ×÷¿ª·¢µÄÒ»ÖÖ±ê×¼¡£COM²»½ö½öÌṩÁË×é¼þÖ®¼äµÄ½Ó¿Ú±ê×¼£¬Ëü»¹ÒýÈëÁËÃæÏò¶ÔÏóµÄ˼Ïë¡£ÔÚCOM¹æ·¶ÖÐ,°Ñ¶ÔÏó³ÆÎªCOM¶ÔÏó¡£×é¼þÄ£ÐÍΪCOM¶ÔÏóÌṩÁ˻µÄ¿Õ¼ä£¬COM¶ÔÏóÒԽӿڵķ½Ê½Ìṩ·þÎñ£¬ÏÂͼ±íÃ÷ÁËCOM×é¼þ¡¢COM¶ÔÏóºÍCOM½Ó¿ÚÈýÕßÖ®¼äµÄ¹ØÏµ¡£

Ò»¸ö×é¼þ³ÌÐò¿ÉÒÔ°üº¬¶à¸öCOM¶ÔÏ󣬶øÇÒÿ¸öCOM¶ÔÏó¿ÉÒÔʵÏÖ¶à¸ö½Ó¿Ú¡£µ±ÁíÍâµÄ×é¼þ»òÆÕͨ³ÌÐò£¨¼´×é¼þµÄ¿Í»§³ÌÐò£©µ÷ÓÃ×é¼þµÄ¹¦ÄÜʱ£¬ËüÊ×ÏÈ´´½¨Ò»¸öCOM¶ÔÏó»òÕßͨ¹ý¸Ã¶ÔÏóËùʵÏÖµÄCOM½Ó¿Úµ÷ÓÃËüËùÌṩµÄ·þÎñ¡£µ±ËùÓеķþÎñ½áÊøºó£¬Èç¹û¿Í»§³ÌÐò²»ÔÙÐèÒª¸ÃCOM¶ÔÏó£¬ÄÇôӦ¸ÃÊͷŵô¶ÔÏóËùÕ¼ÓеÄ×ÊÔ´£¬°üÀ¨¶ÔÏó×ÔÉí¡£

2.1.3 COM½á¹¹

Ç°ÃæÒѾ­Ìáµ½¹ý£¬COMΪ×é¼þºÍÓ¦ÓóÌÐòÖ®¼ä½øÐÐͨÐÅÌṩÁËͳһµÄ±ê×¼£¬ËüΪ×é¼þ³ÌÐòÌṩÁËÒ»¸öÃæÏò¶ÔÏóµÄ»î¶¯»·¾³¡£

COM±ê×¼°üÀ¨¹æ·¶ºÍʵÏÖÁ½´ó²¿·Ö£¬¹æ·¶²¿·Ö¶¨ÒåÁË×é¼þºÍ×é¼þÖ®¼äͨÐŵĻúÖÆ£¬ÕâЩ¹æ·¶²»ÒÀÀµÓÚÈκÎÌØ¶¨µÄÓïÑԺͲÙ×÷ϵͳ£¬Ö»Òª°´Õոù淶£¬ÈκÎÓïÑÔ¶¼¿ÉÒÔʹÓá£ÔÚÕâÀïÖ÷ÒªÌÖÂÛCOM¹æ·¶£¬ÖÁÓÚÆäÔÚOSKITÖеÄʵÏÖ£¬ÔÚºóÃæµÄÕ½ÚÖÐÌÖÂÛ¡£

COMÖ÷ÒªÊÇÓɶÔÏóºÍ½Ó¿ÚÁ½²¿·Ö×é³É¡£¶ÔÏóÊÇij¸öÀà(class)µÄÒ»¸öʵÀý£»¶øÀàÔòÊÇÒ»×éÏà¹ØµÄÊý¾ÝºÍ¹¦ÄÜ×éºÏÔÚÒ»ÆðµÄÒ»¸ö¶¨Ò塣ʹÓöÔÏóµÄÓ¦Ó㨻òÁíÒ»¸ö¶ÔÏ󣩳ÆÎª¿Í»§£¬ÓÐʱҲ³ÆÎª¶ÔÏóµÄ¿Í»§¡£½Ó¿ÚÊÇÒ»×éÂß¼­ÉÏÏà¹ØµÄº¯Êý¼¯ºÏ£¬Æäº¯Êý³ÆÎª½Ó¿Ú³ÉÔ±º¯Êý¡£°´ÕÕϰ¹ß£¬½Ó¿ÚÃû³£ÒÔ"I"Ϊǰ׺£¬ÀýÈç"IUNKNOWN".¶ÔÏóͨ¹ý½Ó¿ÚºÍ³ÉÔ±º¯ÊýΪ¿Í»§Ìṩ¸÷ÖÖÐÎʽµÄ·þÎñ¡£

2.1.4¿Í»§/·þÎñÆ÷Ä£ÐÍ

¿ÉÒÔºÜÈÝÒ׿´³ö£¬¶ÔÏóºÍ¿Í»§Ö®¼äµÄÏ໥×÷ÓÃÊǽ¨Á¢ÔÚ¿Í»§/·þÎñÆÚÄ£ÐÍ»ù´¡Éϵģ¬¿Í»§/·þÎñÆ÷Ä£Ð͵ÄÒ»¸öºÜ´óµÄÓŵãÊÇÎȶ¨ÐԺ㬶øÎȶ¨ÐÔÕýÊÇCOMÄ£Ð͵ÄÄ¿±ê£¬ÓÈÆä¶ÔÓÚ¿ç½ø³ÌµÄ³ÌÐòͨÐÅ£¬Îȶ¨ÐÔ¸ü»á´øÀ´ÐÔÄÜÉϵĸ߿ɿ¿ÐÔ¡£

¿Í»§/·þÎñÆ÷Ä£ÐÍÊÇÒ»ÖÖ·¢Õ¹±È½Ï³É¹¦µÄÈí¼þÄ£ÐÍ£¬ÒòΪÕâÖÖÄ£ÐÍÓÐÒÔÏÂһЩÓÅÊÆ£º

Îȶ¨ÐԺᢿɿ¿ÐԸߡ£¿Í»§/·þÎñÆ÷Ä£Ðͼò»¯ÁËÓ¦Ó㬰ÑÈÎÎñ½øÐзÖÀ룬¿Í»§ºÍ·þÎñÆ÷¸÷˾ÆäÖ°£¬¹²Í¬Íê³ÉÈÎÎñ¡£

Èí¼þµÄ¿ÉÀ©Õ¹ÐԺá£Ò»¸ö·þÎñÆ÷½ø³Ì¿ÉÒÔΪ¶à¸ö¿Í»§Ìṩ·þÎñ£¬¿Í»§Ò²¿ÉÒÔÁ¬½Óµ½²»Í¬µÄ·þÎñÆ÷ÉÏ£¬ÕâÖÖÄ£Ð͵ÄÁ¬½Ó·Ç³£Áé»î¡£

¿ÉÒÔºÜÈÝÒ׿´³ö£¬¶ÔÏóºÍ¿Í»§Ö®¼äµÄÏ໥×÷ÓÃÊǽ¨Á¢ÔÚ¿Í»§/·þÎñÆ÷Ä£Ð͵Ļù´¡Éϵģ¬¿Í»§/·þÎñÆ÷Ä£Ð͵ÄÒ»¸öºÜ´óÓŵãÊÇÎȶ¨ÐԺ㬶øÎȶ¨ÐÔÕýÊÇCOMÄ£Ð͵ÄÄ¿±ê£¬ÓÈÆä¶ÔÓÚ¿ç½ø³ÌµÄ³ÌÐòͨÐÅ£¬Îȶ¨ÐÔ¸ü»á´øÀ´ÐÔÄÜÉϵĸ߿ɿ¿ÐÔ¡£

È»¶ø£¬COM²»½ö½öÊÇÒ»ÖÖ¼òµ¥µÄ¿Í»§/·þÎñÆ÷Ä£ÐÍ£¬ÓÐʱ¿Í»§Ò²¿ÉÒÔ·´¹ýÀ´Ìṩ·þÎñ£¬»òÕß·þÎñ·½±¾ÉíÒ²ÐèÒªÆäËû¶ÔÏóµÄһЩ¹¦ÄÜ£¬ÔÚÕâЩÇé¿öÏ£¬Ò»¸ö¶ÔÏó¿ÉÄܼÈÊÇ·þÎñÆ÷Ò²Êǿͻ§¡£COMÄܹ»ÓÐЧµØ´¦ÀíÕâÖÖÇé¿ö¡£

2.2 COM¶ÔÏó

ÔÚCOM¹æ·¶ÖУ¬²¢Ã»ÓжÔCOM¶ÔÏó½øÐÐÑϸñµÄ¶¨Ò壬µ«COMÌṩµÄÊÇÃæÏò¶ÔÏóµÄ×é¼þÄ£ÐÍ£¬COM×é¼þÌṩ¸ø¿Í»§µÄÊÇÒÔ¶ÔÏóÐÎʽ·â×°ÆðÀ´µÄʵÌå¡£¿Í»§³ÌÐòÓëCOM×é¼þ³ÌÐò½øÐн»»¥µÄʵÌåÊÇCOM¶ÔÏó£¬Ëü²¢²»¹ØÐÄ×é¼þÄ£¿éµÄÃû³ÆºÍλÖ㨼´Î»ÖÃ͸Ã÷ÐÔ£©£¬µ«Ëü±ØÐëÖªµÀ×Ô¼ºÔÚÓëÄǸöCOM¶ÔÏó½øÐн»»¥¡£

ÀàËÆÓÚC++ÓïÑÔÖÐÀࣨclass)µÄ¸ÅÄCOM¶ÔÏóÒ²°üÀ¨ÊôÐÔ£¨Ò²°üÀ¨×´Ì¬£©ºÍ·½·¨£¨Ò²³ÆÎª²Ù×÷£©£¬¶ÔÏóµÄ״̬·´Ó³Á˶ÔÏóµÄ´æÔÚ£¬Ò²ÊÇÇø±ðÓÚÆäËû¶ÔÏóµÄÒªËØ£»¶ø¶ÔÏóËùÌṩµÄ·½·¨¾ÍÊǶÔÏóÌṩ¸øÍâ½çµÄ½Ó¿Ú£¬¿Í»§±ØÐëͨ¹ý½Ó¿Ú²ÅÄÜ»ñµÃ¶ÔÏóµÄ·þÎñ¡£¶ÔÓÚCOM¶ÔÏóÀ´Ëµ£¬½Ó¿ÚÊÇËüÓëÍâ½ç½»»¥µÄΨһ;¾¶£¬Òò´Ë£¬·â×°ÌØÐÔÊÇCOM¶ÔÏóµÄ»ù±¾ÌØÕ÷¡£

COM¶ÔÏó¿ÉÒÔÓɶàÖÖÓïÑÔÀ´ÊµÏÖ£¬ÀýÈçC++,JAVA,C(ÕýÈçÔÚOSKITÖÐ)¡£Èç¹ûÓÃC++À´ÊµÏÖCOM¶ÔÏó£¬ÔòºÜ×ÔÈ»¿ÉÒÔÓÃÀࣨclass)À´¶¨ÒåCOM¶ÔÏó£¬ÀàµÄÿ¸öʵÀý´ú±íÒ»¸öCOM¶ÔÏó£¬ÀàµÄÊý¾Ý³ÉÔ±¿ÉÓÃÓÚ·´Ó³¶ÔÏóµÄÊôÐÔ£¬¶ø½Ó¿Ú×ÔÈ»¿ÉÒÔ¶¨Òå³ÉÀàµÄ³ÉÔ±º¯Êý¡£µ«ÔÚ·ÇÃæÏò¶ÔÏóÓïÑÔ£¬ÀýÈçCÓïÑÔÖУ¬¶ÔÏóµÄ¸ÅÄî¿ÉÄܱä³ÉÒ»¸öÂß¼­¸ÅÄÈç¹ûÁ½¸ö¶ÔÏóͬʱ´æÔÚ£¬ÔòÔÚ½Ó¿ÚʵÏÖÖбØÐëÃ÷È·ÖªµÀËù½øÐеIJÙ×÷ÊÇÕë¶ÔÄĸö¶ÔÏóµÄ£¬Õâ¸ö¹ý³Ì¿ÉÓÉCOM½Ó¿ÚµÄ¶¨ÒåÀ´±£Ö¤¡£

2.2.1 COM¶ÔÏóµÄ±êʶ£­CLSID

Ç°ÃæÒѾ­Ëµ¹ý£¬COM×é¼þµÄλÖöԿͻ§À´ËµÊÇ͸Ã÷µÄ£¬ÒòΪ¿Í»§²¢²»Ö±½ÓÈ¥·ÃÎÊCOM×é¼þ£¬¿Í»§³ÌÐòͨ¹ýÒ»¸öÈ«¾Ö±êʶ·û½øÐжÔÏóµÄ´´½¨ºÍ³õʼ»¯¹¤×÷¡£Èç¹û´Ó±êʶ·ûµÄ¿É¶ÁÐÔÀ´¿¼ÂÇ£¬Ê¹ÓÃ×Ö·û´®ÊÇ×î¼òµ¥µÄ·½·¨£¬µ«ÕâÑù×ö»áÔö¼ÓÃû×Ö³åÍ»µÄ¿ÉÄÜÐÔ£¬ÕâÑù×é¼þµÄΨһÐԾͺÜÄѱ£Ö¤£¬ËùÒÔ²»ÄܲÉÓÃÕâÖÖ·½·¨¡£¶øÈç¹û°´ÕÕTCP/IPÍøÂçЭÒé±êʶ¼ÆËã»ú²ÉÓõÄIPµØÖ·±êʶ·½·¨£¬ÄÇôÿ¸ö×é¼þ¶ÔÏó¶¼Ó¦¸Ã·ÖÅäÒ»¸öÕûÊý£¬¸ÃÕûÊýΨһ±êʶÁË×é¼þ¶ÔÏó¡£ÎÊÌâÔÚÓÚ£¬ÎªÁ˱£Ö¤Î¨Ò»ÐÔ£¬±ØÐëÓÐÒ»¸öרÃŵÄȨÍþ»ú¹¹ÎªCOM×é¼þ·ÖÅäÕûÊý±êʶ·û£¬¶ÔÓÚCOM×é¼þµÄ¿ª·¢ºÍʹÓã¬ÏÔÈ»²»ÄÜÂú×ãʵ¼ÊÐèÒª¡£

ʹÓö¨³¤Î»ÊýµÄÕûÊýÀ´±êʶ×é¼þ¶ÔÏóÊǺÏÀíµÄ£¬ÎªÁËÔÚûÓÐÖÐÐÄ»ú¹¹¹ÜÀíµÄÇé¿öϱ£Ö¤Î¨Ò»ÐÔ£¬COM¹æ·¶²ÉÓÃÁË128λȫ¾ÖΨһ±êʶ·ûGUID£¬ÕâÊÇÒ»¸öËæ»úÊý£¬²¢²»ÐèҪרÃÅ»ú¹¹½øÐзÖÅäºÍ¹ÜÀí¡£ÒòΪGUIDÊÇËæ»úÊý£¬ËùÒÔ²¢²»¾ø¶Ô±£Ö¤Î¨Ò»ÐÔ£¬µ«·¢Éú±êʶ·ûÏàÖØµÄ¿ÉÄÜÐԷdz£Ð¡¡£´ÓÀíÂÛÉϽ²£¬Èç¹ûһ̨»úÆ÷ÿÃë²úÉú10000 000¸öGUID£¬Ôò¿ÉÒÔ±£Ö¤£¨¸ÅÂÊÒâÒåÉÏ£©£¬3240Äê²»ÖØ¸´¡£

ÏÂÃæÊÇÒ»¸öGUIDµÄÀý×Ó£º

{54BF6567--1007--11D1--B0AA--444553540000}¡£
ÔÚC/C++ÓïÑÔÖпÉÒÔÓÃÕâÑùµÄ½á¹¹À´ÃèÊö£º
¡¡typedefstruct_GUID
¡¡{
¡¡¡¡¡¡DWORDData1;
¡¡¡¡¡¡WORD¡¡¡¡Data2;
¡¡¡¡¡¡WORD¡¡¡¡Data3;
¡¡¡¡¡¡Byte¡¡¡¡Data4[8];
¡¡}GUID;

ÓÚÊÇÇ°ÃæµÄGUIDÀý×Ó¿ÉÒÔ¶¨ÒåΪ
extern "c" const GUID CLSID_MYCLASID =
{0x54bf6567,0x1007,0x11d1,{0xb0,0xaa,0x44,0x45,0x53,0x54,0x00,0x00}};

CLSIDÊÇÓÃÀ´±êʶCOM¶ÔÏóµÄGUID£¬Òò´Ë£¬CLSIDÔڽṹ¶¨ÒåÉÏGUIDÒ»Ö¡£GUID²¢²»ÊÇרÃÅÓÃÀ´¶¨ÒåCOM¶ÔÏó±êʶ·ûµÄ£¬ËüÒ²ÓÃÓÚ¶¨ÒåÆäËüʵÌåµÄ±êʶ·û£¬±ÈÈç½Ó¿Ú±êʶ·û¡£

2.3 COM½Ó¿Ú

ÒòΪCOM¶ÔÏóµÄ¿Í»§Óë¶ÔÏóµÄ·þÎñÖ®¼äͨ¹ý½Ó¿Ú½øÐн»»¥£¬ËùÒÔ×é¼þÖ®¼ä½Ó¿ÚµÄ¶¨ÒåÖÁ¹ØÖØÒª¡£COM¹æ·¶µÄºËÐÄÄÚÈÝÊǹØÓڽӿڵ͍Òå¡£

2.3.1 ½Ó¿ÚµÄ¶¨ÒåºÍ±êʶ

´Ó¼¼ÊõÉϽ²£¬½Ó¿ÚÊǰüº¬ÁËÒ»×麯ÊýµÄÊý¾Ý½á¹¹£¬Í¨¹ýÕâ×éÊý¾Ý½á¹¹£¬¿Í»§´úÂë¿ÉÒÔµ÷ÓÃ×é¼þ¶ÔÏóµÄ¹¦ÄÜ¡£½Ó¿Ú¶¨ÒåÁËÒ»×é³ÉÔ±º¯Êý£¬Õâ×é³ÉÔ±º¯ÊýÊÇ×é¼þ¶ÔÏó±©Â¶³öÀ´µÄËùÓÐÐÅÏ¢£¬¿Í»§³ÌÐòÀûÓÃÕâЩº¯Êý»ñµÃ×é¼þ¶ÔÏóµÄ·þÎñ¡£

¿Í»§³ÌÐòÓÃÒ»¸öÖ¸Ïò½Ó¿ÚÊý¾Ý½á¹¹µÄÖ¸ÕëÀ´µ÷ÓýӿڳÉÔ±º¯Êý¡£ÈçͼËùʾ£¬½Ó¿ÚÖ¸Õëʵ¼ÊÉÏÓÖÖ¸ÏòÁíÒ»¸öÖ¸Õ룬ÕâµÚ¶þ¸öÖ¸ÕëÖ¸ÏòÒ»×麯Êý£¬³ÆÎª½Ó¿Úº¯Êý±í£¬½Ó¿Úº¯Êý±íÖÐÿһÏîΪ4¸ö×Ö½Ú³¤µÄº¯ÊýÖ¸Õ룬ÿ¸öº¯ÊýÖ¸ÕëÓë¶ÔÏóµÄ¾ßÌåʵÏÖÁ¬½ÓÆðÀ´¡£Í¨¹ýÕâÖÖ·½Ê½£¬¿Í»§Ö»Òª»ñµÃÁ˽ӿÚÖ¸Õ룬¾Í¿ÉÒÔµ÷Óõ½¶ÔÏóµÄʵ¼Ê¹¦ÄÜ¡£

ͨ³££¬½Ó¿Úº¯Êý±í±»³ÆÎªÐ麯Êý±í£¨virtual functiontable£¬¼ò³Ævtable£©£¬ÔÚOSKITÖгÆÎªº¯Êý¶¯Ì¬ÅÉDz±í¡£¶ÔÓÚÒ»¸ö½Ó¿ÚÀ´Ëµ£¬ËüµÄÐ麯Êý±íÊÇÈ·¶¨µÄ£¬Òò´Ë½Ó¿ÚµÄ³ÉÔ±º¯Êý¸öÊýÊDz»±äµÄ£¬¶øÇÒ³ÉÔ±º¯ÊýµÄÏȺó˳ÐòÒ²ÊDz»±äµÄ£»¶ÔÓÚÿ¸ö³ÉÔ±º¯ÊýÀ´Ëµ£¬Æä²ÎÊýºÍ·µ»ØÖµÒ²ÊÇÈ·¶¨µÄ¡£ÔÚÒ»¸ö½Ó¿ÚµÄ¶¨ÒåÖУ¬ËùÓÐÕâЩÐÅÏ¢¶¼±ØÐëÔÚ¶þ½øÖÆÒ»¼¶È·¶¨£¬²»¹ÜʲôÓïÑÔ£¬Ö»ÒªÄÜÖ§³ÖÕâÑùµÄÄÚ´æ½á¹¹ÃèÊö£¬¾Í¿ÉÒÔ¶¨Òå½Ó¿Ú¡£´ËÍ⣬³ÉÔ±º¯Êý³ýÁ˲ÎÊýÀàÐÍÊÇÈ·¶¨µÄ£¬»¹ÒªÊ¹ÓÃͬÑùµÄµ÷ÓÃϰ¹ß¡£¿Í»§³ÌÐòÔÚµ÷ÓóÉÔ±º¯Êý֮ǰ£¬±ØÐëÏȰѲÎÊýѹÈëÕ»ÖУ¬È»ºóÔÙ½øÈë³ÉÔ±º¯ÊýÖУ¬³ÉÔ±º¯ÊýÒÀ´Î°Ñ²ÎÊý´ÓÕ»ÖÐÈ¡³öÀ´£¬ÔÚº¯Êý·µ»ØÖ®Ç°»ò·µ»Øºó£¬±ØÐë»Ö¸´Õ»µÄµ±Ç°Î»Ö㬲ÅÄܱ£Ö¤º¯ÊýÕý³£ÔËÐС£ÓÉÓÚOSKITÊÇÓÃCÓïÑÔÀ´ÊµÏֵģ¬Òò´Ë¿Í»§³ÌÐòÖ»ÐèÒª°üº¬½Ó¿ÚÉùÃ÷µÄÍ·Îļþ£¬¾Í¿ÉÒÔµ÷ÓÃCOM¶ÔÏóµÄ½Ó¿Ú£¬¶ø×é¼þ³ÌÐò±ØÐëÌṩ¾ßÌåµÄʵÏÖ¹ý³Ì£¬Ò²¾ÍÊÇ˵£¬Èç¹ûÒ»¸öCOM¶ÔÏóʵÏÖÁËÕâ¸ö½Ó¿Ú£¬ÔòËüÌṩµÄ½Ó¿ÚÖ¸ÕëËùÖ¸ÏòµÄ½á¹¹ÖУ¬Ã¿¸ö³ÉÔ±±ØÐëÊÇÓÐЧµÄº¯ÊýÖ¸Õë¡£

ÒòΪ½Ó¿Ú±»ÓÃÓÚ×é¼þ³ÌÐòºÍ¿Í»§³ÌÐòµÄͨÐÅÇÅÁº£¬ËùÒÔ½Ó¿ÚÓ¦¸Ã¾ßÓв»±äÐÔ£¬Ò»¸öCOM¶ÔÏó¿ÉÒÔÖ§³Ö¶à¸ö½Ó¿Ú¡£ÎªÁËÈÿͻ§³ÌÐò±êʶÿ¸ö½Ó¿Ú£¬ÀàËÆÓÚCOM¶ÔÏóµÄ±êʶ·½·¨£¬COM½Ó¿ÚҲʹÓÃÈ«¾ÖΨһ±êʶ·û£¬Ëü±»³ÆÎª½Ó¿Ú±êʶ·û£¨IID£¬interfaceidentifier£©¡£

ÀýÈ磺
extern "c" const IID IID_Iunknown =
{ 0x00000000,0x0000,0x0000, {0xc0,0x00,0x00,0x00, 0x00, 0x00, 0x00,0x46} };

Èç¹û¿Í»§³ÌÐòҪʹÓÃÒ»¸öCOM¶ÔÏóµÄij¸ö½Ó¿Ú£¬ÔòËü±ØÐëÖªµÀ¸Ã½Ó¿ÚµÄIIDºÍ½Ó¿ÚËùÄÜÌṩµÄ·½·¨£¨¼´½Ó¿Ú³ÉÔ±º¯Êý£©¡£

2.3.2 ½Ó¿ÚµÄÒ»Ð©ÌØµã

*¶þ½øÖÆÌØÐÔ
½Ó¿Ú¹æ·¶²¢²»½¨Á¢ÔÚÈκαà³ÌÓïÑԵĻù´¡ÉÏ£¬¶øÊǹ涨Á˶þ½øÖÆÒ»¼¶µÄ±ê×¼¡£ÈκÎÓïÑÔÖ»ÒªÓÐ×ã¹»µÄÊý¾Ý±í´ïÄÜÁ¦£¬Ëü¾Í¿ÉÒÔ¶Ô½Ó¿Ú½øÐÐÃèÊö£¬´Ó¶ø¿ÉÒÔÓÃÓÚÓë×é¼þ³ÌÐòÓйصĿª·¢¡£

*½Ó¿Ú²»±äÐÔ
½Ó¿ÚÊÇ×é¼þ¿Í»§³ÌÐòºÍ×é¼þ¶ÔÏóÖ®¼äµÄÇÅÁº£¬½Ó¿ÚÈç¹û¾­³£·¢Éú±ä»¯£¬Ôò¿Í»§³ÌÐòºÍ×é¼þ³ÌÐòÒ²Òª¸ú×ű仯£¬Õâ¶ÔÓÚϵͳµÄ¿ª·¢·Ç³£²»Àû£¬Ò²²»·ûºÏ×é¼þ»¯³ÌÐòÉè¼ÆµÄ˼Ïë¡£Òò´Ë£¬½Ó¿ÚÓ¦¸Ã±£³Ö²»±ä£¬Ö»Òª¿Í»§³ÌÐòºÍ×é¼þ³ÌÐò¶¼°´Õռȶ¨µÄ½Ó¿ÚÉè¼Æ½øÐпª·¢£¬Ôò¿ÉÒÔ±£Ö¤ÔÚÁ½Õß¶ÀÁ¢¿ª·¢½áÊøºó£¬ËüÃǵÄЭ×÷ÔËÐÐÄÜÁ¦ÄÜ´ïµ½Ô¤ÆÚµÄЧ¹û¡£

*¼Ì³ÐÐÔ
COM½Ó¿Ú¾ßÓв»±äÐÔ£¬µ«½Ó¿ÚÒ²ÐèÒª·¢Õ¹¡£ÀàËÆÓëC++Öеļ̳ÐÐÔ£¬½Ó¿ÚÒ²¿ÉÒԼ̳з¢Õ¹¡£ÓëC++Öеļ̳в»Í¬£¬½Ó¿Ú¼Ì³ÐÖ»ÊÇ˵Ã÷¼Ì³Ð£¬¼´ÅÉÉúµÄ½Ó¿ÚÖ»¼Ì³ÐÁË»ù½Ó¿ÚµÄ³ÉÔ±º¯Êý˵Ã÷£¬²¢Ã»Óм̳лù½Ó¿ÚµÄʵÏÖ£¬ÒòΪ½Ó¿Ú¶¨Òå²»°üÀ¨º¯ÊýʵÏÖ²¿·Ö£¬¶øÇҽӿڼ̳ÐÖ»ÔÊÐíµ¥¼Ì³Ð£¬²»ÔÊÐí¶àÖØ¼Ì³Ð¡£¸ù¾ÝCOM¹æ·¶£¬ËùÓеĽӿڶ¼±ØÐë´ÓIunknown½Ó¿ÚÅÉÉú£¬¶øÇÒÒ»°ãµÄ½Ó¿Ú¶¼ÊÇÖ±½ÓÅÉÉúÓÚIunknown½Ó¿Ú¡£

*¶à̬ÐÔ£­ÔËÐйý³ÌÖеĶà̬ÐÔ
¶à̬ÐÔÊÇÃæÏò¶ÔÏóϵͳµÄÖØÒªÌØÕ÷£¬COM¶ÔÏóÒ²¾ßÓжà̬ÐÔ£¬Æä¶à̬ÐÔͨ¹ýCOM½Ó¿ÚÌåÏÖ¡£¶à̬ÐÔʱ¿Í»§³ÌÐò¿ÉÒÔÓÃͳһµÄ·½·¨´¦Àí²»Í¬µÄ¶ÔÏó£¬ÉõÖÁÊDz»Í¬ÀàÐ͵ĶÔÏó£¬Ö»ÒªËüÃÇʵÏÖÁËͬÑùµÄ½Ó¿Ú¡£Èç¹û¼¸¸ö²»Í¬µÄCOM¶ÔÏóʵÏÖÁËͬһ¸ö½Ó¿Ú£¬Ôò¿Í»§³ÌÐò¿ÉÒÔÓÃͬÑùµÄ´úÂëµ÷ÓÃÕâЩCOM¶ÔÏó¡£ÒòΪCOM¹æ·¶ÔÊÐíÒ»¸ö¶ÔÏóʵÏÖ¶à¸ö½Ó¿Ú£¬Òò´Ë£¬COM¶ÔÏóµÄ¶à̬ÐÔ¿ÉÒÔÔÚÿ¸ö½Ó¿ÚÉϵõ½ÌåÏÖ¡£

2.4 Iunknown½Ó¿Ú

COM¹æ·¶ËµÃ÷£¬COM¶¨ÒåµÄÿһ¸ö½Ó¿Ú¶¼±ØÐë´ÓIunknown¼Ì³Ð¹ýÀ´£¬ÆäÔ­ÒòÔÚÓÚIunknown½Ó¿ÚÌṩÁËÁ½¸ö·Ç³£ÖØÒªµÄÌØÕ÷£ºÉú´æÆÚ¿ØÖƺͽӿڲéѯ¡£¿Í»§³ÌÐòÖ»ÄÜͨ¹ý½Ó¿ÚÓëCOM¶ÔÏó½øÐÐͨÐÅ£¬ÐèÒª¿ØÖƶÔÏóµÄ´æÔÚÓë·ñ¡£Èç¹û¿Í»§»¹Òª¼ÌÐø¶Ô¶ÔÏó½øÐвÙ×÷£¬ÔòËü±ØÐë±£Ö¤¶ÔÏóÄÜÒ»Ö±´æÔÚÓÚÄÚ´æÖУ»Èç¹û¿Í»§¶Ô¶ÔÏóµÄ²Ù×÷ÒѾ­Íê³É£¬¶øÇÒ²»ÔÙÐèÒª¸Ã¶ÔÏó£¬ÔòËü±ØÐ뼰ʱµØ°Ñ¶ÔÏóÊͷŵô£¬ÒÔÌá¸ß×ÊÔ´µÄÀûÓÃÂÊ¡£IunknownÒýÈëÁË"ÒýÓüÆÊý"£¨referencecounting£©·½·¨£¬¿ÉÒÔÓÐЧµØ¿ØÖƶÔÏóµÄÉú´æÖÜÆÚ¡£

ÁíÒ»·½Ã棬Èç¹ûÒ»¸öCOM¶ÔÏóʵÏÖÁ˶à¸öCOM½Ó¿Ú£¬ÔÚ³õʼʱ¿Ì£¬¿Í»§³ÌÐò²»´ó¿ÉÄܵõ½¸Ã¶ÔÏóËùÓеĽӿÚÖ¸Õ룬ËüÖ»»áÓµÓÐÒ»¸ö½Ó¿ÚÖ¸Õë¡£IunknownʹÓÃÁË"½Ó¿Ú²éѯ"£¨QueryInterface£©µÄ·½·¨À´Íê³É½Ó¿ÚÖ®¼äµÄÌø×ª¡£

Iunknown°üº¬ÁËÈý¸ö³ÉÔ±º¯Êý£ºQueryInterface¡¢AddrefºÍRelease¡£º¯ÊýQueryInterfaceÓÃÓÚ²éѯCOM¶ÔÏóµÄÆäËü½Ó¿ÚÖ¸Õ룬º¯ÊýAddrefºÍReleaseÓÃÓÚ¶ÔÒýÓüÆÊý½øÐвÙ×÷¡£

2.4.1 ÒýÓüÆÊý

COM²ÉÓÃÁË"ÒýÓüÆÊý"¼¼ÊõÀ´½â¾öÄÚ´æ¹ÜÀíµÄÎÊÌ⣬COM¶ÔÏóͨ¹ýÒýÓüÆÊýÀ´¾ö¶¨ÊÇ·ñ¼ÌÐøÉú´æÏÂÈ¥£¬¶ÔÓÚÒ»¸öCOM¶ÔÏóÀ´Ëµ£¬Ö»ÒªÓÐÈÎÒ»¸öÂß¼­Ä£¿é»¹ÐèҪʹÓÃËü£¬ÄÇôËü¾Í±ØÐëפÁôÔÚÄÚ´æÖУ¬²»ÄÜÊÍ·Å×Ô¼º¡£Òò´Ë£¬Ã¿Ò»¸öCOM¶ÔÏ󶼼ǼÁËÒ»¸ö³ÆÎª"ÒýÓüÆÊý"µÄÊýÖµ£¬¸ÃÊýÖµµÄº¬ÒåÊÇÓжàÉÙ¸öÓÐЧָÕëÔÚÒýÓøÃCOM¶ÔÏó¡£µ±¿Í»§µÃµ½ÁËÒ»¸öÖ¸Ïò¸Ã¶ÔÏóµÄ½Ó¿ÚÖ¸Õëʱ£¬ÒýÓüÆÊýÔö1£»µ±¿Í»§ÓÃÍêÁ˸ýӿÚÖ¸Õëºó£¬ÒýÓüÆÊý¼õ1¡£µ±ÒýÓüÆÊý¼õµ½0ʱ£¬COM¶ÔÏó¾ÍÓ¦¸Ã°ÑËü×Ô¼º´ÓÄÚ´æÖÐÇå³ýµô¡£µ±¿Í»§³ÌÐò¶ÔÒ»¸ö½Ó¿ÚÖ¸Õë½øÐÐÁ˸´ÖÆ£¬ÔòÒýÓüÆÊýÒ²Ó¦¸ÃÏàÓ¦Ôö¼Ó¡£IunknownµÄ½Ó¿Ú³ÉÔ±º¯ÊýAddrefºÍRelease·Ö±ðÍê³ÉÒýÓüÆÊýµÄ¼Ó1ºÍ¼õ1²Ù×÷¡£Í¨¹ýÒýÓüÆÊý£¬COM¶ÔÏóµÄ¿Í»§³ÌÐò¿ÉÒÔͨ¹ý½Ó¿ÚÖ¸ÕëºÜºÃµØ¿ØÖƶÔÏóµÄÉú´æÆÚ¡£

2.4.2 ʵÏÖÒýÓüÆÊý

°´ÕÕCOM¹æ·¶£¬Ò»¸öCOM×é¼þ¿ÉÒÔʵÏÖ¶à¸öCOM¶ÔÏ󣬶øÇÒÿ¸öCOM¶ÔÏóÓÖ¿ÉÒÔÖ§³Ö¶à¸öCOM½Ó¿Ú¡£Òò´Ë¿ÉÒÔʵÏÖÔÚCOM×é¼þÒ»¼¶£¬COM¶ÔÏóÒ»¼¶£¬ÉõÖÁÓÚ¶ÔÏóµÄÿ¸ö½Ó¿ÚÒ»¼¶ÉèÖÃÒýÓüÆÊý¡£

Èç¹ûÔÚ×é¼þÒ»¼¶ÉèÖÃÒýÓüÆÊý£¬ÄÇô¿ÉÒÔ¿ØÖÆ×é¼þÄ£¿éµÄÉú´æÖÜÆÚ£¬µ«²»ÄÜ¿ØÖÆCOM¶ÔÏóµÄÉú´æÖÜÆÚ¡£Èç¹ûÒ»¸ö×é¼þÓÐÁ½¸öCOM¶ÔÏó£¬Ôò±ØÐëµÈµ½ËùÓеÄCOM¶ÔÏó¶¼Ê¹ÓÃÍêÒÔºó£¬ËùÓеÄCOM¶ÔÏó²Å¿ÉÒÔÒ»Æð±»ÊÍ·Å¡£ÕâÑù×ö½µµÍÁËϵͳ×ÊÔ´µÄÀûÓÃÂÊ¡£

Èç¹ûÔÚ½Ó¿ÚÒ»¼¶ÉèÖÃÒýÓüÆÊý£¬¿ÉÒÔ¸ú×Ù¿Í»§¶ÔÏóCOM¶ÔÏóµÄʹÓÃÇé¿ö¡£¶ÔÓÚʵÏÖ¶à¸ö½Ó¿ÚµÄ¶ÔÏ󣬺ÜÓпÉÄÜijЩ½Ó¿ÚûÓб»¿Í»§Ê¹Óã¬ÄÇôÕâЩ½Ó¿ÚÏà¹ØµÄ×ÊÔ´¿ÉÒÔ²»±»Õ¼Óᣵ«Ã¿µ±Ò»¸ö½Ó¿ÚµÄÒýÓüÆÊý¼õµ½0ʱ£¬Ëü±ØÐë¸ø¶ÔÏó·¢³ö֪ͨ£¬¶ÔÏóÔÚ½Óµ½Í¨Öªºó£¬ÐèÒªÅжÏÊÇ·ñËùÓеĽӿÚÒýÓüÆÊýΪ0£¬ÈôÊÇ£¬¾Í°Ñ×Ô¼ºÊÍ·Å£¬È»ºóÔÙ½øÒ»²½Í¨Öª×é¼þ³ÌÐò£¬×é¼þ³ÌÐò½Óµ½Í¨ÖªºóÅжÏÊÇ·ñËùÓеĶÔÏó¶¼Òѱ»Çå³ý£¬ÈôÊÇ£¬ÔòËü¿ÉÒÔ±»Ð¶³öÄÚ´æ¡£Õâ¸ö¹ý³Ì±È½Ï·±Ëö£¬¶øÇÒÒ²ÐèÒªÕ¼ÓÃÒ»²¿·ÖµÄʱ¼ä¡£

´ÓÕÛÖеĽǶȳö·¢£¬±È½ÏºÏÀíµÄ·½°¸ÊDzÉÓöÔÏóÒ»¼¶µÄÒýÓüÆÊýÒÔ±ã¿ØÖÆ¶ÔÏóºÍ×é¼þµÄÉú´æÖÜÆÚ¡£ÕâÑùʹ¶à¸ö¶ÔÏóµÄ×é¼þ³ÌÐò¿ÉÒÔÓÐЧµØÌá¸ßϵͳ×ÊÔ´ÀûÓÃÂÊ¡£µ±Ò»¸ö¶ÔÏó±»ÊͷŵôÒÔºó£¬Ëü±ØÐë֪ͨ×é¼þ³ÌÐò£¬Èç¹û×é¼þ³ÌÐò·¢ÏÖÒѾ­Ã»ÓжÔÏó´æÔÚÁË£¬Ôò×é¼þÄ£¿éÓ¦¸Ã¿ÉÒÔ´ÓÄÚ´æÖÐж³ö¡£Òò´Ë£¬×é¼þ³ÌÐòÓ¦¸Ã±£³ÖÒ»·ÝÓÐЧ¶ÔÏóµÄ¼Ç¼£¬¿ÉÒÔÓÃÒ»¸öÈ«¾ÖµÄ¶ÔÏó¼ÆÊýÖµÀ´¿ØÖÆ×é¼þµÄÉú´æÖÜÆÚ¡£

2.4.3 ½Ó¿Ú²éѯ

°´ÕÕCOM¹æ·¶£¬Ò»¸öCOM¶ÔÏó¿ÉÒÔʵÏÖ¶à¸ö½Ó¿Ú£¬¿Í»§³ÌÐò¿ÉÒÔÔÚÔËÐÐʱ¿Ì¶ÔCOM¶ÔÏóµÄ½Ó¿Ú½øÐÐѯÎÊ£¬Ö»ÓжÔÏóʵÏÖÁ˸ýӿڣ¬¶ÔÏó²ÅÄÜÌṩÕâÑùµÄ½Ó¿ÚµÄ·þÎñ¡£ÒªÊµÏÖ½Ó¿Ú²éѯ£¬¾ÍҪʹÓÃIunknownµÄ³ÉÔ±º¯ÊýQueryInterface¡£

QueryInterfaceº¯ÊýµÄIDL£¨interface description language£¬½Ó¿ÚÃèÊöÓïÑÔ£©ÓïÑÔ˵Ã÷£º

HRESULT QueryInterface([in] REFIID iid,[out] void **ppv);

º¯ÊýµÄÊäÈë²ÎÊýiidΪ½Ó¿Ú±êʶ·ûIID£¬ËüÊÇÓëGUIDÒ»ÑùµÄ128λÕûÊý£¬ÓÃÀ´±êʶһ¸öCOM¶ÔÏóËùÖ§³ÖµÄ½Ó¿Ú¡£Êä³ö²ÎÊýptvΪ²éѯµÃµ½µÄ½á¹û½Ó¿ÚÖ¸Õ룬Èç¹û¶ÔÏóûÓÐʵÏÖiidËù±êʶµÄ½Ó¿Ú£¬ÔòÊä³ö²ÎÊýptvÖ¸Ïò¿Õ£¨NULL£©¡£µ±¿Í»§´´½¨ÁËCOM¶ÔÏóºó£¬´´½¨º¯Êý×ܻ᷵»ØÒ»¸ö½Ó¿ÚÖ¸Õ룬ÒòΪËùÓеĽӿڶ¼¼Ì³ÐÓÚIunknown£¬ËùÒÔ£¬ËùÓеĽӿڶ¼ÓÐQueryInterface³ÉÔ±º¯Êý£¬ÓÚÊÇ£¬Ôڵõ½Á˳õʼµÄ½Ó¿ÚÖ¸ÕëÖ®ºó£¬¿ÉÒÔͨ¹ýËüµÄQueryInterfaceº¯Êý»ñµÃ¸Ã¶ÔÏóÖ§³ÖµÄÈκÎÒ»¸ö½Ó¿ÚÖ¸Õë¡£

2.4.4 COM¶ÔÏóµÄ½Ó¿ÚÔ­Ôò

COM¹æ·¶¶Ô½Ó¿ÚµÄ²éѯ¸ø³öÁËÒÔÏÂһЩ¹æÔò£º

*¶ÔÓÚͬһ¸ö¶ÔÏóµÄ²»Í¬½Ó¿ÚÖ¸Õ룬²éѯµÃµ½µÄIUnknown½Ó¿Ú±ØÐëÍêÈ«Ïàͬ¡£Ò²¾ÍÊÇ˵£¬Ã¿¸ö¶ÔÏóµÄIunknown½Ó¿ÚÖ¸ÕëÊÇΨһµÄ£¬Òò´Ë£¬¶ÔÁ½¸ö½Ó¿ÚÖ¸Õ룬¿ÉÒÔͨ¹ýÅÐ¶ÏÆä²éѯµ½µÄIunknown½Ó¿ÚÊÇ·ñÏàµÈÀ´ÅжÏËüÃÇÊÇ·ñÖ¸Ïòͬһ¸ö¶ÔÏó¡£
*½Ó¿Ú¶Ô³ÆÐÔ¡£¶ÔÒ»¸ö½Ó¿Ú²éѯÆä×ÔÉí×ÜÓ¦¸Ã³É¹¦¡£
*½Ó¿Ú×Ô·´ÐÔ¡£Èç¹û´ÓÒ»¸ö½Ó¿ÚÖ¸Õë²éѯµ½ÁíÒ»¸ö½Ó¿ÚÖ¸Õ룬Ôò´ÓµÚ¶þ¸ö½Ó¿ÚÖ¸ÕëÔÙ²éѯµÚÒ»¸ö½Ó¿ÚÖ¸Õë±Ø¶¨³É¹¦¡£
*½Ó¿Ú´«µÝÐÔ¡£Èç¹û´ÓµÚÒ»¸ö½Ó¿ÚÖ¸Õë²éѯµ½µÚ¶þ¸ö½Ó¿ÚÖ¸Õ룬´ÓµÚ¶þ¸ö½Ó¿ÚÖ¸Õë¿ÉÒÔ²éѯµ½µÚÈý¸ö½Ó¿ÚÖ¸Õ룬Ôò´ÓµÚÈý¸ö½Ó¿ÚÖ¸Õë¿ÉÒÔ²éѯµ½µÚÒ»¸ö½Ó¿ÚÖ¸Õë¡£
*ʱ¼äÎÞ¹ØÐÔ¡£Èç¹ûÒ»¸ö½Ó¿ÚÔÚijһ¸öʱ¿Ì¿ÉÒÔ²éѯµ½ÁíÒ»¸ö½Ó¿ÚÖ¸Õ룬ÔòÒÔºóÈκÎʱºòÔÙ²éѯÏàͬµÄ½Ó¿ÚÖ¸Õ룬һ¶¨¿ÉÒÔ²éѯ³É¹¦¡£

2.5 COMÌØÐÔ

COM¹æ·¶Ëù¶¨ÒåµÄ×é¼þÄ£ÐÍ£¬³ýÁËÇ°ÃæÌáµ½µÄÃæÏò¶ÔÏóµÄÌØÐԺͿͻ§/·þÎñÆ÷ÌØÐÔÕâÁ½¸ö»ù±¾ÌØÐÔÍ⣬ֵµÃÖØµã˵Ã÷µÄ¾ÍÊÇCOM¹æ·¶µÄÓïÑÔÎÞ¹ØÐÔ£¬¶Ô½ø³ÌµÄ͸Ã÷ÐÔºÍËüµÄ¿ÉÖØÓûúÖÆ¡£

2.5.1ÓïÑÔÎÞ¹ØÐÔ

COM¶ÔÏóµÄ¶¨Òå²»ÒÀÀµÓÚÌØ¶¨µÄÓïÑÔ£¬Òò´Ë£¬±àд×é¼þ¶ÔÏóËùʹÓõÄÓïÑÔÓë±àд¿Í»§³ÌÐòµÄÓïÑÔ¿ÉÒÔÓÐËù²»Í¬£¬Ö»ÒªËüÃǶ¼ÄÜÉú³É·ûºÏCOM¹æ·¶µÄ¿ÉÖ´ÐдúÂë¼´¿É¡£COM±ê×¼ÓëÃæÏà¶ÔÏóµÄ±à³ÌÓïÑÔ²»Í¬£¬ËüËù²ÉÓõÄÊÇÒ»ÖÖ¶þ½øÖÆ´úÂë¼¶µÄ±ê×¼£¬¶ø²»ÊÇÔ´´úÂë¼¶µÄ±ê×¼¡£Òò´Ë£¬COMµÄÓïÑÔÎÞ¹ØÐÔʵ¼ÊÉÏΪ¿çÓïÑÔºÏ×÷¿ª·¢ÌṩÁËͳһ±ê×¼¡£ÔÚOSKITÖУ¬ËùÓеÄCOM¶ÔÏó¶¼ÊÇÓÃCÓïÑÔд³ÉµÄ£¬µ«Ö»ÒªÒÀ¾ÝCOM¹æ·¶£¬ÍêÈ«¿ÉÒÔÓÃC++¸ÄдÆäÖеÄijЩģ¿é£¬È»ºóµ¥¶À±àÒë¸ÃÄ£¿é£¬¶ø¿ÉÒÔ¼ÌÐøÊ¹ÓÃOSKITÖÐÆäËüµÄÔ­ÓÐÄ£¿é¡£

2.5.2 ½ø³Ì͸Ã÷ÌØÐÔ

COMËùÌṩµÄ·þÎñ×é¼þ¶ÔÏóÔÚʵÏÖʱÓÐÁ½ÖÖ½ø³ÌÄ£ÐÍ£¬½ø³ÌÄÚ¶ÔÏóºÍ½ø³ÌÍâ¶ÔÏó¡£Èç¹ûÊǽø³ÌÄÚ¶ÔÏó£¬ÔòËüÔÚ¿Í»§½ø³Ì¿Õ¼äÔËÐУ»Èç¹ûÊǽø³ÌÍâ¶ÔÏó£¬ÔòËüÔËÐÐÔÚͬһ»úÆ÷ÉϵÄÁíÒ»¸ö½ø³Ì¿Õ¼ä£¬»òÕßÔÚÔ¶³Ì»úÆ÷µÄ½ø³Ì¿Õ¼äÖС£ËäÈ»COM¶ÔÏóÓв»Í¬µÄ½ø³ÌÄ£ÐÍ£¬µ«ÕâÖÖÇø±ð¶ÔÓÚ¿Í»§»úÀ´ËµÊÇ͸Ã÷µÄ£¬Òò´Ë¿Í»§³ÌÐòÔÚʹÓÃ×é¼þ¶ÔÏóʱ¿ÉÒÔ²»¹ÜÕâÖÖÇø±ðµÄ´æÔÚ£¬Ö»Òª×ñÑ­COM¹æ·¶¼´¿É¡£È»¶ø£¬ÔÚʵÏÖCOM¶ÔÏóʱ£¬»¹ÊÇÓ¦¸ÃÉ÷ÖØÑ¡Ôñ½ø³ÌÄ£ÐÍ¡£½ø³ÌÄÚÄ£Ð͵ÄÓŵãÊÇЧÂʸߣ¬µ«×é¼þ²»Îȶ¨»áÒýÆð¿Í»§½ø³Ì±ÀÀ££¬Òò´Ë×é¼þ½ø³Ì¿ÉÄÜ»áΣ¼°¿Í»§£»½ø³ÌÍâÄ£Ð͵ÄÓŵãÊÇÎȶ¨ÐԺã¬×é¼þ½ø³Ì²»»áΣ¼°¿Í»§³ÌÐò£¬Ò»¸ö×é¼þ½ø³Ì¿ÉÒÔΪ¶à¸ö¿Í»§³ÌÐòÌṩ·þÎñ£¬µ«½ø³ÌÍâ×é¼þ¿ªÏú´ó£¬¶øÇÒµ÷ÓÃЧÂÊÏà¶ÔµÍһЩ¡£

ʵÏÖÕâÖÖ½ø³Ì͸Ã÷ÐԵĹؼüÔÚÓÚCOM¿â£¬COM¿â¸ºÔð×é¼þ³ÌÐòµÄ¶¨Î»£¬¹ÜÀí×é¼þ¶ÔÏóµÄ´´½¨ºÍ¶ÔÏóÓë¿Í»§Ö®¼äµÄͨÐÅ¡£µ±¿Í»§´´½¨×é¼þ¶ÔÏóʱ£¬COM¿â¸ºÔð×°Èë×é¼þÄ£¿é»òÕ߯ô¶¯×é¼þ½ø³Ì¡£Òò´Ë£¬¿Í»§³ÌÐò¿ÉÒÔ²»¹Ü×é¼þ¶ÔÏóµÄ½ø³ÌÄ£ÐÍ£¬¼´Ê¹×é¼þµÄ½ø³ÌÄ£ÐÍ·¢ÉúÁ˱仯£¬¿Í»§³ÌÐòÒ²²»ÐèÒªÖØÐ±àÒë¡£

2.5.3 ¿ÉÖØÓÃÐÔ

¿ÉÖØÓÃÐÔÊÇÈκζÔÏóÄ£Ð͵ÄʵÏÖÄ¿±ê£¬ÓÈÆäÊÇ´óÐÍϵͳ£¬¿ÉÖØÓÃÐԷdz£ÖØÒª¡£¶øÇÒ£¬ÓÉÓÚCOM±ê×¼Êǽ¨Á¢ÔÚ¶þ½øÖÆ´úÂë¼¶µÄ£¬Òò´ËCOM¶ÔÏóµÄ¿ÉÖØÓÃÐÔÓëÒ»°ãµÄÃæÏò¶ÔÏóÓïÑÔÓÐËù²»Í¬¡£

¶ÔÓÚCOM¶ÔÏóµÄ¿Í»§³ÌÐòÀ´Ëµ£¬ËüÖ»ÊÇͨ¹ý½Ó¿ÚʹÓöÔÏóÌṩµÄ·þÎñ£¬Ëü²¢²»ÖªµÀ¶ÔÏóÄÚ²¿µÄʵÏÖ¹ý³Ì£¬Òò´Ë£¬×é¼þ¶ÔÏóµÄÖØÓÃÐÔ½¨Á¢ÔÚ×é¼þ¶ÔÏóµÄÐÐΪ·½Ê½ÉÏ£¬¶ø²»ÊǾßÌåµÄʵÏÖÉÏ£¬ÕâÊÇÖØÓõĹؼü¡£

COMÓÃÁ½ÖÖ·½Ê½ÊµÏÖ¶ÔÏóµÄÖØÓ᣼ٶ¨ÓÐÁ½¸öCOM¶ÔÏ󣬶ÔÏó1Ï£ÍûÄÜÖØÓöÔÏó2µÄ¹¦ÄÜ£¬¶ÔÏó1³ÆÎªÍⲿ¶ÔÏ󣬶ÔÏó2³ÆÎªÄÚ²¿¶ÔÏó¡£

°üÈÝ·½Ê½¡£¶ÔÏó1°üº¬Á˶ÔÏó2£¬µ±¶ÔÏó1ÐèÒªÓõ½¶ÔÏó2µÄ¹¦ÄÜʱ£¬Ëü¿ÉÒÔ¼òµ¥µØ°ÑʵÏÖ½»¸ø¶ÔÏó2À´Íê³É£¬ËäÈ»¶ÔÏó1ºÍ¶ÔÏó2ʵÏÖͬÑùµÄ½Ó¿Ú£¬µ«¶ÔÏó1ÔÚʵÏÖ½Ó¿Úʱʵ¼ÊÉϵ÷ÓÃÁ˶ÔÏó2µÄʵÏÖ¡£

¾ÛºÏ·½Ê½¡£¶ÔÏó1Ö»Ðè¼òµ¥µØ°Ñ¶ÔÏó2µÄ½Ó¿ÚµÝ½»¸ø¿Í»§¼´¿É£¬¶ÔÏó1²¢Ã»ÓÐʵÏÖ¶ÔÏó2µÄ½Ó¿Ú£¬µ«Ëü°Ñ¶ÔÏó2µÄ½Ó¿ÚÒ²±©Â¶¸ø¿Í»§³ÌÐò£¬¶ø¿Í»§³ÌÐò²¢²»ÖªµÀÄÚ²¿¶ÔÏó2µÄ´æÔÚ¡£

¶ÔÏóÖØÓÃÊÇCOM¹æ·¶ºÜÖØÒªµÄÒ»¸ö·½Ã棬Ëü±£Ö¤COM¿ÉÓÃÓÚ¹¹Ôì´óÐ͵ÄÈí¼þϵͳ£¬¶øÇÒ£¬Ëüʹ¸´ÔÓϵͳ¼ò»¯ÎªÒ»Ð©¼òµ¥µÄ¶ÔÏóÄ£¿é£¬ÌåÏÖÁËÃæÏò¶ÔÏóµÄ˼Ïë¡£

[Ŀ¼]


µÚÈýÕ COM»úÖÆµÄʵÏÖ

¡¶OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚÈýÕ¡·


OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚÈýÕÂ2000Äê12ÔÂ3ÈÕ22:07


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥


µÚÈýÕ OSKITÖÐCOM»úÖÆµÄʵÏÖ

3.1 OSKITÖÐCOMµÄ»ù±¾¶¨Òå

ÔÚOSKITÖÐÓйØCOMµÄ»ù±¾¶¨ÒåÔÚcom.hÖУ¬ÔÚ¸ÃÎļþÖж¨ÒåÁËOSKITÖеÄiid£¬COMµÄµ÷Óù淶£¬ÒÔ¼°OSKITÖеÄIunknown½Ó¿Ú¡£

OSKITÖÐGUIDµÄ¶¨ÒåÈçÏ£º
struct oskit_guid{
¡¡¡¡¡¡oskit_u32_t¡¡¡¡data1;
¡¡¡¡¡¡oskit_u16_t¡¡¡¡data2;
¡¡¡¡¡¡oskit_u16_t¡¡¡¡data3;
¡¡¡¡¡¡oskit_u8_tdata4[8];
};
ÆäÖÐoskit_u32_t¡¢oskit_u16_t¡¢oskit_u8_t·Ö±ðÊÇ32λ¡¢16λ¡¢8λÎÞ·ûºÅÕûÐΡ£OSKITʹÓÃÕâÑùµÄ¶¨Òå¶ø²»Ê¹ÓÃÀýÈçwin32ÖеÄDWORDÓÐÁ½·½ÃæµÄÔ­Òò£ºÊ×ÏÈ£¬ÕâÑù¶¨ÒåʹOSKIT±£³ÖÒ»Öµķç¸ñ£¬Ïò¿ª·¢ÈËÔ±³ÊÏÖ³öÒ»ÖµÄÃüÃû¹æÔò¡£Æä´Î£¬Èç¹ûoskitÔÚwin32»òÏàËÆµÄ»·¾³ÖÐʹÓã¬ÄܱÜÃâÓëʵ¼ÊµÄWIN32Í·Îļþ³åÍ»¡£

OSKITÖеĵ÷Óù淶ÈçÏ£º
#define OSKIT_COMCALL¡¡¡¡¡¡OSKIT_STDCALL
#defineOSKIT_COMDECL¡¡¡¡¡¡oskit_error_t¡¡¡¡OSKIT_COMCALL
#defineOSKIT_COMDECL_U¡¡¡¡oskit_u32_t¡¡¡¡¡¡OSKIT_COMCALL
#defineOSKIT_COMDECL_V¡¡¡¡voidOSKIT_COMCALL
ÆäÖУ¬OSKIT_STDCALLÊÇÔÚcompile.hÖж¨ÒåµÄÓйرàÒëÆ÷ÉèÖõĺ꣬Õâ¸öºêÔÚOSKIT°²×°Ç°µÄconfigure²½ÖèÖб»¸³Öµ£¨configure²½ÖèÇë¼ûµÚÒ»Õ£©¡£OSKITÕâÑù¶¨Òåµ÷Óù淶£¬ÊÇΪÁËÓò»Í¬µÄ±àÒëÆ÷¶¼¿ÉÒÔ±àÒëOSKIT£¬¶ø²»±ØÔÚ±àд³ÌÐòʱ¿¼ÂÇÕâЩµ÷ÓõÄϸ½Ú¡£¶øOSKIT_COMDECL¾ÍÊÇ´ø´íÎó·µ»ØÂëµÄµ÷Óã¬OSKIT_COMDECL_UÊÇ·µ»ØÖµÎª32λÎÞ·ûºÅÕûÐ͵ĵ÷Óã¬OSKIT_COMDECL_VÊDz»´ø·µ»ØÖµµÄµ÷Óá£

OSKITÖÐIunknown½Ó¿ÚµÄ¶¨ÒåÈçÏ£º
struct oskit_iunknown
{
¡¡¡¡¡¡structoskit_iunknown_ops *ops;
};
typedef struct oskit_iunknownoskit_iunknown_t;
struct oskit_iunknown_ops
{ / *²éѯ¶ÔÏóÊÇ·ñÖ§³Öij¸öÌØ¶¨µÄ½Ó¿Ú£¬ÈôÖ§³ÖÔò·µ»Ø¸Ã½Ó¿ÚµÄÖ¸Õë*/
¡¡¡¡¡¡OSKIT_COMDECL (*query)(oskit_iunknown_t*obj,
¡¡¡¡¡¡const oskit_iid_t *iid, void **out_ihandle);
¡¡¡¡¡¡/*Ôö¼Óij¸ö½Ó¿ÚµÄÒýÓüÆÊý*/
¡¡¡¡¡¡OSKIT_COMDECL_U (*addref)(oskit_iunknown_t *obj);
¡¡¡¡¡¡/*½«¶Ôij¸ö½Ó¿Ú»ò¶ÔÏóµÄÒýÓüÆÊý¼õ1£¬ÈôÒýÓüÆÊýΪ0£¬ÔòÊͷŸýӿڻò¶ÔÏó */
¡¡¡¡¡¡OSKIT_COMDECL_U(*release)(oskit_iunknown_t*obj);
};
ÆäÖУ¬queryµÄ²ÎÊýÖÐobjÊÇÒª²éѯµÄCOM¶ÔÏó£¬iidÊÇÒª²éѯµÄ½Ó¿ÚµÄÈ«¾Ö±êʶ·û£¬Èô²éѯ³É¹¦£¬out_ihandle·µ»ØÖ¸Ïò±»²éѯ½Ó¿ÚµÄÖ¸Õ룬Èô²éѯʧ°Ü£¬Ôò·µ»Ø¿ÕÖ¸Õë¡£

ÉÏÃæ¿ÉÒÔ¿´µ½£¬oskit_iunknown½á¹¹Öдæ·Å×ÅÖ¸Ïòº¯Êý±í¸ñµÄÖ¸Õ룬³ÆÎªops£¬¶øº¯Êý±í¸ñÊÇͨ¹ýÒ»¸ö³ÆÎªoskit_iunknown_opsµÄ½á¹¹ÊµÏֵģ¬Õâ¸ö½á¹¹Öж¨ÒåÁËÖ¸Ïò¸Ã½Ó¿ÚËùʵÏÖµÄËùÓгÉÔ±º¯ÊýµÄÖ¸Õë¡£Ö»Òª¶Ô¸Ã½á¹¹½øÐи³Öµ£¬¾Í¿ÉÒÔͨ¹ýÕâ¸ö½á¹¹µ÷ÓøýӿڵÄËùÓгÉÔ±º¯Êý¡£

ÓÉÓÚIunknown½Ó¿ÚÊÇÓɸ÷¸öCOM¶ÔÏó×Ô¼ºÊµÏֵģ¬Òò´ËÔÚCOM.HÖÐûÓжԸýṹ½øÐи³Öµ£¬ºóÃæÕ½ÚÖн«»áÏêϸÆÊÎöOSKITÖÐÒ»¸öCOM¶ÔÏóµÄʵÀý£¬ÄÇʱÔٶԸýṹµÄ¸³Öµ½øÐÐÌÖÂÛ¡£

COM.H»¹Í¨¹ýºê¶¨Òå¶ÔIunknown½Ó¿ÚµÄ³ÉÔ±º¯Êý½øÐÐÁ˰ü×°£¬ÈçÏÂËùʾ£º

#define oskit_iunknown_query(obj, iid, out_ihandle)\
¡¡((obj)->ops->query((oskit_iunknown_t *)(obj),(iid),
¡¡(out_ihandle)))
#define oskit_iunknown_addref(obj)\
¡¡((obj)->ops->addref((oskit_iunknown_t *)(obj)))
#defineoskit_iunknown_release(obj) \
¡¡((obj)->ops->release((oskit_iunknown_t*)(obj)))

Õâʹ¿ª·¢ÈËÔ±¿ÉÒÔ¶ÔËüÃǵĵ÷Óøü¼Ó·½±ã¡£´ËÍ⣬˳±ãÌáÒ»¾ä£¬OSKITµÄÒ»´óÌØÉ«¾ÍÊǶԺ궨ÒåµÄÁé»îʹÓá£ÔÚÕâ·½ÃæÖµµÃ´ó¼Ò½è¼ø¡£

3.2 ʵÀý·ÖÎöIunknown½Ó¿ÚµÄʵÏÖ

OSKITÖв¢²»ÊÇÿ¸ö½Ó¿Ú¶¼ÔÊÐí±»ÒýÓöà´Î£¬±ÈÈçÄÚ´æ½Ó¿Ú£¬µ±ÏµÍ³³õʼ»¯Ê±±ã¶Ô¶¨ÒåºÃµÄ¾²Ì¬ÄÚ´æ½á¹¹½øÐи³Öµ£¬È»ºóËùÓжÔÄÚ´æµÄ²Ù×÷¶¼ÒÀÀµÓÚ¸ÃÄÚ´æ½Ó¿Ú£¬Ò²¾ÍÊÇ˵£¬ÔÚ¸ÃÄÚ´æ½Ó¿ÚÖв»´æÔÚʵÏÖIunknown½Ó¿ÚµÄÎÊÌâ¡£µ«Ò²ÓпÉÒÔ´æÔÚ¿ÉÒÔÒýÓöà´ÎµÄ½Ó¿Ú£¬ÈçÁ÷½Ó¿Ú£¨stream£©£¬C»·¾³½Ó¿Ú£¨OSKITΪºËÐÄÌṩÁËÒ»¸ö×îСµÄC¿â£¬¿ª·¢ÕâÒ²¿ÉÒÔʹÓÃ×Ô¼º¶¨ÒåµÄC¿â¼ÓÒÔÌæ»»£©¡£±¾½Ú¾ÍÒÔC»·¾³½Ó¿ÚΪÀý·ÖÎöOSKITÖÐIunknown½Ó¿ÚµÄʵÏÖ¡£

3.2.1 C»·¾³¶ÔÏóµÄ½á¹¹

OSKITÖÐC»·¾³¶ÔÏóµÄ½á¹¹ÈçÏ£º
struct genv {
¡¡¡¡¡¡oskit_libcenv_t¡¡¡¡¡¡libcenvi; /* C»·¾³½Ó¿Ú*/
¡¡¡¡¡¡int¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡count; /* ÒýÓüÆÊý*/
¡¡¡¡¡¡oskit_fsnamespace_t¡¡*fsn;
¡¡¡¡¡¡charhostname[256];
¡¡¡¡¡¡oskit_ttystream_t¡¡¡¡*console;
¡¡¡¡¡¡void(*exit)(int);
¡¡¡¡¡¡void¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ (*siginit)(int (*func)(int, int, void*));
¡¡¡¡¡¡#ifndefPTHREADS
¡¡¡¡¡¡oskit_timer_t¡¡¡¡¡¡¡¡*sleep_timer;
¡¡¡¡¡¡oskit_osenv_sleep_t¡¡*sleep_iface;
¡¡¡¡¡¡osenv_sleeprec_t*sleeprec;
¡¡¡¡¡¡#endif
};

3.2.2 C»·¾³½Ó¿Ú¼°Æä¶ÔIunknown½Ó¿ÚµÄʵÏÖ

C»·¾³½Ó¿ÚÊÇÔÚlibcenv.hÖж¨ÒåµÄ£¬ÎªÁËÈôó¼Ò¶ÔOSKITÖÐCOM½Ó¿ÚÓÐÒ»¸öÍêÕûµÄÈÏʶ£¬ÏÖ½«Õû¸ö½Ó¿ÚµÄ˵Ã÷Áгö:

struct oskit_libcenv {
¡¡¡¡¡¡struct oskit_libcenv_ops *ops; /* Ö¸Ïòº¯Êý±í¸ñµÄÖ¸Õë*/
};
typedef struct oskit_libcenv oskit_libcenv_t;

ÏÂÃæÊǺ¯Êý±í¸ñ£º
struct oskit_libcenv_ops {
/* ¶ÔIunknown½Ó¿ÚµÄ¼Ì³Ð*/
OSKIT_COMDECL_IUNKNOWN(oskit_libcenv_t)
/* »ñµÃ¼°ÉèÖøùÎļþϵͳ*/
OSKIT_COMDECL (*getfsnamespace)(oskit_libcenv_t*s,
¡¡¡¡¡¡¡¡oskit_fsnamespace_t **out_dir);
OSKIT_COMDECL(*setfsnamespace)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡oskit_fsnamespace_t *dir);
/*ÉèÖü°»ñµÃÖ÷»úÃû */
OSKIT_COMDECL (*gethostname)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡char*hostname, int len);
OSKIT_COMDECL (*sethostname)(oskit_libcenv_t*s,
¡¡¡¡¡¡¡¡const char *hostname, int len);
/* µ÷Óü°ÉèÖÃÍ˳öº¯Êý */
OSKIT_COMDECL_V(*exit)(oskit_libcenv_t *s,
oskit_u32_t exitval);
OSKIT_COMDECL(*setexit)(oskit_libcenv_t *s,
void (*exitfunc)(int));
/* ÉèÖü°»ñµÃÖն˶ÔÏó*/
OSKIT_COMDECL (*getconsole)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡oskit_ttystream_t**out_ttystream);
OSKIT_COMDECL (*setconsole)(oskit_libcenv_t*s,
¡¡¡¡¡¡¡¡oskit_ttystream_t *ttystream);
/* ³õʼ»¯Ðźſâ */
OSKIT_COMDECL(*signals_init)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡int (*func)(int, int, void*));
OSKIT_COMDECL (*setsiginit)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡void(*sigfunc)(int (*func)(int,int,void *)));
/* ˯Ãß/»½ÐÑ½Ó¿Ú */
OSKIT_COMDECL_V(*sleep_init)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡osenv_sleeprec_t*sleeprec);
OSKIT_COMDECL_U (*sleep)(oskit_libcenv_t *s,
osenv_sleeprec_t*sleeprec,
struct oskit_timespec *timeout);
OSKIT_COMDECL_V(*wakeup)(oskit_libcenv_t *s,
¡¡¡¡¡¡¡¡osenv_sleeprec_t *sleeprec);
/* ¿Ë¡Õû¸ö¶ÔÏó*/
OSKIT_COMDECL (*clone)(oskit_libcenv_t *s,
oskit_libcenv_t**intf);
};

ÏÂÃæÊǶ¨ÒåC»·¾³½Ó¿ÚµÄiid
extern const struct oskit_guidoskit_libcenv_iid;
#define OSKIT_LIBCENV_IID OSKIT_GUID(0x4aa7dfe9, 0x7c74,0x11cf, 0xb5, 0x00, 0x08, 0x00, 0x09, 0x53, 0xad, 0xc2)

ÏÂÃæÊǶÔC¿â½Ó¿Ú³ÉÔ±º¯ÊýµÄ°ü×°£¬ÒòΪ³¤¶ÈÔµ¹Ê£¬Ö»Ð´³ö²¿·Ö£º
#define oskit_libcenv_query(s, iid,out_ihandle) \
((s)->ops->query((oskit_libcenv_t *)(s), (iid),(out_ihandle)))
#define oskit_libcenv_addref(s)\
((s)->ops->addref((oskit_libcenv_t *)(s)))
#defineoskit_libcenv_release(s) \
((s)->ops->release((oskit_libcenv_t *)(s)))

ÏÂÃæÊÇC¿â½Ó¿ÚµÄʵÏÖ£º
static struct genv default_libcenv;
/* ¶¨Ò徲̬µÄC»·¾³¶ÔÏó */

ÔÚOSKITÖУ¬¾­³£ÔÚ³õʼ»¯Ê±´óÁ¿Ê¹Óþ²Ì¬¶¨Ò壬ÒòΪÕâÑù¶¨Òå³öÀ´µÄ½á¹¹ÔÚ±àÒëʱ¾Í·ÖÅäºÃÁ˿ռ䣬ʹϵͳÔÚÆô¶¯Ê±¾Í¿ÉÒÔʹÓÃÕâЩ½á¹¹£¬¶ø²»ÐèÒªµÈµ½ÄÚ´æ¶ÔÏó³õʼ»¯ÍêÖ®ºóÔÙ¶¯Ì¬·ÖÅä¿Õ¼ä¡£

Query ³ÉÔ±º¯ÊýµÄÁ÷³Ìͼ¼ûÏÂÒ»Ò³£º

ÏÂÃæÊÇQuery³ÉÔ±º¯ÊýµÄʵÏÖ£º
staticOSKIT_COMDECL
libcenv_query(oskit_libcenv_t *s, const oskit_iid_t *iid,
void **out_ihandle)
{
struct genv *g = (struct genv *) s;
/*½«Ö¸ÏòC¿â»·¾³½Ó¿ÚµÄÖ¸Õëת»¯ÎªÖ¸ÏòC¿â»·¾³¶ÔÏóµÄÖ¸ */
if (memcmp(iid, oskit_iunknown_iid,sizeof(*iid)) == 0 ||
¡¡¡¡¡¡¡¡memcmp(iid, oskit_libcenv_iid, sizeof(*iid))== 0)
/* ͨ¹ý±È½ÏÒª²éѯµÄiidºÍiunknown½Ó¿ÚµÄiidÒÔ¼°c¿â»·¾³½Ó¿ÚµÄiid
Ïà±È½Ï£¬Èç¹ûÏàµÈ£¬Ôò±íÃ÷¸ÃC¿â»·¾³¶ÔÏóÖ§³Ö¸Ã½Ó¿Ú*/
¡¡¡¡{ *out_ihandle = g->libcenvi;/*·µ»ØÖ¸ÏòC»·¾³½Ó¿ÚµÄÖ¸Õë*/
¡¡¡¡¡¡¡¡g->count++; /*½«ÒýÓüÆÊý¼Ó1*/
¡¡¡¡¡¡¡¡return 0;
¡¡¡¡}
¡¡¡¡*out_ihandle = 0;
¡¡¡¡return OSKIT_E_NOINTERFACE; /* Èç¹ûÕÒ²»µ½£¬Ôò·µ»Ø³ö´íÐÅÏ¢*/
};
/* Ôö¼ÓÒýÓüÆÊý */
static OSKIT_COMDECL_Ulibcenv_addref(oskit_libcenv_t *s)
{ /* ½«C¿â»·¾³µÄ½Ó¿ÚÖ¸Õëת»¯ÎªC¿â»·¾³¶ÔÏóÖ¸Õë */
¡¡¡¡structgenv *g = (struct genv *) s;
¡¡¡¡assert(g->count);
¡¡¡¡return++g->count; /*Ôö¼ÓÒýÓüÆÊý*/
}

Release º¯ÊýµÄÁ÷³Ì¼ûÏÂÒ»Ò³£º

/* ÊÍ·ÅÒýÓüÆÊý*/
libcenv_release(oskit_libcenv_t *s)
{ /* ½«C¿â»·¾³½Ó¿ÚÖ¸Õëת»¯ÎªC¿â»·¾³¶ÔÏóÖ¸Õë*/
¡¡¡¡struct genv g = (struct genv ) s;
¡¡¡¡assert(g->count);
/*ÒÔÏÂÓï¾äÏȽ«¶ÔÏóµÄÒýÓüÆÊý¼õ1£¬È»ºóÅжϼÆÊýÊÇ·ñΪ0£¬ÈôÊÇÔòÊÍ
·Å¶ÔÓëÆäÏà¹ØµÄ½Ó¿ÚµÄÒýÓÃ*/
¡¡¡¡if (--g->count == 0){
¡¡¡¡¡¡¡¡if (g->fsn) oskit_fsnamespace_release(g->fsn);
¡¡¡¡¡¡¡¡if(g->console) oskit_ttystream_release(g->console);
¡¡¡¡#ifndefPTHREADS
¡¡¡¡¡¡¡¡if(g->sleep_timer)
¡¡¡¡¡¡¡¡¡¡¡¡oskit_timer_release(g->sleep_timer);
¡¡¡¡¡¡¡¡if(g->sleep_iface)
¡¡¡¡¡¡¡¡¡¡¡¡oskit_osenv_sleep_release(g->sleep_iface);
¡¡¡¡#endif
¡¡¡¡¡¡¡¡sfree(g,sizeof(g));
¡¡¡¡}
¡¡¡¡return g->count; /*·µ»Ø¸Ã¶ÔÏóµÄÒýÓüÆÊý*/
}

ÏÖÔÚ¶ÔÉÏÃæIunknown½Ó¿ÚµÄÈý¸ö³ÉÔ±º¯ÊýµÄʵÏÖ˼·×÷Ò»¶¨µÄ½âÊÍ¡£ÔÚOSKITÖУ¬¿Í»§ËùÄÜʹÓõÄÖ»ÊǶÔÏóÌṩ¸øÓû§µÄ½Ó¿ÚÖ¸Õ룬µ±Óû§ÔڸýӿÚÖе÷ÓÃQuery·½·¨Ê±£¬ÀýÈçlibcenv_query£¬²¢¶Ô¸Ã¶ÔÏóÖеÄij¸ö½Ó¿Ú½øÐвéѯ£¬Õâʱ£¬ÓÉÓÚ¶ÔÏóÊÇ·ñʵÏÖËù²éѯ½Ó¿ÚÊÇÔÚ¶ÔÏó½á¹¹Öж¨ÒåµÄ£¬Òò´ËÊ×ÏȰѽӿÚÖ¸Õë½øÐÐÇ¿ÖÆÀàÐÍת»»£¬±äΪָÏò½Ó¿ÚËùÊô¶ÔÏóµÄÖ¸Õ룬ȻºóÔÙ½«ËùÒª²éѯµÄ½Ó¿ÚiidÓë¶ÔÏóËùʵÏÖµÄËùÓнӿڵÄiidÖðÒ»±È½Ï£¬Èç¹ûÓëÆäÖÐijһ¸ö½Ó¿ÚµÄiidÏàµÈ£¬Ôò·µ»ØÖ¸Ïò¸Ã½Ó¿ÚµÄÖ¸Õ룬Èç¹ûÎÞÒ»ÏàµÈ£¬Ôò·µ»Ø´íÎóÐÅÏ¢¡£µ±Óû§Ê¹ÓÃaddref·½·¨Ê±£¬Í¬ÑùÒ²ÊÇÏȽøÐÐÀàÐÍת»»£¬È»ºó½«Õâ¸ö¶ÔÏóÖеÄÒýÓüÆÊý¼Ó1£¬ÈôÓû§µ÷ÓÃrelease·½·¨£¬ÔÚ½øÐÐÀàÐÍת»»ºó£¬½«¶ÔÏóµÄÒýÓüÆÊý¼õ1£¬Èç¹û·¢ÏÖÒýÓüÆÊýλ0£¬Ôò½«ÊÍ·ÅÕû¸ö¶ÔÏóµÄÄÚ´æ¿Õ¼ä¡£

[Ŀ¼]


µÚËÄÕ ½Ó¿Ú×¢²á»úÖÆ

¡¶OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚËÄÕ¡·


OSKitµÄ²¿¼þ¶ÔÏóÄ£ÐÍ µÚËÄÕÂ2000Äê12ÔÂ3ÈÕ22:49


×÷ Õߣº ºéÄþ


µ¼Ê¦£º³ÂË·Ó¥


µÚËÄÕ OSKITÖеĽӿÚ×¢²á»úÖÆ

4.1 ¸ÅÊö

ΪÁ˹ÜÀíOSKITÖеĽӿڣ¬OSKITϵͳÒýÈëÁ˽ӿÚ×¢²áµÄ»úÖÆ¡£Ëùν½Ó¿Ú×¢²á£¬¾ÍÊÇÔÚϵͳÖн¨Á¢Ò»¸ö·þÎñÊý¾Ý¿â£¬ÀïÃæ¼ÇÔØÁËËùÓÐÔÚ¸ÃÊý¾Ý¿âÖÐ×¢²áµÄ½Ó¿ÚÐÅÏ¢£¬°üÀ¨¶ÔÏóÃû¡¢½Ó¿ÚµÄiid¡¢¶ÔÏóµÄÒýÓüÆÊýµÈ¡£ÏµÍ³Ìṩ¸øÓû§Ò»¸öÖ¸Ïò·þÎñ½Ó¿ÚµÄÖ¸Õ룬ͨ¹ý¸ÃÖ¸Õ룬Óû§¿ÉÒÔʵÏÖ´´½¨×Ô¼ºµÄÊý¾Ý¿â£¬ÔÚij¸öÊý¾Ý¿âÖÐ×¢²á½Ó¿Ú£¬ÔÚÊý¾Ý¿âÖÐ×¢ÏúÏÈǰע²áµÄij¸ö½Ó¿Ú£¬»ñµÃÓÃij¸öiid×¢²áµÄµÚÒ»¸ö½Ó¿Ú£¬»ñµÃÓÃij¸öiid×¢²áµÄËùÓнӿڡ£ÏµÍ³ÔÚ³õʼ»¯Ê±×Ô¶¯´´½¨ÁËÒ»¸öÌØÊâµÄÊý¾Ý¿â£¬³ÆÎªÈ«¾ÖÊý¾Ý¿â£¬ÔÚ¸ÃÊý¾Ý¿âÖÐ×¢²áÁËÐí¶à¶ÔÓÚϵͳÀ´ËµÊ®·Ö¹Ø¼üµÄ½Ó¿Ú£¬ÀýÈçC¿â»·¾³½Ó¿Ú£¬ÄÚ´æ½Ó¿Ú£¬²¢ÌṩÁËһЩÆäËüµÄº¯ÊýÒÔ·½±ã¶ÔÈ«¾ÖÊý¾Ý¿âµÄ²Ù×÷£¬ÈçÖ±½Ó½«½Ó¿Ú×¢²áÈëÈ«¾ÖÊý¾Ý¿â£¬ÒÔ¼°Ö±½ÓÔÚÈ«¾ÖÊý¾Ý¿âÖнøÐнӿڲéѯµÈ¡£Í¨¹ýÕâЩº¯Êý£¬ÏµÍ³ÄÜ¿ì½Ý·½±ãµØ¹ÜÀíÈ«¾ÖÊý¾Ý¿â¡£

4.2 Êý¾Ý¿â¶ÔÏó

OSKITÖеÄÊý¾Ý¿â¶ÔÏóÊÇÔÚservice.cÖж¨Óе쬯䶍ÒåÈçÏ£º

struct db {
¡¡¡¡oskit_services_t¡¡¡¡servi; /* ·þÎñ½Ó¿Ú */
¡¡¡¡int¡¡¡¡¡¡¡¡¡¡¡¡¡¡count; /*ÒýÓüÆÊý */
¡¡¡¡struct iidnode¡¡ *iids; /* iidÁ´Ö¸Õë */
¡¡¡¡oskit_mem_t¡¡¡¡¡¡*memi; /*ËùҪʹÓõÄÄÚ´æ¶ÔÏóÖ¸Õë*/
};

ÆäÖÐÓõ½µÄiidnode½á¹¹ÈçÏ£º

struct iidnode {
¡¡¡¡struct iidnode¡¡*next;/*ÏÂÒ»¸öiid½Úµã*/
¡¡¡¡oskit_guid_t¡¡¡¡iid; /*È«¾Öiid*/
¡¡¡¡struct objnode¡¡*objs;/*¶ÔÏó½ÚµãÖ¸Õë*/
¡¡¡¡int objconut /*¶ÔÏóÒýÓüÆÊý*/
};

¶øobjnodeµÄ¶¨ÒåÈçÏ£º

struct objnode {
¡¡¡¡struct objnode¡¡¡¡*next;/*ÏÂÒ»¸öobjnode½Úµã*/
¡¡¡¡oskit_iunknown_t¡¡*intf; /*iunknown½Ó¿ÚÀàÐÍÖ¸Õë*/
};

ÓÉ´Ë£¬¿ÉÒԵóö¸ÃÊý¾Ý¿âµÄ½á¹¹Í¼Îª£º

4.3 ·þÎñ½Ó¿ÚµÄ¶¨Òå

·þÎñ½Ó¿Ú¶¨ÒåÈçÏ£º

struct oskit_services {
¡¡¡¡struct oskit_services_ops *ops;/*Ö¸Ïòº¯Êý±í¸ñµÄÖ¸Õë*/
};
typedef struct oskit_services oskit_services_t;
structoskit_services_ops {
/*½Ó¿Ú²éѯ*/
OSKIT_COMDECL (*query)(oskit_services_t*s,
¡¡¡¡¡¡¡¡const struct oskit_guid *iid,void**out_ihandle);
/*ÔöÌíÒýÓüÆÊý*/
OSKIT_COMDECL_U (*addref)(oskit_services_t*s);
/*ÊÍ·ÅÒýÓüÆÊý*/
OSKIT_COMDECL_U (*release)(oskit_services_t*s)
/*ÔÚÊý¾Ý¿âÖÐ×¢²á½Ó¿Ú*/
OSKIT_COMDECL (*addservice)(oskit_services_t*s,
¡¡¡¡¡¡¡¡const struct oskit_guid *iid, void*intf);
/*ÔÚÊý¾Ý¿âÖг·ÏúÏÈǰע²á½Ó¿Ú*/
OSKIT_COMDECL (*remservice)(oskit_services_t*s,
¡¡¡¡¡¡¡¡const struct oskit_guid *iid, void*intf);
/*ÔÚÊý¾Ý¿âÖвéѯÒÔij¸öiid×¢²áµÄËùÓнӿÚ*/
OSKIT_COMDECL (*lookup)(oskit_services_t*s,
constoskit_guid_t *iid,void***out_interface_array);
/*ÔÚÊý¾Ý¿âÖвéѯÒÔij¸öiid×¢²áµÄµÚÒ»¸ö½Ó¿Ú*/
OSKIT_COMDECL(*lookup_first)(oskit_services_t *s,
¡¡¡¡¡¡¡¡const oskit_guid_t *iid, void**out_intf);
/*¿Ë¡Õû¸öÊý¾Ý¿â*/
OSKIT_COMDECL(*clone)(oskit_services_t*s,
oskit_services_t **intf);
};

ÁíÍâÔÚOSKITÖУ¬»¹Îª²Ù×÷È«¾ÖÊý¾Ý¿âÌṩÁËһЩº¯Êý£¬ËüÃǵ͍ÒåÈçÏ£»

/*´´½¨È«¾ÖÊý¾Ý¿â*/
oskit_error_toskit_global_registry_create
¡¡¡¡¡¡¡¡(structoskit_mem*memobject);
/*»ñµÃÈ«¾ÖÊý¾Ý¿â*/
oskit_services_t*oskit_get_services(void);
/*ÔÚÈ«¾ÖÊý¾Ý¿âÖÐ×¢²á½Ó¿Ú*/
oskit_error_toskit_register(const struct oskit_guid*iid,
¡¡¡¡¡¡¡¡void*interface);
/*ÔÚÈ«¾ÖÊý¾Ý¿âÖг·ÏúÏÈǰע²áµÄ½Ó¿Ú*/
oskit_error_toskit_unregister(const struct oskit_guid
¡¡¡¡¡¡¡¡*iid,void*interface);
/*²éѯÓÃij¸öiid×¢²áµÄËùÓнӿÚ*/
oskit_error_toskit_lookup(const oskit_guid_t *iid, void
¡¡¡¡¡¡¡¡***out_interface_array);
/*²éѯÓÃij¸öiid×¢²áµÄµÚÒ»¸ö½Ó¿Ú*/
oskit_error_toskit_lookup_first(const oskit_guid_t *iid,
¡¡¡¡¡¡¡¡void**out_interface);

4.4 Êý¾Ý¿â·þÎñ½Ó¿ÚµÄʵÏÖ

4.4.1 ´´½¨Êý¾Ý¿â

OSKITÖд´½¨Êý¾Ý¿âµÄʵÏÖ˼·ÊÇ£ºÊ¹ÓÃij¸öÄÚ´æ¶ÔÏó·ÖÅä³öÊý¾Ý¿â¶ÔÏóËùÐèµÄ´æ´¢¿Õ¼ä£¬È»ºó´´½¨Êý¾Ý¿â£¬¸øÊý¾Ý¿â¶ÔÏóµÄÿ¸ö³ÉÔ±¸³Öµ£¬×îºó·µ»ØÊý¾Ý¿âµÄ·þÎñ½Ó¿ÚÖ¸Õë¡£ÆäÁ÷³Ìͼ¼ûÏÂÒ»Ò³£º

ÆäʵÏÖµÄÔ´´úÂëÈçÏ£º

oskit_error_t oskit_services_create
(oskit_mem_t *memi, oskit_services_t**out_intf)
{¡¡ struct db *s;/*¶¨ÒåÊý¾Ý¿â¶ÔÏó*/
¡¡¡¡/*Èç¹ûûÓÐÌṩÄÚ´æ¶ÔÏó£¬ÔòÔÚÈ«¾ÖÊý¾Ý¿âÖвéÕÒ*/
¡¡¡¡if (!memi){
¡¡¡¡¡¡¡¡/*ÔÚÈ«¾ÖÊý¾Ý¿âÖвéÕÒµÚÒ»¸öÄÚ´æ¶ÔÏó*/
¡¡¡¡¡¡¡¡oskit_lookup_first(oskit_mem_iid,(void*) memi);
¡¡¡¡¡¡¡¡if (!memi)
¡¡¡¡¡¡¡¡¡¡¡¡panic("oskit_services_create:Nullmemory object!");
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡/* ¸øÊý¾Ý¿â¶ÔÏó·ÖÅäÄÚ´æ¿Õ¼ä */
¡¡¡¡¡¡¡¡s =oskit_mem_alloc(memi, sizeof(*s), 0);
¡¡¡¡¡¡¡¡if (s == NULL)
¡¡¡¡¡¡¡¡¡¡¡¡returnOSKIT_E_OUTOFMEMORY;
¡¡¡¡¡¡¡¡s->count = 1; /*¸øÒýÓüÆÊý¸³Öµ*/
¡¡¡¡¡¡¡¡s->memi =memi; /*¸øÄÚ´æ¶ÔÏóÖ¸Õ븳ֵ*/
¡¡¡¡¡¡¡¡/*¸øÊý¾Ý¿â¶ÔÏóÖеķþÎñ½Ó¿ÚÖ¸Õ븳ֵ*/
¡¡¡¡¡¡¡¡s->servi.ops =services_ops;
¡¡¡¡¡¡¡¡s->iids =0;
¡¡¡¡¡¡¡¡oskit_mem_addref(memi);
¡¡¡¡¡¡¡¡/* ÔÚÈ«¾ÖÊý¾Ý¿âÖÐÔö¼Ó¸ÃÄÚ´æ¶ÔÏóµÄÒýÓüÆÊý*/
¡¡¡¡¡¡¡¡*out_intf = s->servi; /*·µ»Ø·þÎñ½Ó¿ÚÖ¸Õë*/
¡¡¡¡¡¡¡¡return 0;
}

4.4.2 ÔÚÊý¾Ý¿âÖÐ×¢²á½Ó¿Ú

OSKITÔÚÊý¾Ý¿âÖÐ×¢²á½Ó¿ÚµÄ¹ý³ÌÊÇÕâÑùµÄ£¬Ê×ÏȽ«·þÎñ½Ó¿ÚÖ¸Õëת»»ÎªÊý¾Ý¿â¶ÔÏóÖ¸Õ룬Ȼºó¸ù¾ÝҪע²áµÄ½Ó¿ÚµÄiid£¬ÔÚÊý¾Ý¿âÖвéÕÒÒѾ­×¢²áµÄiid£¬Èô¸ÃiidÒÑ×¢²á£¬ÔòÔÚ¸ÃiidϲéÕÒÓÃÕâ¸öiid×¢²áµÄ½Ó¿ÚÃû£¬Èç¹ûÕÒµ½Ôò·µ»Ø£¬·ñÔò£¬Éú³ÉÒ»¸öеÄobj½Úµã£¬²¢½«Òª×¢²áµÄ½Ó¿Ú¸³¸øobj½ÚµãÖеĽӿÚÖ¸Õë¡£Èç¹ûҪע²áµÄiidÕÒ²»µ½£¬ÔòÉú³ÉÒ»¸öеÄiid½Úµã£¬ÔÚ¸Ãiid½ÚµãÏÂн¨Ò»¸öobj½Úµã£¬²¢¶ÔËüÃǽøÐи³Öµ¡£ÔÚ³ÌÐòÖ´Ðйý³ÌÖУ¬Èç¹ûÔÚ·ÖÅäÄÚ´æÊ±·¢ÏÖÄÚ´æ²»¹»£¬Ôò·µ»ØÒ»¸öÄÚ´æ²»×ã´íÎó£¬Óɵ÷ÓóÌÐòÀ´´¦Àí¡£ÏÂÃæÊÇ×¢²á½Ó¿ÚµÄ³ÌÐòÁ÷³Ì£º

ÏÂÃæÊÇ×¢²á½Ó¿ÚµÄÔ´³ÌÐò£º

²ÎÊý£ºsi:Êý¾Ý¿âÖ¸Õë
¡¡¡¡¡¡iid:ÐèÒª½øÐÐ×¢²áµÄÈ«¾ÖiidÖ¸Õë
¡¡¡¡¡¡interface:ÐèÒª½øÐÐ×¢²áµÄ½Ó¿ÚÖ¸Õë
OSKIT_COMDECLservices_addservice(oskit_services_t *si,
¡¡¡¡¡¡¡¡¡¡const struct oskit_guid *iid,void *interface)
{¡¡ /*½«·þÎñ½Ó¿ÚÖ¸Õëת»»ÎªÊý¾Ý¿âÖ¸Õë*/
¡¡¡¡struct db *s = (struct db *) si;
¡¡¡¡/*½«ÐèҪע²áµÄ½Ó¿ÚÖ¸Õëת»»Îªiunknown½Ó¿ÚµÄÖ¸*/
¡¡¡¡oskit_iunknown_t *iu =(oskit_iunknown_t*)interface;
¡¡¡¡struct iidnode *in;/*¶¨Òåiid½ÚµãÖ¸Õë*/
¡¡¡¡struct objnode *on, **onp; /*¶¨Òåobj½ÚµãÖ¸Õë*/
¡¡¡¡/*²éÕÒ»ò´´½¨ÏàÓ¦µÄiid½Úµã */
¡¡¡¡for (in = s->iids; ; in = in->next) {
¡¡¡¡¡¡¡¡if (in== NULL) {
¡¡¡¡¡¡¡¡¡¡¡¡/*Èç¹ûûÓÐÕÒµ½£¬Ôò´´½¨ÐµÄiid½Úµã*/
¡¡¡¡¡¡¡¡¡¡¡¡in =oskit_mem_alloc(s->memi, sizeof(*in), 0);
¡¡¡¡¡¡¡¡¡¡¡¡if (in == NULL)/*·ÖÅäÄÚ´æÊ§°Ü*/
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡return OSKIT_E_OUTOFMEMORY;/*·µ»ØÄÚ´æ²»×ã´íÎó*/
¡¡¡¡¡¡¡¡¡¡¡¡in->iid = *iid;
¡¡¡¡¡¡¡¡¡¡¡¡in->objs =NULL;
¡¡¡¡¡¡¡¡¡¡¡¡in->objcount = 0;
¡¡¡¡¡¡¡¡¡¡¡¡in->next =s->iids;/*ÔÚiidÁ´ÖвåÈë¸Ãiid½Úµã*/
¡¡¡¡¡¡¡¡¡¡¡¡s->iids =in;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡if (memcmp(in->iid, iid,sizeof(*iid)) == 0)
¡¡¡¡¡¡¡¡break; /*ÕÒµ½Á˸Ãiid½Úµã£¬Í˳öÑ­»·*/
¡¡¡¡}
¡¡¡¡/*ÔÚ¸ÃiidµÄobjÁ´ÖвéÕÒҪע²áµÄ½Ó¿Ú*/
¡¡¡¡for (onp = in->objs; *onp; onp =(*onp)->next) {
¡¡¡¡¡¡¡¡if ((*onp)->intf == interface)
¡¡¡¡¡¡¡¡¡¡¡¡return 0; /*ÕÒµ½ºó£¬Ö±½Ó·µ»Ø*/
¡¡¡¡}
¡¡¡¡/* ΪÕâ¸ö½Ó¿Ú´´½¨Ò»¸öеÄobj½Úµã*/
¡¡¡