10.1¡¡POSIX API¤È¥·¥¹¥Æ¥à¥³¡¼¥ë

  • API¡§Í׵ᤵ¤ì¤¿¥µ¡¼¥Ó¥¹¤òÆÀ¤ë¤¿¤á¤Î´Ø¿ô¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹
  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¡§¥½¥Õ¥È¥¦¥§¥¢³ä¤ê¹þ¤ß¤òÍøÍѤ·¤Æ¹Ô¤ï¤ì¤ë¥«¡¼¥Í¥ë¤ËÂФ¹¤ëÌÀ¼¨Åª¤ÊÍ×µá
  • libc¤ÎAPI¤Î¼ïÎà
    • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ë1ÂÐ1¤ÇÂбþ¤¹¤ë¥é¥Ã¥Ñ¡¼¥ë¡¼¥Á¥ó¡£
    • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ë´Ø·¸¤Ê¤¤»»½Ñ´Ø¿ô
    • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤È°Û¤Ê¤ë¥µ¡¼¥Ó¥¹¤òÄó¶¡(malloc()¤¬brk()¤òÆâÉôŪ¤Ë¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë)
  • POSIX¤Ç¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ç¤Ï¤Ê¤¯API¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
  • ¥¨¥é¡¼È¯À¸»þ¤Ï-1¤òÊÖ¤·¡¢errono¤ÇÆâÍƤò¼èÆÀ¡£

10.2¡¡¥·¥¹¥Æ¥à¥³¡¼¥ë¥Ï¥ó¥É¥é¤È¥·¥¹¥Æ¥à¥³¡¼¥ë¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó

  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¸Æ¤Ó½Ð¤·¤Ï¡¢¥¢¥»¥ó¥Ö¥ê¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥·¥¹¥Æ¥à¥³¡¼¥ë¥Ï¥ó¥É¥é¤ò¸Æ¤Ó½Ð¤¹¡£
  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ëÈÖ¹æ(eax)¤Ç¼±Ê̤µ¤ì¤ë¡£
  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¸Æ¤Ó½Ð¤·¡£
    • ¥«¡¼¥Í¥ë¥â¡¼¥É¥¹¥¿¥Ã¥¯¾å¤Ë¤Û¤Ü¤¹¤Ù¤Æ¤Î¥ì¥¸¥¹¥¿¤ÎÆâÍƤòÂàÈò¤¹¤ë¡£(¥¢¥»¥ó¥Ö¥ê¸À¸ì¤Çµ­½Ò)
    • ¥·¥¹¥Æ¥à¥³¡¼¥ë¥µ¥Ö¥ë¡¼¥Á¥ó(system call service routine)¤ò¸Æ¤Ó½Ð¤¹¡£
    • ¥ì¥¸¥¹¥¿¤ò²óÉü¤·¡¢¥æ¡¼¥¶¥â¡¼¥É¤ËÉüµ¢¤¹¤ë¡£(¥¢¥»¥ó¥Ö¥ê¸À¸ì¤Çµ­½Ò)
  • ¥·¥¹¥Æ¥à¥³¡¼¥ëÈÖ¹æ¤ò¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¤ËÂбþÉÕ¤±¤ë¤¿¤á¤Ë¥·¥¹¥Æ¥à¥³¡¼¥ëʬ´ô¥Æ¡¼¥Ö¥ë(dispatch table)¤ò»ÈÍѤ¹¤ë¡£

10.3¡¡¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÆþ¸ý¤È½Ð¸ý

  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¸Æ¤Ó½Ð¤·Ë¡
    • int $0x80¡§¸Å¤¤¥«¡¼¥Í¥ë¤Ç¤ÎÍ£°ì¤Î¸Æ¤Ó½Ð¤·Ë¡¡£
    • sysenter¡§Pentium ­¶¥×¥í¥»¥Ã¥µ°Ê¹ß¤Ç²Äǽ¡£
  • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤«¤é¤ÎÉüµ¢Ë¡
    • iret
    • sysexit¡§Pentium ­¶¥×¥í¥»¥Ã¥µ°Ê¹ß¤Ç²Äǽ¡£

10.3.1¡¡int $0x80Ì¿Îá¤Ë¤è¤ë¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹Ô


