Process Address Spaces and Binary Formats

Similar documents
Process Address Spaces and Binary Formats

Process Address Spaces and Binary Formats

CSE506: Operating Systems CSE 506: Operating Systems

CSE506: Operating Systems CSE 506: Operating Systems

Applications of. Virtual Memory in. OS Design

Process Environment. Pradipta De

CSE 120 Principles of Operating Systems

Page Frame Reclaiming

Virtual Memory: Systems

CSE 506: Opera.ng Systems. The Page Cache. Don Porter

CSE 120 Principles of Operating Systems Spring 2017

CS 31: Intro to Systems Virtual Memory. Kevin Webb Swarthmore College November 15, 2018

Virtual Memory. Kevin Webb Swarthmore College March 8, 2018

The Page Cache 3/16/16. Logical Diagram. Background. Recap of previous lectures. The address space abstracvon. Today s Problem.

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2015 Lecture 25

Recall: Address Space Map. 13: Memory Management. Let s be reasonable. Processes Address Space. Send it to disk. Freeing up System Memory

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2018 Lecture 23

ECE 598 Advanced Operating Systems Lecture 10

RCU. ò Walk through two system calls in some detail. ò Open and read. ò Too much code to cover all FS system calls. ò 3 Cases for a dentry:

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2015 Lecture 23

VFS, Continued. Don Porter CSE 506

CSE 451: Operating Systems Winter Processes. Gary Kimura

CS 318 Principles of Operating Systems

Lab 09 - Virtual Memory

seven Virtual Memory Introduction

The Art and Science of Memory Allocation

ECE 471 Embedded Systems Lecture 4

P6 memory system P6/Linux Memory System October 31, Overview of P6 address translation. Review of abbreviations. Topics. Symbols: ...

Virtual Memory: Systems

PROCESS VIRTUAL MEMORY PART 2. CS124 Operating Systems Winter , Lecture 19

Pentium/Linux Memory System March 17, 2005

Fall 2017 :: CSE 306. Process Abstraction. Nima Honarmand

Memory Management. Disclaimer: some slides are adopted from book authors slides with permission 1

Memory Management. Disclaimer: some slides are adopted from book authors slides with permission 1

Block Device Scheduling. Don Porter CSE 506

Block Device Scheduling

CSCI 4061: Virtual Memory

Virtual Memory 1. Virtual Memory

Main Memory: Address Translation

Virtual Memory 1. Virtual Memory

Memory System Case Studies Oct. 13, 2008

Recall from Tuesday. Our solution to fragmentation is to split up a process s address space into smaller chunks. Physical Memory OS.

This lecture is covered in Section 4.1 of the textbook.

Ext3/4 file systems. Don Porter CSE 506

ECE 498 Linux Assembly Language Lecture 1

Physical memory vs. Logical memory Process address space Addresses assignment to processes Operating system tasks Hardware support CONCEPTS 3.

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2018 Lecture 24

CS 153 Design of Operating Systems Winter 2016

Address spaces and memory management

Native POSIX Thread Library (NPTL) CSE 506 Don Porter

Intel P6 (Bob Colwell s Chip, CMU Alumni) The course that gives CMU its Zip! Memory System Case Studies November 7, 2007.

CIS Operating Systems Memory Management Cache and Demand Paging. Professor Qiang Zeng Spring 2018

Chapter 6: Demand Paging

Memory Management. Disclaimer: some slides are adopted from book authors slides with permission 1

Intel P The course that gives CMU its Zip! P6/Linux Memory System November 1, P6 memory system. Review of abbreviations

Memory Mapping. Sarah Diesburg COP5641

ò Paper reading assigned for next Tuesday ò Understand low-level building blocks of a scheduler User Kernel ò Understand competing policy goals

Basic OS Progamming Abstrac7ons

Changelog. Virtual Memory (2) exercise: 64-bit system. exercise: 64-bit system

Virtual Memory. Alan L. Cox Some slides adapted from CMU slides

CIS Operating Systems Memory Management Cache. Professor Qiang Zeng Fall 2017

PAGE REPLACEMENT. Operating Systems 2015 Spring by Euiseong Seo

Princeton University. Computer Science 217: Introduction to Programming Systems. Dynamic Memory Management

Basic OS Progamming Abstrac2ons

Memory Management - Demand Paging and Multi-level Page Tables

COS 318: Operating Systems

