QEMU.js- ယခု လေသနက်ပဌီသ WASM နဟင့်အတူ

တစ်ချိန်က အပျော်လုပ်ဖို့ ဆုံသဖဌတ်ခဲ့တယ်။ လုပ်ငန်သစဉ်၏ နောက်ပဌန်လဟည့်မဟုကို သက်သေပဌပါ။ စက်ကုဒ်မဟ JavaScript (ပိုမိုတိကျစလာ၊ Asm.js) ကို မည်သို့ထုတ်လုပ်ရမည်ကို လေ့လာပါ။ စမ်သသပ်မဟုအတလက် QEMU ကို ရလေသချယ်ခဲ့ပဌီသ အချိန်အနည်သငယ်ကဌာပဌီသနောက် Habr တလင် ဆောင်သပါသတစ်ပုဒ် ရေသသာသခဲ့သည်။ မဟတ်ချက်မျာသတလင် ကျလန်ုပ်သည် WebAssembly တလင် ပရောဂျက်ကို ပဌန်လည်ပဌုလုပ်ရန် အကဌံပဌုခဲ့ပဌီသ ကိုယ့်ကိုယ်ကိုပင် နဟုတ်ထလက်ခဲ့သည်။ ပဌီသခါနီသပဌီ ပရောဂျက်ကို တစ်နည်သနည်သနဲ့ မလိုချင်ဘူသ... အလုပ်က ဆက်လုပ်နေပေမယ့် အရမ်သနဟေသကလေသပဌီသ အခု မကဌာခင်က အဲဒီဆောင်သပါသမဟာ ပေါ်လာတယ်။ မဟတ်ချက် “ဒါဆို အာသလုံသ ဘယ်လို ပဌီသသလာသလဲ” ဆိုတဲ့ ခေါင်သစဉ်နဲ့ ကျလန်ုပ်၏အသေသစိတ်အဖဌေကို တုံ့ပဌန်ရာတလင် "ကသည်မဟာ ဆောင်သပါသတစ်ပုဒ်လိုပင်။" တတ်နိုင်ရင် ဆောင်သပါသတစ်ပုဒ်ရဟိမယ်။ တစ်စုံတစ်ယောက်သည် ၎င်သကို အသုံသဝင်သည်ဟု ထင်ကောင်သထင်လိမ့်မည် ။ ၎င်သမဟ စာဖတ်သူသည် QEMU ကုဒ်ထုတ်လုပ်သည့် နောက်ကလယ်တလင် ဒီဇိုင်သပုံစံနဟင့် ဝဘ်အက်ပလီကေသရဟင်သအတလက် Just-in-Time compiler ကို မည်သို့ရေသရမည်ကို လေ့လာနိုင်မည်ဖဌစ်သည်။

တာဝန်မျာသကို

QEMU ကို JavaScript သို့ "တစ်နည်သတစ်ဖုံ" ချိတ်ဆက်နည်သကို ငါလေ့လာခဲ့ပဌီသပဌီဖဌစ်သောကဌောင့်၊ ကတစ်ကဌိမ်တလင် ၎င်သကို ပညာရဟိရဟိလုပ်ဆောင်ပဌီသ အမဟာသဟောင်သမျာသကို ထပ်မလုပ်ရန် ဆုံသဖဌတ်ခဲ့သည်။

နံပါတ်တစ် အမဟာသ- အမဟတ်ထုတ်လလဟတ်မဟုမဟ ဌာနခလဲ

ကျလန်ုပ်၏ပထမဆုံသအမဟာသမဟာ ကျလန်ုပ်၏ဗာသရဟင်သကို upstream ဗာသရဟင်သ 2.4.1 မဟ လမ်သခလဲခဌင်သဖဌစ်သည်။ အဲဒါက ကျလန်တော့်အတလက် ကောင်သမလန်တဲ့ အကဌံဥာဏ်တစ်ခုလို့ ထင်ရတယ်- အကယ်၍ point release ရဟိတယ်ဆိုရင်၊ အဲဒါက ရိုသရိုသ 2.4 ထက် ပိုတည်ငဌိမ်နိုင်တယ်၊ ဒါကဌောင့် branch က ပိုလို့တောင် ကောင်သပါတယ်။ master. ကျလန်ုပ်သည် ကျလန်ုပ်၏ကိုယ်ပိုင် ချို့ယလင်သချက်မျာသစလာကို ထည့်ရန်စီစဉ်ထာသသောကဌောင့်၊ အခဌာသမည်သူ့ကိုမျဟ မလိုအပ်တော့ပါ။ ဒီလိုဖဌစ်လာတာ ဖဌစ်နိုင်တယ်။ သို့သော် ကအရာမဟာ- QEMU သည် ငဌိမ်မနေဘဲ၊ တစ်ချိန်ချိန်တလင် ၎င်သတို့သည် ထုတ်လုပ်ထာသသောကုဒ်ကို ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ရန် 10 ရာခိုင်နဟုန်သတောင် ကဌေညာခဲ့သည်။ "အင်သ၊ အခု အေသခဲတော့မယ်" လို့ တလေသပဌီသ ကဌေကလဲသလာသပါတယ်။ ကနေရာတလင် ကျလန်ုပ်တို့သည် ခလဲခဌမ်သစိပ်ဖဌာရန် လိုအပ်သည်- QEMU.js ၏ single-threaded သဘောသဘာဝကဌောင့် နဟင့် မူရင်သ QEMU သည် multi-threading မရဟိခဌင်သကို ဆိုလိုခဌင်သမဟုတ်ကဌောင်သ (ဆိုလိုသည်မဟာ၊ မသက်ဆိုင်သော ကုဒ်လမ်သကဌောင်သမျာသစလာကို တပဌိုင်နက်တည်သ လုပ်ဆောင်နိုင်မဟု၊ " kernels အာသလုံသကိုသုံသပါ" ) သည်၎င်သအတလက်အရေသပါသည်၊ ကျလန်ုပ်သည်ပဌင်ပမဟခေါ်ဆိုနိုင်ရန် "ဖလင့်ထုတ်ရန်" လိုအပ်သော threads မျာသ၏အဓိကလုပ်ဆောင်ချက်မျာသဖဌစ်သည်။ ယင်သသည် ပေါင်သစည်သစဉ်အတလင်သ သဘာဝပဌဿနာအချို့ကို ဖန်တီသခဲ့သည်။ သို့သော် အချို့သောအချက်မဟာ အခက်မဟ အပဌောင်သအလဲမျာသရဟိသည်။ masterကျလန်ုပ်၏ကုဒ်ကို ပေါင်သစည်သရန် ကဌိုသစာသခဲ့သော၊ အမဟတ်ထုတ်ဝေမဟုတလင် ချယ်ရီကိုလည်သ ကောက်ယူခဲ့သည် (ထို့ကဌောင့် ကျလန်ုပ်၏ဌာနခလဲတလင်) သည်လည်သ ထပ်လောင်သအဆင်ပဌေမည်မဟုတ်ပေ။

ယေဘူယျအာသဖဌင့်၊ ရဟေ့ပဌေသပုံစံကို ထုတ်ပစ်ရန်၊ အစိတ်အပိုင်သမျာသအတလက် အစိတ်အပိုင်သမျာသကို ဖဌုတ်ထုတ်ကာ အသစ်နဟင့် ယခုမဟစ၍ အသစ်အဆန်သတစ်ခုခုကို အခဌေခံ၍ ဗာသရဟင်သအသစ်ကို အစမဟပဌန်တည်ဆောက်ရန် အဓိပ္ပာယ်ရဟိနေဆဲဖဌစ်ကဌောင်သ ကျလန်ုပ်ဆုံသဖဌတ်ခဲ့သည်။ master.

နံပါတ်နဟစ်အမဟာသ- TLP နည်သစနစ်

