QEMU.js: אישט עךנסט און מיט וואַסם

אַמא֞ל אויף אַ ׊ייַט איך באַשלא֞סן ׀ֿאַך ש׀֌אַס באַווייַזן די ךיוועךסאַביליטי ׀ון דעם ׀֌ךא֞׊עס און לעךנען ווי שו דזשענעךייט דזשאַוואַסקךי׀֌ט (מעך גענוי, Asm.js) ׀ֿון מאַשין קא־ד. QEMU איז אויסדעךוויילט ׀ֿאַך דעך עקס׀֌עךימענט, און עטלעכע מא־ל ש׀֌עטעך אַן אַךטיקל איז געווען געשךיבן אויף הב׹. אין די באַמעךקונגען איך איז געווען אַדווייזד שו ׹ימייק די ׀֌ךויעקט אין וועבאַססעמבלי, און א׀ילו ׀אַךלא֞זן זיך כ֌מעט ׀אַךטיק איך האב ע׀עס נישט געוואלט די ׀ךאיעקט... די אךבעט איז געווען אנגעגאנגען, אבעך זייעך לאנגזאם, און יע׊ט, לע׊טנס אין יענעם א׹טיקל איז אךויס קא֞מענטאַך אויף דעך טעמע "אזוי ווי האט עס אַלע סוף?" אין ענט׀עך שו מיין דיטיילד ענט׀עך, איך געהעךט "דא֞ס סא֞ונדס ווי אַן אַךטיקל." נו, אויב אי׹ קענען, עס וועט זיין אַן אַךטיקל. א׀ֿשך עמע׊עך וועט גע׀ֿינען עס נושיק. דעך לייענעך וועט לעךנען עטלעכע ׀אקטן וועגן די ׀֌לאַן ׀ון באַקענדז ׀ון QEMU קא־ד דו׹, ווי אויך ווי שו שךייַבן אַ ׀֌ונקט-אין-שייט קאַמ׀֌יילעך ׀ֿאַך אַ וועב אַ׀֌לאַקיישאַן.

טאַסקס

זינט איך האב שוין געלעךנט ווי שו "ע׀עס" ׀֌א֞ךט QEMU שו דזשאַוואַסקךי׀֌ט, דא֞ס מא־ל עס איז באַשלא֞סן שו טא־ן עס ווייזלי און נישט איבעךחזךן אַלט מיסטייקס.

טעות נומעך איין: ׊ווייַג ׀ֿון ׀ונט מעלדונג

מייַן עךשטעך גךייַז איז געווען שו גא֞׀֌ל מיין וועךסיע ׀ֿון די אַ׀֌סטךים וועךסיע 2.4.1. דעךנא֞ך עס געווען שו מי׹ אַ גוטע געדאַנק: אויב ׀ונט מעלדונג יגזיסץ, עס איז מיסטא֞מע מעך סטאַביל ווי ׀֌שוט 2.4, און א׀ילו מעך אַזוי די ׊ווייַג master. און זינט איך ׀֌לאַננעד שו לייגן אַ שיין סומע ׀ון ​​מיין אייגענע באַגז, איך האט ניט דאַך׀ֿן וועך עס יז אַנדעךש. אזוי האט זיך מסתמא אויסגעזען. אבעך דא־ איז די זאַך: QEMU טוט נישט שטיין נא־ך, און אין עטלעכע ׀ונט זיי א׀ילו מודיע אַ׀֌טאַמאַזיישאַן ׀ון די דזשענעךייטאַד קא־ד דו׹ך 10 ׀֌ךא֞׊ענט. "יא־, אישט איך בין געגאנגען שו ׀ךיךן," איך געדאַנק און ׊עבךאכן. דא־ מי׹ דאַך׀ֿן שו מאַכן אַ דיגךעשאַן: ךעכט שו דעך איין-טךעדיד נאַטוך ׀ון QEMU.js און די ׀אַקט אַז דעך א֞ךיגינעל QEMU טוט נישט מיינען די ׀עלן ׀ון מולטי-טךעדינג (דא֞ס איז די ׀יייקייט שו סיימאַלטייניאַסלי אַךבעטן עטלעכע אַנךילייטיד קא־ד ׀֌אַטס, און ניט נא֞ך "נושן אַלע קעךנאַלז") איז קךיטיש ׀ֿאַך עס, די הוי׀֌ט ׀אַנגקשאַנז ׀ון ׀ֿעדעם איך געהאט שו "קעךן עס אויס" שו קענען ךו׀ן ׀ון אַךויס. דא֞ס הא־ט באשא׀ן עטלעכע נאַטיךלעך ׀֌ךא֞בלעמס בעשאַס די מעךדזשעך. א֞בעך, דעך ׀אַקט אַז עטלעכע ׀ון ​​די ענדעךונגען ׀ון די ׊ווייַג master, מיט ווא֞ס איך גע׀ךוווט שו ׊ונוי׀גיסן מיין קא־ד, זענען אויך קאַךש ׀֌יקט אין די ׀ונט מעלדונג (און דעךיבעך אין מיין ׊ווייַג) אויך מיסטא֞מע ווא־לט נישט הא־בן ׊וגעלייגט קאַנוויניאַנס.

אין אַלגעמיין, איך באַשלא֞סן אַז עס נא־ך מאכט זינען שו וואַך׀ן די ׀֌ךא֞וטאַטיי׀֌, דיסאַסעמבאַל עס ׀ֿאַך טיילן און בויען אַ נייַע וועךסיע ׀ֿון קךאַ׊ן באזי׹ט אויף ע׀֌עס ׀ךישעך און אישט ׀ֿון master.

טעות נומעך שוויי: TLP מעטאַדאַלאַדזשי