Operating System Design and Implementation Memory Management Part III

CS399 New Beginnings. Jonathan Walpole

More on Address Translation. CS170 Fall T. Yang Some of slides from UCB CS162 by Kubiatowicz

16 Sharing Main Memory Segmentation and Paging

Operating Systems CMPSC 473. Process Management January 29, Lecture 4 Instructor: Trent Jaeger

Virtual Memory. 11/8/16 (election day) Vote!

Princeton University Computer Science 217: Introduction to Programming Systems. Dynamic Memory Management

ADRIAN PERRIG & TORSTEN HOEFLER Networks and Operating Systems ( ) Chapter 6: Demand Paging

PROCESS VIRTUAL MEMORY. CS124 Operating Systems Winter , Lecture 18

CSE506: Operating Systems CSE 506: Operating Systems

The Process Model (1)

ECE 571 Advanced Microprocessor-Based Design Lecture 13

Memory Management. Kevin Webb Swarthmore College February 27, 2018

ECE 550D Fundamentals of Computer Systems and Engineering. Fall 2017

CSE506: Operating Systems CSE 506: Operating Systems

Foundations of Computer Systems

SYSTEM CALL IMPLEMENTATION. CS124 Operating Systems Fall , Lecture 14

ECE 598 Advanced Operating Systems Lecture 14

CS5460/6460: Operating Systems. Lecture 21: Shared libraries. Anton Burtsev March, 2014

ECE 471 Embedded Systems Lecture 5

Virtual Memory Paging

CSE506: Operating Systems CSE 506: Operating Systems

Virtual Memory #3 Oct. 10, 2018

Requirements, Partitioning, paging, and segmentation

Lecture 12: Demand Paging

The UtePC/Yalnix Memory System

Administrivia. Lab 1 due Friday 12pm. We give will give short extensions to groups that run into trouble. But us:

Recap: Memory Management

Operating Systems. 09. Memory Management Part 1. Paul Krzyzanowski. Rutgers University. Spring 2015

Outline. 1 Details of paging. 2 The user-level perspective. 3 Case study: 4.4 BSD 1 / 19

Virtual Memory III. Jo, Heeseung

Process. Heechul Yun. Disclaimer: some slides are adopted from the book authors slides with permission

Main Memory. CISC3595, Spring 2015 X. Zhang Fordham University

CS162 Operating Systems and Systems Programming Lecture 12. Address Translation. Page 1

Transcription:

Process Address Spaces and Binary Formats Don Porter CSE 506 Binary Formats RCU Memory Management Logical Diagram File System Memory Threads Allocators Today s Lecture System Calls Device Drivers Networking Sync CPU Scheduler User Kernel Interrupts Disk Net Consistency Hardware Review Definitions (can vary) We ve seen how paging and segmentation work on x86 Maps logical addresses to physical pages These are the low-level hardware tools This lecture: build up to higher-level abstractions Namely, the process address space Process is a virtual address space 1+ threads of execution work within this address space A process is composed of: Memory-mapped files Includes program binary Anonymous pages: no file backing When the process exits, their contents go away Address Space Layout Determined (mostly) by the application Determined at compile time Link directives can influence this See kern/kernel.ld in JOS; specifies kernel starting address OS usually reserves part of the address space to map itself Upper GB on x86 Linux Application can dynamically request new mappings from the OS, or delete mappings Simple Example Virtual Address Space hello heap stk libc.so 0 0xffffffff Hello world binary specified load address Also specifies where it wants libc Dynamically asks kernel for anonymous pages for its heap and stack 1