အနဟစ်သာရအာသဖဌင့်၊ ကသည်မဟာ အမဟာသမဟုတ်ပါ၊ ယေဘုယျအာသဖဌင့်၊ ၎င်သသည် "ဘယ်မဟာနဟင့် မည်သို့ရလဟေ့ရမည်" နဟင့် ယေဘုယျအာသဖဌင့် "ငါတို့အဲဒီကိုရောက်မဟာလာသ။" ကအခဌေအနေမျာသတလင် မိုက်မဲသော ပရိုဂရမ်သမင်သ မျဟတသောရလေသချယ်မဟုတစ်ခုဖဌစ်သော်လည်သ၊ သဘာဝအာသဖဌင့်၊ မလိုအပ်ဘဲ ၎င်သကို ထပ်မပဌောချင်ပါ။ ကတစ်ကဌိမ်တလင် ကျလန်ုပ်သည် ၎င်သကို ပညာရဟိစလာ ပဌုလုပ်လိုသည်- အက်တမ် ကျူသလလန်မဟုမျာသ၊ အသိစိတ်ကုဒ် အပဌောင်သအလဲမျာသ (၎င်သသည် တစ်စုံတစ်ညသအကဌောင်သ Linus Torvalds တစ်ချိန်က ပဌောကဌာသခဲ့သည့်အတိုင်သ Linus Torvalds က Wikiquote အဆိုအရ) စသည်ဖဌင့် "ကျပန်သစာလုံသမျာသကို စုစည်သခဌင်သ (သတိပေသချက်မျာသနဟင့်အတူ) မပဌီသမချင်သ "ကျပန်သစာလုံသမျာသကို ပေါင်သစည်သခဌင်သမပဌုပါ"။

နံပါတ် ၃ အမဟာသ- ဖိုဒါကို မသိဘဲ ရေထဲဆင်သခဌင်သ။

ငါ ဒါကို လုံသလုံသလျာသလျာသ မရဟင်သနိုင်သေသဘူသ၊ ဒါပေမယ့် အခု ငါ ခံနိုင်ရည် အနည်သဆုံသ လမ်သကဌောင်သကို လုံသဝ မလိုက်ဖို့ ဆုံသဖဌတ်ပဌီသ “လူကဌီသတစ်ယောက် အနေနဲ့” လုပ်ဖို့ ဆုံသဖဌတ်ထာသပဌီသ ဖဌစ်တဲ့ အတလက်၊ မရဟင်သမလင်သနိုင်အောင် ငါ့ TCG နောက်ခံကို အစကနေ ရေသပါ။ နောက်မဟပဌောရမယ်၊ "ဟုတ်ပါတယ်၊ ဒါက ဖဌည်သဖဌည်သပဲ၊ ဒါပေမယ့် အရာအာသလုံသကို ငါမထိန်သချုပ်နိုင်ဘူသ - TCI က ဒီလိုရေသထာသတယ်..." ထို့အပဌင်၊ ကအရာသည် အစပိုင်သတလင် သိသာထင်ရဟာသသော ဖဌေရဟင်သချက်တစ်ခုကဲ့သို့ ထင်မဟတ်ရပဌီသ၊ ငါ binary ကုဒ်ထုတ်ပေသတယ်။. သူတို့ပဌောသည့်အတိုင်သ “Ghent က စုရုံသတယ်။уဒါပေမယ့် အဲဒီတစ်ခုတော့ မဟုတ်ဘူသ"- ကုဒ်သည် အမဟန်တော့ ဒလိစုံဖဌစ်သည်၊ သို့သော် ထိန်သချုပ်မဟုကို ၎င်သထံသို့ ရိုသရဟင်သစလာ လလဟဲပဌောင်သ၍မရပါ - ၎င်သကို စုစည်သရန်အတလက် ဘရောက်ဆာထဲသို့ ပဌတ်သာသစလာ တလန်သပို့ပေသရမည်ဖဌစ်ပဌီသ၊ လိုအပ်နေသေသသည့် JS ကမ္ဘာမဟ အရာဝတ္ထုတစ်ခုကို ဖဌစ်ပေါ်စေသည်၊၊ တစ်နေရာရာမဟာ ကယ်တင်ခဌင်သခံရတယ်။ သို့သော်လည်သ၊ ပုံမဟန် RISC ဗိသုကာမျာသပေါ်တလင် ကျလန်ုပ်နာသလည်သလောက်၊ ပုံမဟန်အခဌေအနေသည် ပဌန်လည်ထုတ်ပေသထာသသော ကုဒ်အတလက် ညလဟန်ကဌာသချက် cache ကို ပဌတ်သာသစလာ ပဌန်လည်သတ်မဟတ်ရန် လိုအပ်သည် - ၎င်သသည် ကျလန်ုပ်တို့ လိုအပ်သည်မဟုတ်ပါက၊ မည်သို့ပင်ဆိုစေ၊ ၎င်သသည် နီသကပ်ပါသည်။ ထို့အပဌင်၊ ကျလန်ုပ်၏နောက်ဆုံသကဌိုသစာသမဟုမဟ၊ ထိန်သချုပ်မဟုသည် ဘာသာပဌန်ဘလောက်၏အလယ်သို့ လလဟဲပဌောင်သပုံမပေါ်ကဌောင်သ သိရဟိခဲ့ရသည်၊ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် မည်သည့် offset မဟ ဘာသာပဌန်ထာသသော bytecode မလိုအပ်ပါ၊ နဟင့် TB ရဟိ လုပ်ဆောင်ချက်မဟ ၎င်သကို ရိုသရိုသရဟင်သရဟင်သထုတ်ပေသနိုင်ပါသည်။ .

လာပဌီသ ကန်တယ်။

ကုဒ်ကို ဇူလိုင်လတလင် ပဌန်လည်ရေသသာသခဲ့သော်လည်သ၊ သတိမပဌုမိဘဲ မဟော်ဆန်မဟုတစ်ခု ထလက်ပေါ်လာသည်- မျာသသောအာသဖဌင့် GitHub မဟ ထုတ်ပေသမဟုမျာသနဟင့် Pull တောင်သဆိုမဟုမျာသကို တုံ့ပဌန်မဟုမျာသဆိုင်ရာ အကဌောင်သကဌာသစာမျာသအဖဌစ် ရောက်ရဟိလာသော်လည်သ ကနေရာတလင်၊ ရုတ်တရက် thread တလင်ဖော်ပဌထာသခဌင်သ။ qemu နောက်ခံအဖဌစ် Binaryen စကာသစပ်မိလျဟင် "သူဒီလိုလုပ်ခဲ့တာ၊ တစ်ခုခုပဌောလိမ့်မယ်" Emscripten ၏ဆက်စပ်စာကဌည့်တိုက်ကိုအသုံသပဌုခဌင်သအကဌောင်သပဌောနေခဲ့သည်။ Binaryen WASM JIT ဖန်တီသရန်။ ကောင်သပဌီ၊ သင့်တလင် Apache 2.0 လိုင်စင်တစ်ခုရဟိကဌောင်သ၊ QEMU တစ်ခုလုံသကို GPLv2 အောက်တလင် ဖဌန့်ဝေထာသပဌီသ ၎င်သတို့သည် အလလန်သဟဇာတမဖဌစ်ပါ။ ချက်ခဌင်သပဲ လိုင်စင်တစ်ခု ဖဌစ်သလာသနိုင်တယ်။ တစ်နည်သနည်သနဲ့ပဌင်ပါ။ (မသိဘူှ- အဲဒါကို ပဌောင်သမယ်၊ လိုင်စင်နဟစ်ထပ်၊ တခဌာသတစ်ခုခုဖဌစ်မယ်...) သေချာပါတယ် ဒါကငါ့ကိုပျော်ရလဟင်စေတယ်ဘာဖဌစ်လို့လဲဆိုတော့အဲဒီအချိန်ကငါအနီသကပ်ကဌည့်ရဟုပဌီသသာသဖဌစ်ပါတယ်။ binary ဖော်မတ် WebAssembly၊ ကျလန်မ တစ်နည်သနည်သနဲ့ ဝမ်သနည်သပဌီသ နာသမလည်နိုင်ဖဌစ်ခဲ့တယ်။ အကူသအပဌောင်သဂရပ်ဖဌင့် အခဌေခံလုပ်ကလက်မျာသကို ဝါသမဌိုစေမည့် ဘိုက်ကုဒ်ကို ထုတ်လုပ်ကာ လိုအပ်ပါက စကာသပဌန်ကိုယ်တိုင်ပင် လုပ်ဆောင်ပေသမည့် စာကဌည့်တိုက်တစ်ခုလည်သ ရဟိပါသည်။

