From 710fe93ec5730e226648abd00c79e82c283262c5 Mon Sep 17 00:00:00 2001 From: Akilan Date: Mon, 20 Jan 2025 15:20:21 +0000 Subject: [PATCH] Added Literature review --- docs/.DS_Store | Bin 6148 -> 8196 bytes docs/LiteratureReview/LiteratureReview.bbl | 63 +++ docs/LiteratureReview/LiteratureReview.bib | 474 ++++++++++++++++++++ docs/LiteratureReview/LiteratureReview.org | 73 +++ docs/LiteratureReview/LiteratureReview.org~ | 0 docs/LiteratureReview/LiteratureReview.pdf | Bin 0 -> 112798 bytes docs/LiteratureReview/LiteratureReview.tex | 109 +++++ 7 files changed, 719 insertions(+) create mode 100644 docs/LiteratureReview/LiteratureReview.bbl create mode 100644 docs/LiteratureReview/LiteratureReview.bib create mode 100644 docs/LiteratureReview/LiteratureReview.org create mode 100644 docs/LiteratureReview/LiteratureReview.org~ create mode 100644 docs/LiteratureReview/LiteratureReview.pdf create mode 100644 docs/LiteratureReview/LiteratureReview.tex diff --git a/docs/.DS_Store b/docs/.DS_Store index 7ecf7dc145e38dd10958a7c5753c6af951fef326..e1a9d848fe4ef3c430f186f52085a6bf7c5e268a 100644 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIz|54&6j~@dLPnYZ(gn9jD-@NbKm3aPY)eZ4*V&x`CQN6_&g>Q> z#HukQ3Tk4EPvTGXQ4(YHfrz1RM4vR3z>6lB_@WQSs81$%?%Y|Rg(mu92+mFJJ#+3k zXYQPHzjJTTmNAB|vem{|GhRn9saBw3CS> z0!ajt2qY0mB9KJjUWfqQ*}Tcq-1|bBj7bEN2>dT2z|RMRI;Yu~jtLqa9W+EG08w57 zM2()Q4v1`wm}X--CTL_z?-bPoVpGH=2821u4X#c!8`CjCg*k&TXNXruT%jOZo$QQA zogph|GA0p7B5-E}c>1W!W)-U3-P`N;!e}s3aQyxCkQi{E0AhxXUv=>&ywrp zgSjLAXf8Cva?oX#_H(Y!_uWGE*(~gJ?9sf|*zJ3v>3DW2GH@)LR1OR{p5>2r`DM=v zBHNr0$cn7wwbaRzD_3XMq>Xi%%&D|-a$QFzZM0?D+fSWR2b?M~Z_E+48x(rj-MG zk4*+n#qJ@qpmB-=P|nY8TC`+oYo@((L(kS7yC>=&n4>kQ^VA`VmlryR9J{p742rgA zIo{#^QO6383{;%JDY$l@XAav+15PUw_45}rFHGsWP`G7KRUIrBoMUAtJfXG7aH`%KTSeP0CfBP^=z~Rnc$i!a$b+<)&gxzIGkoQz%plx3 zVtf3n#)Yg`->eS>N6eDFbCj?qYnR3RHkyz2j3nHw*K$I?#J`zB^0cAr`}hktT2|yp z^ZW(%dQR_`wQptG9>=RVgmBt+0d%<~yF%;yZ* z-eKq1$Lw=9&c0^fuxspl_5-`leq_I}-`HQMMLp&~LjzJ+hUHj+R;)o58_|XB*oEE5 zp$`X9KoK?$!ABVt9LEW~h*$6`&f+z^jrZ_AKEy{jkBj&cmoSd6@Exw;Dz4!=e#am9 z6E`G9Ql&bnQEHMFNX=5Kl$P41PN`dbyj0De{gc5b^$>s8vw^ZFJ{zQCcgvpCrp;UK zjqJHLJIa^2^BS8Lw=7?|x?_FzCawe!tJu38(GiR%fj@$AwC7XsHxVV4`rx8!Cf&*{ zk!$^gfBU%1L9ES+wI5m{6aKXsF}rjbvD>wof=#uiWy&>8idZ$3X;Ubpw3?W0Z6_9j zQP*`Ulv`SD%s#n6;pwiih)<=ud+1H$n*8r!`w6?iF0spOf?)d-`V=Do-5B=DSK@1UWEduUgI4B`NNZ@@QV|W2C;bnsE>v#ii z;w_xRy9DA7Vi13dFQ$NU+hkDU;&h;_**qoraL!zt!+?$mO5`-Z%ok0ga)p{=c96*=*@o^(z6lEvN0VK ZlqA&t^B)3|`~M&O*_zz{5jgMT;cxfFI9UJy delta 154 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjUEV6q~50$jG!YU^nAr0~wad2gF2qlFEw< zl5+BsfGT!QHV`OeldP^bH#M8QLO_wRd-5p(dB&d2d&RsMH#S^hUd+zHA;=6=2?PS% kK*AMd?8d_H%#-w0TB-#e*gdg diff --git a/docs/LiteratureReview/LiteratureReview.bbl b/docs/LiteratureReview/LiteratureReview.bbl new file mode 100644 index 0000000..6d7d134 --- /dev/null +++ b/docs/LiteratureReview/LiteratureReview.bbl @@ -0,0 +1,63 @@ +% Generated by IEEEtran.bst, version: 1.14 (2015/08/26) +\begin{thebibliography}{1} +\providecommand{\url}[1]{#1} +\csname url@samestyle\endcsname +\providecommand{\newblock}{\relax} +\providecommand{\bibinfo}[2]{#2} +\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax} +\providecommand{\BIBentryALTinterwordstretchfactor}{4} +\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus +\BIBentryALTinterwordstretchfactor\fontdimen3\font minus + \fontdimen4\font\relax} +\providecommand{\BIBforeignlanguage}[2]{{% +\expandafter\ifx\csname l@#1\endcsname\relax +\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}% +\typeout{** loaded for the language `#1'. Using the pattern for}% +\typeout{** the default language instead.}% +\else +\language=\csname l@#1\endcsname +\fi +#2}} +\providecommand{\BIBdecl}{\relax} +\BIBdecl + +\bibitem{panwar_hawkeye_2019} +\BIBentryALTinterwordspacing +A.~Panwar, S.~Bansal, and K.~Gopinath, ``{HawkEye}: Efficient fine-grained {OS} + support for huge pages,'' in \emph{Proceedings of the Twenty-Fourth + International Conference on Architectural Support for Programming Languages + and Operating Systems}.\hskip 1em plus 0.5em minus 0.4em\relax {ACM}, pp. + 347--360. [Online]. Available: + \url{https://dl.acm.org/doi/10.1145/3297858.3304064} +\BIBentrySTDinterwordspacing + +\bibitem{THP} +J.~Navarro, ``Practical, transparent operating system support for superpages.'' + +\bibitem{Shadow_superpages} +\BIBentryALTinterwordspacing +C.~H. Park and D.~Park, ``Aggressive superpage support with the shadow memory + and the partial-subblock tlb,'' \emph{Microprocessors and Microsystems}, + vol.~25, no.~7, pp. 329--342, 2001. [Online]. Available: + \url{https://www.sciencedirect.com/science/article/pii/S0141933101001259} +\BIBentrySTDinterwordspacing + +\bibitem{DirectSegment} +\BIBentryALTinterwordspacing +A.~Basu, J.~Gandhi, J.~Chang, M.~D. Hill, and M.~M. Swift, ``Efficient virtual + memory for big memory servers,'' \emph{SIGARCH Comput. Archit. News}, + vol.~41, no.~3, p. 237–248, Jun. 2013. [Online]. Available: + \url{https://doi.org/10.1145/2508148.2485943} +\BIBentrySTDinterwordspacing + +\bibitem{karakostas_redundant_2015} +\BIBentryALTinterwordspacing +V.~Karakostas, J.~Gandhi, F.~Ayar, A.~Cristal, M.~D. Hill, K.~S. {McKinley}, + M.~Nemirovsky, M.~M. Swift, and O.~Ünsal, ``Redundant memory mappings for + fast access to large memories,'' in \emph{Proceedings of the 42nd Annual + International Symposium on Computer Architecture}.\hskip 1em plus 0.5em minus + 0.4em\relax {ACM}, pp. 66--78. [Online]. Available: + \url{https://dl.acm.org/doi/10.1145/2749469.2749471} +\BIBentrySTDinterwordspacing + +\end{thebibliography} diff --git a/docs/LiteratureReview/LiteratureReview.bib b/docs/LiteratureReview/LiteratureReview.bib new file mode 100644 index 0000000..b5acf94 --- /dev/null +++ b/docs/LiteratureReview/LiteratureReview.bib @@ -0,0 +1,474 @@ + +@article{navarro_practical_nodate, + title = {Practical, transparent operating system support for superpages}, + abstract = {Most general-purpose processors provide support for memory pages of large sizes, called superpages. Superpages enable each entry in the translation lookaside buffer ({TLB}) to map a large physical memory region into a virtual address space. This dramatically increases {TLB} coverage, reduces {TLB} misses, and promises performance improvements for many applications. However, supporting superpages poses several challenges to the operating system, in terms of superpage allocation and promotion tradeoffs, fragmentation control, etc. We analyze these issues, and propose the design of an effective superpage management system. We implement it in {FreeBSD} on the Alpha {CPU}, and evaluate it on real workloads and benchmarks. We obtain substantial performance benefits, often exceeding 30\%; these benefits are sustained even under stressful workload scenarios.}, + author = {Navarro, Juan}, + langid = {english}, + file = {Navarro - Practical, transparent operating system support fo.pdf:/Users/akilan/Zotero/storage/9RBYAPGM/Navarro - Practical, transparent operating system support fo.pdf:application/pdf}, +} + +@inproceedings{panwar_hawkeye_2019, + location = {Providence {RI} {USA}}, + title = {{HawkEye}: Efficient Fine-grained {OS} Support for Huge Pages}, + isbn = {978-1-4503-6240-5}, + url = {https://dl.acm.org/doi/10.1145/3297858.3304064}, + doi = {10.1145/3297858.3304064}, + shorttitle = {{HawkEye}}, + eventtitle = {{ASPLOS} '19: Architectural Support for Programming Languages and Operating Systems}, + pages = {347--360}, + booktitle = {Proceedings of the Twenty-Fourth International Conference on Architectural Support for Programming Languages and Operating Systems}, + publisher = {{ACM}}, + author = {Panwar, Ashish and Bansal, Sorav and Gopinath, K.}, + urldate = {2024-05-27}, + date = {2019-04-04}, + langid = {english}, + file = {Full Text PDF:/Users/akilan/Zotero/storage/VQLCKYCA/Panwar et al. - 2019 - HawkEye Efficient Fine-grained OS Support for Hug.pdf:application/pdf}, +} + +@inproceedings{karakostas_redundant_2015, + location = {Portland Oregon}, + title = {Redundant memory mappings for fast access to large memories}, + isbn = {978-1-4503-3402-0}, + url = {https://dl.acm.org/doi/10.1145/2749469.2749471}, + doi = {10.1145/2749469.2749471}, + abstract = {Page-based virtual memory improves programmer productivity, security, and memory utilization, but incurs performance overheads due to costly page table walks after {TLB} misses. This overhead can reach 50\% for modern workloads that access increasingly vast memory with stagnating {TLB} sizes. To reduce the overhead of virtual memory, this paper proposes Redundant Memory Mappings ({RMM}), which leverage ranges of pages and provides an efficient, alternative representation of many virtual-to-physical mappings. We define a range be a subset of process’s pages that are virtually and physically contiguous. {RMM} translates each range with a single range table entry, enabling a modest number of entries to translate most of the process’s address space. {RMM} operates in parallel with standard paging and uses a software range table and hardware range {TLB} with arbitrarily large reach. We modify the operating system to automatically detect ranges and to increase their likelihood with eager page allocation. {RMM} is thus transparent to applications. We prototype {RMM} software in Linux and emulate the hardware. {RMM} performs substantially better than paging alone and huge pages, and improves a wider variety of workloads than direct segments (one range per program), reducing the overhead of virtual memory to less than 1\% on average.}, + eventtitle = {{ISCA} '15: The 42nd Annual International Symposium on Computer Architecture}, + pages = {66--78}, + booktitle = {Proceedings of the 42nd Annual International Symposium on Computer Architecture}, + publisher = {{ACM}}, + author = {Karakostas, Vasileios and Gandhi, Jayneel and Ayar, Furkan and Cristal, Adrián and Hill, Mark D. and {McKinley}, Kathryn S. and Nemirovsky, Mario and Swift, Michael M. and Ünsal, Osman}, + urldate = {2024-05-27}, + date = {2015-06-13}, + langid = {english}, + file = {Karakostas et al. - 2015 - Redundant memory mappings for fast access to large.pdf:/Users/akilan/Zotero/storage/8JECES24/Karakostas et al. - 2015 - Redundant memory mappings for fast access to large.pdf:application/pdf}, +} + +@article{chen_flexpointer_2023, + title = {{FlexPointer}: Fast Address Translation Based on Range {TLB} and Tagged Pointers}, + volume = {20}, + issn = {1544-3566, 1544-3973}, + url = {https://dl.acm.org/doi/10.1145/3579854}, + doi = {10.1145/3579854}, + shorttitle = {{FlexPointer}}, + abstract = {Page-based virtual memory relies on {TLBs} to accelerate the address translation. Nowadays, the gap between application workloads and the capacity of {TLB} continues to grow, bringing many costly {TLB} misses and making the {TLB} a performance bottleneck. Previous studies seek to narrow the gap by exploiting the contiguity of physical pages. One promising solution is to group pages that are both virtually and physically contiguous into a memory range. Recording range translations can greatly increase the {TLB} reach, but ranges are also hard to index because they have arbitrary bounds. The processor has to compare against all the boundaries to determine which range an address falls in, which restricts the usage of memory ranges. + In this article, we propose a tagged-pointer-based scheme, {FlexPointer}, to solve the range indexing problem. The core insight of {FlexPointer} is that large memory objects are rare, so we can create memory ranges based on such objects and assign each of them a unique {ID}. With the range {ID} integrated into pointers, we can index the range {TLB} with {IDs} and greatly simplify its structure. Moreover, because the {ID} is stored in the unused bits of a pointer and is not manipulated by the address generation, we can shift the range lookup to an earlier stage, working in parallel with the address generation. According to our trace-based simulation results, {FlexPointer} can reduce nearly all the L1 {TLB} misses, and page walks for a variety of memory-intensive workloads. Compared with a 4K-page baseline system, {FlexPointer} shows a 14\% performance improvement on average and up to 2.8x speedup in the best case. For other workloads, {FlexPointer} shows no performance degradation.}, + pages = {1--24}, + number = {2}, + journaltitle = {{ACM} Transactions on Architecture and Code Optimization}, + shortjournal = {{ACM} Trans. Archit. Code Optim.}, + author = {Chen, Dongwei and Tong, Dong and Yang, Chun and Yi, Jiangfang and Cheng, Xu}, + urldate = {2024-05-27}, + date = {2023-06-30}, + langid = {english}, + file = {Full Text PDF:/Users/akilan/Zotero/storage/L9XGZDFK/Chen et al. - 2023 - FlexPointer Fast Address Translation Based on Ran.pdf:application/pdf}, +} + +@article{woodruff_cheri_2019, + title = {{CHERI} Concentrate: Practical Compressed Capabilities}, + volume = {68}, + rights = {https://ieeexplore.ieee.org/Xplorehelp/downloads/license-information/{IEEE}.html}, + issn = {0018-9340, 1557-9956, 2326-3814}, + url = {https://ieeexplore.ieee.org/document/8703061/}, + doi = {10.1109/TC.2019.2914037}, + shorttitle = {{CHERI} Concentrate}, + abstract = {We present {CHERI} Concentrate, a new fat-pointer compression scheme applied to {CHERI}, the most developed capability-pointer system at present. Capability fat pointers are a primary candidate to enforce fine-grained and non-bypassable security properties in future computer systems, although increased pointer size can severely affect performance. Thus, several proposals for capability compression have been suggested elsewhere that do not support legacy instruction sets, ignore features critical to the existing software base, and also introduce design inefficiencies to {RISC}-style processor pipelines. {CHERI} Concentrate improves on the state-of-the-art region-encoding efficiency, solves important pipeline problems, and eases semantic restrictions of compressed encoding, allowing it to protect a full legacy software stack. We present the first quantitative analysis of compiled capability code, which we use to guide the design of the encoding format. We analyze and extend logic from the open-source {CHERI} prototype processor design on {FPGA} to demonstrate encoding efficiency, minimize delay of pointer arithmetic, and eliminate additional load-to-use delay. To verify correctness of our proposed high-performance logic, we present a {HOL}4 machine-checked proof of the decode and pointer-modify operations. Finally, we measure a 50\% to 75\% reduction in L2 misses for many compiled C-language benchmarks running under a commodity operating system using compressed 128-bit and 64-bit formats, demonstrating both compatibility with and increased performance over the uncompressed, 256-bit format.}, + pages = {1455--1469}, + number = {10}, + journaltitle = {{IEEE} Transactions on Computers}, + shortjournal = {{IEEE} Trans. Comput.}, + author = {Woodruff, Jonathan and Joannou, Alexandre and Xia, Hongyan and Fox, Anthony and Norton, Robert M. and Chisnall, David and Davis, Brooks and Gudka, Khilan and Filardo, Nathaniel W. and Markettos, A. Theodore and Roe, Michael and Neumann, Peter G. and Watson, Robert N. M. and Moore, Simon W.}, + urldate = {2024-05-27}, + date = {2019-10-01}, + langid = {english}, + file = {Woodruff et al. - 2019 - CHERI Concentrate Practical Compressed Capabiliti.pdf:/Users/akilan/Zotero/storage/3SZUIWQ5/Woodruff et al. - 2019 - CHERI Concentrate Practical Compressed Capabiliti.pdf:application/pdf}, +} + +@online{noauthor_capability-based_nodate, + title = {Capability-Based Computer Systems}, + url = {https://homes.cs.washington.edu/~levy/capabook/}, + urldate = {2024-06-07}, + file = {Capability-Based Computer Systems:/Users/akilan/Zotero/storage/IAAG6ZF3/capabook.html:text/html}, +} + +@article{woodruff_cheri_2014, + title = {The {CHERI} capability model: revisiting {RISC} in an age of risk}, + volume = {42}, + issn = {0163-5964}, + url = {https://doi.org/10.1145/2678373.2665740}, + doi = {10.1145/2678373.2665740}, + shorttitle = {The {CHERI} capability model}, + abstract = {Motivated by contemporary security challenges, we reevaluate and refine capability-based addressing for the {RISC} era. We present {CHERI}, a hybrid capability model that extends the 64-bit {MIPS} {ISA} with byte-granularity memory protection. We demonstrate that {CHERI} enables language memory model enforcement and fault isolation in hardware rather than software, and that the {CHERI} mechanisms are easily adopted by existing programs for efficient in-program memory safety. In contrast to past capability models, {CHERI} complements, rather than replaces, the ubiquitous page-based protection mechanism, providing a migration path towards deconflating data-structure protection and {OS} memory management. Furthermore, {CHERI} adheres to a strict {RISC} philosophy: it maintains a load-store architecture and requires only singlecycle instructions, and supplies protection primitives to the compiler, language runtime, and operating system. We demonstrate a mature {FPGA} implementation that runs the {FreeBSD} operating system with a full range of software and an open-source application suite compiled with an extended {LLVM} to use {CHERI} memory protection. A limit study compares published memory safety mechanisms in terms of instruction count and memory overheads. The study illustrates that {CHERI} is performance-competitive even while providing assurance and greater flexibility with simpler hardware}, + pages = {457--468}, + number = {3}, + journaltitle = {{ACM} {SIGARCH} Computer Architecture News}, + shortjournal = {{SIGARCH} Comput. Archit. News}, + author = {Woodruff, Jonathan and Watson, Robert N.M. and Chisnall, David and Moore, Simon W. and Anderson, Jonathan and Davis, Brooks and Laurie, Ben and Neumann, Peter G. and Norton, Robert and Roe, Michael}, + urldate = {2024-06-07}, + date = {2014-06-14}, +} + +@article{miller_towards_nodate, + title = {Towards a Unified Approach to Access Control and Concurrency Control}, + author = {Miller, Mark Samuel}, + langid = {english}, + file = {Miller - Towards a Unified Approach to Access Control and Co.pdf:/Users/akilan/Zotero/storage/7METVAKG/Miller - Towards a Unified Approach to Access Control and Co.pdf:application/pdf}, +} + +@inproceedings{curtsinger_coz_2015, + title = {Coz: Finding Code that Counts with Causal Profiling}, + url = {http://arxiv.org/abs/1608.03676}, + doi = {10.1145/2815400.2815409}, + shorttitle = {Coz}, + abstract = {Improving performance is a central concern for software developers. To locate optimization opportunities, developers rely on software profilers. However, these profilers only report where programs spent their time: optimizing that code may have no impact on performance. Past profilers thus both waste developer time and make it difficult for them to uncover significant optimization opportunities.}, + pages = {184--197}, + booktitle = {Proceedings of the 25th Symposium on Operating Systems Principles}, + author = {Curtsinger, Charlie and Berger, Emery D.}, + urldate = {2024-06-07}, + date = {2015-10-04}, + langid = {english}, + eprinttype = {arxiv}, + eprint = {1608.03676 [cs]}, + keywords = {C.4, Computer Science - Performance, D.4.8}, + file = {Curtsinger and Berger - 2015 - Coz Finding Code that Counts with Causal Profilin.pdf:/Users/akilan/Zotero/storage/QTFQXVHE/Curtsinger and Berger - 2015 - Coz Finding Code that Counts with Causal Profilin.pdf:application/pdf}, +} + + @online{noauthor_benchmark_nodate, + title = {Benchmark {ABI} - {CheriBSD} 23.11 new features tutorial}, + url = {https://www.cheribsd.org/tutorial/23.11/benchmark/index.html}, + urldate = {2024-06-07}, + file = {Benchmark ABI - CheriBSD 23.11 new features tutorial:/Users/akilan/Zotero/storage/9BDKUW28/index.html:text/html}, + } + +@inproceedings{zhu_research_2018, + location = {Taipei, Taiwan}, + title = {Research and Implementation of High Performance Traffic Processing Based on Intel {DPDK}}, + isbn = {978-1-5386-9403-9}, + url = {https://ieeexplore.ieee.org/document/8701793/}, + doi = {10.1109/PAAP.2018.00018}, + eventtitle = {2018 9th International Symposium on Parallel Architectures, Algorithms and Programming ({PAAP})}, + pages = {62--68}, + booktitle = {2018 9th International Symposium on Parallel Architectures, Algorithms and Programming ({PAAP})}, + publisher = {{IEEE}}, + author = {Zhu, Wenjun and Li, Peng and Luo, Baozhou and Xu, He and Zhang, Yujie}, + urldate = {2024-06-07}, + date = {2018-12}, +} + +@article{bi_dpdk-based_2016, + title = {{DPDK}-based Improvement of Packet Forwarding}, + volume = {7}, + rights = {© Owned by the authors, published by {EDP} Sciences, 2016}, + issn = {2271-2097}, + url = {https://www.itm-conferences.org/articles/itmconf/abs/2016/02/itmconf_ita2016_01009/itmconf_ita2016_01009.html}, + doi = {10.1051/itmconf/20160701009}, + abstract = {Reel-time processing of packets occupies a significant position in the field of computer network security. With theexplosive growth of the backbone link rate,which is consistent with Gilder's law, many bottlenecks of server performance leave the real-time data stream unprocessed.Thus, we proposedto take use of {DPDK}(Data Plan Development Kit) framework to achieve an intelligent {NIC} packet forwarding system. During this research, we deeply analysis the forwarding process of packet in {DPDK} and improve its {DMA} mode.According to the results of experiment, the system greatly enhanced the performance of packet forwarding,and the throughput of forwarding 64-byet or random-length packets by 20Gbit {NIC} reaches13.3Gbps and 18.7Gbps(dual ports forwarding).}, + pages = {01009}, + journaltitle = {{ITM} Web of Conferences}, + shortjournal = {{ITM} Web Conf.}, + author = {Bi, Hao and Wang, Zhao-Hun}, + urldate = {2024-06-07}, + date = {2016}, + langid = {english}, + note = {Publisher: {EDP} Sciences}, + file = {Full Text PDF:/Users/akilan/Zotero/storage/LEVMJ983/Bi and Wang - 2016 - DPDK-based Improvement of Packet Forwarding.pdf:application/pdf}, +} + +@article{esswood_cherios_nodate, + title = {{CheriOS}: designing an untrusted single-address-space capability operating system utilising capability hardware and a minimal hypervisor}, + author = {Esswood, Lawrence G}, + langid = {english}, + file = {Esswood - CheriOS designing an untrusted single-address-spa.pdf:/Users/akilan/Zotero/storage/YGIBFTD5/Esswood - CheriOS designing an untrusted single-address-spa.pdf:application/pdf}, +} + +@book{wilkes_cambridge_1979, + location = {New York}, + title = {The Cambridge {CAP} computer and its operating system}, + isbn = {978-0-444-00357-7 978-0-444-00358-4}, + series = {The computer science library operating and programming systems series}, + pagetotal = {165}, + number = {6}, + publisher = {North Holland}, + author = {Wilkes, Maurice V. and Needham, Roger M.}, + date = {1979}, + langid = {english}, + file = {Wilkes and Needham - 1979 - The Cambridge CAP computer and its operating syste.pdf:/Users/akilan/Zotero/storage/VIQTWZS3/Wilkes and Needham - 1979 - The Cambridge CAP computer and its operating syste.pdf:application/pdf}, +} + +@article{fillo_mmachine_nodate, + title = {The M–Machine Multicomputer}, + author = {Fillo, Marco and Keckler, Stephen W and Dally, William J and Carter, Nicholas P and Chang, Andrew and Gurevich, Yevgeny and Lee, Whay S}, + langid = {english}, + file = {Fillo et al. - The M–Machine Multicomputer.pdf:/Users/akilan/Zotero/storage/LD95UQTM/Fillo et al. - The M–Machine Multicomputer.pdf:application/pdf}, +} + +@inproceedings{kwon_low-fat_2013, + location = {New York, {NY}, {USA}}, + title = {Low-fat pointers: compact encoding and efficient gate-level implementation of fat pointers for spatial safety and capability-based security}, + isbn = {978-1-4503-2477-9}, + url = {https://dl.acm.org/doi/10.1145/2508859.2516713}, + doi = {10.1145/2508859.2516713}, + series = {{CCS} '13}, + shorttitle = {Low-fat pointers}, + abstract = {Referencing outside the bounds of an array or buffer is a common source of bugs and security vulnerabilities in today's software. We can enforce spatial safety and eliminate these violations by inseparably associating bounds with every pointer (fat pointer) and checking these bounds on every memory access. By further adding hardware-managed tags to the pointer, we make them unforgeable. This, in turn, allows the pointers to be used as capabilities to facilitate fine-grained access control and fast security domain crossing. Dedicated checking hardware runs in parallel with the processor's normal datapath so that the checks do not slow down processor operation (0\% runtime overhead). To achieve the safety of fat pointers without increasing program state, we compactly encode approximate base and bound pointers along with exact address pointers for a 46b address space into one 64-bit word with a worst-case memory overhead of 3\%. We develop gate-level implementations of the logic for updating and validating these compact fat pointers and show that the hardware requirements are low and the critical paths for common operations are smaller than processor {ALU} operations. Specifically, we show that the fat-pointer check and update operations can run in a 4 ns clock cycle on a Virtex 6 (40nm) implementation while only using 1100 6-{LUTs} or about the area of a double-precision, floating-point adder.}, + pages = {721--732}, + booktitle = {Proceedings of the 2013 {ACM} {SIGSAC} conference on Computer \& communications security}, + publisher = {Association for Computing Machinery}, + author = {Kwon, Albert and Dhawan, Udit and Smith, Jonathan M. and Knight, Thomas F. and {DeHon}, Andre}, + urldate = {2024-06-18}, + date = {2013-11-04}, + keywords = {capabilities, fat pointer, memory safety, processor, security, spatial confinement}, + file = {Full Text PDF:/Users/akilan/Zotero/storage/CVVZYZS4/Kwon et al. - 2013 - Low-fat pointers compact encoding and efficient g.pdf:application/pdf}, +} + +@article{wulf_hydra_1974, + title = {{HYDRA}: the kernel of a multiprocessor operating system}, + volume = {17}, + issn = {0001-0782, 1557-7317}, + url = {https://dl.acm.org/doi/10.1145/355616.364017}, + doi = {10.1145/355616.364017}, + shorttitle = {{HYDRA}}, + abstract = {This paper describes the design philosophy of {HYDRA}—the kernel of an operating system for C.mmp, the Carnegie-Mellon Multi-Mini-Processor. This philosophy is realized through the introduction of a generalized notion of “resource,” both physical and virtual, called an “object.” Mechanisms are presented for dealing with objects, including the creation of new types, specification of new operations applicable to a given type, sharing, and protection of any reference to a given object against improper application of any of the operations defined with respect to that type of object. The mechanisms provide a coherent basis for extension of the system in two directions: the introduction of new facilities, and the creation of highly secure systems.}, + pages = {337--345}, + number = {6}, + journaltitle = {Communications of the {ACM}}, + shortjournal = {Commun. {ACM}}, + author = {Wulf, W. and Cohen, E. and Corwin, W. and Jones, A. and Levin, R. and Pierson, C. and Pollack, F.}, + urldate = {2024-06-18}, + date = {1974-06}, + langid = {english}, + file = {Full Text:/Users/akilan/Zotero/storage/EIRBNTVF/Wulf et al. - 1974 - HYDRA the kernel of a multiprocessor operating sy.pdf:application/pdf}, +} + +@article{hardy_keykos_1985, + title = {{KeyKOS} architecture}, + volume = {19}, + issn = {0163-5980}, + url = {https://dl.acm.org/doi/10.1145/858336.858337}, + doi = {10.1145/858336.858337}, + pages = {8--25}, + number = {4}, + journaltitle = {{ACM} {SIGOPS} Operating Systems Review}, + shortjournal = {{SIGOPS} Oper. Syst. Rev.}, + author = {Hardy, Norman}, + urldate = {2024-06-18}, + date = {1985-10-01}, + file = {Full Text PDF:/Users/akilan/Zotero/storage/QSYKM6QN/Hardy - 1985 - KeyKOS architecture.pdf:application/pdf}, +} + +@article{rashid_mach_nodate, + title = {Mach: A System Software Kernel}, + abstract = {The Mach operating system can be used as a system software kernel which can support a variety of operating system environments. Key elements of the Mach design which allow it to efficiently support system software include integrated virtual memory management and interprocess communication, multiple threads of control within one address space, support for transparent system trap callout and an object programming facility integrated with the Mach {IPC} mechanisms. Mach is currently available both from {CMU} and commercially on a wide range of uniprocessor and multiprocessor hardware.}, + author = {Rashid, Richard and Julin, Daniel and Orr, Douglas and Sanzi, Richard and Baron, Robert and Forin, Alessandro and Golub, David and Jones, Michael}, + langid = {english}, + file = {Rashid et al. - Mach A System Software Kernel.pdf:/Users/akilan/Zotero/storage/UHLILYH9/Rashid et al. - Mach A System Software Kernel.pdf:application/pdf}, +} + +@inproceedings{baumann_multikernel_2009, + location = {Big Sky Montana {USA}}, + title = {The multikernel: a new {OS} architecture for scalable multicore systems}, + isbn = {978-1-60558-752-3}, + url = {https://dl.acm.org/doi/10.1145/1629575.1629579}, + doi = {10.1145/1629575.1629579}, + shorttitle = {The multikernel}, + abstract = {Commodity computer systems contain more and more processor cores and exhibit increasingly diverse architectural tradeoffs, including memory hierarchies, interconnects, instruction sets and variants, and {IO} configurations. Previous high-performance computing systems have scaled in specific cases, but the dynamic nature of modern client and server workloads, coupled with the impossibility of statically optimizing an {OS} for all workloads and hardware variants pose serious challenges for operating system structures.}, + eventtitle = {{SOSP}09: {ACM} {SIGOPS} 22nd Symposium on Operating Systems Principles}, + pages = {29--44}, + booktitle = {Proceedings of the {ACM} {SIGOPS} 22nd symposium on Operating systems principles}, + publisher = {{ACM}}, + author = {Baumann, Andrew and Barham, Paul and Dagand, Pierre-Evariste and Harris, Tim and Isaacs, Rebecca and Peter, Simon and Roscoe, Timothy and Schüpbach, Adrian and Singhania, Akhilesh}, + urldate = {2024-06-18}, + date = {2009-10-11}, + langid = {english}, + file = {Baumann et al. - 2009 - The multikernel a new OS architecture for scalabl.pdf:/Users/akilan/Zotero/storage/4BVCRZN6/Baumann et al. - 2009 - The multikernel a new OS architecture for scalabl.pdf:application/pdf}, +} + +@article{watson_capsicum_nodate, + title = {Capsicum: practical capabilities for {UNIX}}, + abstract = {Capsicum is a lightweight operating system capability and sandbox framework planned for inclusion in {FreeBSD} 9. Capsicum extends, rather than replaces, {UNIX} {APIs}, providing new kernel primitives (sandboxed capability mode and capabilities) and a userspace sandbox {API}. These tools support compartmentalisation of monolithic {UNIX} applications into logical applications, an increasingly common goal supported poorly by discretionary and mandatory access control. We demonstrate our approach by adapting core {FreeBSD} utilities and Google’s Chromium web browser to use Capsicum primitives, and compare the complexity and robustness of Capsicum with other sandboxing techniques.}, + author = {Watson, Robert N M and Anderson, Jonathan and Kennaway, Kris and Laurie, Ben}, + langid = {english}, + file = {Watson et al. - Capsicum practical capabilities for UNIX.pdf:/Users/akilan/Zotero/storage/IAFXHJ8H/Watson et al. - Capsicum practical capabilities for UNIX.pdf:application/pdf}, +} + +@online{noauthor_department_nodate, + title = {Department of Computer Science and Technology: {CheriBSD}}, + url = {https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/cheribsd.html}, + urldate = {2024-06-18}, + file = {Department of Computer Science and Technology\: CheriBSD:/Users/akilan/Zotero/storage/3XQJWCXD/cheribsd.html:text/html}, +} + +@online{noauthor_msrc-security-researchpapers2020security_nodate, + title = {{MSRC}-Security-Research/papers/2020/Security analysis of {CHERI} {ISA}.pdf at master · microsoft/{MSRC}-Security-Research}, + url = {https://github.com/microsoft/MSRC-Security-Research/blob/master/papers/2020/Security%20analysis%20of%20CHERI%20ISA.pdf}, + abstract = {Security Research from the Microsoft Security Response Center ({MSRC}) - microsoft/{MSRC}-Security-Research}, + titleaddon = {{GitHub}}, + urldate = {2024-06-18}, + langid = {english}, + file = {Snapshot:/Users/akilan/Zotero/storage/ENF2KYRT/Security analysis of CHERI ISA.html:text/html}, +} + +@inproceedings{zaliva_formal_2024, + location = {La Jolla {CA} {USA}}, + title = {Formal Mechanised Semantics of {CHERI} C: Capabilities, Undefined Behaviour, and Provenance}, + isbn = {9798400703720}, + url = {https://dl.acm.org/doi/10.1145/3617232.3624859}, + doi = {10.1145/3617232.3624859}, + shorttitle = {Formal Mechanised Semantics of {CHERI} C}, + abstract = {Memory safety issues are a persistent source of security vulnerabilities, with conventional architectures and the C codebase chronically prone to exploitable errors. The {CHERI} research project has shown how one can provide radically improved security for that existing codebase with minimal modification, using unforgeable hardware capabilities in place of machine-word pointers in {CHERI} dialects of C, implemented as adaptions of Clang/{LLVM} and {GCC}. {CHERI} was first prototyped as extensions of {MIPS} and {RISC}-V; it is currently being evaluated by Arm and others with the Arm Morello experimental architecture, processor, and platform, to explore its potential for mass-market adoption, and by Microsoft in their {CHERIoT} design for embedded cores.}, + eventtitle = {{ASPLOS} '24: 29th {ACM} International Conference on Architectural Support for Programming Languages and Operating Systems, Volume 1}, + pages = {181--196}, + booktitle = {Proceedings of the 29th {ACM} International Conference on Architectural Support for Programming Languages and Operating Systems, Volume 1}, + publisher = {{ACM}}, + author = {Zaliva, Vadim and Memarian, Kayvan and Almeida, Ricardo and Clarke, Jessica and Davis, Brooks and Richardson, Alexander and Chisnall, David and Campbell, Brian and Stark, Ian and Watson, Robert N. M. and Sewell, Peter}, + urldate = {2024-06-18}, + date = {2024-04-27}, + langid = {english}, + file = {Zaliva et al. - 2024 - Formal Mechanised Semantics of CHERI C Capabiliti.pdf:/Users/akilan/Zotero/storage/8Y2CRHBS/Zaliva et al. - 2024 - Formal Mechanised Semantics of CHERI C Capabiliti.pdf:application/pdf}, +} + +@article{watson_cheri_nodate, + title = {{CHERI} C/C++ Programming Guide}, + abstract = {This document is a brief introduction to the {CHERI} C/C++ programming languages. We explain the principles underlying these language variants, and their grounding in {CHERI}’s multiple architectural instantiations: {CHERI}-{MIPS}, {CHERI}-{RISC}-V, and Arm’s Morello. We describe the most commonly encountered differences between these dialects and C/C++ on conventional architectures, and where existing software may require minor changes. We document new compiler warnings and errors that may be experienced compiling code with the {CHERI} Clang/{LLVM} compiler, and suggest how they may be addressed through typically minor source-code changes. We explain how modest language extensions allow selected software, such as memory allocators, to further refine permissions and bounds on pointers. This guidance is based on our experience adapting the {FreeBSD} operating-system userspace, and applications such as {PostgreSQL} and {WebKit}, to run in a {CHERI} C/C++ capability-based programming environment. We conclude by recommending further reading.}, + author = {Watson, Robert N M and Richardson, Alexander and Davis, Brooks and Baldwin, John and Chisnall, David and Clarke, Jessica and Filardo, Nathaniel and Moore, Simon W and Napierala, Edward and Sewell, Peter and Neumann, Peter G}, + langid = {english}, + file = {Watson et al. - CHERI CC++ Programming Guide.pdf:/Users/akilan/Zotero/storage/WHGQXE8P/Watson et al. - CHERI CC++ Programming Guide.pdf:application/pdf}, +} + +@article{esswood_cherios_nodate-1, + title = {{CheriOS}: designing an untrusted single-address-space capability operating system utilising capability hardware and a minimal hypervisor}, + author = {Esswood, Lawrence G}, + langid = {english}, + file = {Esswood - CheriOS designing an untrusted single-address-spa.pdf:/Users/akilan/Zotero/storage/3IVKGYZ5/Esswood - CheriOS designing an untrusted single-address-spa.pdf:application/pdf}, +} + +@online{noauthor_architecture_nodate, + title = {The Architecture  of the Burroughs B-5000}, + url = {https://www.smecc.org/The%20Architecture%20%20of%20the%20Burroughs%20B-5000.htm}, + urldate = {2024-06-18}, + file = {The Architecture  of the Burroughs B-5000:/Users/akilan/Zotero/storage/ELNL8VBQ/The Architecture of the Burroughs B-5000.html:text/html}, +} + +@article{dennis_programming_1966, + title = {Programming semantics for multiprogrammed computations}, + volume = {9}, + issn = {0001-0782, 1557-7317}, + url = {https://dl.acm.org/doi/10.1145/365230.365252}, + doi = {10.1145/365230.365252}, + abstract = {The semantics are defined for a number of meta-instructions which perform operations essential to the writing of programs in multiprogrammed computer systems. These meta-instructions relate to parallel processing, protecting of separate computations, program debugging, and the sharing among users of memory segments and other computing objects, the names of which are hierarchically structured. The language sophistication contemplated is midway between an assembly language and an advanced algebraic language.}, + pages = {143--155}, + number = {3}, + journaltitle = {Communications of the {ACM}}, + shortjournal = {Commun. {ACM}}, + author = {Dennis, Jack B. and Van Horn, Earl C.}, + urldate = {2024-06-18}, + date = {1966-03}, + langid = {english}, + file = {Full Text:/Users/akilan/Zotero/storage/6MLX2U8V/Dennis and Van Horn - 1966 - Programming semantics for multiprogrammed computat.pdf:application/pdf}, +} + +@article{watson_capability_nodate, + title = {Capability Hardware Enhanced {RISC} Instructions: {CHERI} Instruction-Set Architecture (Version 8)}, + abstract = {This technical report describes {CHERI} {ISAv}8, the eighth version of the {CHERI} architecture being developed by {SRI} International and the University of Cambridge. This design captures ten years of research, development, experimentation, refinement, formal analysis, and validation through hardware and software implementation.}, + author = {Watson, Robert N M and Neumann, Peter G and Woodruff, Jonathan and Roe, Michael and Almatary, Hesham and Anderson, Jonathan and Baldwin, John and Barnes, Graeme and Chisnall, David and Clarke, Jessica and Davis, Brooks and Eisen, Lee and Filardo, Nathaniel Wesley and Grisenthwaite, Richard and Joannou, Alexandre and Laurie, Ben and Markettos, A Theodore and Moore, Simon W and Murdoch, Steven J and Nienhuis, Kyndylan and Norton, Robert and Richardson, Alexander and Rugg, Peter and Sewell, Peter and Son, Stacey and Xia, Hongyan}, + langid = {english}, + file = {Watson et al. - Capability Hardware Enhanced RISC Instructions CH.pdf:/Users/akilan/Zotero/storage/R9T374YS/Watson et al. - Capability Hardware Enhanced RISC Instructions CH.pdf:application/pdf}, +} + +@online{noauthor_-it-yourself_nodate, + title = {Do-It-Yourself Virtual Memory Translation {\textbar} {ACM} {SIGARCH} Computer Architecture News}, + url = {https://dl.acm.org/doi/10.1145/3140659.3080209}, + urldate = {2024-06-18}, +} + +@online{noauthor_osdi_nodate, + title = {{OSDI} Symposia {\textbar} {USENIX}}, + url = {https://www.usenix.org/conferences/byname/179}, + urldate = {2024-06-19}, + file = {OSDI Symposia | USENIX:/Users/akilan/Zotero/storage/VI7YCLJV/179.html:text/html}, +} + +@article{mittal_survey_2017, + title = {A survey of techniques for architecting {TLBs}}, + volume = {29}, + rights = {Copyright © 2016 John Wiley \& Sons, Ltd.}, + issn = {1532-0634}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/cpe.4061}, + doi = {10.1002/cpe.4061}, + abstract = {Translation lookaside buffer ({TLB}) caches virtual to physical address translation information and is used in systems ranging from embedded devices to high-end servers. Because {TLB} is accessed very frequently and a {TLB} miss is extremely costly, prudent management of {TLB} is important for improving performance and energy efficiency of processors. In this paper, we present a survey of techniques for architecting and managing {TLBs}. We characterize the techniques across several dimensions to highlight their similarities and distinctions. We believe that this paper will be useful for chip designers, computer architects, and system engineers.}, + pages = {e4061}, + number = {10}, + journaltitle = {Concurrency and Computation: Practice and Experience}, + author = {Mittal, Sparsh}, + urldate = {2024-06-24}, + date = {2017}, + langid = {english}, + note = {\_eprint: https://onlinelibrary.wiley.com/doi/pdf/10.1002/cpe.4061}, + keywords = {classification, power management, prefetching, Review, superpage, {TLB}, virtual cache, workload characterization}, + file = {Snapshot:/Users/akilan/Zotero/storage/JJ9H6B2H/cpe.html:text/html}, +} + +@inproceedings{lietar_snmalloc_2019, + location = {New York, {NY}, {USA}}, + title = {snmalloc: a message passing allocator}, + isbn = {978-1-4503-6722-6}, + url = {https://doi.org/10.1145/3315573.3329980}, + doi = {10.1145/3315573.3329980}, + series = {{ISMM} 2019}, + shorttitle = {snmalloc}, + abstract = {snmalloc is an implementation of malloc aimed at workloads in which objects are typically deallocated by a different thread than the one that had allocated them. We use the term producer/consumer for such workloads. snmalloc uses a novel message passing scheme which returns deallocated objects to the originating allocator in batches without taking any locks. It also uses a novel bump pointer-free list data structure with which just 64-bits of meta-data are sufficient for each 64 {KiB} slab. On such producer/consumer benchmarks our approach performs better than existing allocators. Snmalloc is available at {\textless}a href="https://github.com/Microsoft/snmalloc"{\textgreater}https://github.com/Microsoft/snmalloc{\textless}/a{\textgreater}.}, + pages = {122--135}, + booktitle = {Proceedings of the 2019 {ACM} {SIGPLAN} International Symposium on Memory Management}, + publisher = {Association for Computing Machinery}, + author = {Liétar, Paul and Butler, Theodore and Clebsch, Sylvan and Drossopoulou, Sophia and Franco, Juliana and Parkinson, Matthew J. and Shamis, Alex and Wintersteiger, Christoph M. and Chisnall, David}, + urldate = {2024-06-23}, + date = {2019-06-23}, + keywords = {Memory allocation, message passing}, +} + +% New bib entries + +@article{Shadow_superpages, +title = {Aggressive superpage support with the shadow memory and the partial-subblock TLB}, +journal = {Microprocessors and Microsystems}, +volume = {25}, +number = {7}, +pages = {329-342}, +year = {2001}, +issn = {0141-9331}, +doi = {https://doi.org/10.1016/S0141-9331(01)00125-9}, +url = {https://www.sciencedirect.com/science/article/pii/S0141933101001259}, +author = {Cheol Ho Park and Daeyeon Park}, +keywords = {Superpage, Shadow memory, Subblock TLB, Translation lookaside buffer}, +abstract = {While superpages are an efficient solution to increase TLB reach, strong requirements for using superpages hinder the actual utilization. Two previous solutions, the partial-subblock TLB and the shadow memory were proposed to release the requirements. The partial-subblock TLB releases only a small portion of the requirements. The shadow memory releases most of the requirements but introduces other serious problems. We propose a hybrid scheme which integrates both the shadow memory and the partial-subblock TLB, thereby enjoying the benefits inherited from both sides. The hybrid scheme has as high a superpage utilization as the shadow memory, and avoids most of the problems in the shadow memory by virtue of the partial-subblock TLB. The experiment shows that the hybrid scheme outperforms the previous schemes though its hardware cost and overhead are considered.} +} + +@article{THP, + title = {Practical, transparent operating system support for superpages}, + abstract = {Most general-purpose processors provide support for memory pages of large sizes, called superpages. Superpages enable each entry in the translation lookaside buffer ({TLB}) to map a large physical memory region into a virtual address space. This dramatically increases {TLB} coverage, reduces {TLB} misses, and promises performance improvements for many applications. However, supporting superpages poses several challenges to the operating system, in terms of superpage allocation and promotion tradeoffs, fragmentation control, etc. We analyze these issues, and propose the design of an effective superpage management system. We implement it in {FreeBSD} on the Alpha {CPU}, and evaluate it on real workloads and benchmarks. We obtain substantial performance benefits, often exceeding 30\%; these benefits are sustained even under stressful workload scenarios.}, + author = {Navarro, Juan}, + langid = {english}, + file = {Navarro - Practical, transparent operating system support fo.pdf:/Users/akilan/Zotero/storage/R9MSCWQX/Navarro - Practical, transparent operating system support fo.pdf:application/pdf}, +} + +@article{DirectSegment, +author = {Basu, Arkaprava and Gandhi, Jayneel and Chang, Jichuan and Hill, Mark D. and Swift, Michael M.}, +title = {Efficient virtual memory for big memory servers}, +year = {2013}, +issue_date = {June 2013}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +volume = {41}, +number = {3}, +issn = {0163-5964}, +url = {https://doi.org/10.1145/2508148.2485943}, +doi = {10.1145/2508148.2485943}, +abstract = {Our analysis shows that many "big-memory" server workloads, such as databases, in-memory caches, and graph analytics, pay a high cost for page-based virtual memory. They consume as much as 10\% of execution cycles on TLB misses, even using large pages. On the other hand, we find that these workloads use read-write permission on most pages, are provisioned not to swap, and rarely benefit from the full flexibility of page-based virtual memory.To remove the TLB miss overhead for big-memory workloads, we propose mapping part of a process's linear virtual address space with a direct segment, while page mapping the rest of the virtual address space. Direct segments use minimal hardware---base, limit and offset registers per core---to map contiguous virtual memory regions directly to contiguous physical memory. They eliminate the possibility of TLB misses for key data structures such as database buffer pools and in-memory key-value stores. Memory mapped by a direct segment may be converted back to paging when needed.We prototype direct-segment software support for x86-64 in Linux and emulate direct-segment hardware. For our workloads, direct segments eliminate almost all TLB misses and reduce the execution time wasted on TLB misses to less than 0.5\%.}, +journal = {SIGARCH Comput. Archit. News}, +month = jun, +pages = {237–248}, +numpages = {12}, +keywords = {tanslation lookaside buffer, virtual memory} +} + + + diff --git a/docs/LiteratureReview/LiteratureReview.org b/docs/LiteratureReview/LiteratureReview.org new file mode 100644 index 0000000..a68a3b3 --- /dev/null +++ b/docs/LiteratureReview/LiteratureReview.org @@ -0,0 +1,73 @@ +* Literature Review + +** Huge Pages +Increasing TLB reach can be achieved by using larger page sizes, such as huge pages\cite{panwar_hawkeye_2019}, which are common in modern computer systems. +The x86-64 architecture supports huge pages of 2 MB and 1 GB, backed by OS mechanisms like Transparent Huge Pages (THP)\cite{THP} +and HugeTLBFS in Linux. However, available page sizes in x86-64 are limited, leading to internal fragmentation issues. +For instance, allocating 1 MB with 4 KB base pages requires 256 PTEs, but using a 2 MB huge page would waste +half of the memory space. Some architectures offer more page size choices, such as Intel Itanium, which +allows different areas of the address space to have their own page sizes. Itanium uses a hash page table to organize huge +pages, but without significant changes to the conventional page table, it only helps reduce page walk overheads. +HP Tunable Base Page Size permits the OS to adjust the base page size, but still faces internal fragmentation problems, +with HP recommending a base page size of no more than 16 KB. Shadow Superpage\cite{Shadow_superpages} introduces a new translation level +in the memory controller to merge non-contiguous physical pages into a huge page in a shadow memory space, extending +TLB coverage. However, this approach requires all memory traffic to be translated again in the memory controller, +resulting in additional latency for memory accesses. + +** Direct Segment +Early processors often used segments to manage virtual memory, where a segment\cite{DirectSegment} essentially mapped contiguous +virtual memory to contiguous physical memory. Unlike pages, which are relatively small, segments can be much +larger, offering the potential for more efficient memory management in certain scenarios. +This concept of segmentation has seen a resurgence in some modern approaches that aim to enhance +translation coverage by designating specific areas in the virtual address space. + +This method allows programmers to explicitly define +a single segment for applications requiring significant memory. It introduces two new +registers to the system, which indicate the start and end of this segment. +Virtual addresses within this segment are translated by calculating +the offset from the virtual start address and applying this offset to the +physical start address. This straightforward method simplifies the translation +process for large memory areas but requires significant modifications to the +source code of applications. + +** Range Memory Mapping (RMM) +Redundant Memory Mappings (RMM)\cite{karakostas_redundant_2015} enhance memory management by introducing an additional range table +that pre-allocates contiguous physical pages for large memory allocations, creating ranges that +are both virtually and physically contiguous. This approach simplifies address translation +within these ranges by adding an offset, similar to Direct Segment, but RMM supports multiple +ranges and operates transparently to programmers, requiring no source code modifications. +The range table, separate from the conventional page table, holds the mappings for these +large allocations. To determine which range an address belongs to, RMM compares the address +against all range boundaries, a process that is computationally expensive and therefore performed +only after an L1 TLB miss. To optimize this, RMM uses a range TLB (RTLB) to quickly identify +if an address falls within any pre-allocated range, facilitating efficient translation and +reducing overhead. Range mapping works alongside the paging system by generating TLB entries on +TLB misses and still performing TLB lookups for each virtual address translation. +Unlike traditional segmentation mechanisms, range mapping activates a range lookaside +buffer (RTLB) located with the last level TLB upon a miss. The hardware TLB miss +handler then searches the RTLB for the miss address and, if found, generates a new +TLB entry with the physical address derived from the base virtual address and +range offset, along with permission bits. If the RTLB also misses, the system +defaults to a standard page walk while a range table walker simultaneously +loads the range into the RTLB in the background, avoiding delays in memory operations. +The RTLB, functioning as a fully associative search structure, ensures +that most last level TLB misses are handled efficiently by range mapping, +reducing the need for costly page table walks. + +** CHERI +CHERI (Capability Hardware Enhanced RISC Instructions) extends conventional processor +Instruction-Set Architectures (ISAs) with architectural capabilities to enable fine-grained +memory protection and highly scalable software compartmentalization. CHERI is a hybrid +capability architecture that can combine capabilities with conventional MMU (Memory Management Unit) based systems. +The contributions of CHERI include: +- ISA changes to introduce architectural capabilities. +- New microarchitecture proving that capabilities can be implemented efficiently in hardware, with support for + efficient tagged memory to protect capabilities and compress capabilities to reduce memory overhead. +- A newly designed software construction model that uses capabilities to provide fine-grained memory protection + and scalable software compartmentalization. +- Language and compiler extensions for using capabilities with C and C++. +- OS extensions to support fine-grained memory protection (spatial, referential, and (non-stack) temporal memory safety) + and abstraction extensions for scalable software compartmentalization. + +\bibliographystyle{IEEEtran} +\bibliography{LiteratureReview.bib} diff --git a/docs/LiteratureReview/LiteratureReview.org~ b/docs/LiteratureReview/LiteratureReview.org~ new file mode 100644 index 0000000..e69de29 diff --git a/docs/LiteratureReview/LiteratureReview.pdf b/docs/LiteratureReview/LiteratureReview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4cc663d6132f2f41c36b52d64a1a6978397f1238 GIT binary patch literal 112798 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

