## Quantitative Pointer Analysis for Programs on Hybrid DRAM-PM Memory Systems #### Authors:李瑞恆, 陳鵬升 <br/> #### Presenter: 郭康唯 --- - Abstract - Introdcution - Background - Design and Implementaion - Evaluation - Conclusion --- ### Abstract ![image](https://hackmd.io/_uploads/rytowU7Ka.png) --- # Introcudion - Hybrid Memory System - Characteristics of PM and DRAM - Contribution ---- #### Hybrid Memory System ![image](https://hackmd.io/_uploads/Hy5LmrmY6.png) ---- #### Characteristics of PM and DRAM ![image](https://hackmd.io/_uploads/SkHDpSXYa.png) ---- #### Contribution - A pointer analysis for hybrid DRAM-PM memory systems. - Implementation - Experiment --- # Background - PMDK - MemorySSA ---- #### PMDK ```c= void write_hello_string (char *buf, char *path) { // Create the pmemobj pool or open it if it already exists PMEMobjpool *pop = pmemobj_create(path, LAYOUT, PMEMOBJ_MIN_POOL, 0666); // Get the PMEMObj root PMEMoid root = pmemobj_root(pop, sizeof (struct my_root)); // Pointer for structure at the root struct my_root *rootp = pmemobj_direct(root); rootp->val = 10; // Close PMEM object pool pmemobj_close(pop); return; } ``` ---- #### MemorySSA - MemoryDef - MemoryUse - MemoryPhi - Clobber ---- #### MemoryDef ```llvmir= define void @foo() { %p1 = alloca i8, align 1 %p2 = alloca i8, align 1 ; 1 = MemoryDef(liveOnEntry) store i8 0, ptr %p1, align 1 ; 2 = MemoryDef(1) store i8 0, ptr %p2, align 1 ; 3 = MemoryDef(2) %1 = call ptr @pmemobj_create() } ``` ---- #### MemoryUse ```llvmir= define void @foo() { %p1 = alloca i8, align 1 ; 1 = MemoryDef(liveOnEntry) store i8 0, ptr %p1, align 1 ; MemoryUse(1) %1 = load i8, ptr %p1 } ``` ---- #### MemoryPhi ```llvmir= define void @foo() { ;if %1 = alloca i32, align 4 %2 = alloca i32, align 4 ; 1 = MemoryDef(liveOnEntry) store i32 0, ptr %1, align 4 ; 2 = MemoryDef(1) store i32 1, ptr %2, align 4 ; MemoryUse(2) %3 = load i32, ptr %2, align 4 %4 = icmp eq i32 %3, 1 br i1 %4, label %5, label %6 5: ;then ; 3 = MemoryDef(2) store i32 0, ptr %1, align 4 br label %7 6: ;else ; 4 = MemoryDef(2) store i32 1, ptr %1, align 4 br label %7 7: ;return ; 5 = MemoryPhi({%5,3},{%6,4}) ; MemoryUse(5) %8 = load i32, ptr %1, align 4 ret i32 %8 } ``` ---- #### Clobber ```llvmir= define void @foo() { %p1 = alloca i8, align 1 ; 1 = MemoryDef(liveOnEntry)->liveOnEntry store i8 0, ptr %p1, align 1 ; 2 = MemoryDef(1)->1 store i8 3, ptr %p1, align 1 ; MemoryUse(2) %1 = load i8, ptr %p1, align 1 } ``` --- ### Design and Implementaion - algorithm - inter-procedural analysis - running example ---- #### algorithm ![image](https://hackmd.io/_uploads/HyF7snH3p.png) ---- #### algorithm ![image](https://hackmd.io/_uploads/SJqHihH3a.png) ---- #### algorithm ![image](https://hackmd.io/_uploads/BJeDo3Hnp.png) ---- #### algorithm ![image](https://hackmd.io/_uploads/rkHni2S3a.png) ---- #### inter-procedural analysis - case1 - case2 ---- #### case1 ```llvmir= define ptr @bar() { %1 = call ptr @pmemobj_create() ret ptr %1 } define void @foo() { %1 = call ptr @bar() } ``` ---- #### case2 ```llvmir= define i8 @bar(ptr %0) { %1 = load i8, ptr %0, align 1 ret i8 %1 } define void @foo() { %1 = call ptr @pmemobj_create() %2 = call ptr @bar(ptr %1) } ``` ---- #### running example ---- #### C code ```c= void foo() { int* ptr_dram = malloc(); int* ptr_pm = pmemobj_create(); *ptr_dram = 1; *ptr_pm = 0; } ``` ---- #### LLVM IR ```llvmir= define void @foo() { ; int* ptr_dram = malloc(); %1 = alloca ptr, align 8 ; 1 = MemoryDef(liveOnEntry)->liveOnEntry %2 = call ptr @malloc() ; 2 = MemoryDef(1)->liveOnEntry store ptr %2, ptr %1, align 8 ; int* ptr_pm = pmemobj_create(); %3 = alloca ptr, align 8 ; 3 = MemoryDef(2)->1 MayAlias %4 = call ptr @pmemobj_create() ; 4 = MemoryDef(3)->liveOnEntry store ptr %4, ptr %3, align 8 ; *ptr_dram = 1; ; MemoryUse(2) MustAlias %5 = load ptr, ptr %1, align 8 ; 5 = MemoryDef(4)->3 MayAlias store i32 1, ptr %5, align 4 ; *ptr_pm = 0; ; MemoryUse(4) MustAlias %6 = load ptr, ptr %3, align 8 ; 6 = MemoryDef(5)->5 MayAlias store i32 0, ptr %6, align 4 } ``` ---- #### StrongPM ![image](https://hackmd.io/_uploads/SkwuXRS2T.png) ---- #### StrongPM ![image](https://hackmd.io/_uploads/ByZ_VABnT.png) ---- #### StrongPM ![image](https://hackmd.io/_uploads/BkxIS0H3p.png) ---- #### StrongPM ![image](https://hackmd.io/_uploads/SJJlIASh6.png) ---- #### StrongPM ![image](https://hackmd.io/_uploads/H1GIURShT.png) ---- #### NotPM ![image](https://hackmd.io/_uploads/HyhxY0H2p.png) ---- #### NotPM ![image](https://hackmd.io/_uploads/SJGQtCr2T.png) ---- #### NotPM ![image](https://hackmd.io/_uploads/rkT4YABnT.png) ---- #### NotPM ![image](https://hackmd.io/_uploads/rJfDtCBh6.png) ---- #### NotPM ![image](https://hackmd.io/_uploads/r1HuF0Bna.png) ---- --- # Evaluation - Configuration - Methods - Result ---- #### Configuration ![image](https://hackmd.io/_uploads/BJvF5LXt6.png) ---- #### Methods ![image](https://hackmd.io/_uploads/Hk16kv7Ka.png) ---- #### Methods ![image](https://hackmd.io/_uploads/rkGawo9ha.png) ---- #### Result ![image](https://hackmd.io/_uploads/B1ijxDmK6.png) --- # Conclusion ![image](https://hackmd.io/_uploads/S1NoyI7YT.png) ---- ```python from cryptography.hazmat.primitives.ciphers.aead import AESGCM import os import filecmp key = AESGCM.generate_key(bit_length=256) nonce = os.urandom(12) input_file = "plain" output_file = "cipher" with open(input_file, "rb") as f: plaintext = f.read() aesgcm = AESGCM(key) ciphertext = aesgcm.encrypt(nonce, plaintext, None) with open(output_file, "wb") as f: f.write(ciphertext) ```
{"title":"Paper-1","description":"Starting from x86_64_start_kernelimage.png","slideOptions":"{\"title\":\"Quantitative Pointer Analysis for Programs on Hybrid DRAM-PM Memory Systems\",\"tags\":\"presentation\",\"slideOptions\":{\"theme\":\"white\",\"transition\":\"fade\"}}","contributors":"[{\"id\":\"a52cef82-249b-4802-a80d-b9556709864b\",\"add\":15762,\"del\":9467}]"}
    135 views