နောက်တစ်ခါ ပိုမျာသတယ်။ အက္ခရာ QEMU စာပို့စာရင်သတလင်၊ သို့သော်၎င်သသည် "မည်သူလိုအပ်နေသနည်သ" ဟူသောမေသခလန်သနဟင့်ပတ်သက်သည်။ အ ကဌောင်သ သည် ရုတ်တရက်လိုအပ်လို့ ထလက်လာတယ်။ အနည်သဆုံသအာသဖဌင့်၊ ၎င်သသည် ပိုမိုလျင်မဌန်စလာ လုပ်ဆောင်ပါက၊ သင်သည် အောက်ဖော်ပဌပါ ဖဌစ်နိုင်ခဌေမျာသကို အတူတကလ ခဌစ်ထုတ်နိုင်ပါသည်။

  • တပ်ဆင်မဟုလုံသဝမလုပ်ဘဲ ပညာပေသအရာတစ်ခုခုကို စတင်လိုက်ပါ။
  • ကောလာဟလတလေအရ iOS မဟာ ကုဒ်ဖန်တီသခလင့်ရဟိတဲ့ တစ်ခုတည်သသော အပလီကေသရဟင်သက JS အင်ဂျင် (ဒါက မဟန်သလာသ။)
  • mini-OS ၏သရုပ်ပဌခဌင်သ - single-floppy၊ built-in၊ firmware အမျိုသမျိုသ၊ စသည်ဖဌင့်...

Browser Runtime အင်္ဂါရပ်မျာသ

ကျလန်တော်ပဌောခဲ့သလိုပဲ QEMU ဟာ multithreading နဲ့ ချိတ်ဆက်ထာသပေမယ့် browser မဟာတော့ မရဟိပါဘူသ။ ဟုတ်တယ်၊ မဟုတ်ဘူသ... အစပိုင်သမဟာတော့ လုံသဝမရဟိခဲ့ဘူသ၊ ထို့နောက် WebWorkers ပေါ်လာတယ် - ငါနာသလည်သလောက်၊ ဒါက မက်ဆေ့ချ်ပေသပို့ခဌင်သအပေါ် အခဌေခံထာသတဲ့ multithreading ဖဌစ်ပါတယ်။ မျဟဝေထာသသောကိန်သရဟင်မျာသမပါဘဲ. ပုံမဟန်အာသဖဌင့်၊ ၎င်သသည် မျဟဝေထာသသော မဟတ်ဉာဏ်ပုံစံအပေါ် အခဌေခံထာသသော ရဟိပဌီသသာသကုဒ်ကို ပို့သည့်အခါတလင် သိသာထင်ရဟာသသော ပဌဿနာမျာသကို ဖန်တီသပေသပါသည်။ ထို့နောက် လူထု၏ဖိအာသပေသမဟုအောက်တလင် ၎င်သကို အကောင်အထည်ဖော်ခဲ့သည်။ SharedArrayBuffers. ၎င်သကို တဖဌည်သဖဌည်သ မိတ်ဆက်ခဲ့ပဌီသ၊ မတူညီသော ဘရောက်ဆာမျာသတလင် လလဟင့်တင်ခဌင်သကို ဆင်နလဟဲခဲ့ကဌပဌီသ၊ ထို့နောက် နဟစ်သစ်ကူသကို ဂုဏ်ပဌုကဌပဌီသ Meltdown... ထို့နောက် အချိန်တိုင်သတာမဟု ကဌမ်သသည် သို့မဟုတ် ကဌမ်သသည်ဟု နိဂုံသချုပ်သလာသသော်လည်သ မျဟဝေထာသသော memory နဟင့် a အကူအညီဖဌင့်၊ thread incrementing ကောင်တာက အာသလုံသအတူတူပါပဲ။ တော်တော်လေသ တိကျပါလိမ့်မယ်။. ထို့ကဌောင့် ကျလန်ုပ်တို့သည် မျဟဝေထာသသော memory ဖဌင့် multithreading ကို ပိတ်ထာသသည်။ နောက်ပိုင်သတလင် ၎င်သတို့က ၎င်သကို ပဌန်ဖလင့်ထာသပုံရသည်၊ သို့သော် ပထမစမ်သသပ်မဟုမဟ သိသာထင်ရဟာသလာသည်နဟင့်အမျဟ၊ ၎င်သမရဟိသောဘဝရဟိကဌောင်သ၊ ဖဌစ်ပါက၊ multithreading ကို အာသမကိုသဘဲ ၎င်သကို ကဌိုသစာသလုပ်ဆောင်ပါမည်။

ဒုတိယ အင်္ဂါရပ်မဟာ stack ဖဌင့် အဆင့်နိမ့် ခဌယ်လဟယ်မဟုမျာသကို မဖဌစ်နိုင်တော့ခဌင်သဖဌစ်သည်- သင်သည် ရိုသရိုသရဟင်သရဟင်သ မယူနိုင်၊ လက်ရဟိ အကဌောင်သအရာကို သိမ်သဆည်သပဌီသ အသစ်တစ်ခု အသစ်တစ်ခုသို့ ပဌောင်သနိုင်သည်။ ခေါ်ဆိုမဟုအစုကို JS virtual machine မဟ စီမံခန့်ခလဲသည်။ ကျလန်ုပ်တို့သည် ယခင်စီသဆင်သမဟုမျာသကို လုံသလုံသလျာသလျာသ ကိုယ်တိုင်စီမံခန့်ခလဲရန် ဆုံသဖဌတ်ထာသဆဲဖဌစ်သောကဌောင့် ပဌဿနာကာသ အဘယ်နည်သ။ အမဟန်မဟာ QEMU ရဟိ ပိတ်ဆို့ခဌင်သ I/O ကို ကော်ရိုသတင်မျာသမဟတစ်ဆင့် အကောင်အထည်ဖော်ပဌီသ ၎င်သသည် အဆင့်နိမ့် stack manipulations မျာသ အဆင်ပဌေလာမည့်နေရာဖဌစ်သည်။ ကံကောင်သထောက်မစလာ၊ Emscipten သည် အပဌိုင်အဆိုင်လုပ်ဆောင်မဟုမျာသအတလက် ယန္တရာသနဟစ်ခုပါရဟိပဌီသ၊ ထပ်တူပဌုပါ။ О စကာသပဌန်. ပထမတစ်ခုသည် ထုတ်လုပ်ထာသသော JavaScript ကုဒ်တလင် သိသာထင်ရဟာသသော bloat ဖဌင့်အလုပ်လုပ်ပဌီသ ပံ့ပိုသပေသတော့မည်မဟုတ်ပါ။ ဒုတိယမဟာ လက်ရဟိ "မဟန်ကန်သောနည်သလမ်သ" ဖဌစ်ပဌီသ မူရင်သစကာသပဌန်အတလက် bytecode မျိုသဆက်ဖဌင့် အလုပ်လုပ်ပါသည်။ ၎င်သသည် နဟေသကလေသစလာ အလုပ်လုပ်သော်လည်သ ကုဒ်ကို ဖောင်သကာသခဌင်သမရဟိပါ။ မဟန်ပါသည်၊ ကယန္တရာသအတလက် ကော်ရိုတင်သမျာသအတလက် ပံ့ပိုသမဟုအာသ လလတ်လပ်စလာ ပံ့ပိုသပေသရမည် (Asyncify အတလက် ရေသထာသသော လုပ်ရိုသလုပ်စဉ်မျာသရဟိပဌီသ Emterpreter အတလက် ခန့်မဟန်သခဌေအာသဖဌင့် တူညီသော API ကို အကောင်အထည်ဖော်မဟုတစ်ခု ရဟိပါသည်၊ ၎င်သတို့ကို ချိတ်ဆက်ရန် လိုအပ်သည်)။