*X%~X%DW*g3!dxizjt|l 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%0A+`Za&dQY#+5TJ`hK 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 literal 0 HcmV?d00001 diff --git a/docs/LiteratureReview/LiteratureReview.tex b/docs/LiteratureReview/LiteratureReview.tex new file mode 100644 index 0000000..9c82946 --- /dev/null +++ b/docs/LiteratureReview/LiteratureReview.tex @@ -0,0 +1,109 @@ +% Created 2025-01-20 Mon 15:17 +% Intended LaTeX compiler: pdflatex +\documentclass[11pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{wrapfig} +\usepackage{rotating} +\usepackage[normalem]{ulem} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{capt-of} +\usepackage{hyperref} +\author{Akilan} +\date{\today} +\title{} +\hypersetup{ + pdfauthor={Akilan}, + pdftitle={}, + pdfkeywords={}, + pdfsubject={}, + pdfcreator={Emacs 29.1 (Org mode 9.6.6)}, + pdflang={English}} +\begin{document} + +\tableofcontents + +\section{Literature Review} +\label{sec:org3735e9d} + +\subsection{Huge Pages} +\label{sec:orgac849a1} +Increasing TLB reach can be achieved by using larger page sizes, such as huge pages\cite{panwar_hawkeye_2019}, which are common in modern computer systems. +The x86-64 architecture supports huge pages of 2 MB and 1 GB, backed by OS mechanisms like Transparent Huge Pages (THP)\cite{THP} +and HugeTLBFS in Linux. However, available page sizes in x86-64 are limited, leading to internal fragmentation issues. +For instance, allocating 1 MB with 4 KB base pages requires 256 PTEs, but using a 2 MB huge page would waste +half of the memory space. Some architectures offer more page size choices, such as Intel Itanium, which +allows different areas of the address space to have their own page sizes. Itanium uses a hash page table to organize huge +pages, but without significant changes to the conventional page table, it only helps reduce page walk overheads. +HP Tunable Base Page Size permits the OS to adjust the base page size, but still faces internal fragmentation problems, +with HP recommending a base page size of no more than 16 KB. Shadow Superpage\cite{Shadow_superpages} introduces a new translation level +in the memory controller to merge non-contiguous physical pages into a huge page in a shadow memory space, extending +TLB coverage. However, this approach requires all memory traffic to be translated again in the memory controller, +resulting in additional latency for memory accesses. + +\subsection{Direct Segment} +\label{sec:org4ee3203} +Early processors often used segments to manage virtual memory, where a segment\cite{DirectSegment} essentially mapped contiguous +virtual memory to contiguous physical memory. Unlike pages, which are relatively small, segments can be much +larger, offering the potential for more efficient memory management in certain scenarios. +This concept of segmentation has seen a resurgence in some modern approaches that aim to enhance +translation coverage by designating specific areas in the virtual address space. + +This method allows programmers to explicitly define +a single segment for applications requiring significant memory. It introduces two new +registers to the system, which indicate the start and end of this segment. +Virtual addresses within this segment are translated by calculating +the offset from the virtual start address and applying this offset to the +physical start address. This straightforward method simplifies the translation +process for large memory areas but requires significant modifications to the +source code of applications. + +\subsection{Range Memory Mapping (RMM)} +\label{sec:orgd19b3b4} +Redundant Memory Mappings (RMM)\cite{karakostas_redundant_2015} enhance memory management by introducing an additional range table +that pre-allocates contiguous physical pages for large memory allocations, creating ranges that +are both virtually and physically contiguous. This approach simplifies address translation +within these ranges by adding an offset, similar to Direct Segment, but RMM supports multiple +ranges and operates transparently to programmers, requiring no source code modifications. +The range table, separate from the conventional page table, holds the mappings for these +large allocations. To determine which range an address belongs to, RMM compares the address +against all range boundaries, a process that is computationally expensive and therefore performed +only after an L1 TLB miss. To optimize this, RMM uses a range TLB (RTLB) to quickly identify +if an address falls within any pre-allocated range, facilitating efficient translation and +reducing overhead. Range mapping works alongside the paging system by generating TLB entries on +TLB misses and still performing TLB lookups for each virtual address translation. +Unlike traditional segmentation mechanisms, range mapping activates a range lookaside +buffer (RTLB) located with the last level TLB upon a miss. The hardware TLB miss +handler then searches the RTLB for the miss address and, if found, generates a new +TLB entry with the physical address derived from the base virtual address and +range offset, along with permission bits. If the RTLB also misses, the system +defaults to a standard page walk while a range table walker simultaneously +loads the range into the RTLB in the background, avoiding delays in memory operations. +The RTLB, functioning as a fully associative search structure, ensures +that most last level TLB misses are handled efficiently by range mapping, +reducing the need for costly page table walks. + +\subsection{CHERI} +\label{sec:org2a48228} +CHERI (Capability Hardware Enhanced RISC Instructions) extends conventional processor +Instruction-Set Architectures (ISAs) with architectural capabilities to enable fine-grained +memory protection and highly scalable software compartmentalization. CHERI is a hybrid +capability architecture that can combine capabilities with conventional MMU (Memory Management Unit) based systems. +The contributions of CHERI include: +\begin{itemize} +\item ISA changes to introduce architectural capabilities. +\item New microarchitecture proving that capabilities can be implemented efficiently in hardware, with support for +efficient tagged memory to protect capabilities and compress capabilities to reduce memory overhead. +\item A newly designed software construction model that uses capabilities to provide fine-grained memory protection +and scalable software compartmentalization. +\item Language and compiler extensions for using capabilities with C and C++. +\item OS extensions to support fine-grained memory protection (spatial, referential, and (non-stack) temporal memory safety) +and abstraction extensions for scalable software compartmentalization. +\end{itemize} + +\bibliographystyle{IEEEtran} +\bibliography{LiteratureReview.bib} +\end{document} \ No newline at end of file