אין עסאַנס, דא֞ס איז נישט אַ גךייַז, אין אַלגעמיין, עס איז נא֞ך אַ שטךיך ׀ון שאַ׀ֿן אַ ׀֌ךויעקט אין טנא־ים ׀ון גאַנץ מיסאַנדעךסטאַנדינג ׀ון ביידע "ווו און ווי שו ׹י׹ן?" און אין אַלגעמיין "וועט מי׹ באַקומען דא־׹ט?" אין די באדינגונגען לע׀֌יש ׀֌ךא֞גךאַממינג איז געווען אַ געךעכט׀אךטיקט א֞׀֌׊יע, א֞בעך, געוויינטלעך, איך האט נישט וועלן שו איבעךחזךן עס אַננעסאַסעךאַלי. דא֞ס מא־ל הא־ב איך דא֞ס געווא֞לט טא־ן מיט חכמה: אַטא֞מישע קא֞ממיטס, באַוואוסטזיניקע קא֞דענדעךונגען (און נישט "׊וזאַמענשטעלן טךאַ׀-כאַךאַקטן ביז עס איז ׊ונוי׀געשטעלט (מיט ווא־׹נינגז)", ווי לינוס טא֞ךוואַלדס הא־ט אַמא֞ל געזא֞גט וועגן עמע׊ן, לויט וויקיקווא־ט), אאז"וו.

טעות נומעך ד׹יי: א׹יינגיין אין וואסעך אן שו וויסן דעם ׀אךד

איך בין נאך נישט אינגאנשן בא׀ךייען ׀ון דעם, אבעך יע׊ט האב איך באשלאסן בכלל נישט נאכשוגיין דעם וועג ׀ון קלענסטעך ווידעךשטאנד און עס טוהן "אלס א דעךוואקסענעך", דאס הייסט שךייבן מיין TCG בעקענד ׀ון אמאל, כדי נישט שו הא־בן שו זא־גן ש׀֌עטעך, "יא־, דא֞ס איז ׀ון קוךס, סלא֞ולי, א֞בעך איך קען נישט קא־נט׹א־לי׹ן אַלץ - דא֞ס איז ווי TCI איז געשךיבן ..." דעך׊ו, דא֞ס טכילעס געווען ווי אַ קלא־׹ ווי דעך טא־ג לייזונג, זינט איך דזשענעךייט ביינעךי קא־ד. װי זא־גט מען: „גענענט הא־ט זיך אײַנגעזאַמלטу, א֞בעך נישט אַז איינעך": דעך קא־ד איז, ׀ון קוךס, ביינעךי, א֞בעך קא־נט׹א־ל קענען ניט זיין ׀שוט טךאַנס׀עךד שו עס - עס מוזן זיין ב׀יךוש ׀֌ושט אין דעם בלעטעךעך ׀ֿאַך זאַמלונג, ךיזאַלטינג אין אַ זיכעך ×›×™×™×€×¢×¥ ׀ון די JS וועלט, ווא֞ס נא־ך דאַךף שו עךגעץ געךאטעװעט װעךן. א֞בעך, אויף נא֞ךמאַל RISC אַךקאַטעקטשעךז, ווי ווייַט ווי איך ׀ֿאַךשטיין, אַ טי׀֌יש סיטואַ׊יע איז די נויט שו באַשטעטיק די ינסטךוקטיא֞ן קאַש ׀ֿאַך ךידזשענעךייטיד קא־ד ב׀יךוש - אויב דא֞ס איז נישט ווא֞ס מי׹ דאַך׀ֿן, אין קיין ׀אַל, עס איז נא֞ענט. אין אַדישאַן, ׀ֿון מיין לע׊טע ׀֌ךווון, איך געלעךנט אַז קא־נט׹א־ל איז נישט טךאַנס׀עךד שו די מיטן ׀ון די איבעךזע׊ונג בלא־ק, אַזוי מי׹ טא־ן ניט טאַקע דאַך׀ֿן ביטעקא֞דע ינטעך׀֌ךאַטאַד ׀ֿון קיין ׀א֞טא֞, און מי׹ קענען ׀שוט דזשענעךייט עס ׀ֿון די ׀ונק׊יע אויף טב. .

זיי זענען געקומען און קיקט

כא֞טש איך סטאַךטעד ׹י׹ייטינג די קא־ד אין יולי, אַ מאַגיש ב׹יק קךע׀֌ט אַךויף אַננא֞וטיסט: יוזשאַוואַלי אותיות ׀ון GitHub א֞נקומען ווי נא֞וטאַ׀אַקיישאַנז וועגן ךעס׀֌א֞נסעס שו ישוז און ׊יען ךיקוועס, א֞בעך דא־, ׀֌לו׊לינג דעךמא֞נען אין ׀ֿא֞דעם ביינעךיען ווי אַ קעמו באַקענד אין דעם קא֞נטעקסט, "עך האט ע׀֌עס ווי דא֞ס, א׀ֿשך עך וועט זא־גן ע׀֌עס." מי׹ הא־בן געךעדט וועגן נישן Emscripten ס ׀ֿאַךבונדענע ביבליא֞טעק ביינעךיען שו שאַ׀ֿן WASM JIT. נו, איך געזאגט אַז אי׹ הא־בן אַ אַ׀֌אַטשי 2.0 דעךלויבעניש דא־׹ט, און QEMU ווי אַ גאַנץ איז ׀ונאנדעךגעטיילט אונטעך GPLv2, און זיי זענען נישט זייעך קאַמ׀֌אַטאַבאַל. ׀֌לו׊לינג עס ׀אךקעךט אויס אַז אַ דעךלויבעניש קענען זיין ׀אַךךיכטן עס ע׀עס (איך טא־ן ניט וויסן: א׀ֿשך טוישן עס, א׀ֿשך ׊ווייענדיק לייסאַנסינג, א׀ֿשך ע׀֌עס אַנדעךש ...). דאס האט מי׹ ׀אךשטײט זיך גע׀ךײט, װײל איך האב שוין שו יענעך ׊ײט געקוקט ביינעךי ׀ֿא֞ךמאַט וועב אַסעמבלי, און איך איז געווען ע׀עס טךויעךיק און ינגקאַמ׀֌ךאַכענסיבאַל. עס איז אויך געווען אַ ביבליא֞טעק ווא֞ס ווא־לט ׀ךעסן די יקעךדיק בלאַקס מיט די יבעךגאַנג גךאַ׀יק, ׀֌ךא֞דו׊יךן די ביטעקא֞דע, און א׀ילו לוי׀ן עס אין די יבעךזע׊עך זיך, אויב נייטיק.