³ä¤ê¹þ¤ß¤Ë¤è¤ê¡¢¥«¡¼¥Í¥ë¥³¡¼¥É¥»¥°¥á¥ó¥È¤Ë°Ü¹Ô¤·¡¢¥«¡¼¥Í¥ë¥â¡¼¥É¤È¤Ê¤ë¡£
10.3.1.1 system_call()´Ø¿ô
  1. ¥·¥¹¥Æ¥à¥³¡¼¥ëÈÖ¹æ¤ÈÁ´¤Æ¤Î¥ì¥¸¥¹¥¿¤ÎÆâÍƤò¥¹¥¿¥Ã¥¯¤ËÊݸ¤¹¤ë¡£(CPU¤Ë¤è¤êÊݸ¤µ¤ì¤ë¥ì¥¸¥¹¥¿°Ê³°¤âÊݸ)
  2. ¥«¥ì¥ó¥È¥×¥í¥»¥¹¤Îthread_info¹½Â¤ÂΤΥ¢¥É¥ì¥¹¤òebx¤Ë³ÊǼ¡£
  3. ¥Ç¥Ð¥Ã¥¬¤Ë¥È¥ì¡¼¥¹¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¼Â¹ÔľÁ°¡¦Ä¾¸å¤Ë¥Ç¥Ð¥Ã¥¬¤¬¾ðÊó¤ò¼ý½¸²Äǽ¤È¤¹¤ë¡£
  4. »ØÄꤵ¤ì¤¿¥·¥¹¥Æ¥à¥³¡¼¥ëÈÖ¹æ¤Î¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤¹¡£
10.3.1.2 ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î½Ð¸ý
  1. eax¤ËÌá¤êÃͤò¼èÆÀ¤·¤Æ¥¹¥¿¥Ã¥¯¤Ë³ÊǼ¡£
  2. thread_info¹½Â¤ÂΤÎflags¥á¥ó¥Ð¤Î¥Õ¥é¥°¤¬Î©¤Ã¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¥ì¥¸¥¹¥¿¤ò²óÉü¤·¤Æiret¤Ç¥æ¡¼¥¶¥â¡¼¥É¤ËÉüµ¢¤¹¤ë¡£
  3. ¥Õ¥é¥°¤¬Î©¤Ã¤Æ¤¤¤¿¤é¡¢ºÆ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¦²¾ÁÛ8086¥â¡¼¥É¡¦ÊÝαÃæ¤Î¥·¥°¥Ê¥ë¡¦¥·¥ó¥°¥ë¥¹¥Æ¥Ã¥×¼Â¹Ô¤ÎÍ×µá¤Ê¤É¤ò½èÍý¤¹¤ë¡£

10.3.2¡¡sysenterÌ¿Îá¤Ë¤è¤ë¥·¥¹¥Æ¥à¥³¡¼¥ëȯ¹Ô


Intel¼Ò¤Ë¹â®¥·¥¹¥Æ¥à¥³¡¼¥ë¤È̾¤Å¤±¤é¤ì¤Æ¤¤¤ë¡£
10.3.2.1 sysenterÌ¿Îá
  • sysenter¤Ç»ÈÍѤµ¤ì¤ëÆÃÊ̤ʥ쥸¥¹¥¿¤¬¤¢¤ê¡¢enable_sep_cpu()´Ø¿ô¤Ç½é´ü²½¤¹¤ë¡£
    • SYSENTER_CS_MSR¡§¥«¡¼¥Í¥ë¥³¡¼¥É¥»¥°¥á¥ó¥ÈÍÑ¥»¥°¥á¥ó¥È¥ì¥¸¥¹¥¿
    • SYSENTER_EIP_MSR¡§¥«¡¼¥Í¥ë¤Î¥¨¥ó¥È¥ê¥Ý¥¤¥ó¥È¤Î¥ê¥Ë¥¢¥¢¥É¥ì¥¹
    • SYSENTER_ESP_MSR¡§¥«¡¼¥Í¥ë¤Î¥¹¥¿¥Ã¥¯¥Ý¥¤¥ó¥¿
  1. SYSENTER_CS_MSR¤ÎÃæ¿È¤òcs¥ì¥¸¥¹¥¿¤ËÀßÄê
  2. SYSENTER_EIP_MSR¤ÎÃæ¿È¤òeip¥ì¥¸¥¹¥¿¤ËÀßÄê
  3. SYSENTER_ESP_MSR¤ÎÃæ¿È¤òesp¥ì¥¸¥¹¥¿¤ËÀßÄê
  4. SYSENTER_CS_MSR¤ÎÃæ¿È¤Ë8¤ò²Ã¤¨¤¿¤â¤Î¤òss¥ì¥¸¥¹¥¿¤ËÀßÄê(GDT¥ì¥¤¥¢¥¦¥È¤¬Å¬ÀÚ¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë)