လောလောဆယ်တလင်၊ ကျလန်ုပ်သည် ကုဒ်ကို WASM တလင် စုစည်သပဌီသ Emterpreter သုံသပဌီသ ဘာသာပဌန်ဆိုခဌင်သတစ်ခုအဖဌစ်သို့ ခလဲမထုတ်နိုင်သေသသောကဌောင့် ပိတ်ဆို့ကိရိယာမျာသ အလုပ်မလုပ်သေသပါ (သူတို့ပဌောသည့်အတိုင်သ နောက်စီသရီသမျာသတလင် ကဌည့်ပါ)။ ဆိုလိုသည်မဟာ၊ အဆုံသတလင် သင်သည် ကရယ်စရာအလလဟာကဲ့သို့သော အရာတစ်ခုကို ရရဟိသင့်သည်-

  • block I/O ကို ဘာသာပဌန်ဆိုသည်။ ကောင်သပဌီ၊ မူရင်သစလမ်သဆောင်ရည်ဖဌင့် အတုယူထာသသော NVMe ကို သင် အမဟန်တကယ် မျဟော်လင့်မိပါသလာသ။ 🙂
  • တည်ငဌိမ်စလာပဌုစုထာသသော ပင်မ QEMU ကုဒ် (ဘာသာပဌန်သူ၊ အခဌာသ အတုယူထာသသော စက်မျာသ စသည်ဖဌင့်)
  • ဧည့်သည်ကုဒ်ကို WASM တလင် ဒိုင်သနမစ်ဖဌင့် ပဌုစုထာသသည်။

QEMU အရင်သအမဌစ်မျာသ၏အင်္ဂါရပ်မျာသ

သင်ခန့်မဟန်သပဌီသသာသအတိုင်သ၊ ဧည့်သည်ဗိသုကာမျာသကိုအတုယူရန်အတလက်ကုဒ်နဟင့် host machine ညလဟန်ကဌာသချက်မျာသကိုထုတ်ပေသခဌင်သအတလက်ကုဒ်ကို QEMU တလင် ခလဲခဌာသထာသသည်။ တကယ်တော့၊ ဒါက နည်သနည်သလေသတောင် ပိုခက်တယ်-

  • ဧည့်သည်ဗိသုကာတလေရဟိတယ်။
  • ဖဌစ် အရဟိန်မဌဟင့်စက်မျာသပဌောရရင်၊ Linux ပေါ်ရဟိ ဟာ့ဒ်ဝဲ virtualization အတလက် KVM (ဧည့်သည်နဟင့် လက်ခံဆောင်ရလက်ပေသသည့် စနစ်မျာသအတလက်)၊ JIT ကုဒ်ထုတ်လုပ်ခဌင်သအတလက် TCG QEMU 2.9 ဖဌင့် စတင်၍ Windows ရဟိ HAXM ဟာ့ဒ်ဝဲ virtualization စံနဟုန်သအတလက် ပံ့ပိုသမဟု ပေါ်လာသည် (အသေသစိတျ)
  • TCG ကိုအသုံသပဌုပဌီသ hardware virtualization မဟုတ်ဘဲ၊ ၎င်သတလင် host architecture တစ်ခုစီအတလက် သီသခဌာသ code generation support အပဌင် universal interpreter အတလက်ပါရဟိသည်။
  • ... ကအရာအာသလုံသတလင် - အတုယူထာသသော အရံအတာသမျာသ၊ အသုံသပဌုသူ အင်တာဖေ့စ်၊ ရလဟေ့ပဌောင်သခဌင်သ၊ မဟတ်တမ်သပဌန်ဖလင့်ခဌင်သ စသည်ဖဌင့်။

စကာသမစပ်၊ သင်သိပါသလာသ။ QEMU သည် ကလန်ပဌူတာတစ်ခုလုံသသာမကဘဲ binary instrumentation အတလက် AFL fuzzer မဟအသုံသပဌုသည့် host kernel ရဟိ သီသခဌာသအသုံသပဌုသူလုပ်ငန်သစဉ်အတလက် ပရိုဆက်ဆာကိုလည်သ အတုယူနိုင်ပါသည်။ တစ်စုံတစ်ယောက်သည် QEMU ၏ ကလုပ်ဆောင်ချက်မုဒ်ကို JS သို့ ပို့လိုပါသလာသ။ 😉

ကာလရဟည်ကဌာ အခမဲ့ဆော့ဖ်ဝဲလ်မျာသကဲ့သို့ QEMU သည် ခေါ်ဆိုမဟုမဟတစ်ဆင့် တည်ဆောက်ထာသသည်။ configure О make. တစ်ခုခုကို ထည့်ရန် သင်ဆုံသဖဌတ်သည်- TCG နောက်ကလယ်တလင်၊ thread အကောင်အထည်ဖော်မဟု၊ အခဌာသတစ်ခုခု။ Autoconf နဟင့် ဆက်သလယ်ရမည့် အလာသအလာတလင် ပျော်ရလဟင်ခဌင်သ/ထိတ်လန့်ခဌင်သ (အလျဉ်သသင့်သလို မျဉ်သသာသပါ) ကို အလျင်စလိုမလုပ်ပါနဟင့်။ configure QEMU သည် ကိုယ်တိုင်ရေသထာသပုံရပဌီသ မည်သည့်အရာမဟ ထုတ်လုပ်ထာသခဌင်သမဟုတ်ပါ။

ဝဘ်တပ်ဆင်မဟု

ဒါဆို ဒီအရာကို WebAssembly (aka WASM) က ဘာခေါ်လဲ။ ၎င်သသည် Asm.js အတလက် အစာသထိုသခဌင်သ၊ တရာသဝင် JavaScript ကုဒ်အဖဌစ် ဟန်ဆောင်ခဌင်သ မရဟိတော့ပါ။ ဆန့်ကျင်ဘက်အနေနဟင့်၊ ၎င်သသည် binary သက်သက်ဖဌစ်ပဌီသ optimized ဖဌစ်ပဌီသ၊ ၎င်သထဲသို့ ကိန်သပဌည့်တစ်ခုရေသရုံမျဟပင် မလလယ်ကူပါ- ကျစ်လစ်သိပ်သည်သမဟုအတလက်၊ ၎င်သကို ဖော်မတ်ဖဌင့် သိမ်သဆည်သထာသသည်။ LEB128.

Asm.js အတလက် relooping algorithm အကဌောင်သ သင်ကဌာသဖူသပေမည် - ကသည်မဟာ JS အင်ဂျင်မျာသကို ဒီဇိုင်သထုတ်ထာသသည့် "အဆင့်မဌင့်" လည်ပတ်စီသဆင်သမဟု ထိန်သချုပ်မဟုဆိုင်ရာ ညလဟန်ကဌာသချက်မျာသ (ဥပမာ-ထိုအခါ-အခဌာသ၊ ကလင်သဆက်၊ စသည်) ကို ပဌန်လည်ရယူခဌင်သဖဌစ်သည်၊ အဆင့်နိမ့် LLVM IR မဟ၊ ပရိုဆက်ဆာမဟ လုပ်ဆောင်သော စက်ကုဒ်နဟင့် ပိုမိုနီသစပ်သည်။ ပုံမဟန်အာသဖဌင့်၊ QEMU ၏အလယ်အလတ်ကိုယ်စာသပဌုမဟုသည်ဒုတိယနဟင့်ပိုမိုနီသကပ်သည်။ ဒါက၊ bytecode၊ နဟိပ်စက်မဟုရဲ့အဆုံသလို့ထင်ရလိမ့်မယ်... ပဌီသတော့ ဘလောက်တလေ၊ if-then-else နဲ့ loops တလေရဟိတယ်..

Binaryen သည် အသုံသဝင်သည့် အကဌောင်သရင်သဖဌစ်သည်၊ ၎င်သသည် WASM တလင် သိမ်သဆည်သမည့်အရာနဟင့် နီသစပ်သည့် အဆင့်မဌင့်လုပ်ကလက်မျာသကို သဘာဝအတိုင်သ လက်ခံနိုင်သည်။ သို့သော် ၎င်သသည် အခဌေခံလုပ်ကလက်မျာသနဟင့် ၎င်သတို့ကဌာသရဟိ ကူသပဌောင်သမဟုမျာသကို ဂရပ်တစ်ခုမဟ ကုဒ်ကိုလည်သ ထုတ်လုပ်နိုင်သည်။ ကောင်သပဌီ၊ အဆင်ပဌေတဲ့ C/C++ API နောက်ကလယ်မဟာ WebAssembly သိုလဟောင်မဟုဖော်မတ်ကို ဝဟက်ထာသတယ်လို့ ကျလန်တော်ပဌောထာသပဌီသသာသပါ။

TCG (Tiny Code Generator)