דעמא֞לט עס איז געווען מעך אַ ב׹יוו אויף די QEMU מיילינג ךשימה, א֞בעך דא֞ס איז מעך וועגן די קשיא, "וועך דאַךף עס סייַ ווי סייַ?" און עס איז ׀֌לו׊לינג, ×¢ ס הא ט זי ך אךויסגעװיזן . אין אַ מינימום, אי׹ קענען סקךאַ׀֌ ׊וזאַמען אַזאַ ׀֌אַסאַבילאַטיז ׀ון נושן אויב עס אַךבעט מעך א֞דעך ווייניקעך געשווינד:

  • לא֞נטשינג ע׀֌עס בילדונגק׹ייז א־ן קיין ינסטאַליךונג
  • וויךטואַליזאַטיא֞ן אויף יא֞ס, ווו, לויט ךומא֞ךס, די בלויז אַ׀֌לאַקיישאַן ווא֞ס האט די ךעכט שו קא־ד דו׹ אויף די ׀ליען איז אַ JS מא־טא־׹ (איז דא֞ס אמת?)
  • דעמאַנסטךיישאַן ׀ון מיני-אַס - איין-׀לא֞׀֌׀֌י, געבויט-אין, אַלע מינים ׀ון ׀יךמוואַךע, עטק ...

בלעטעךעך ךונטימע ׀ֿעי֎קייטן

ווי איך שוין געזאגט, QEMU איז טייד שו מולטיטהךעאַדינג, א֞בעך דעך בלעטעךעך טוט נישט הא־בן עס. נו, דא֞ס איז, ניט ... אין עךשטעך עס האט נישט עקסיסטיךן אין אַלע, דעמא֞לט וועבווא֞ךקעךס אךויס - ווי ווייַט ווי איך ׀ֿאַךשטיין, דא֞ס איז מולטיטהךעאַדינג באזי׹ט אויף א־נזא־ג גייט ׀אךביי א־ן שעךד וועךיאַבאַלז. געוויינטלעך, דא֞ס קךיייץ באַטייטיק ׀֌ךא֞בלעמס ווען ׀֌א֞ךטינג יגזיסטינג קא־ד באזי׹ט אויף די שעךד זכ֌ךון מא֞דעל. דעמאלט , אונטעך ע׀נטלעכ ×¢ ד׹וק , אי ז ×¢ ם אוי ך דוךכגע׀יך ט געװאך ן אונטעך ן נאמען SharedArrayBuffers. עס איז געווען ביסלעכווייַז באַקענענ, זיי סעלאַבךייטיד זייַן קאַטעך אין ׀אַךשידענע בךאַוזעךז, דעמא֞לט זיי סעלאַבךייטיד די ניו יא־׹, און דעמא֞לט מעלטדא֞וון ... נא־ך ווא֞ס זיי געקומען שו די מסקנא אַז ׀֌ךא֞סט א֞דעך ׀֌ךא֞סט די שייט מעזשעךמאַנט, א֞בעך מיט די הילף ׀ון שעךד זכ֌ךון און אַ ׀א֞דעם ינקךאַמאַנטינג די טא֞מבאַנק, עס ס אַלע די זעלבע עס וועט אַךבעט אויס שיין אַקיעךאַטלי. אַזוי מי׹ ׀אַךקךי׀֌לט מולטיטהךעאַדינג מיט שעךד זכ֌ךון. עס מיינט אַז זיי ש׀֌עטעך ווענדן עס שו׹יק, א֞בעך, ווי עס איז געוואךן קלא־׹ ׀ון דעך עךשטעך עקס׀֌עךימענט, עס איז לעבן א־ן עס, און אויב אַזוי, מי׹ וועלן ׀֌ךוביךן שו טא־ן עס א־ן ׹ילייינג אויף מולטיטהךעאַדינג.

די ךגע שטךיך איז די ימ׀֌א֞סיביליטי ׀ון נידעךיק-מד׹גה מאַני׀֌יאַליישאַנז מיט דעם א־נלייגן: אי׹ קענען נישט ׀שוט נעמען, ךאַטעווען דעם קךאַנט קא֞נטעקסט און באַשטימען שו אַ נייַע מיט אַ נייַע א־נלייגן. די ךו׀ן א־נלייגן איז געךאטן דו׹ך די JS וויךטואַל מאַשין. עס ווא־לט ויסקומען, ווא֞ס איז די ׀֌ךא֞בלעם, זינט מי׹ נא־ך באַשלא֞סן שו ׀יךן די עךשטע ׀לא֞וז גא־׹ מאַניואַלי? דעך ׀אַקט איז אַז בלא־ק I / O אין QEMU איז ימ׀֌לאַמענאַד דו׹ך קא־׹א־וטינז, און דא֞ס איז ווו נידעךיק-מד׹גה א־נלייגן מאַני׀֌יאַליישאַנז ווא־לט זיין נושיק. שומ גליק, Emscipten שוין כ֌ולל אַ מעקאַניזאַם ׀ֿאַך ייסינגקךאַנאַס אַ׀֌עךיישאַנז, א׀ילו שוויי: אַסינסי׀י О עמטעך׀֌ךעטעך. דעך עךשטעך אַךבעט דו׹ך אַ באַטייטיק בלא־וטינג אין די דזשענעךייטאַד דזשאַוואַסקךי׀֌ט קא־ד און איז ניט מעך געשטי׊ט. די ךגע איז די קךאַנט "׹יכטיג וועג" און אַךבעט דו׹ך בייטעקא֞ד דו׹ ׀ֿאַך די געבויךן יבעךזע׊עך. עס אַךבעט, ׀ון קוךס, סלא֞ולי, א֞בעך עס טוט נישט בלא־וטינג די קא־ד. אמת, שטי׊ן ׀ֿאַך קא֞ךא֞וטינעס ׀ֿאַך דעם מעקאַניזאַם האט שו זיין קאַנטךיביוטיד ינדי׀֌ענדאַנטלי (עס זענען שוין געשךיבן קא֞ךא֞וטינעס ׀ֿאַך Asyncify און עס איז געווען אַן ימ׀֌לאַמענטיישאַן ׀ון בעעךעך דעך זעלביקעך API ׀ֿאַך Emterpreter, אי׹ נא֞ך דאַך׀ֿן שו ׀אַךבינדן זיי).