10.3.2.2 vsyscall¥Ú¡¼¥¸
  • libcɸ½à¥é¥¤¥Ö¥é¥ê¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤ÏCPU¤È¥«¡¼¥Í¥ë¤ÎξÊý¤¬sysenter¤ËÂбþ¤·¤Æ¤¤¤ë¾ì¹ç¤ËsysenterÌ¿Îá¤ò»ÈÍѤ¹¤ë¡£
  • sysenter_setup()´Ø¿ô¤Çvsyscall¥Ú¡¼¥¸¤È¸Æ¤Ð¤ì¤ë¥Ú¡¼¥¸¥Õ¥ì¡¼¥à¤òºîÀ®¡£
10.3.2.3 ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÆþ¤ê¸ý

(¾ÜºÙά)
10.3.2.4 ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î½Ð¸ý

system_call()´Ø¿ô¤ÈƱÍͤʽèÍý¤ò¹Ô¤¤¡¢¥æ¡¼¥¶¥â¡¼¥É¤ËÉüµ¢¤¹¤ë¡£
10.3.2.5 sysexitÌ¿Îá

sysenterÌ¿Îá¤ÈÂФˤʤꡢ¹â®¤Ë¥æ¡¼¥¶¥â¡¼¥É¤ËÉüµ¢¤¹¤ë¡£
10.3.2.6 SYSENTER_RETURN¥³¡¼¥É

¥ì¥¸¥¹¥¿¤ò²óÉü¤·¡¢É¸½à¥é¥¤¥Ö¥é¥ê¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤ËÀ©¸æ¤òÌ᤹¡£

10.4¡¡°ú¿ô¤Î¼õ¤±ÅϤ·

  • ¥«¡¼¥Í¥ë¥â¡¼¥É¡¦¥æ¡¼¥¶¥â¡¼¥É¤ÎξÊý¤òƱ»þ¤Ë°·¤ï¤Ê¤¤¤¿¤á¤ÎÊý¼°
    • ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Î¸Æ¤Ó½Ð¤·Â¦¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ø¤Î°ú¿ô¤Ï¥¹¥¿¥Ã¥¯¤ËÀѤó¤Ç¥é¥Ã¥Ñ¡¼¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤¹¡£
    • ¥«¡¼¥Í¥ë¤Ï¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤¹Á°¤Ë¡¢°ú¿ô¤òCPU¥ì¥¸¥¹¥¿¤Ë½ñ¤­¹þ¤à¡£
    • ¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¤Î¸Æ¤Ó½Ð¤·Á°¤Ë¡¢°ú¿ô¤ò¥«¡¼¥Í¥ë¥â¡¼¥É¥¹¥¿¥Ã¥¯¤Ë½ñ¤­¹þ¤à¡£
  • ¾åµ­Êý¼°¤ÎÀ©¸Â
    • ³Æ°ú¿ô¤ÎŤµ¤¬¥ì¥¸¥¹¥¿Ä¹¤òĶ¤¨¤Ê¤¤¤³¤È¡£(x86¤Ç¤Ï32bit)
    • °ú¿ô¤Î¿ô¤Ï6¤Ä¤Þ¤Ç¡£
    • 6¤Ä°Ê¾å¤Î°ú¿ô¤Ï¥×¥í¥»¥¹¥¢¥É¥ì¥¹¶õ´Ö¤Î¥¢¥É¥ì¥¹¤ò¥ì¥¸¥¹¥¿¤ÇÅϤ¹¡£

10.4.1¡¡°ú¿ô¤Î³Îǧ

  • ¥«¡¼¥Í¥ë¤Ï°ú¿ô¤Î³Îǧ¤ò¹Ô¤Ã¤Æ¤¤¤ë¡£
  • ¥¢¥É¥ì¥¹¤¬ÅϤµ¤ì¤¿¾ì¹ç¤Î¶¦Ä̤γÎǧ
    • °ÊÁ°¤ÎÃÙ¤¤³Îǧˡ¡§»ØÄꤷ¤¿¥ê¥Ë¥¢¥¢¥É¥ì¥¹¤¬¥×¥í¥»¥¹¥¢¥É¥ì¥¹¶õ´Ö¤Ë°¤¹¤ë¤³¤È¡£Å¬Àڤʥ¢¥¯¥»¥¹¸¢¤¬¤¢¤ë¤³¤È¡£
    • ¸½ºß¤ÎÁᤤ³Îǧˡ¡§»ØÄꤷ¤¿¥ê¥Ë¥¢¥¢¥É¥ì¥¹¤¬¥«¡¼¥Í¥ë¤¬Í½Ì󤷤Ƥ¤¤ë¥¢¥É¥ì¥¹¤Ç¤Ï¤Ê¤¤¤³¤È¡£(access_ok()¥Þ¥¯¥í)
    • Áᤤ³Îǧˡ¤Ç¤Ï¸å¤Ç¥Ú¡¼¥¸¥Õ¥©¥ë¥È¤È¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ë¤¬¡¢¤³¤Î¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤Ê¤¤¤È¥«¡¼¥Í¥ë¤Î¶õ´Ö¤¬Æɤ߹þ¤á¤Æ¤·¤Þ¤¤¥Õ¥©¥ë¥È¤âȯÀ¸¤·¤Ê¤¤¡£