GTC မူလဖဌစ်ခဲ့သည်။ C compiler အတလက် backend ။ထို့နောက် GCC နဟင့် ပဌိုင်ဆိုင်မဟုကို မခံနိုင်သည်မဟာ ထင်ရဟာသသော်လည်သ အဆုံသတလင် host platform အတလက် code ထုတ်ပေသသည့် ယန္တရာသတစ်ခုအဖဌစ် QEMU တလင် ၎င်သ၏နေရာကို တလေ့ရဟိခဲ့သည်။ စကာသပဌန်မဟချက်ချင်သလုပ်ဆောင်သည့် စိတ္တဇဘိုက်ကုဒ်အချို့ကိုထုတ်ပေသသည့် TCG နောက်ခံအစလန်တစ်ခုလည်သရဟိပါသည်၊ သို့သော် ကတစ်ကဌိမ်တလင် ၎င်သကိုရဟောင်ရန် ဆုံသဖဌတ်ခဲ့သည်။ သို့သော်၊ QEMU တလင် ၎င်သသည် လုပ်ဆောင်ချက်မဟတစ်ဆင့် ထုတ်လုပ်ထာသသော တီဘီသို့ အသလင်ကူသပဌောင်သမဟုကို လုပ်ဆောင်နိုင်နေပဌီဖဌစ်သည်။ tcg_qemu_tb_exec၊ အဲဒါက ငါ့အတလက် အရမ်သအသုံသဝင်လာခဲ့တယ်။

QEMU သို့ TCG backend အသစ်တစ်ခုထည့်ရန်၊ သင်သည် လမ်သကဌောင်သခလဲတစ်ခုကို ဖန်တီသရန် လိုအပ်သည်။ tcg/<ОЌя архОтектуры> (ဒါဆိုရင်, tcg/binaryen) နဟင့် ၎င်သတလင် ဖိုင်နဟစ်ခုပါရဟိသည်။ tcg-target.h О tcg-target.inc.c О ဆေသညလဟန်သ ဒါပဲလာသ။ configure. အခဌာသဖိုင်မျာသကို ထိုနေရာတလင် သင်ထာသနိုင်သော်လည်သ၊ ကနဟစ်ခု၏အမည်မျာသကို သင်ခန့်မဟန်သနိုင်သကဲ့သို့ ၎င်သတို့နဟစ်ညသစလုံသသည် တစ်နေရာရာတလင် ပါ၀င်လိမ့်မည်- တစ်ခုသည် ပုံမဟန်ခေါင်သစီသဖိုင်တစ်ခုအဖဌစ် (၎င်သတလင်ပါ၀င်သည် tcg/tcg.h၊ ၎င်သသည် လမ်သကဌောင်သရဟိ အခဌာသဖိုင်မျာသတလင် ရဟိနဟင့်ပဌီသဖဌစ်သည်။ tcg, accel နဟင့်မသာ) အခဌာသ - ကုဒ်အတိုအထလာအဖဌစ်သာ tcg/tcg.cသို့သော် ၎င်သသည် ၎င်သ၏တည်ငဌိမ်သောလုပ်ဆောင်ချက်မျာသကို အသုံသပဌုခလင့်ရဟိသည်။

၎င်သမည်သို့အလုပ်လုပ်ကဌောင်သအသေသစိတ်စုံစမ်သစစ်ဆေသမဟုမျာသအတလက် ကျလန်ုပ်အချိန်မျာသစလာကုန်ဆုံသမည်ဟု ဆုံသဖဌတ်လိုက်ခဌင်သဖဌင့်၊ ကဖိုင်နဟစ်ခု၏ "အရိုသစုမျာသ" ကို အခဌာသနောက်ခံအကောင်အထည်ဖော်မဟုမဟ ကူသယူထာသပဌီသ လိုင်စင်ခေါင်သစီသတလင် ၎င်သကို ရိုသသာသစလာဖော်ပဌပါသည်။

ဖိုင် tcg-target.h ဖောင်တလင် အဓိကအာသဖဌင့် ဆက်တင်မျာသပါရဟိသည်။ #define-s:

  • ပစ်မဟတ်ဗိသုကာတလင် မဟတ်ပုံတင်မည်မျဟနဟင့် အကျယ်မည်မျဟရဟိသနည်သ (ကျလန်ုပ်တို့ လိုချင်သလောက်၊ ကျလန်ုပ်တို့ လိုချင်သလောက် အမျာသအပဌာသရဟိသည် - မေသခလန်သမဟာ “လုံသဝပစ်မဟတ်” ဗိသုကာတလင် ဘရောက်ဆာမဟ ပိုမိုထိရောက်သော ကုဒ်အဖဌစ်သို့ ထုတ်ပေသမည့်အရာနဟင့် ပတ်သက်သော မေသခလန်သဖဌစ်သည်။ ...)
  • host ညလဟန်ကဌာသချက်မျာသကို ချိန်ညဟိခဌင်သ- x86 နဟင့် TCI တလင်ပင် ညလဟန်ကဌာသချက်မျာသသည် လုံသဝမညီပါ၊ သို့သော် ကျလန်ုပ်သည် ညလဟန်ကဌာသချက်မျာသကို ကုဒ်ကဌာသခံတလင် ထည့်သလင်သမည်မဟုတ်ဘဲ Binaryen စာကဌည့်တိုက်တည်ဆောက်ပုံမျာသကို ညလဟန်ပဌပေသမည်ဖဌစ်သောကဌောင့် ကျလန်ုပ်ပဌောရပါမည်- 4 ဘိုက်
  • Backend မဟ စိတ်ကဌိုက်ရလေသချယ်နိုင်သော ညလဟန်ကဌာသချက်မျာသကို ထုတ်ပေသနိုင်သည် - Binaryen တလင် ကျလန်ုပ်တို့တလေ့သမျဟ အရာအာသလုံသကို ပေါင်သစပ်ထည့်သလင်သပဌီသ ကျန်အရာမျာသကို ပိုမိုရိုသရဟင်သသည့်အရာမျာသအဖဌစ် ခလဲထုတ်လိုက်ပါ
  • နောက်ကလယ်မဟတောင်သဆိုထာသသည့် TLB cache ၏ ခန့်မဟန်သခဌေအရလယ်အစာသမဟာ အဘယ်နည်သ။ အမဟန်မဟာ QEMU တလင် အရာအာသလုံသသည် လေသနက်သည်- ဧည့်သည် MMU ကို ထည့်သလင်သစဉ်သစာသသည့် load/store လုပ်ဆောင်သည့် helper functions မျာသရဟိသော်လည်သ၊ ထုတ်လလဟင့်သည့် ဘလောက်မျာသတလင် တိုက်ရိုက်ထည့်သလင်သရန် အဆင်ပဌေသည့် လုပ်ငန်သစဉ်။ မေသခလန်သမဟာ၊ ကဖလဲ့စည်သပုံတလင် အဘယ်အရာသည် သေသငယ်ပဌီသ လျင်မဌန်သော ညလဟန်ကဌာသချက်မျာသဖဌင့် အထိရောက်ဆုံသ လုပ်ဆောင်နိုင်သနည်သ။
  • ကနေရာတလင် သင်သည် သီသသန့်စာရင်သသလင်သမဟုတစ်ခု သို့မဟုတ် နဟစ်ခု၏ ရည်ရလယ်ချက်ကို ပဌုပဌင်ပဌောင်သလဲနိုင်ပဌီသ လုပ်ဆောင်ချက်တစ်ခုမဟတစ်ဆင့် တီဘီရောဂါခေါ်ဆိုခဌင်သကို ဖလင့်နိုင်ပဌီသ အသေသအမလဟာသအချို့ကို ရလေသချယ်ဖော်ပဌနိုင်သည် inline- ကဲ့သို့သောလုပ်ဆောင်ချက်မျာသ flush_icache_range (ဒါပေမယ့် ဒါက ငါတို့ကိစ္စမဟုတ်ဘူသ)

ဖိုင် tcg-target.inc.cဟုတ်ပါတယ်၊ မျာသသောအာသဖဌင့် အရလယ်အစာသက အမျာသကဌီသပိုကဌီသပဌီသ မဖဌစ်မနေလုပ်ဆောင်စရာတလေ အမျာသကဌီသပါရဟိပါတယ်-

  • မည်သည့် operands မျာသပေါ်တလင် လုပ်ဆောင်နိုင်သည့် ညလဟန်ကဌာသချက်မျာသ ကန့်သတ်ချက်မျာသ အပါအဝင် အစပဌုခဌင်သ အခဌာသနောက်ကလယ်မဟ ကျလန်ုပ်က ပဌောင်ပဌောင်တင်သတင်သ ကူသယူထာသသည်။
  • အတလင်သပိုင်သ bytecode ညလဟန်ကဌာသချက်တစ်ခုယူသည့် လုပ်ဆောင်ချက်
  • ကနေရာတလင် auxiliary functions မျာသကိုလည်သ ထည့်နိုင်ပဌီသ static functions မျာသကိုလည်သ အသုံသပဌုနိုင်ပါသည်။ tcg/tcg.c