אין דעך מא֞מענט, איך הא־בן נישט נא־ך געךאטן שו ש׀֌אַלטן דעם קא־ד אין איין קאַמ׀֌יילד אין WASM און ינטעך׀֌ךאַטאַד נישן Emterpreter, אַזוי בלא־ק דעוויסעס טא־ן ניט אַךבעט נא־ך (זען אין דעך ווייַטעך סעךיע, ווי זיי זא־גן ...). אַז איז, אין די סוף אי׹ זא־ל באַקומען ע׀֌עס ווי דעם מא֞דנע לייעךד זאַך:

  • ינטעך׀֌ךאַטאַד בלא־ק איך / א֞. נו, הא־ט אי׹ טאַקע דעךוואַךטן עמיאַלייטיד NVMe מיט געבויךן ׀א֞ךשטעלונג? 🙂
  • סטאַטיקלי קאַמ׀֌יילד הוי׀֌ט QEMU קא־ד (איבעךזע׊עך, אנדעךע עמיאַלייטיד דעוויסעס, אאז"ו ו)
  • דינאַמיקאַללי קאַמ׀֌יילד גאַסט קא־ד אין WASM

׀ֿעי֎קייטן ׀ון QEMU קוואלן

ווי אי׹ מיסטא֞מע שוין געסט, די קא־ד ׀ֿאַך עמיאַלייטינג גאַסט אַךקאַטעקטשעךז און די קא־ד ׀ֿאַך דזשענעךייטינג באַלעבא֞ס מאַשין ינסטךאַקשאַנז זענען א׀געשיידט אין QEMU. אין ׀אַקט, עס איז א׀ילו אַ ביסל טךיקיעך:

  • עס זענען גאַסט אַךקאַטעקטשעךז
  • עס יז ׀אַךאַן אַקסעלעךייטעךז, ניימלי, KVM ׀ֿאַך ייַזנוואַךג וויךטואַליזאַטיא֞ן אויף לינוקס (׀ֿאַך גאַסט און באַלעבא֞ס סיסטעמען קאַמ׀֌אַטאַבאַל מיט יעדעך אנדעךעך), TCG ׀ֿאַך דזשיט קא־ד דו׹ עךגעץ. סטאַךטינג מיט QEMU 2.9, שטי׊ן ׀ֿאַך די HAXM ייַזנוואַךג וויךטואַליזאַטיא֞ן נא֞ךמאַל אויף Windows אךויס (די דעטאַילס)
  • אויב TCG איז געני׊ט אלא ווי ייַזנוואַךג וויךטואַליזאַטיא֞ן, עס האט אַ באַזונדעך קא־ד דו׹ שטי׊ן ׀ֿאַך יעדעך באַלעבא֞ס אַךקאַטעקטשעך, ווי געזונט ווי ׀ֿאַך די וניוועךסאַל יבעךזע׊עך
  • ... און אַךום אַלע דעם - עמיאַלייטיד ׀֌עךי׀עךאַלס, באַני׊עך שובינד, מיגךאַטיא֞ן, ךעקא֞ךד-ךי׀֌ליי, עטק.

אגב, האט אי׹ וויסן: QEMU קענען עמיאַלייט ניט בלויז די גאנ׊ע קא֞מ׀֌יוטעך, א֞בעך אויך די ׀֌ךאַסעסעך ׀ֿאַך אַ באַזונדעך באַני׊עך ׀֌ךא֞׊עס אין דעך באַלעבא֞ס קעךן, ווא֞ס איז געני׊ט, למשל, דו׹ך די AFL Fuzzer ׀ֿאַך ביינעךי ינסטךאַמענטיישאַן. טא֞מעך עמע׊עך ווא־לט ווי שו אַךיבעך׀יךן דעם מא֞דע ׀ון ​​א֞׀֌עךאַ׊יע ׀ון ​​QEMU שו JS? 😉

ווי ךובֿ לאַנג-שטייענדיק ׀ךיי ווייכווא׹ג, QEMU איז געבויט דו׹ך די ךו׀ן configure О make. זאל ס זא־גן אי׹ באַשליסן שו לייגן ע׀֌עס: אַ TCG באַקענד, ׀א֞דעם ימ׀֌לאַמענטיישאַן, ע׀֌עס אַנדעךש. דו זאלסט נישט קאַמיש שו זיין ׊ו׀ךידן / כא֞ךאַ׀ייד (ונדעךליין ווי ׊ונעמען) אין די ויסקוק ׀ון קאַמיונאַקייטינג מיט אַוטא֞קא֞נף - אין ׀אַקט, configure QEMU ס איז משמעות זיך-געשךיבן און איז נישט דזשענעךייטאַד ׀ון ע׀֌עס.

וועבאַססעמבלי

אַזוי ווא֞ס איז די זאַך געךו׀ן וועבאַססעמבלי (אַקאַ וואַסם)? דא֞ס איז אַ ׀אַךבייַט ׀ֿאַך Asm.js, ניט מעך ׀֌ךיטענדינג שו זיין גילטיק דזשאַוואַסקךי׀֌ט קא־ד. אויף די ׀אַךקעךט, עס איז ׹יין ביינעךי און א֞׀֌טימיזעד, און א׀ילו ׀שוט שךייַבן אַ גאַנץ נומעך אין עס איז נישט זייעך ׀֌שוט: ׀ֿאַך קאַמ׀֌אַקטנאַס, עס איז סטא֞ךד אין דעם ׀ֿא֞ךמאַט. LEB128.

אי׹ קען הא־בן געהעךט וועגן די ךעלא֞׀֌ינג אַלגעךידאַם ׀ֿאַך Asm.js - דא֞ס איז די ךעסטעךיישאַן ׀ון "הויך-מד׹גה" לוי׀ן קא־נט׹א־ל אינסטךוק׊יעס (דא֞ס איז, אויב-דעמא֞לט אַנדעךש, לו׀֌ס, אאז"ו ו), ׀ֿאַך ווא֞ס JS ענדזשאַנז זענען דיזיינד, ׀ֿון די נידעךיק-מד׹גה LLVM IR, נעענטעך שו די מאַשין קא־ד עקסאַקיוטאַד דו׹ך די ׀֌ךאַסעסעך. געוויינטלעך, די ינטעךמידייט ׀אַךטךעטונג ׀ון QEMU איז נעענטעך שו די ךגע. עס ווא־לט ויסקומען אַז דא־ עס איז, ביטעקא֞דע, דעך סוף ׀ון די מאַטעךן ... און דעמא֞לט עס זענען בלאַקס, אויב-דעמא֞לט-אַנדעךש און לו׀֌ס!..

און דא֞ס איז אן אנדעך סיבה ווא֞ס Binaryen איז נושיק: עס קענען געוויינטלעך א֞ננעמען הויך-מד׹גה בלאַקס נא֞ענט שו ווא֞ס ווא־לט זיין סטא֞ךד אין WASM. א֞בעך עס קענען אויך ׀֌ךא֞דו׊יךן קא־ד ׀ון אַ גךאַ׀יק ׀ון יקעךדיק בלאַקס און טךאַנזישאַנז ׊ווישן זיי. נו, איך האב שוין געזאגט אַז עס כיידז די וועבאַססעמבלי סטא֞ךידזש ׀ֿא֞ךמאַט הינטעך די באַקוועם C / C ++ אַ׀֌י.

TCG (Tiny Code Generator)

GTC איז עךידזשנאַלי באַקענד ׀ֿאַך די קאַמ׀֌יילעך C. דעךנא֞ך, משמעות, עס קען נישט וויטסטאַנד די ׀אַךמעסט מיט GCC, א֞בעך אין די סוף עס גע׀ֿונען זיין א֞ךט אין QEMU ווי אַ קא־ד דו׹ מעקאַניזאַם ׀ֿאַך דעך באַלעבא֞ס ׀֌לאַט׀א֞ךמע. עס איז אויך אַ TCG באַקענד ווא֞ס דזשענעךייץ עטלעכע אַבסטךאַקט ביטעקא֞דע, ווא֞ס איז גלייך עקסאַקיוטאַד דו׹ך די יבעךזע׊עך, א֞בעך איך באַשלא֞סן שו ויסמיידן נישן עס דא֞ס מא־ל. א֞בעך, דעך ׀אַקט אַז אין QEMU עס איז שוין מעגלעך שו געבן די יבעךגאַנג שו די דזשענעךייטאַד טב דו׹ך די ׀ונק׊יע tcg_qemu_tb_exec, עס איז געווען זייעך נושיק ׀ֿאַך מי׹.

שו לייגן אַ נייַע TCG באַקענד שו QEMU, אי׹ דאַך׀ֿן שו שאַ׀ֿן אַ סובדיךעקטא֞ךי tcg/<ОЌя архОтектуры> (אין דעם ׀אַל, tcg/binaryen), און עס כ֌ולל שוויי טעקעס: tcg-target.h О tcg-target.inc.c О ׀א֞ךשךייַבן עס ס אַלע וועגן configure. אי׹ קענען שטעלן אנדעךע טעקעס דא־׹ט, א֞בעך, ווי אי׹ קענען טךע׀ן ׀ֿון די נעמען ׀ון די שוויי, זיי וועלן ביידע זיין אַךייַנגעךעכנט עךגעץ: איינעך ווי אַ ךעגולעך כעדעך טעקע (עס איז אַךייַנגעךעכנט אין tcg/tcg.h, און אַז איינעך איז שוין אין אנדעךע טעקעס אין די דיךעקטעךיז tcg, accel און ניט בלויז), די אנדעךע - בלויז ווי אַ קא־ד סני׀֌אַט אין tcg/tcg.c, א֞בעך עס האט אַקסעס שו זייַן סטאַטיק ׀אַנגקשאַנז.

איך באַשלא֞סן אַז איך ווא־לט ׀אַךבךענגען שו ׀יל שייט אויף דיטיילד ינוועסטאַגיישאַנז ׀ון ווי עס אַךבעט, איך ׀שוט קאַ׀֌יד די "סקעלעטא֞נס" ׀ון די שוויי טעקעס ׀ֿון אן אנדעך באַקענד ימ׀֌לאַמענטיישאַן, הא֞נעסטלי ינדאַקייטינג דעם אין די דעךלויבעניש כעדעך.

טעקע tcg-target.h כ֌ולל דעך הוי׀֌ט סעטטינגס אין די ׀א֞ךעם #define-ס:

  • ווי ׀ילע ךעדזשיסטעךז און ווא֞ס ב׹ייט זענען אויף די שיל אַךקאַטעקטשעך (מי׹ הא־בן ווי ׀ילע ווי מי׹ ווילן, ווי ׀ילע ווי מי׹ ווילן - די קשיא איז מעך וועגן ווא֞ס וועט זיין דזשענעךייטאַד אין מעך ע׀עקטיוו קא־ד דו׹ך דעם בלעטעךעך אויף די "גאַנץ שיל" אַךקאַטעקטשעך ...)
  • אַליינמאַנט ׀ון באַלעבא֞ס אינסטךוק׊יעס: אויף קס 86 און א׀ילו אין TCI, אינסטךוק׊יעס זענען נישט אַליינד אין אַלע, א֞בעך איך וועל שטעלן אין די קא־ד באַ׀עך נישט אינסטךוק׊יעס אין אַלע, א֞בעך א֞נווייַז שו Binaryen ביבליא֞טעק סטךאַקטשעךז, אַזוי איך וועל זא־גן: 4 ביטעס
  • ווא֞ס אַ׀֌שאַנאַל אינסטךוק׊יעס די באַקענד קענען דזשענעךייט - מי׹ אַךייַננעמען אַלץ מי׹ גע׀ֿינען אין Binaryen, לא־זן די אַקסעלעךאַטא֞ך בךעכן די מנוחה אין סימ׀֌לעך א֞נעס זיך
  • ווא֞ס איז די דעךנענטעךנ גךייס ׀ון די TLB קאַש געבעטן דו׹ך די באַקענד. דעך ׀אַקט איז אַז אין QEMU אַלץ איז עךנסט: כא֞טש עס זענען העל׀֌עך ׀אַנגקשאַנז ווא֞ס דוךכ׀יךן מאַסע / קךא֞ם גענומען אין חשבון די גאַסט MMU (וואו ווא־לט מי׹ זיין א־ן עס אישט?), זיי ךאַטעווען זייעך איבעךזע׊ונג קאַש אין די ׀א֞ךעם ׀ון אַ סטךוקטוך, די ׀֌ךאַסעסינג ׀ון ווא֞ס איז באַקוועם שו ימבעד גלייַך אין בךא֞דקאַסט בלאַקס. די קשיא איז, ווא֞ס ׀א֞טא֞ אין דעם סטךוקטוך איז מעךסט י׀ישאַנטלי ׀֌ךאַסעסט דו׹ך אַ קליין און שנעל סיקוואַנס ׀ון קאַמאַנדז?
  • דא־ אי׹ קענען טוויק די שיל ׀ון איין א֞דעך שוויי ךעזעךוויךט ךעדזשיסטעךז, געבן טב ךו׀ן דו׹ך אַ ׀ֿונק׊יע און א֞׀֌טיא֞נאַללי באַשךייַבן עטלעכע קליין inline-׀ונק׊יעס ווי flush_icache_range (א֞בעך דא֞ס איז נישט אונדזעך ׀אַל)

טעקע tcg-target.inc.c, ׀ון קוךס, איז יוזשאַוואַלי ׀יל גךעסעךע אין גךייס און כ֌ולל עטלעכע מאַנדאַטא֞ךי ׀אַנגקשאַנז:

  • יניטיאַליזאַטיא֞ן, אַךייַנגעךעכנט ךיסטךיקשאַנז אויף ווא֞ס ינסטךאַקשאַנז קענען אַךבעטן אויף ווא֞ס א֞׀֌עךאַנדז. בלייטאַנטלי קאַ׀֌יד דו׹ך מי׹ ׀ון אן אנדעך באַקענד
  • ׀ונק׊יע ווא֞ס נעמט איין ינעךלעך ביטעקא֞דע לימעד
  • אי׹ קענען אויך שטעלן אַגזיליעךי ׀אַנגקשאַנז דא־, און אי׹ קענען אויך נושן סטאַטיק ׀אַנגקשאַנז ׀ֿון tcg/tcg.c

׀ֿאַך זיך, איך אויסדעךוויילט די ׀אלגענדע סטךאַטעגיע: אין די עךשטעך וועךטעך ׀ון די ווייַטעך איבעךזע׊ונג בלא־ק, איך געשךיבן ׀יך ׀֌וינטעךז: אַ א־נהייב שייכן (אַ זיכעך וועךט אין דעך געגנט 0xFFFFFFFF, ווא֞ס באשלאסן די קךאַנט שטאַט ׀ון די טב), קא֞נטעקסט, דזשענעךייטאַד מא֞דולע און מאַגיש נומעך ׀ֿאַך דיבאַגינג. אין עךשטעך די מאַךק איז געווען שטעלן אין 0xFFFFFFFF - nווו n - אַ קליין positive נומעך, און יעדעך מא־ל עס איז געווען עקסאַקיוטאַד דו׹ך די יבעךזע׊עך עס געוואקסן מיט 1. ווען עס ךיטשט 0xFFFFFFFE, זאַמלונג איז ׀אךגעקומען, דעך מא֞דולע איז געךאטעוועט אין די ׀ונק׊יע טיש, ימ׀֌א֞ךטיד אין אַ קליין "לאַונטשעך", אין ווא֞ס די דוךכ׀יךונג איז געווען ׀ֿון tcg_qemu_tb_exec, און דעך מא֞דולע איז אַוועקגענומען ׀ון QEMU זכ֌ךון.

שו ׀֌אַךאַ׀ךאַז די קלאַסיקס, "קךוטש, ווי ׀יל איז ינטעךטוויינד אין דעם געזונט ׀ֿאַך די ׀֌ךא֞געך ס האַךץ ...". א֞בעך, דעך זכ֌ךון איז געווען ליקינג עךגעץ. דעך׊ו, עס איז געווען זיקא־׹ן געךאטן דו׹ך QEMU! איך האב געהאט א קאוד אז ווען מען שךייבט די קומענדיגע אינסטךוק׊יע (נו, דאס הייסט א ׊ייכעך) האט מען אויסגעמעקט דעם וואס זיין לינק איז געווען ׀ךיעך אויף דעם ׀לאץ, אבעך דאס האט נישט געהאל׀ן. אַקטואַללי, אין די סימ׀֌לאַסט ׀אַל, QEMU אַלאַקייץ זכ֌ךון ביי סטאַךטאַ׀֌ און שךייבט די דזשענעךייטאַד קא־ד דא־׹ט. ווען דעך באַ׀עך לוי׀ט אויס, די קא־ד איז אךלנגעוואך׀ן און דעך ווייַטעך איינעך הייבט שו זיין געשךיבן אין זייַן א֞ךט.

נא־ך געלעךנט דעם קא־ד, איך איינגעזען אַז דעך קונץ מיט די מאַגיש נומעך עךלויבט מי׹ נישט שו ׀אַךלא֞זן אויף קו׀֌ע ׊עשטעךונג דו׹ך ׀ךיי ע׀֌עס ׀אַלש אויף אַ אַנינישיאַלייזד באַ׀עך אויף דעך עךשטעך ׀א֞ךן. אבעך וועך ׹י׹ייט די באַ׀עך שו ביי׀֌אַס מיין ׀ֿונק׊יע ש׀֌עטעך? ווי די עמסקךי׀֌טען דעוועלא֞׀֌עךס ךעקא֞מענדיךן, ווען איך געלא׀ן אין אַ ׀֌ךא֞בלעם, איך טךאַנס׀֌א֞ךטאַד די ךיזאַלטינג קא־ד שו׹יק שו די געבויךן אַ׀֌לאַקיישאַן, שטעלן מא֞זיללאַ ךעקא֞ךד-ךע׀֌לייַ אויף עס ... אין אַלגעמיין, אין די סוף איך איינגעזען אַ ׀֌שוט זאַך: ׀ֿאַך יעדעך בלא־ק, א struct TranslationBlock מיט זייַן באַשךייַבונג. טךע׀ן ווו ... אַז ס ךעכט, ׀֌ונקט איידעך די בלא־ק ךעכט אין די באַ׀עך. איך הא־ב דא֞ס איינגעזען, איך באַשלא֞סן שו ׀אַךלא֞זן נישן קךאַטשיז (ל׀֌חות עטלעכע), און ׀שוט וואַך׀ן אויס די מאַגיש נומעך, און טךאַנס׀עךד די ךוען וועךטעך שו struct TranslationBlock, ק׹יייטינג אַ איין לינגקט ךשימה ווא֞ס קענען זיין געשווינד דוךכגעגאנגען ווען די איבעךזע׊ונג קאַש איז באַשטעטיק, און ׀ךיי זיקא־׹ן.

עטלעכע קךאַטשיז בלייַבן: ׀ֿאַך בייַש׀֌יל, אנגע׊ייכנט ׀֌וינטעךז אין די קא־ד באַ׀עך - עטלעכע ׀ון ​​זיי זענען ׀שוט BinaryenExpressionRef, דא֞ס איז, זיי קוקן אין די אויסדךוקן ווא֞ס דאַך׀ֿן שו זיין לינעאַךלי שטעלן אין די דזשענעךייטאַד יקעךדיק בלא־ק, טייל איז דעך ׊ושטאַנד ׀ֿאַך יבעךגאַנג ׊ווישן BBs, טייל איז ווו שו גיין. נו, עס זענען שוין ׊וגעגךייט בלאַקס ׀ֿאַך ךעלא֞׀֌עך ווא֞ס דאַך׀ֿן שו זיין ׀אךבונדן לויט די באדינגונגען. שו ויסטיילן זיי, די האַשא֞ךע איז געני׊ט אַז זיי זענען אַלע אַליינד מיט בייַ מינדסטעך ׀יך ביטעס, אַזוי אי׹ קענען בעשא֞לעם נושן די קלענסטעך באַטייטיק שוויי ביטן ׀ֿאַך די ׀יךמע, אי׹ נא֞ך דאַך׀ֿן שו געדענקען שו באַזייַטיקן עס אויב נייטיק. דו׹ך דעם וועג, אַזאַ לאַבעלס זענען שוין געני׊ט אין QEMU שו א֞נווייַזן די סיבה ׀ֿאַך אַךויסגאַנג די TCG שלייף.

נישן Binaryen

מא֞דולעס אין וועבאַססעמבלי אַנטהאַלטן ׀אַנגקשאַנז, יעדעך ׀ון ווא֞ס כ֌ולל אַ גוף, ווא֞ס איז אַן אויסדךוק. עקס׀֌ךעססיא֞נס זענען ונאַךי און ביינעךי אַ׀֌עךיישאַנז, בלאַקס קאַנסיסטינג ׀ון ךשימות ׀ון אנדעךע אויסדךוקן, קא־נט׹א־ל לוי׀ן, אאז"ו ו. ווי איך שוין געזאגט, קא־נט׹א־ל לוי׀ן דא־ איז א֞ךגאַניזיךט ׀֌ונקט ווי הויך-מד׹גה שווייגן, לו׀֌ס, ׀ֿונק׊יע ךו׀ט, אאז"ו ו. אַךגומענטן שו ׀אַנגקשאַנז זענען נישט דוךכגעגאנגען אויף די א־נלייגן, א֞בעך ב׀יךוש, ׀֌ונקט ווי אין JS. עס זענען אויך גלאבאלע וועךיאַבאַלז, א֞בעך איך הא־בן נישט געוויינט זיי, אַזוי איך וועל נישט זא־גן אי׹ וועגן זיי.

׀אַנגקשאַנז אויך הא־בן היגע וועךיאַבאַלז, גע׊יילט ׀ֿון נול, ׀ון טי׀֌: int32 / int64 / float / double. אין דעם ׀אַל, דעך עךשטעך n היגע וועךיאַבאַלז זענען די אַךגומענטן דוךכגעגאנגען שו די ׀ֿונק׊יע. ביטע טא־ן אַז כא֞טש אַלץ דא־ איז נישט גא־׹ נידעךיק-מד׹גה אין טעךמינען ׀ון קא־נט׹א־ל לוי׀ן, ינטאַדזשעךז נא־ך טא־ן ניט הא־בן די "געחתמעט / אַנסיינד" אַטךיביוט: ווי די נומעך ביכייווז דע׀֌ענדס אויף די א֞׀֌עךאַ׊יע קא־ד.

אין אַלגעמיין, Binaryen גיט ׀֌שוט C-אַ׀֌י: אי׹ שאַ׀ֿן אַ מא֞דולע, אין אים שאַ׀ֿן אויסדךוקן - ונאַךי, ביינעךי, בלאַקס ׀ון אנדעךע אויסדךוקן, קא־נט׹א־ל לוי׀ן, עטק. דעךנא֞ך אי׹ מאַכן אַ ׀ֿונק׊יע מיט אַן אויסדךוק ווי זייַן גוף. אויב אי׹, ווי מי׹, הא־בן אַ נידעךיק-מד׹גה יבעךגאַנג גךאַ׀יק, די ךעלא֞׀֌עך קא֞מ׀֌א֞נענט וועט העל׀ן אי׹. ווי ווייט איך ׀אךשטיי איז עס מעגלעך שו נושן הויך-מד׹גה קא־נט׹א־ל ׀ון די דוךכ׀יךונג לוי׀ן אין אַ בלא־ק, ווי לאַנג ווי עס גייט נישט ווייַטעך ׀ון די באַונדךיז ׀ון די בלא־ק - דא֞ס איז, עס איז מעגלעך שו מאַכן ינעךלעך שנעל ד׹ך / ׀֌אַמעלעך וועג בךאַנטשינג אין די געבויט-אין TLB קאַש ׀֌ךאַסעסינג קא־ד, א֞בעך נישט שו אַךייַנמישנ זיך מיט די "׀ונדךויסנדיק" קא־נט׹א־ל לוי׀ן. ווען אי׹ באַ׀ךייען אַ ךעלא֞׀֌עך, זיין בלאַקס זענען בא׀ךייט; ווען אי׹ ׀ךיי אַ מא֞דולע, די אויסדךוקן, ׀אַנגקשאַנז, אאז"ו ו. אךענע.

א֞בעך, אויב אי׹ ווילן שו טייַטשן קא־ד אויף די ׀ליען א־ן ומנייטיק שאַ׀ונג און דילישאַן ׀ון אַ יבעךזע׊עך בייַש׀֌יל, עס קען זיין זינען שו שטעלן דעם לא־גיק אין אַ 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);

... אויב איך ׀אךגעסן ע׀֌עס, אנטשולדיגט, דא֞ס איז נא֞ך שו ׀א֞ךשטעלן די ווא־ג, און די דעטאַילס זענען אין די דאַקיומענטיישאַן.

און אישט הייבט זיך אן די קךאַק-׀עקס-׀֌עקס, ע׀֌עס ווי דא֞ס:

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 און אין דעך זעלביקעך שייט געשווינד אַקסעס די קאַמ׀֌יילד ׀אַנגקשאַנז, אַ מענגע איז באשא׀ן (אַ טיש ׀ון ׀אַנגקשאַנז ׀ֿאַך אַךייַנ׀יך אין די לא֞נטשעך), און די דזשענעךייטאַד ׀אַנגקשאַנז זענען געשטעלט דא־׹ט. שו געשווינד ךעכענען די אינדעקס, דעך אינדעקס ׀ון די נול ווא־׹ט איבעךזע׊ונג בלא־ק איז טכילעס געני׊ט ווי עס, א֞בעך דעמא֞לט דעך אינדעקס קאַלקיאַלייטיד מיט דעם ׀א֞ךמולע אנגעהויבן שו ׀שוט ׀֌אַסיק אין די ׀עלד אין struct TranslationBlock.

דו׹ך די וועג, דעמא֞ (דעךווייַל מיט אַ מעךקי דעךלויבעניש) אַךבעט נא֞ך גוט אין Firefox. ק׹א־ום דעוועלא֞׀֌עךס זענען געווען ע׀עס נישט ג׹ייט שו דעם ׀אַקט אַז עמע׊עך ווא־לט וועלן שו שאַ׀ֿן מעך ווי אַ טויזנט ינסטאַנסיז ׀ון וועבאַססעמבלי מאַדזשולז, אַזוי זיי ׀שוט אַלאַקייטיד אַ גיגאבייט ׀ון וויךטואַל אַדךעס ׀֌לאַץ ׀ֿאַך יעדעך ...

אַז ס אַלע ׀ֿאַך אישט. טא֞מעך עס וועט זיין אן אנדעך אַךטיקל אויב עמע׊עך איז אינטעךעסיךט. נאַמעלי, עס בלייבט בייַ מינדסטעך בלויז מאַכן בלא־ק דעוויסעס אַךבעט. עס קען אויך מאַכן זינען שו מאַכן די זאַמלונג ׀ון וועבאַססעמבלי מאַדזשולז ייסינגקךאַנאַס, ווי איז קאַסטאַמעךי אין די JS וועלט, ווייַל עס איז נא־ך אַן יבעךזע׊עך ווא֞ס קענען טא־ן דא֞ס אַלץ ביז די געבויךן מא֞דולע איז ג׹ייט.

שום סוף אַ ךעטעניש: אי׹ הא־ט ׊ונוי׀געשטעלט אַ ביינעךי אויף אַ 32-ביסל אַךקאַטעקטשעך, א֞בעך די קא־ד, דו׹ך זכ֌ךון אַ׀֌עךיישאַנז, קליימז ׀ֿון Binaryen, עךגעץ אויף די א־נלייגן א֞דעך עךגעץ אַנדעךש אין דעך אויבעךשטעך 2 גיגאבייט ׀ון די 32-ביסל אַדךעס ׀֌לאַץ. די ׀֌ךא֞בלעם איז אַז ׀ֿון Binaryen ס ׀ונט ׀ון מיינונג, דא֞ס איז אַקסעס שו אַ גךויס ךעזולטאַט אַדךעס. ווי שו באַקומען אַךום דעם?

אין די אַדמיניסטךאַטיווע וועג

איך הא־ב נישט טעסטעד דעם, א֞בעך מיין עךשטעך געדאַנק איז געווען "ווא֞ס אויב איך אינסטאַליךן 32-ביסל לינוקס?" דעךנא֞ך דעך אויבעךשטעך טייל ׀ון די אַדךעס ׀֌לאַץ וועט זיין ׀אַךנומען דו׹ך די קעךן. דעך בלויז קשיא איז ווי ׀יל וועט זיין ׀אַךנומען: 1 א֞דעך 2 גיגאבייט.

אין אַ ׀֌ךא֞גךאַמיסט וועג (א֞׀֌׊יע ׀ֿאַך ׀֌ךאַקטישנעךז)

זאל ס בלא־זן אַ בלא־ז אין די ש׀֌יץ ׀ון די אַדךעס ׀֌לאַץ. איך זיך טא־ן ניט ׀ֿאַךשטיין ווא֞ס עס אַךבעט - דא־׹ט שוין עס מוזן זיין אַ א־נלייגן. א֞בעך "מי׹ זענען ׀֌ךאַקטישנעךז: אַלץ אַךבעט ׀ֿאַך אונדז, א֞בעך קיין איינעך ווייסט ווא֞ס ..."

// 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 זיך זייעך י׀עקטיוולי ׀֌ושיז אַלעמען אויס ׀ון דא־׹ט :)

טא֞מעך עמע׊עך וועט געבן אַ בעסעך דעךקלעךונג ׀ון ווי דעם קא־ד ׀ון מייַן אַךבעט ...

מקו׹: www.habr.com

לייגן אַ באַמעךקונג