10.4.2¡¡¥×¥í¥»¥¹¥¢¥É¥ì¥¹¶õ´Ö¤Ø¤Î¥¢¥¯¥»¥¹


(¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥óÆâ¤Ç»ÈÍѤµ¤ì¤ë¥Þ¥¯¥í¤ÎÀâÌÀά)

10.4.3¡¡¥¢¥É¥ì¥¹¤ÎưŪ¤Ê³Îǧ¤Èfixup¥³¡¼¥É

  • ¥Ú¡¼¥¸¥Õ¥©¥ë¥ÈÎã³°¤¬È¯À¸¤¹¤ë¸¶°ø
    • ¥¢¥¯¥»¥¹¤·¤¿¥¢¥É¥ì¥¹¤ËÂбþ¤¹¤ë¥Ú¡¼¥¸¥Õ¥ì¡¼¥à¤¬Â¸ºß¤·¤Ê¤¤¡£
    • ¥¢¥¯¥»¥¹¤·¤¿¥¢¥É¥ì¥¹¤ËÂбþ¤¹¤ë¥Ú¡¼¥¸¥Æ¡¼¥Ö¥ë¥¨¥ó¥È¥ê¤¬½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤¡£
    • ¥«¡¼¥Í¥ë´Ø¿ô¤Î¥Ð¥°¤ä¥Ï¡¼¥É¥¦¥§¥¢¤Î°ì»þŪ¤Ê¥¨¥é¡¼¤Ë¤è¤ëÎã³°¡£
    • ¥¢¥¯¥»¥¹¤·¤¿¥¢¥É¥ì¥¹¤¬¥×¥í¥»¥¹¥¢¥É¥ì¥¹¶õ´Ö°Ê³°¤ò»Ø¤·¤Æ¤¤¤ë¡£

10.4.4¡¡Îã³°¥Æ¡¼¥Ö¥ë

  • ¥æ¡¼¥¶¥¢¥É¥ì¥¹¶õ´Ö¤Ë¥¢¥¯¥»¥¹¤¹¤ë²Õ½ê¤òÎã³°¥Æ¡¼¥Ö¥ë¤ËÅÐÏ¿¤·¤Æ¡¢¥Æ¡¼¥Ö¥ë¤ËÅÐÏ¿ºÑ¤ß¤Î¥¢¥É¥ì¥¹¤Ç¤ÎÎã³°¤Ï°ú¿ôÉÔÀµ¤ÈȽÄꤹ¤ë¡£
  • fixup¥³¡¼¥É¤È¤¤¤¦¥µ¡¼¥Ó¥¹¥ë¡¼¥Á¥ó¤«¤é¥æ¡¼¥¶¥â¡¼¥É¥×¥í¥»¥¹¤Ë¥¨¥é¡¼ÈÖ¹æ¤òÊÖ¤¹¤¿¤á¤Î½èÍý¤ò̵Íý¤ä¤êÁÞÆþ¤¹¤ë¤¿¤á¤Î¤â¤Î¡£
  • fixup¥³¡¼¥É¤Ï.fixup¤È¤¤¤¦ÆÃÊ̤ʥ»¥¯¥·¥ç¥ó¤ËÇÛÃÖ¡£

10.4.5¡¡Îã³°¥Æ¡¼¥Ö¥ë¤Èfixup¥³¡¼¥É¤ÎÀ¸À®

  • gcc¤Î.section¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò»ÈÍѤ·¤Æ¡¢Îã³°¥Æ¡¼¥Ö¥ë¤¬¼Â¸½¤µ¤ì¤Æ¤¤¤ë¡£
(¾ÜºÙά)

10.5¡¡¥«¡¼¥Í¥ë¥é¥Ã¥Ñ¡¼¥ë¡¼¥Á¥ó


¥é¥¤¥Ö¥é¥ê´Ø¿ô¤òÍøÍѤǤ­¤Ê¤¤¥«¡¼¥Í¥ë¥¹¥ì¥Ã¥É¤«¤é¸Æ¤Ó½Ð¤¹¤¿¤á¤Ë¥Þ¥¯¥í¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡£

Menu

Mac

    • Homebrew?

Perl

    • cpanm?

2011ÎعÖ

¥á¥ó¥Ð¡¼¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