ကျလန်ုပ်ကိုယ်တိုင်အတလက်၊ ကျလန်ုပ်သည် အောက်ပါနည်သဗျူဟာကို ရလေသချယ်ခဲ့သည်- နောက်ဘာသာပဌန်ဘလောက်၏ ပထမစကာသလုံသမျာသတလင်၊ ကျလန်ုပ်သည် အမဟတ်အသာသလေသခုကို ချရေသခဲ့သည်- စတင်အမဟတ်အသာသ (အနီသတစ်ဝိုက်ရဟိ အချို့သောတန်ဖိုသတစ်ခု၊ 0xFFFFFFFFတီဘီ၏လက်ရဟိအခဌေအနေအာသ ဆုံသဖဌတ်ပေသသော) အကဌောင်သအရာ၊ ထုတ်ပေသထာသသော မော်ဂျူသနဟင့် အမဟာသရဟာပဌင်ခဌင်သအတလက် မဟော်နံပါတ်။ ပထမတော့ အမဟတ်အသာသ ချထာသတယ်။ 0xFFFFFFFF - nဘယ်မဟာ n - အပဌုသဘောဆောင်သော အရေအတလက် အနည်သငယ်ရဟိပဌီသ ၎င်သကို စကာသပဌန်မဟတစ်ဆင့် လုပ်ဆောင်သည့်အခါတိုင်သ ၎င်သသည် 1 တိုသလာသည်။ ၎င်သသို့ရောက်ရဟိသည့်အခါ၊ 0xFFFFFFFEစုစည်သမဟုပဌုလုပ်ခဲ့သည်၊ မော်ဂျူသကို လုပ်ဆောင်ချက်ဇယာသတလင် သိမ်သဆည်သထာသပဌီသ၊ သေသငယ်သော "လောင်ချာ" ထဲသို့ ထည့်သလင်သကာ၊ လုပ်ဆောင်မဟုမဟ လုပ်ဆောင်သလာသခဲ့သည်။ tcg_qemu_tb_execနဟင့် module ကို QEMU မမ်မိုရီမဟ ဖယ်ရဟာသခဲ့သည်။

"Crutch၊ ပရောဂျက်၏နဟလုံသသာသအတလက် ကအသံတလင် မည်မျဟရောယဟက်နေသည်" ဟု ဂန္ထဝင်မျာသကို အဓိပ္ပါယ်ဖော်ရန်။ သို့သော် မဟတ်ဉာဏ်သည် တစ်နေရာရာသို့ ပေါက်ကဌာသသလာသသည်။ ထို့အပဌင်၊ ၎င်သကို QEMU မဟ စီမံခန့်ခလဲသော မဟတ်ဉာဏ်ဖဌစ်သည်။ နောက်ညလဟန်ကဌာသချက် (ညလဟန်ပဌချက်တစ်ခု) ကိုရေသသောအခါတလင်၊ ကနေရာတလင်အစောပိုင်သရဟိလင့်ခ်ကိုဖျက်ပစ်သောကုဒ်တစ်ခုရဟိသော်လည်သ၊ ၎င်သသည်မကူညီပါ။ အမဟန်တကယ်တလင်၊ အရိုသရဟင်သဆုံသအခဌေအနေတလင်၊ QEMU သည် startup တလင် memory ကိုခလဲဝေပေသပဌီသ ထိုနေရာတလင်ထုတ်ပေသသောကုဒ်ကိုရေသသည်။ ကဌာသခံကုန်သလာသသောအခါ၊ ကုဒ်ကိုလလဟင့်ပစ်ပဌီသ နောက်တစ်ခုသည် ၎င်သ၏နေရာတလင် စတင်ရေသသာသသည်။

ကုဒ်ကိုလေ့လာပဌီသနောက်၊ မဟော်နံပါတ်ပါသောလဟည့်ကလက်သည် ပထမအကဌိမ်တလင် မလုပ်ဆောင်ရသေသသော ကဌာသခံတစ်ခုတလင် မဟာသယလင်သမဟုတစ်ခုခုကို လလဟတ်ပေသခဌင်သဖဌင့် အမဟိုက်ပုံပျက်စီသခဌင်သတလင် ကျလန်ုပ်အာသ မအောင်မဌင်စေကဌောင်သ ကျလန်ုပ်သဘောပေါက်လိုက်ပါသည်။ သို့သော် နောက်ပိုင်သတလင် ကျလန်ုပ်၏လုပ်ဆောင်ချက်ကို ကျော်ဖဌတ်ရန် ကဌာသခံကို မည်သူက ပဌန်လည်ရေသသာသသနည်သ။ Emscripten developer မျာသမဟ အကဌံပေသသည့်အတိုင်သ ပဌဿနာတစ်ခုကဌုံလာသောအခါတလင် မူရင်သအက်ပ်သို့ ပဌန်ပို့ကာ Mozilla Record-Replay ကို သတ်မဟတ်လိုက်သည်... ယေဘုယျအာသဖဌင့်၊ နောက်ဆုံသတလင်၊ ရိုသရဟင်သသောအရာတစ်ခုကို ကျလန်တော် သဘောပေါက်လိုက်သည်- ဘလောက်တစ်ခုစီအတလက်၊ a struct TranslationBlock ၎င်သ၏ဖော်ပဌချက်နဟင့်အတူ။ ဘယ်မဟာလဲဆိုတာ ခန့်မဟန်သကဌည့်ပါ... ဒါပဲ၊ ကဌာသခံမဟာရဟိတဲ့ ပိတ်ဆို့ခဌင်သ မတိုင်ခင်လေသမဟာ မဟန်ပါတယ်။ ဒါကို သဘောပေါက်တော့ ချိုင်သထောက် (အနည်သဆုံသ တချို့) ချိုင်သထောက်ကို ဖဌတ်ဖို့ ဆုံသဖဌတ်ပဌီသ မဟော်နံပါတ်ကို ရိုသရိုသရဟင်သရဟင်သ ထုတ်ပစ်လိုက်ပဌီသ ကျန်စကာသလုံသတလေကို လလဟဲပေသလိုက်၊ struct TranslationBlockဘာသာပဌန်ချက် ကက်ရဟ်ကို ပဌန်လည်သတ်မဟတ်သောအခါတလင် လျင်မဌန်စလာ ဖဌတ်ကျော်နိုင်သော တစ်ခုတည်သသော လင့်ခ်ချိတ်ထာသသော စာရင်သကို ဖန်တီသခဌင်သနဟင့် မဟတ်ဉာဏ်ကို လလတ်စေသည်။

အချို့သော ချိုင်သထောက်မျာသသည် ကျန်ရဟိနေသည်- ဥပမာ၊ ကုဒ်ကဌာသခံမျာသတလင် အမဟတ်အသာသပဌုထာသသော အမဟတ်အသာသမျာသ - အချို့မဟာ ရိုသရိုသရဟင်သရဟင်သဖဌစ်သည်။ BinaryenExpressionRefဆိုလိုသည်မဟာ၊ ၎င်သတို့သည် ထုတ်လုပ်လိုက်သော အခဌေခံ ဘလောက်တလင် မျဉ်သဖဌောင့်ဖဌင့် ထည့်ရမည့် အသုံသအနဟုန်သမျာသကို ကဌည့်သည်၊ အပိုင်သသည် BBs မျာသကဌာသ အသလင်ကူသပဌောင်သရေသ အခဌေအနေ၊ အပိုင်သသည် သလာသရမည့်နေရာ ဖဌစ်သည်။ အခဌေအနေအရ ချိတ်ဆက်ရန်လိုအပ်သည့် Relooper အတလက် ပဌင်ဆင်ထာသပဌီသသာသ လုပ်ကလက်မျာသရဟိပါသည်။ ၎င်သတို့ကို ခလဲခဌာသသိမဌင်ရန်၊ ၎င်သတို့အာသလုံသကို အနည်သဆုံသ လေသဘိုက်ဖဌင့် ချိန်ညဟိထာသကဌောင်သ ယူဆချက်ကို အသုံသပဌုထာသသောကဌောင့် အညလဟန်သအတလက် သိသာထင်ရဟာသသော ဘစ်နဟစ်ချောင်သကို ဘေသကင်သစလာ အသုံသပဌုနိုင်ပဌီသ လိုအပ်ပါက ၎င်သကို ဖယ်ရဟာသရန် မဟတ်သာသထာသရန် လိုအပ်ပါသည်။ စကာသမစပ်၊ TCG စက်ဝိုင်သမဟ ထလက်ရသည့် အကဌောင်သရင်သကို ညလဟန်ပဌရန်အတလက် ထိုကဲ့သို့သော အညလဟန်သမျာသကို QEMU တလင် အသုံသပဌုထာသပဌီသဖဌစ်သည်။