In practice You can see (part of) the requested memory layout of a program using ldd: $ ldd /usr/bin/git linux-vdso.so.1 => (0x00007fff197be000) libz.so.1 => /lib/libz.so.1 (0x00007f31b9d4e000) libpthread.so.0 => /lib/libpthread.so.0 (0x00007f31b9b31000) libc.so.6 => /lib/libc.so.6 (0x00007f31b97ac000) /lib64/ld-linux-x86-64.so.2 (0x00007f31b9f86000) Problem 1: How to represent in the kernel? What is the best way to represent the components of a process? Common question: is mapped at address x? Page faults, new memory mappings, etc. Hint: a 64-bit address space is seriously huge Hint: some programs (like databases) map tons of data Others map very little No one size fits all Sparse representation Linux: vm_area_struct Naïve approach might make a big array of pages Mark empty space as unused But this wastes OS memory Better idea: only allocate nodes in a data structure for memory that is mapped to something Kernel data structure memory use proportional to complexity of address space! Linux represents portions of a process with a vm_area_struct, or vma Includes: Start address (virtual) End address (first address after vma) why? Memory regions are page aligned Protection (read, write, execute, etc) implication? Different page protections means new vma Pointer to file (if one) Other bookkeeping Simple list representation Simple list 0 Process Address Space 0xffffffff Linear traversal O(n) start end vma /bin/ls next vma anon (data) vma libc.so Shouldn t we use a data structure with the smallest O? Practical system building question: What is the common case? Is it past the asymptotic crossover point? If tree traversal is O(log n), but adds bookkeeping overhead, which makes sense for: 10 vmas: log 10 =~ 3; 10/2 = 5; Comparable either way mm_struct (process) 100 vmas: log 100 starts making sense 2

Common cases Red-black trees Many programs are simple Only load a few libraries Small amount of data Some programs are large and complicated Databases Linux splits the difference and uses both a list and a redblack tree (Roughly) balanced tree Read the wikipedia article if you aren t familiar with them Popular in real systems Asymptotic == worst case behavior Insertion, deletion, search: log n Traversal: n Optimizations Memory mapping recap Using an RB-tree gets us logarithmic search time Other suggestions? Locality: If I just accessed region x, there is a reasonably good chance I ll access it again Linux caches a pointer in each process to the last vma looked up Source code (mm/mmap.c) claims 35% hit rate VM Area structure tracks regions that are mapped Efficiently represent a sparse address space On both a list and an RB-tree Fast linear traversal Efficient lookup in a large address space Cache last lookup to exploit temporal locality Linux APIs Example 1: mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); munmap(void *addr, size_t length); How to create an anonymous mapping? Let s map a 1 page (4k) anonymous region for data, readwrite at address 0x40000 mmap(0x40000, 4096, PROT_READ PROT_WRITE, MAP_ANONYMOUS, -1, 0); Why wouldn t we want exec permission? What if you don t care where a memory region goes (as long as it doesn t clobber something else)? 3

