HCFãnã ãHalt and Catch Fireãã®ããŒã¢ããã¯ãç Žå£çãªå¯äœçšã䌎ããææžåãããŠããªãåç¥è©±çãªæ©æ¢°åœä»€ã®ãããã<...>
å°éçšèªãã¡ã€ã«
以åã®æçš¿ã§ãã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã ã®ãœãããŠã§ã¢ã¢ãã«ïŒã·ãã¥ã¬ãŒã¿ãŒïŒã®éçºã«ãããã¢ã»ã³ãã©ãŒã®å¿çšåéã«ã€ããŠã®è¬æŒãå§ããŸããã ãœãããŠã§ã¢ãã³ãŒããŒã®åäœã«ã€ããŠèª¬æããåäœãã¹ãã䜿çšããŠã·ãã¥ã¬ãŒã¿ãŒããã¹ãããæ¹æ³ã«ã€ããŠã説æããŸããã
ãã®èšäºã§ã¯ãã·ãã¥ã¬ãŒã¿ãŒã®çããéèŠãªã³ã³ããŒãã³ãã§ããã«ãŒãã«ãäœæããéã«ãããã°ã©ããŒããã·ã³ã³ãŒãã®æ§é ã«é¢ããç¥èãå¿
èŠãšããçç±ã説æããŸããã«ãŒãã«ã¯åã
ã®åœä»€ã®ã¢ããªã³ã°ãæ
åœããŸãã
ãããŸã§ã®ãšãããè°è«ã¯äž»ã«ã²ã¹ãã¢ã»ã³ãã©ãŒã«çŠç¹ãåœãŠãŠããŸããã ã¢ã»ã³ãã©ãŒãã¹ã¿ãŒã«ã€ããŠã話ããŸãã
ã¢ã»ã³ãã©ãŒãäžå¿ã«-ã·ãã¥ã¬ãŒã¿ãŒã®äžæ ž
æ¬æ Œçãªã·ãã¥ã¬ãŒã·ã§ã³è£œåã«ã¯ã
ãã«ãã«ã¡ã©ã® ãããŒãããå¿
èŠã§ããã²ã¹ãã³ãŒããå®è¡ããããã€ãã®æ¹æ³ã§ãã åžžã«ãæãå¹æçãªãã®ã䜿çšãããŸãã
äžè¬ã«ã解éããã€ããªå€æãããã³çŽæ¥å®è¡ã®3ã€ã®ãã¯ãããžãŒãåºå¥ãããŸãã ãããŠãããããã«ãã·ã³ã³ãŒããšã¢ã»ã³ãã©ã®å ŽæããããŸãã
éèš³ãšçµã¿èŸŒã¿
æãã·ã³ãã«ãªã€ã³ã¿ãŒããªã¿ãŒããŒã¹ã®ã·ãã¥ã¬ãŒã¿ãŒã¯ã移æ€å¯èœãªé«ã¬ãã«èšèªã§æžãããŠããŸãã ã€ãŸããåœä»€ãèšè¿°ãããã¹ãŠã®ããã·ãŒãžã£ã¯ããã®ããžãã¯ãCã§å®è£
ããã ãã§ãã
æ©æ¢°èªåœä»€ã®å€§éšåã¯ãCã§ç°¡åã«è¡šçŸã§ããããªãåçŽãªã»ãã³ãã£ã¯ã¹ãæã£ãŠããŸãã2ã€ã®æ°å€ãå ç®ãã3çªç®ã®æ°å€ãšæ¯èŒããå·Šã«ã·ããããå³ã«ã·ããããŸãã
ç¹æš©åœä»€ã¯ãéåžžãããŸããŸãªã¢ã¯ã»ã¹ãã§ãã¯ãå®è¡ããŠäŸå€ãã¹ããŒããå¿
èŠããããããããè€éã§ãã ãã ãããããã®æ°ã¯æ¯èŒçå°ãªãã§ãã
å°é£ãçããŸãã
IEEE 754çªå·ã§æ©èœããæé ã¯æ¬¡ã®ãšããã§ãã æµ®åå°æ°ç¹ããæµ®åãã ãããã®æ°å€ã®ããã€ãã®åœ¢åŒïŒfloat16ããfloat32ãfloat64ãå Žåã«ãã£ãŠã¯æºæšæºã®float80ãããã«ã¯float82ãŸã§ïŒãæ£ããåŠçããå¿
èŠããããŸãã æšæºã§ã¯ãããã説æããŠããŸããããŸã float128ãçŽæ¥ãµããŒãããŠããã¢ãŒããã¯ãã£ã¯ãªãããã§ãã éNaNæ°ãéæ£èŠåæ°ãç¶æããäžžãã¢ãŒããšäŸå€ã·ã°ãã«ãèæ
®ããŸãã ãŸãããµã€ã³ãã«ãŒããéæ°å€ãªã©ãããããçš®é¡ã®ç®è¡æŒç®ãå®è£
ããŸãã
ããã€ãã®ãã«ãã¯ãéåžžã«å€ãã®æšæºãå®è£
ãããªãŒãã³
Softfloatã©ã€ãã©ãªã§ãã
ã·ãã¥ã¬ãŒããå°é£ãªåœä»€ã®ã¯ã©ã¹ã®å¥ã®äŸã¯ããã¯ãã«SIMDã§ãã ãããã¯ãåãã¿ã€ãã®åŒæ°ã®ãã¯ãã«ã«å¯ŸããŠããã«1ã€ã®æäœãå®è¡ããŸãã 第äžã«ãæŽæ°ãªãã©ã³ãããããŸããããæµ®åãã§ãããæ©èœããŸãã 第äºã«ãçµã¿åããå¹æã®ããããã®ãããªåœä»€ãå€æ°ãããŸããåæäœã«ã¯ãããã€ãã®é·ãã®ãã¯ãã«ãšèŠçŽ 圢åŒããã¹ã¯åœ¢åŒããããã·ã³ã°ããããŒããã£ã¹ãã®ãªãã·ã§ã³ã®äœ¿çšãåé/åæ£ãªã©ããããŸãã
å¿
èŠãªãã¹ãŠã®ã²ã¹ãæ瀺ã®ãšãã¥ã¬ãŒãæé ãæ£åžžã«å®è£
ãããšãã¢ãã«ã®äœæè
ã¯éåžžã«äœãã€ã³ã¿ãŒããªã¿ãŒé床ã«ééããå¯èœæ§ãé«ããªããŸãã ããã¯é©ãã¹ãããšã§ã¯ãããŸããã1ã€ã®åœä»€ã§å®éã®ãã·ã³ã§è¡ãããããšã¯ããã¹ãŠã®ãšããžã¹ã¯ãªãããèšç®ããå
éšã«ãŒããšéèªæãªããžãã¯ãæã€ããã·ãŒãžã£ãšããŠã¢ãã«ã«è¡šç€ºãããŸãã åœä»€ã®ã»ãã³ãã£ã¯ã¹ãå®è£
ããããã®äœãããããã«å®è¡ããããïŒ
å°ãåŸ
ã£ãŠãã ããããã ãããã¹ãããã»ããµã«ã¯ãããããŸã£ããåããŸãã¯å°ãªããšãéåžžã«ãã䌌ãåœä»€ããããŸãã çã®ããã§ã¯ãªããå°ãªããšãäžéšã®ããã«ããŸãããã ããã«ãäžè¬çãªã³ã³ãã€ã©ã¯ãã³ãŒãã«ãã·ã³åœä»€ãå«ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸã-
çµã¿èŸŒã¿ ïŒè±èªçµã¿èŸŒã¿-å
éšïŒ-ãã·ã³åœä»€ãã©ããããé¢æ°ã®èª¬æã
Intel SDMã® LZCNTåœä»€ã®çµã¿èŸŒã¿èšè¿°ã®äŸïŒ
ã€ã³ãã«C / C ++ã³ã³ãã€ã©çµã¿èŸŒã¿é¢æ°
LZCNTïŒ
笊å·ãªã__int32 _lzcnt_u32ïŒç¬Šå·ãªã__int32 srcïŒ;
LZCNTïŒ
笊å·ãªã__int64 _lzcnt_u64ïŒç¬Šå·ãªã__int64 srcïŒ;
GCCã§ãåãçµã¿èŸŒã¿é¢æ°ãæ©èœããŸãã 以äžã§ã¯ãå°ãå®éšãè¡ããŸããã
$ cat lzcnt1.c #include <stdint.h> #include <immintrin.h> int main(int argc, char **argv) { int64_t src = argc; int64_t dst = _lzcnt_u64(src); return (int)dst; } $ gcc -O3 -mlzcnt lzcnt1.c # , .. LZCNT $ objdump -d a.out <......> Disassembly of section .text: 00000000004003c0 <main>: 4003c0: 48 63 c7 movslq %edi,%rax 4003c3: f3 48 0f bd c0 lzcnt %rax,%rax 4003c8: c3 retq 4003c9: 90 nop 4003ca: 90 nop 4003cb: 90 nop <......>
æé©åãã©ã°
-O3
ã³ã³ãã€ã©ã¯ãã¹ãŠã
_lzcnt_u64()
ããŸããããé¢æ°ã
_lzcnt_u64()
ãããããããŒã°ãŸãã¯ãšãããŒã°ã¯ãªããå¿
èŠãªãã·ã³åœä»€ã®ã¿ããããŸããã
æ©æ¢°åœä»€ã®ããã«ãéåžžå€ãã®çµã¿èŸŒã¿é¢æ°ããããŸãïŒãã ããåœä»€ãããå°ãªãã§ãïŒã åã³ã³ãã€ã©ãŒã¯ç¬èªã®ã»ãããæäŸããŸãããä»ã®ã³ã³ãã€ã©ãŒãšã¯å€å°ç°ãªããŸãã
- Microsoftã³ã³ãã€ã©ã«ååšããçµã¿èŸŒã¿é¢æ°ã¯ãMSDNã®x86ããã³x64ã§åå¥ã«èª¬æãããŠããŸãã
- ã€ã³ãã«C / C ++ã³ã³ãã€ã©ãŒã®ããã¥ã¡ã³ãã¯ãæ°å¹ŽåããWebããŒãžã§äŸ¿å©ãªã€ã³ã¿ã©ã¯ãã£ã圢åŒã§å
¥æã§ããŸã ã æ¡åŒµã¯ã©ã¹ïŒSSE2ãSSE3ãAVXãªã©ïŒããã³æ©èœïŒãããæäœãè«çãæå·åãªã©ïŒã§ãã£ã«ã¿ãŒããã»ãã³ãã£ã¯ã¹ãšé床ã«é¢ãããã«ããååŸããããšã¯éåžžã«äŸ¿å©ã§ãã察çïŒã
- IA-32çšã®GCCã³ã³ãã€ã©ãŒã®çµã¿èŸŒã¿é¢æ°ã¯ãICCã«ã€ããŠèª¬æãããã®ãšåºæ¬çã«åãã§ãã
- Clangã®å Žåãã©ã®ã¢ãŒããã¯ãã£ã§ãå©çšå¯èœãªçµã¿èŸŒã¿é¢æ°ã«é¢ããæ確ãªããã¥ã¡ã³ãã¯èŠã€ãããŸããã§ããã èªè
ããã®åé¡ã«é¢ããé¢é£æ
å ±ãæã£ãŠããå Žåã¯ãã³ã¡ã³ãã§å
±æããŠãã ããã
ææžãã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã»ã¯ã·ã§ã³ãšæ¯èŒããŠãçµã¿èŸŒã¿é¢æ°ã«ã¯æ¬¡ã®å©ç¹ããããŸãã
- é¢æ°åŒã³åºãã¯ã¯ããã«éŠŽæã¿ããããç解ãããããäœææã«ãããæãªãå¯èœæ§ãäœããªããŸãã çµã¿èŸŒã¿é¢æ°ã¯ãå
¥åããã³åºåã¬ãžã¹ã¿ã®å²ãåœãŠäœæ¥ãã³ã³ãã€ã©ã«è»¢éããæ§æãã§ãã¯ãåäžèŽãããã³ãã®ä»ã®æçšãªããšãå®è¡ããå¿
èŠã«å¿ããŠåé¡ãå ±åããããšãã§ããŸãã ã€ã³ã©ã€ã³ã³ãŒãã®å Žåãã¢ã»ã³ãã©ãŒèšºæã¯ã¯ããã«äžå¯è§£ã§ãã ãã°ãã°GNUã®clobberä»æ§ãèšè¿°ããªããã°ãªããªãïŒãããŠãããã«èª€ããç¯ãïŒäººã¯èª°ã§ãç§ã«åæããŸãã
- ã³ã³ãã€ã©åãã®çµã¿èŸŒã¿é¢æ°ã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã®ããã©ãã¯ããã¯ã¹ãã§ã¯ãããŸãããã€ã³ã©ã€ã³ããã¯ã¹ã§ã¯ãæªç¥ã®ã¬ãžã¹ã¿ãšã¡ã¢ãªã®æŽæ°ãçºçããŸãã ãããã£ãŠããã®ã¬ãžã¹ã¿å²ãåœãŠã¢ã«ãŽãªãºã ã¯ãããã·ãŒãžã£ã³ãŒããåŠçãããšãã«ãããèæ
®ããããšãã§ããŸãã ãã®çµæãããé«éãªã³ãŒããç°¡åã«ååŸã§ããŸãã
- çµã¿èŸŒã¿é¢æ°ã¯åŒ±ãã§ãããã³ã³ãã€ã©éã§ç§»æ€å¯èœã§ãïŒãã¹ãã¢ãŒããã¯ãã£ã¯ç§»æ€ã§ããŸããïŒã 極端ãªå Žåããã¹ãã¢ãŒããã¯ãã£ãåœä»€ãçŽæ¥ãµããŒãããŠããªãå Žåãå®è£
ã®ãããã¿ã€ããäœæã§ããŸãã ã±ãŒã¹ã¹ã¿ãã£ïŒSSE2åœä»€
CVTSI2SD xmm, r/m64
ã¯ã32ãããããã»ããµã¢ãŒãã§æå¹ãªãšã³ã³ãŒãããããŸããã ãããã£ãŠã64ãããã¢ãŒãã§ã¯ããŒã«ãæåã«éçºãããããçµã¿èŸŒã¿ã§ãããã³ãŒãã¯ããã䜿çšããŠããŸããããçµã¿èŸŒã¿é¢æ°ã¯ãããŸããã 32ããããã¹ãã§ã³ãŒããã³ã³ãã€ã«ãããšããšã©ãŒãã¹ããŒãããŸããã ãã®çµã¿èŸŒã¿é¢æ°ã«é¢é£ä»ããããããã·ãŒãžã£ã¯ãããããã§ã¯ãªãã£ãããïŒã¢ããªã±ãŒã·ã§ã³ã®é床ã¯ãããã«äŸåããŠããŸããïŒãç¬èªã®_mm_cvtsi64_sd()
å®è£
ã¯Cã§èšè¿°ããã32ãããã¢ã»ã³ããªã«çœ®ãæããããŸããã
ããããŸãã¯ãã®ä»ã®çç±ã«ãããMicrosoft
㯠x64ã¢ãŒããã¯ãã£ã®MS Visual Studio 2010以éã§ã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ãŒã®ãµããŒãã
åæ¢ããŸããã ãã®å Žåããã·ã³ã³ãŒããC / C ++ãã¡ã€ã«ã«æ¿å
¥ããã«ã¯ãçµã¿èŸŒã¿é¢æ°ã®ã¿ã䜿çšã§ããŸãã
ãã ããçµã¿èŸŒã¿é¢æ°ã®äœ¿çšã¯äžèœè¬ã§ãããšèšã£ãŠãçå®ã«åããã§ãããã ããã§ããã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã³ãŒãã«æ³šç®ããå¿
èŠããããŸããç¹ã«ã
æ倧éã®ããã©ãŒãã³ã¹ãåŒãåºãããå Žåã¯æ³šæãå¿
èŠã§ãã
ãã€ããªãã©ã³ã¹ã¬ãŒã¿ãšã³ãŒãçæ
ãã€ããªãã©ã³ã¹ã¬ãŒã¿ïŒä»¥éDTãšåŒã³ãŸãïŒã¯ãã²ã¹ããã·ã³ã³ãŒãã®ãããã¯å
šäœããã¹ããã·ã³ã³ãŒãã®åçã®ãããã¯ã«å€æãããããã³ãŒãã®å Žåã¯ç¹°ãè¿ãå®è¡ããããããéåžžã¯ã€ã³ã¿ãŒããªã¿ãŒãããé«éã«åäœããŸãã ã€ã³ã¿ããªã¿ïŒãã£ãã·ã³ã°ãå®è£
ãããŠããªãå ŽåïŒã¯ãããšãæè¿äœ¿çšãããšããŠããæåããééããåã²ã¹ãåœä»€ã匷å¶çã«åŠçããŸãã
ãŸãããã¹ãã¢ãŒããã¯ãã£ã®æ©èœã䜿çšããã«æåããæåŸãŸã§èšè¿°ã§ããã€ã³ã¿ãŒããªã¿ãŒãšã¯ç°ãªããDTã¯ã¢ã»ã³ãã©ãŒãšæ©æ¢°èªåœä»€ã®ãšã³ã³ãŒãã®äž¡æ¹ã®ç¥èãå¿
èŠãšããŸãã ã·ãã¥ã¬ãŒã¿ãæ°ãããã¹ãã·ã¹ãã ã«è»¢éããå Žåãã³ãŒãçæã«æ£ç¢ºã«é¢äžããéèŠãªéšåãæžãæããå¿
èŠããããŸãã ããã¯é床ã®ä»£äŸ¡ã§ãã
ãã®èšäºã§ã¯ããããã
ãã³ãã¬ãŒããã©ã³ã¹ã¬ãŒã¿ãŒãäœæããç°¡åãªæ¹æ³ã®1ã€ã«ã€ããŠèª¬æããŸãã èå³ãããå Žåã¯ãå¥ã®æ©äŒã«ããã€ããªç¿»èš³ã®ããé«åºŠãªæ¹æ³ã«ã€ããŠã話ããŸãã
ãã³ãŒããŒããã²ã¹ãã®åœä»€ã«é¢ããæ
å ±ãåãåã£ãDTã¯ããã®ããã®ãã·ã³ã³ãŒããã€ãŸã
ã«ãã»ã«ãçæããŸãã é 次å®è¡ãããè€æ°ã®åœä»€ã«ã€ããŠãé çªã«èšé²ãããã«ãã»ã«ã§æ§æããã
翻蚳åäœãäœæãããŸãã ãã®çµæãã²ã¹ãã·ã¹ãã å
ã®æåã®ç¿»èš³ãããåœä»€ã«å¶åŸ¡ã移ããšãããã®ã³ãã³ããšåŸç¶ã®ã³ãã³ããã·ãã¥ã¬ãŒãããã«ã¯ã翻蚳ãŠãããããã³ãŒããå®è¡ããã ãã§ååã§ãã
ãªãã³ãŒããšãªãã©ã³ãã®å€ãç¥ã£ãŠãã²ã¹ãåœä»€ã®ã³ãŒããçæããæ¹æ³ã¯ïŒ ãªãã³ãŒãã«åŸã£ãŠãã·ãã¥ã¬ãŒã¿ãŒã¯
ãã³ãã¬ãŒããéžæããŸããããã¯ãç®çã®ã»ãã³ãã£ã¯ã¹ãå®è£
ãããã¹ããã·ã³ã³ãŒãã®ãã¬ãã£ãã¯ã¹ã§ãã ãã®ãããªãã³ãã¬ãŒããåäžã®ç¿»èš³åäœã«çŽæ¥ãæ¥çããããããããããŒã°ãšãšãããŒã°ãååšããªããšããç¹ã§ãã³ã³ãã€ã©ã«ãã£ãŠéåžžäœæãããæé ãšã¯åºå¥ãããŸãã ãã ããããã§ããŸã 翻蚳åäœãæºåå®äºãšããŠããŒã¯ããã«ã¯ååã§ã¯ãããŸããã
å¥ã®ã¿ã¹ã¯ã¯æªéæã®ãŸãŸã§ãã-ãªãã©ã³ãã®å€ãåŒæ°ãšããŠãã³ãã¬ãŒãã«æž¡ãããã³ãã¬ãŒããç¹æ®åããŠã«ãã»ã«ã«å€æããŸãã ããã«ãã»ãšãã©ã®å Žåããªãã©ã³ããå€æã®æ®µéã§æ£ç¢ºã«è»¢éããå¿
èŠããããŸãããããã¯æ¢ã«ããã£ãŠããŸãã ã€ãŸããã«ãã»ã«ã®ãã¹ãã³ãŒãã«çŽæ¥ãçž«ãä»ãããå¿
èŠããããŸãã æé»ã®ãªãã©ã³ãïŒããšãã°ãã¹ã¿ãã¯ã«ããå€ïŒã§ã¯ãããã¯æ©èœããããã¡ãããæéã浪費ããªãããã·ãã¥ã¬ãŒã·ã§ã³æ®µéã§åŠçããå¿
èŠããããŸãã
æ瀺çãªãªãã©ã³ãã®ã»ããã®æ¬¡å
ïŒ=çµã¿åããã®æ°ïŒãå°ããå Žåããããã®çµã¿åããã¯ããã®åœä»€ã®ãã¿ãŒã³ã®ã°ã«ãŒãïŒçµã¿åããããšã«1ã€ïŒã«ãçž«ãä»ãããããšãã§ããŸãã ãã®çµæãã²ã¹ããªãã³ãŒãããšã«ããªãã©ã³ããç¹å®ã®åã±ãŒã¹ã§äœ¿çšããå€ã«å¿ããŠãNåã®ãã¿ãŒã³ããéžæããå¿
èŠããããŸãã
æ®å¿µãªããããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã å®éã«ã¯ããªãã©ã³ãã®æ°ã®çµã¿åãããççºçã«å¢ããããããªãã©ã³ãã®ãã¹ãŠã®å¯èœãªå€ã®ãã¿ãŒã³ãçæããããšã¯äžå¯èœãªå ŽåããããããŸãã ãããã£ãŠã32åã®ã¬ãžã¹ã¿ãæã€ã¢ãŒããã¯ãã£ã§ã®3ãªãã©ã³ãã³ãã³ãã«ã¯ã32Ã32Ã32 =2¹âµãããã¯ã®ã³ãŒããå¿
èŠã§ãã ãŸããã²ã¹ãã¢ãŒããã¯ãã£ã«32ãããå¹
ã®ãªãã©ã«ãªãã©ã³ãïŒããã³ãã¹ãŠã®éèŠãªãªãã©ã³ãïŒãããå Žåã2³²ã®ã«ãã»ã«ãªãã·ã§ã³ãæ ŒçŽããå¿
èŠããããŸãã ããªãã¯äœããèãåºãå¿
èŠããããŸãã
å®éãã»ãšãã©åäžã®ãã³ãã¬ãŒãã®æãä¿åããå¿
èŠã¯ãããŸãã-ãããã¯ãã¹ãŠåãææè
ã®æ瀺ãå«ãã§ããŸãã ã²ã¹ããªãã©ã³ããå€æŽãããšããã¹ããªãã©ã³ãã®äžéšã®ã¿ãå€æŽãããŸãïŒãã ããåœä»€ã®é·ãã¯ä»¥åã®
æçš¿ãåç
§ããŠãã ããïŒãã·ãã¥ã¬ãŒããããç¶æ
ã®æ ŒçŽå ŽæãŸãã¯éä¿¡ããããªãã©ã«ãèšè¿°ãããŸãã ãã³ãã¬ãŒãããã«ãã»ã«ãäœæãããšãã¯ã察å¿ãããªãã»ããã§ããããŸãã¯ãã€ãããããããããã ãã§ãã
æ奜家ãžã®è³ªåïŒäžèšã®äŸã®ã©ã®ã¢ãŒããã¯ãã£ãã²ã¹ãããã³ãã¹ããšããŠäœ¿çšãããŠããŸããïŒ
ãããã£ãŠãDTã䜿çšããã·ãã¥ã¬ãŒã¿ãŒã®åã²ã¹ãåœä»€ã«ã¯ã1ã€ã®ãã¹ã¿ãŒãã¹ãã³ãŒããã³ãã¬ãŒããšãæ£ãããªãã©ã³ãã®å
ã®ãªãã©ã³ããä¿®æ£ãã1ã€ã®ããã·ãŒãžã£ã§ååã§ãã åœç¶ããã³ãã¬ãŒãã«æ£ããããããé©çšããã«ã¯ããã¹ãŠã®ãªãã©ã³ãã®å
é ã«å¯Ÿãããªãã»ãããç¥ãå¿
èŠããããŸããã€ãŸãããã¹ãã·ã¹ãã ã®ã³ãã³ãã®ãšã³ã³ãŒããç解ããå¿
èŠããããŸãã å®éãç¬èªã®ãšã³ã³ãŒããŒãå®è£
ããããäœããã®æ¹æ³ã§ãµãŒãããŒãã£ããŒã«ã®äœæ¥ããå¿
èŠãªæ
å ±ãåé¢ããæ¹æ³ãåŠç¿ããå¿
èŠããããŸãã
äžè¬ã«ããã³ãã¬ãŒãã®å€æããã»ã¹ã次ã®å³ã«ç€ºããŸãã
çŽæ¥å®è¡ãšä»®æ³å
ç§ãæ€èšããŠãã3çªç®ã®ã·ãã¥ã¬ãŒã·ã§ã³ã¡ã«ããºã ã¯ãçŽæ¥å®è¡ã§ãã ãã®åäœã®åçã¯ååã«çŽæ¥åŸã£ãŠããŸã-ã²ã¹ãã³ãŒããã·ãã¥ã¬ãŒãããå€æŽããã«ãã¹ãäžã§èµ·åããŸãã æããã«ããã®æ¹æ³ã¯æœåšçã«æé«ã®ã·ãã¥ã¬ãŒã·ã§ã³é床ãæäŸããŸãã ãããã圌ã¯æããã ãŒãã£ãŒãã§ããããŸãã 以äžã®èŠä»¶ãæºããå¿
èŠããããŸãã
- ã²ã¹ããšãã¹ãã®ã¢ãŒããã¯ãã£ã¯äžèŽããå¿
èŠããããŸãã ã€ãŸããMIPSã§ARMã®ã³ãŒããçŽæ¥ã·ãã¥ã¬ãŒãããããšã¯ã§ããŸããããã®éãåæ§ã§ãã ãããã«ããŠããããã¯çŽæ¥å®è¡ãããŸããã
- ãã¹ãã¢ãŒããã¯ãã£ã¯å¹æçãªä»®æ³åã®æ¡ä»¶ãæºãããªããã°ãªããŸããã
ã²ã¹ãã¢ãŒããã¯ãã£ãæå®ãããæ¡ä»¶ïŒããšãã°ãIntel®VT-xæ¡åŒµãåããIntel IA-32 / Intel 64ïŒãæºãããŠãããšä»®å®ããŸãã ã·ãã¥ã¬ãŒã¿ã«çŽæ¥å®è¡ã®ãµããŒããè¿œå ãããšãã«çºçãã次ã®ã¿ã¹ã¯ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ã¢ãžã¥ãŒã«ïŒãã©ã€ããŒïŒã®äœæã§ãã ãããªãã§ã¯å®è¡ã§ããŸãããã·ãã¥ã¬ãŒã¿ã¯ç¹æš©åœä»€ãå®è¡ããããŒãžããŒãã«ãç©çã¡ã¢ãªãå²ã蟌ã¿ãªã©ã®ã·ã¹ãã ãªãœãŒã¹ãæäœããå¿
èŠããããŸãã ãŠãŒã¶ãŒã®ã¹ããŒã¹ããã¯ã¢ã¯ã»ã¹ã§ããŸããã äžæ¹ãã«ãŒãã«ãå®å
šã«ãæãäžãããããšã¯æ害ã§ãããã©ã€ããŒã®ããã°ã©ãã³ã°ãšãããã°ã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ã©ã ãæžããããã¯ããã«æéãšåŽåãããããŸãã ãããã£ãŠãéåžžã¯ãã·ã¹ãã ã³ãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¢ã¯ã»ã¹ãããæå°éã®ã·ãã¥ã¬ãŒã¿ãŒæ©èœã®ã¿ãã«ãŒãã«ã«æã¡åºãããŸãã ç§ãç¥ã£ãŠãããã¹ãŠã®ä»®æ³ãã·ã³ãšã·ãã¥ã¬ãŒã¿ãŒã¯ãçŽæ¥å®è¡ã䜿çšããããšã§ãã«ãŒãã«ã¢ãžã¥ãŒã«ãšããã䜿çšãããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã®ããã«èšèšãããŠããŸãã
ã«ãŒãã«ã¢ãžã¥ãŒã«ã¯ç¹å®ã®OSã«æžã蟌ãŸãããããã¢ããªã±ãŒã·ã§ã³ãå¥ã®OSã«è»¢éãããšãã¯ãããããéåžžã«åŒ·åã«æžãæããå¿
èŠãããããšãç解ããå¿
èŠããããŸãã ããã¯ããµã€ãºãæå°åãããã1ã€ã®çç±ã§ãã
ååãšããŠãã«ãŒãã«ã§ã®ã¢ã»ã³ãã©ãŒã®äœ¿çšã¯ããŠãŒã¶ãŒã©ã³ããšã»ãŒåãæ¡ä»¶äžã§æ£åœåãããŸããã€ãŸãããããªãã§ã¯ã§ããªãå Žåã§ãã ä»®æ³ãã·ã³ã¯ãVMCSïŒä»®æ³ãã·ã³å¶åŸ¡æ§é ïŒãå¶åŸ¡ããããã°ãã¢ãã«åºæã®ã¬ãžã¹ã¿ãªã©ã®ã·ã¹ãã æ§é ãšé£æºããŸãããããã®ã¬ãžã¹ã¿ã¯ãç¹æ®ãªåœä»€ã§ã®ã¿å©çšã§ããŸãã ãããã«çµã¿èŸŒã¿é¢æ°ã䜿çšããã®ãæãåççã§ããã...
ãã¹ãŠã®æ©æ¢°èªåœä»€ã«æ¢è£œã®çµã¿èŸŒã¿é¢æ°ãããããã§ã¯ãããŸããã äž»ã«ãŠãŒã¶ãŒã³ãŒãããã«ãããããã«èšèšãããã³ã³ãã€ã©ãŒã§ã¯ããã©ã€ããŒã©ã€ã¿ãŒã®ããŒãºãã©ãã«ãããŠå¿ããŠããŸããŸãã ãããã«ã¢ã¯ã»ã¹ããã«ã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã䜿çšããå¿
èŠããããŸãã ããšãã°ãKVMä»®æ³ãã·ã³ã®ãœãŒã¹ã³ãŒãã«ã¯ãVMCSãã£ãŒã«ããèªã¿åãããã®é¢æ°ã®
å®çŸ©ããããŸãã
#define ASM_VMX_VMREAD_RDX_RAX ".byte 0x0f, 0x78, 0xd0" static __always_inline unsigned long vmcs_readl(unsigned long field) { unsigned long value; asm volatile (__ex_clear(ASM_VMX_VMREAD_RDX_RAX, "%0") : "=a"(value) : "d"(field) : "cc"); return value; }
æ£çŽãªãšããã
vmread
ã§ã¯vmreadããŒã¢ããã¯ã®VMREADåŒã³åºããæåŸ
ããŠããŸãããäœããã®çç±ã§ãã€ã圢åŒã®çã®è¡šçŸã䜿çšãããŠããŸãã ãã¶ããã®æ¹æ³ã§ãèè
ã¯ãã®ãããªåœä»€ãç¥ããªãã³ã³ãã€ã©ã§ã¢ã»ã³ããªããµããŒããããã£ãã§ãããã
ãšããã§ãäžèšã®äŸã®LZCNTã®åºæã®äŸã¯ã次ã®ããã«ã€ã³ã©ã€ã³ã¢ã»ã³ãã©åœ¢åŒã䜿çšããŠæžãæããããšãã§ããŸãã ãã®åçŽãªã±ãŒã¹ã§ã¯ããã·ã³ã³ãŒãã¯åãããã«çæãããŸãã
#include <stdint.h> int main(int argc, char **argv) { int64_t src = argc; int64_t dst; __asm__ volatile( "lzcnt %1, %0\n" :"=r"(dst) :"r"(src) :"cc" ); return (int)dst; }
ãã®èšäºã§ã¯ãGNUã€ã³ã©ã€ã³ã¢ã»ã³ãã©åœ¢åŒã®æ©èœã«ã€ããŠè©³çŽ°ã«èª¬æããã€ããã§ãããããããè¡ããªãããšã«ããŸããã ãã®ãããã¯ã«é¢ããå€ãã®æ
å ±ãã€ã³ã¿ãŒãããäžã«ãããŸãã ããã§ãå¿
èŠãªå Žåã¯ã次ã®èšäºã§ãããè¡ãããšãã§ããŸãã
ã¢ã»ã³ãã©å
šäœã1ã€ã®ãã¡ã€ã«ã«ã¢ã»ã³ãã«ããæ¹ããCã³ãŒãã«ã¢ã»ã³ãã«ãããããæçã§ãã KVMã®äŸã¯èŠã€ãããŸããã§ãããã
Xenã®äŸããããŸããã ãã®ãã¡ã€ã«ã§ã¯ãã¢ã»ã³ãã©èªäœã®éã¯4åã®1以äžã§ãããæ®ãã¯ãã®ã³ãŒãã®æ©èœãšãã®ã€ã³ã¿ãŒãã§ãŒã¹ãææžåããããªããã»ããµãã£ã¬ã¯ãã£ããšã³ã¡ã³ãã§ãã
ãŸãšã
ã¢ã»ã³ããªèšèªã¯ãã·ãã¥ã¬ãŒã·ã§ã³ãœãªã¥ãŒã·ã§ã³ã®éçºã«ãããŠéèŠãªåœ¹å²ãæãããŸãã ããã¯ãã¢ãã«ã®ããŸããŸãªã³ã³ããŒãã³ãã§äœ¿çšãããã»ããã¢ãã«ããã¹ãããããã»ã¹ã§ã䜿çšãããŸãã
é«ã¬ãã«èšèªã䜿çšããè€éãªãããžã§ã¯ãã®ã¢ã»ã³ãã©ãŒã³ãŒãèªäœã¯ã3ã€ã®æ¹æ³ã§è¡šãããšãã§ããŸãã
- çµã¿èŸŒã¿é¢æ°ã¯ãéåžžã®C / C ++é¢æ°ã®ã€ã³ã¿ãŒãã§ãŒã¹ãåããåã
ã®ãã·ã³åœä»€ã®ã©ãããŒã§ãã
- ã¢ã»ã³ãã©ãŒæ¿å
¥-éžæããã³ã³ãã€ã©ãŒ/ã¢ã»ã³ãã©ãŒã«åºæã®ã¢ã»ã³ãã©ãŒã³ãŒãã®ãã©ã°ã¡ã³ãã§ãããããåãå·»ãé«ã¬ãã«ã®ã³ãŒããšäžèŽããŸãã
- å®å
šã«ã¢ã»ã³ãã©ãŒã§èšè¿°ããããã¡ã€ã«-ã¢ã¯ã·ã§ã³ã®ç¹å®ã®ã·ãŒã±ã³ã¹ãå®å
šã«ã¢ã»ã³ãã©ãŒã§è¡šçŸããæ¹ã䟿å©ãªïŒãŸããªïŒå Žåã«äœ¿çšãããŸãã ãããã¯ãé¢æ°ã€ã³ã¿ãŒãã§ã€ã¹ïŒç®çã®ãã©ãããã©ãŒã ã®ABIãç¬ç«ããŠå®è£
ããïŒãä»ããŠããŸãã¯äœããã®æ¹æ³ã§çžäºäœçšããªãïŒç¬ç«ããåäœãã¹ãã®å ŽåïŒã®ãããããéããŠãå€éšã®äžçãšå¯Ÿè©±ããŸãã