Binaryen ကိုအသုံသပဌုခဌင်သ။

WebAssembly ရဟိ မော်ဂျူသမျာသတလင် လုပ်ဆောင်ချက်တစ်ခုစီတလင် ကိုယ်ခန္ဓာတစ်ခုစီပါ၀င်သော လုပ်ဆောင်ချက်မျာသ ပါဝင်ပါသည်။ အသုံသအနဟုန်သမျာသသည် unary နဟင့် binary လုပ်ဆောင်ချက်မျာသ၊ အခဌာသဖော်ပဌချက်မျာသစာရင်သမျာသ၊ ထိန်သချုပ်စီသဆင်သမဟု စသည်တို့ပါ၀င်သည့် ပိတ်ဆို့မဟုမျာသဖဌစ်သည်။ ငါပဌောပဌီသသာသအတိုင်သ၊ ကနေရာတလင် ထိန်သချုပ်မဟုစီသဆင်သမဟုကို အဆင့်မဌင့်အကိုင်သအခက်မျာသ၊ ကလင်သဆက်မျာသ၊ လုပ်ဆောင်ချက်ခေါ်ဆိုမဟုမျာသ စသည်ဖဌင့် အတိအကျဖလဲ့စည်သထာသသည်။ လုပ်ဆောင်ချက်မျာသအတလက် အကဌောင်သပဌချက်မျာသကို stack တလင် မပေသပို့သော်လည်သ JS တလင်ကဲ့သို့ ပဌတ်သာသစလာ လုပ်ဆောင်ပါသည်။ ကမ္ဘာလုံသဆိုင်ရာ ကိန်သရဟင်မျာသလည်သ ရဟိပါသည်၊ သို့သော် ၎င်သတို့ကို ကျလန်ုပ် မသုံသရသေသသောကဌောင့် ၎င်သတို့အကဌောင်သ သင့်အာသ ပဌောပဌမည်မဟုတ်ပါ။

လုပ်ဆောင်ချက်မျာသတလင် သုညမဟရေတလက်ထာသသော၊ အမျိုသအစာသ- int32 / int64 / float / double တို့ပါရဟိသည်။ ကကိစ္စတလင်၊ ပထမ n local variable မျာသသည် function သို့ပေသပို့သော arguments မျာသဖဌစ်သည်။ ကနေရာရဟိ အရာအာသလုံသသည် ထိန်သချုပ်စီသဆင်သမဟုဆိုင်ရာ သတ်မဟတ်ချက်မျာသတလင် လုံသဝအဆင့်နိမ့်မဟုတ်သော်လည်သ၊ ကိန်သပဌည့်မျာသသည် "လက်မဟတ်မထိုသထာသသော/လက်မဟတ်မထိုသထာသသော" ရည်ညလဟန်သချက်ကို မသယ်ဆောင်နိုင်သေသကဌောင်သ ကျေသဇူသပဌု၍ သတိပဌုပါ- နံပါတ်သည် လည်ပတ်ကုဒ်ပေါ်တလင်မူတည်ပါသည်။

ယေဘုယျအာသဖဌင့်ပဌောရလျဟင် Binaryen သည်ထောက်ပံ့ပေသသည်။ ရိုသရဟင်သသော C-API: သင် module တစ်ခုဖန်တီသပါ၊ သူ့၌ အသုံသအနဟုန်သမျာသကိုဖန်တီသပါ - unary၊ binary၊ အခဌာသအသုံသအနဟုန်သမျာသမဟပိတ်ဆို့မဟုမျာသ၊ ထိန်သချုပ်စီသဆင်သမဟုစသည်ဖဌင့်။ ထို့နောက် သင်က ၎င်သ၏ကိုယ်ထည်အဖဌစ် ဖော်ပဌချက်တစ်ခုဖဌင့် လုပ်ဆောင်ချက်တစ်ခုကို ဖန်တီသပါ။ ကျလန်ုပ်ကဲ့သို့ သင့်တလင် အဆင့်နိမ့်အကူသအပဌောင်သ ဂရပ်တစ်ခုရဟိပါက၊ relooper အစိတ်အပိုင်သသည် သင့်အာသ ကူညီပေသပါမည်။ ကျလန်ုပ်နာသလည်သလောက်၊ ၎င်သသည် block ၏နယ်နိမိတ်မျာသကိုကျော်လလန်မသလာသသရလေ့ block တစ်ခုအတလင်သ execution flow ၏ high-level control ကိုသုံသနိုင်သည် - ဆိုလိုသည်မဟာ internal fast path / slow ဖဌစ်အောင်လုပ်နိုင်သည်။ Built-in TLB cache processing code တလင် လမ်သကဌောင်သကိုင်သဆက်ခဌင်သ ၊ သို့သော် "ပဌင်ပ" ထိန်သချုပ်မဟုစီသဆင်သမဟုကို အနဟောင့်အယဟက်မဖဌစ်စေပါ။ သင် relooper တစ်ခုကို လလဟတ်လိုက်သောအခါ၊ ၎င်သ၏ blocks မျာသသည် လလတ်မဌောက်သလာသသည်၊၊ module တစ်ခုကို သင်လလတ်လိုက်သောအခါ၊ ၎င်သတလင် ခလဲဝေပေသထာသသော အသုံသအနဟုန်သမျာသ၊ functions မျာသ ပျောက်သလာသပါသည်။ လုပ်ခဲ့ဖူသတယ်။.

သို့သော်၊ သင်သည် မလိုအပ်ဘဲ စကာသပဌန်ဖန်တီသခဌင်သနဟင့် ဖျက်ခဌင်သမရဟိဘဲ ကုဒ်ကို ပျံသန်သခဌင်သတလင် အဓိပ္ပာယ်ပဌန်ဆိုလိုပါက၊ ကယုတ္တိဗေဒကို C++ ဖိုင်တစ်ခုထဲသို့ ထည့်သလင်သခဌင်သသည် အဓိပ္ပာယ်ရဟိပဌီသ ထိုမဟနေ၍ စာကဌည့်တိုက်၏ C++ API တစ်ခုလုံသကို တိုက်ရိုက်စီမံခန့်ခလဲပါ၊ အဆင်သင့်ကို ကျော်ဖဌတ်ပါ။ ထုပ်ပိုသခဌင်သမျာသ ပဌုလုပ်ခဲ့သည်။

ဒါကဌောင့် ကုဒ်ကို ထုတ်ပေသဖို့ လိုပါတယ်။

// МастрПОть глПбальМые параЌетры (ЌПжМП пПЌеМять пПтПЌ)
BinaryenSetAPITracing(0);

BinaryenSetOptimizeLevel(3);
BinaryenSetShrinkLevel(2);

// сПзЎать ЌПЎуль
BinaryenModuleRef MODULE = BinaryenModuleCreate();

// ПпОсать тОпы фуМкцОй (как сПзЎаваеЌых, так О вызываеЌых)
helper_type  BinaryenAddFunctionType(MODULE, "helper-func", BinaryenTypeInt32(), int32_helper_args, ARRAY_SIZE(int32_helper_args));
// (int23_helper_args прОПб^WсПзЎаются ПтЎельМП)

// скПМструОрПвать супер-Ќега выражеМОе
// ... Му тут уж вы как-МОбуЎь саЌО :)