Insert at 0x40000 Scenario 2 0x1000-0x4000 0x20000-0x21000 0x100000-0x10f000 What if there is something already mapped there with read-only permission? Case 1: Last page overlaps Case 2: First page overlaps Case 3: Our target is in the middle mm_struct (process) 1) Is anything already mapped at 0x40000-0x41000? 2) If not, create a new vma and insert it 3) Recall: pages will be allocated on demand Case 1: Insert at 0x40000 Case 3: Insert at 0x40000 0x1000-0x4000 0x20000-0x41000 0x100000-0x10f000 0x1000-0x4000 0x20000-0x50000 0x100000-0x10f000 mm_struct (process) 1) Is anything already mapped at 0x40000-0x41000? 2) If at the end and different permissions: 1) Truncate previous vma 2) Insert new vma 3) If permissions are the same, one can replace pages and/or extend previous vma mm_struct (process) 1) Is anything already mapped at 0x40000-0x41000? 2) If in the middle and different permissions: 1) Split previous vma 2) Insert new vma Demand paging Unix fork() Creating a memory mapping (vma) doesn t necessarily allocate physical memory or setup page table entries What mechanism do you use to tell when a page is needed? It pays to be lazy! A program may never touch the memory it maps. Examples? Program may not use all code in a library Save work compared to traversing up front Hidden costs? Optimizations? Page faults are expensive; heuristics could help performance Recall: this function creates and starts a copy of the process; identical except for the return value Example: int pid = fork();! if (pid == 0) {!!// child code! } else if (pid > 0) {!!// parent code! } else // error! 4

Copy-On-Write (COW) How does COW work? Naïve approach would march through address space and copy each page Most processes immediately exec() a new binary without using any of these pages Again, lazy is better! Memory regions: New copies of each vma are allocated for child during fork As are page tables Pages in memory: In page table (and in-memory representation), clear write bit, set COW bit Is the COW bit hardware specified? No, OS uses one of the available bits in the PTE Make a new, writeable copy on a write fault New Topic: Stacks Idiosyncrasy 1: Stacks Grow Down In Linux/Unix, as you add frames to a stack, they actually decrease in virtual address order Example: OS allocates a new page main() foo() bar() Stack bottom 0x13000 0x12600 0x12300 0x11900 Exceeds stack page Problem 1: Expansion Feed 2 Birds with 1 Scone Recall: OS is free to allocate any free page in the virtual address space if user doesn t specify an address What if the OS allocates the page below the top of the stack? You can t grow the stack any further Out of memory fault with plenty of memory spare OS must reserve stack portion of address space Unix has been around longer than paging Remember data segment abstraction? Unix solution: Heap Grows Grows Data Segment Stack and heap meet in the middle Stack Fortunate that memory areas are demand paged Out of memory when they meet 5

But now we have paging Windows Comparison Unix and Linux still have a data segment abstraction Even though they use flat data segmentation! sys_brk() adjusts the endpoint of the heap Still used by many memory allocators today LPVOID VirtualAllocEx( in HANDLE hprocess, in_opt LPVOID lpaddress, in SIZE_T dwsize, in DWORD flallocationtype, in DWORD flprotect); Library function applications program to Provided by ntdll.dll the rough equivalent of Unix libc Implemented with an undocumented system call Windows Comparison Windows Comparison LPVOID VirtualAllocEx( in HANDLE hprocess, in_opt LPVOID lpaddress, in SIZE_T dwsize, in DWORD flallocationtype, in DWORD flprotect); LPVOID VirtualAllocEx( in HANDLE hprocess, in_opt LPVOID lpaddress, in SIZE_T dwsize, in DWORD flallocationtype, in DWORD flprotect); Programming environment differences: Parameters annotated ( out, in_opt, etc), compiler checks Name encodes type, by convention dwsize must be page-aligned (just like mmap) Different capabilities hprocess doesn t have to be you! Pros/Cons? flallocationtype can be reserved or committed And other flags Reserved memory Part 1 Summary An explicit abstraction for cases where you want to prevent the OS from mapping anything to an address region To use the region, it must be remapped in the committed state Why? Understand what a vma is, how it is manipulated in kernel for calls like mmap Demand paging, COW, and other optimizations brk and the data segment Windows VirtualAllocEx() vs. Unix mmap() My speculation: Gives the OS more information for advanced heuristics than demand paging 6

Part 2: Program Binaries Linux: ELF How are address spaces represented in a binary file? How are processes loaded? Executable and Linkable Format Standard on most Unix systems And used in JOS You will implement part of the loader in lab 3 2 headers: Program header: 0+ segments (memory layout) Section header: 0+ sections (linking information) Helpful tools Key ELF Segments readelf - Linux tool that prints part of the elf headers objdump Linux tool that dumps portions of a binary Includes a disassembler; reads debugging symbols if present For once, not the same thing as hardware segmentation Similar idea, though.text Where read/execute code goes Can be mapped without write permission.data Programmer initialized read/write data Ex: a global int that starts at 3 goes here.bss Uninitialized data (initially zero by convention) Many other segments Sections How ELF Loading Works Also describe text, data, and bss segments Plus: Procedure Linkage Table (PLT) jump table for libraries.rel.text Relocation table for external targets.symtab Program symbols execve( foo, ) Kernel parses the file enough to identify whether it is a supported format Kernel loads the text, data, and bss sections ELF header also gives first instruction to execute Kernel transfers control to this application instruction 7

Static Linking: Static vs. Dynamic Linking Application binary is self-contained Dynamic Linking: Application needs code and/or variables from an external library How does dynamic linking work? Each binary includes a jump table for external references Jump table is filled in at run time by the linker Jump table example Suppose I want to call foo() in another library Compiler allocates an entry in the jump table for foo Say it is index 3, and an entry is 8 bytes Compiler generates local code like this: mov rax, 24(rbx) // rbx points to the // jump table call *rax Linker initializes the jump tables at runtime Dynamic Linking (Overview) Rather than loading the application, load the linker (ld.so), give the linker the actual program as an argument Kernel transfers control to linker (in user space) Linker: 1) Walks the program s ELF headers to identify needed libraries 2) Issue mmap() calls to map in said libraries 3) Fix the jump tables in each binary 4) Call main() Recap Understand basics of program loading OS does preliminary executable parsing, maps in program and maybe dynamic linker Linker does needed fixup for the program to work Summary We ve seen a lot of details on how programs are represented: In the kernel when running On disk in an executable file And how they are bootstrapped in practice Will help with lab 3 8