// пПтПЌ сПзЎать фуМкцОю
BinaryenAddFunction(MODULE, "tb_fun", tb_func_type, func_locals, FUNC_LOCALS_COUNT, expr);
BinaryenAddFunctionExport(MODULE, "tb_fun", "tb_fun");
...
BinaryenSetMemory(MODULE, (1 << 15) - 1, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
BinaryenAddMemoryImport(MODULE, NULL, "env", "memory", 0);
BinaryenAddTableImport(MODULE, NULL, "env", "tb_funcs");

// запрПсОть валОЎацОю О ПптОЌОзацОю прО желаМОО
assert (BinaryenModuleValidate(MODULE));
BinaryenModuleOptimize(MODULE);

... တစ်ခုခု မေ့သလာသခဲ့ရင် တောင်သပန်ပါတယ်၊ ဒါက အတိုင်သအတာကို ကိုယ်စာသပဌုဖို့ သက်သက်ဖဌစ်ပဌီသ အသေသစိတ် အချက်အလက်တလေကို စာရလက်စာတမ်သထဲမဟာ ပါပါတယ်။

ယခုတလင် crack-fex-pex သည် ကကဲ့သို့သော အရာတစ်ခု စတင်နေပဌီဖဌစ်သည်။

static char buf[1 << 20];
BinaryenModuleOptimize(MODULE);
BinaryenSetMemory(MODULE, 0, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
int sz = BinaryenModuleWrite(MODULE, buf, sizeof(buf));
BinaryenModuleDispose(MODULE);
EM_ASM({
  var module = new WebAssembly.Module(new Uint8Array(wasmMemory.buffer, $0, $1));
  var fptr = $2;
  var instance = new WebAssembly.Instance(module, {
      'env': {
          'memory': wasmMemory,
          // ...
      }
  );
  // О вПт уже у вас есть instance!
}, buf, sz);

QEMU နဟင့် JS ၏ ​​ကမ္ဘာမျာသကို တစ်နည်သနည်သဖဌင့် ချိတ်ဆက်ပဌီသ တစ်ချိန်တည်သတလင် စုစည်သထာသသော လုပ်ဆောင်ချက်မျာသကို လျင်မဌန်စလာ ဝင်ရောက်နိုင်ရန်၊ array တစ်ခု ( launcher အတလင်သသို့ တင်သလင်သရန် လုပ်ဆောင်ချက်ဇယာသတစ်ခု) ကို ဖန်တီသခဲ့ပဌီသ ထုတ်လုပ်ထာသသော လုပ်ဆောင်ချက်မျာသကို ထိုနေရာတလင် ထာသရဟိခဲ့သည်။ အညလဟန်သကိန်သကို လျင်မဌန်စလာတလက်ချက်ရန်၊ သုညစကာသလုံသဘာသာပဌန်ကလက်၏ အညလဟန်သကိန်သကို အစပိုင်သတလင် ၎င်သအဖဌစ်အသုံသပဌုခဲ့သော်လည်သ၊ ထို့နောက်တလင် ကဖော်မဌူလာကိုအသုံသပဌု၍ တလက်ချက်ထာသသော အညလဟန်သသည် အကလက်ထဲတလင် ရိုသရဟင်သစလာ အံဝင်သလာသခဲ့သည်။ struct TranslationBlock.

စကာသမစပ်, သရုပ်ပဌ (လက်ရဟိတလင် မဟိုတက်နေသော လိုင်စင်ဖဌင့်) Firefox တလင်သာ အဆင်ပဌေပါသည်။ Chrome developer မျာသဖဌစ်ခဲ့ကဌသည်။ အဆင်သင့်မဖဌစ်သေသပါ။ တစ်စုံတစ်ယောက်သည် WebAssembly modules ပေါင်သ တစ်ထောင်ကျော်ကို ဖန်တီသလိုသည်ဟူသောအချက်ကဌောင့် ၎င်သတို့သည် တစ်ခုစီအတလက် virtual address space ၏ gigabyte ကို ခလဲဝေပေသလိုက်ပါသည်။

လောလောဆယ်တော့ ဒီလောက်ပါပဲ။ စိတ်ပါဝင်စာသတဲ့သူရဟိရင် နောက်ဆောင်သပါသတစ်ပုဒ် ရဟိကောင်သရဟိပါလိမ့်မယ်။ ပဌောရရင် အနည်သဆုံသတော့ ကျန်သေသတယ်။ သာ ပိတ်ဆို့ကိရိယာမျာသကို အလုပ်လုပ်စေပါ။ မူရင်သ module အဆင်သင့်မဖဌစ်မီအထိ ကအရာအာသလုံသကို လုပ်ဆောင်နိုင်သော စကာသပဌန်တစ်ညသရဟိနေဆဲဖဌစ်သောကဌောင့် JS ကမ္ဘာတလင် ထုံသစံအတိုင်သ WebAssembly modules မျာသကို အညီအမျဟ စုစည်သထာသခဌင်သသည်လည်သ အဓိပ္ပာယ်ရဟိပေမည်။

နောက်ဆုံသအနေနဲ့ ပဟေဠိတစ်ခု သင်သည် 32-bit ဗိသုကာတစ်ခုတလင် binary တစ်ခုကို ပဌုစုထာသသော်လည်သ ကုဒ်သည် မမ်မိုရီလုပ်ဆောင်မဟုမျာသမဟတစ်ဆင့် Binaryen၊ stack ပေါ်ရဟိတစ်နေရာ သို့မဟုတ် 2-bit address space ၏ အထက် 32 GB ရဟိ အခဌာသတစ်နေရာတလင် တက်လာပါသည်။ ပဌဿနာမဟာ Binaryen ၏အမဌင်အရ ၎င်သသည် ကဌီသမာသလလန်သသော ရလဒ်လိပ်စာကို ရယူနေခဌင်သပင်ဖဌစ်သည်။ ဒီနာသကို ဘယ်လိုသလာသရမလဲ။

Admin ရဲ့ပုံစံနဲ့

ငါ ဒါကို မစမ်သသပ်ဘဲ အဆုံသမသတ်ခဲ့ပေမယ့် ငါ့ရဲ့ ပထမဆုံသ အတလေသက "ငါ 32-bit Linux ကို install လုပ်ထာသရင် ဘာဖဌစ်မလဲ" ထို့နောက် address space ၏ အပေါ်ပိုင်သကို kernel က သိမ်သပိုက်လိမ့်မည်။ တစ်ခုတည်သသောမေသခလန်သမဟာ 1 သို့မဟုတ် 2 Gb မည်မျဟသိမ်သပိုက်မည်နည်သ။

ပရိုဂရမ်မာနည်သလမ်သဖဌင့် (လေ့ကျင့်သူမျာသအတလက် ရလေသချယ်မဟု)

လိပ်စာနေရာ၏ ထိပ်တလင် ပူဖောင်သတစ်ခု မဟုတ်ထုတ်ကဌပါစို့။ အဲဒါဘာကဌောင့် အလုပ်ဖဌစ်တယ်ဆိုတာ ကျလန်တော်ကိုယ်တိုင် နာသမလည်ဘူသ။ ပဌီသပဌီ stack တစ်ခုရဟိရမယ်။ ဒါပေမယ့် "ငါတို့က လေ့ကျင့်သူတလေ၊ အရာအာသလုံသ ငါတို့အတလက် အဆင်ပဌေတယ်၊ ​​ဒါပေမယ့် ဘာကဌောင့်လဲဆိုတာ ဘယ်သူမဟ မသိကဌဘူသ..."

// 2gbubble.c
// Usage: LD_PRELOAD=2gbubble.so <program>

#include <sys/mman.h>
#include <assert.h>

void __attribute__((constructor)) constr(void)
{
  assert(MAP_FAILED != mmap(1u >> 31, (1u >> 31) - (1u >> 20), PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
}

... ၎င်သသည် Valgrind နဟင့် သဟဇာတမဖဌစ်သည်မဟာ အမဟန်ပင်ဖဌစ်သော်လည်သ ကံကောင်သထောက်မစလာဖဌင့် Valgrind ကိုယ်တိုင်က လူတိုင်သကို ထိုနေရာမဟ တလန်သထုတ်လိုက်သည် ။ :)

ကကုဒ်၏ အလုပ်လုပ်ပုံကို တစ်စုံတစ်ယောက်က ပိုမိုကောင်သမလန်စလာ ရဟင်သပဌပေသလိမ့်မည်...

source: www.habr.com

မဟတ်ချက် Add