Structs and Alignment

Similar documents
L14: Structs and Alignment. Structs and Alignment. CSE 351 Spring Instructor: Ruth Anderson

Structs & Alignment. CSE 351 Autumn Instructor: Justin Hsia

Structs and Alignment CSE 351 Spring

Roadmap. Java: Assembly language: OS: Machine code: Computer system:

Structs and Alignment

Arrays and Structs. CSE 351 Summer Instructor: Justin Hsia. Teaching Assistants: Josie Lee Natalie Andreeva Teagan Horkan.

Arrays. CSE 351 Autumn Instructor: Justin Hsia

Building an Executable

Memory, Data, & Addressing I

Arrays. CSE 351 Autumn Instructor: Justin Hsia

Executables & Arrays. CSE 351 Autumn Instructor: Justin Hsia

Assembly Programming IV

Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

x86-64 Programming III & The Stack

Roadmap. Java: Assembly language: OS: Machine code: Computer system:

Java and C. CSE 351 Autumn 2018

Data III & Integers I

CSE351: Memory, Data, & Addressing I

Assembly Programming IV

MACHINE-LEVEL PROGRAMMING IV: Computer Organization and Architecture

x86 Programming I CSE 351 Autumn 2016 Instructor: Justin Hsia

x86 Programming I CSE 351 Winter

Data III & Integers I

Java and C I. CSE 351 Spring Instructor: Ruth Anderson

Carnegie Mellon. Bryant and O Hallaron, Computer Systems: A Programmer s Perspective, Third Edition

CSC 252: Computer Organization Spring 2018: Lecture 9

Cache Example, System Control Flow

Data III & Integers I

Machine-level Programs Data

u Arrays One-dimensional Multi-dimensional (nested) Multi-level u Structures Allocation Access Alignment u Floating Point

x86-64 Programming III

Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

Java and C CSE 351 Spring

The Stack & Procedures

Assembly Programming III

x86 64 Programming II

Assembly IV: Complex Data Types. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Hardware: Logical View

Assembly Programming I

University of Washington

Computer Organization: A Programmer's Perspective

Assembly IV: Complex Data Types

CS429: Computer Organization and Architecture

Virtual Memory I. CSE 351 Spring Instructor: Ruth Anderson

Assembly Language: Function Calls

Machine/Assembler Language Putting It All Together

Java and C II. CSE 351 Spring Instructor: Ruth Anderson

Machine Level Programming: Arrays, Structures and More

Princeton University Computer Science 217: Introduction to Programming Systems. Assembly Language: Function Calls

Do not turn the page until 5:10.

Floating Point II, x86 64 Intro

Cache Wrap Up, System Control Flow

Do not turn the page until 12:30.

Floating Point II, x86 64 Intro

We made it! Java: Assembly language: OS: Machine code: Computer system:

CSE 351 Midterm Exam

x86-64 Programming II

Virtual Memory I. CSE 351 Winter Instructor: Mark Wyse

x86-64 Assembly CSE 351 Winter 2018 Instructor: Mark Wyse

Basic Data Types. CS429: Computer Organization and Architecture. Array Allocation. Array Access

University*of*Washington*

Areas for growth: I love feedback

CS 261 Fall Machine and Assembly Code. Data Movement and Arithmetic. Mike Lam, Professor

CSE 351 Midterm - Winter 2015

x86 64 Programming I CSE 351 Autumn 2017 Instructor: Justin Hsia

The Stack & Procedures

Machine Programming. CSE 351 Autumn Instructor: Justin Hsia

CS 107. Lecture 13: Assembly Part III. Friday, November 10, Stack "bottom".. Earlier Frames. Frame for calling function P. Increasing address

Lecture 3 CIS 341: COMPILERS

CS241 Computer Organization Spring Data Alignment

CSE 351 Midterm - Winter 2015 Solutions

Machine Program: Procedure. Zhaoguo Wang

L08: Assembly Programming II. Assembly Programming II. CSE 351 Spring Guest Lecturer: Justin Hsia. Instructor: Ruth Anderson

L09: Assembly Programming III. Assembly Programming III. CSE 351 Spring Guest Lecturer: Justin Hsia. Instructor: Ruth Anderson

x86-64 Programming I CSE 351 Summer 2018 Instructor: Justin Hsia Teaching Assistants: Josie Lee Natalie Andreeva Teagan Horkan

CSE 351 Spring 2017 Midterm Exam (8 May 2017)

Machine-Level Programming III: Procedures

Machine-Level Programming V: Advanced Topics

CS429: Computer Organization and Architecture

+ Machine Level Programming: x86-64 History

Assembly III: Procedures. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

CSE 351 Midterm - Winter 2017

1 Number Representation(10 points)

Bryant and O Hallaron, Computer Systems: A Programmer s Perspective, Third Edition. Carnegie Mellon

Roadmap. Java: Assembly language: OS: Machine code: Computer system:

Do not turn the page until 12:30.

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2017 Lecture 7

CSE351 Spring 2018, Midterm Exam April 27, 2018

CSC 252: Computer Organization Spring 2018: Lecture 6

Roadmap. Java: Assembly language: OS: Machine code: Computer system:

Machine Level Programming: Basics

The Hardware/Software Interface CSE351 Spring 2015

CS429: Computer Organization and Architecture

Procedures and the Call Stack

x86 64 Programming I CSE 351 Autumn 2018 Instructor: Justin Hsia

Kathryn Chan, Kevin Bi, Ryan Wong, Waylon Huang, Xinyu Sui

University of Washington Computer Science & Engineering Winter 2018 Instructor: Mark Wyse March 14, CSE 351 Final Exam. Last Name: First Name:

The Hardware/Software Interface CSE351 Spring 2015

Buffer Overflow Attack (AskCypert CLaaS)

Machine-level Programs Procedure

Transcription:

Structs and Alignment CSE 410 Winter 2017 Instructor: Justin Hsia Teaching Assistants: Kathryn Chan, Kevin Bi, Ryan Wong, Waylon Huang, Xinyu Sui Self Driving Cars Will Make Organ Shortages Even Worse Much has been said about the ways we expect our oncoming fleet of driverless cars to change the way we live remaking us all into passengers, rewiring our economy, retooling our views of ownership, and reshaping our cities and roads. It s morbid, but the truth is that due to limitations on who can contribute transplants, among the most reliable sources for healthy organs and tissues are the more than 35,000 people killed each year on American roads. Currently, 1 in 5 organ donations comes from the victim of a vehicular accident. http://www.slate.com/articles/technology/future_tense/2016/12/self_driving_cars_ will_exacerbate_organ_shortages.html

Administrivia Homework 3 due tomorrow (2/9) Lab 2 due next Monday (2/13) Lab 3 released next Monday (2/13) Mid quarter survey this weekend (due 2/12) Midterm next lecture Try to come early to settle in; starting promptly Make a cheat sheet! two sided letter page, handwritten Midterm details Piazza post: @66 Extra office hours Justin Tue 2/9, 5:30 8:30pm, CSE 438 2

Roadmap C: car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Assembly language: Machine code: get_mpg: pushq %rbp movq %rsp, %rbp... popq %rbp ret 0111010000011000 100011010000010000000010 1000100111000010 110000011111101000011111 Java: Car c = new Car(); c.setmiles(100); c.setgals(17); float mpg = c.getmpg(); OS: Memory & data Integers & floats x86 assembly Procedures & stacks Executables Arrays & structs Memory & caches Processes Virtual memory Operating Systems Computer system: 3

Assembly Programmer s View CPU %rip CF ZF SF OF %rax %rbx %rcx %rdx %rsi %rdi %rsp %rbp %r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15 Programmer visible state PC: the Program Counter (%rip in x86 64) Address of next instruction Named registers Together in register file Heavily used program data Condition codes Addresses Data Instructions Store status information about most recent arithmetic operation Memory Used for conditional branching 4 Stack Dynamic Data (Heap) Static Data Literals Instructions Memory Byte addressable array Code and user data Includes the Stack (for supporting procedures)

x86 64 Instructions Data movement mov, movs, movz,... Arithmetic add, sub, shl, sar, lea,... Control flow cmp, test, j*, set*,... Stack/procedures push, pop, call, ret,... 5

Turning C into Object Code Code in files p1.c p2.c Compile with command: gcc -Og p1.c p2.c -o p Use basic optimizations (-Og) [New to recent versions of GCC] Put resulting machine code in file p text C program (p1.c p2.c) Compiler (gcc Og -S) text Asm program (p1.s p2.s) Assembler (gcc -c or as) binary binary Object program (p1.o p2.o) Linker (gcc or ld) Executable program (p) Static libraries (.a) 6

Assembling Executable has addresses assembler 00000000004004f6 <pcount_r>: 4004f6: b8 00 00 00 00 mov $0x0,%eax 4004fb: 48 85 ff test %rdi,%rdi 4004fe: 74 13 je 400513 <pcount_r+0x1d> 400500: 53 push %rbx 400501: 48 89 fb mov %rdi,%rbx 400504: 48 d1 ef shr %rdi 400507: e8 ea ff ff ff callq 4004f6 <pcount_r> 40050c: 83 e3 01 and $0x1,%ebx 40050f: 48 01 d8 add %rbx,%rax 400512: 5b pop %rbx 400513: f3 c3 rep ret gcc -g pcount.c o pcount objdump d pcount 7

A Picture of Memory (64 bit view) 00000000004004f6 <pcount_r>: 4004f6: b8 00 00 00 00 mov $0x0,%eax 4004fb: 48 85 ff test %rdi,%rdi 4004fe: 74 13 je 400513 <pcount_r+0x1d> 400500: 53 push %rbx 400501: 48 89 fb mov %rdi,%rbx 400504: 48 d1 ef shr %rdi 400507: e8 ea ff ff ff callq 4004f6 <pcount_r> 40050c: 83 e3 01 and $0x1,%ebx 40050f: 48 01 d8 add %rbx,%rax 400512: 5b pop %rbx 400513: f3 c3 rep ret 0 8 1 9 2 a 3 b 4 c 5 d 6 e 7 f 0x00 0x08 0x10...... b8 00 0x4004f0 00 00 00 48 85 ff 74 13 0x4004f8 53 48 89 fb 48 d1 ef e8 0x400500 ea ff ff ff 83 e3 01 48 0x400508 01 d8 5b f3 c3 0x400510 8

Roadmap C: car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Assembly language: Machine code: get_mpg: pushq movq... popq ret %rbp %rsp, %rbp %rbp 0111010000011000 100011010000010000000010 1000100111000010 110000011111101000011111 Java: Car c = new Car(); c.setmiles(100); c.setgals(17); float mpg = c.getmpg(); OS: Memory & data Integers & floats x86 assembly Procedures & stacks Executables Arrays & structs Memory & caches Processes Virtual memory Operating Systems Computer system: 9

Data Structures in Assembly Arrays One dimensional Multi dimensional (nested) Multi level Structs Alignment Unions 10

Peer Instruction Question Which of the following statements is FALSE? Vote at http://pollev.com/justinh int sea[4][5]; 9 8 1 9 5 9 8 1 0 5 9 8 1 0 3 9 8 1 1 5 76 96 116 136 156 A. sea[4][-2] is a valid array reference B. sea[1][1] makes two memory accesses C. sea[2][1] will always be a higher address than sea[1][2] D. sea[2] is calculated using only lea E. We re lost 11

Structs in C Way of defining compound data types A structured group of variables, possibly including other structs typedef struct { int lengthinseconds; int yearrecorded; } Song; Song song1; song1.lengthinseconds = 213; song1.yearrecorded = 1994; Song song2; song2.lengthinseconds = 248; song2.yearrecorded = 1988; 12

Struct Definitions Structure definition: Does NOT declare a variable Variable type is struct name struct name name1, *pn, name_ar[3]; Joint struct definition and typedef Don t need to give struct a name in this case struct nm { /* fields */ }; typedef struct nm name; name n1; pointer struct name { /* fields */ }; array typedef struct { /* fields */ } name; name n1; Easy to forget semicolon!

Scope of Struct Definition Why is placement of struct definition important? What actually happens when you declare a variable? Creating space for it somewhere! Without definition, program doesn t know how much space struct data { int ar[4]; long d; }; Size = bytes struct rec { int a[4]; long i; Size = bytes struct rec* next; Almost always define structs in global scope near the top of your C file Struct definitions follow normal rules of scope }; 14

Accessing Structure Members Given a struct instance, access member using the. operator: struct rec r1; r1.i = val; Given a pointer to a struct: struct rec *r; r = &r1; // or malloc space for r to point to We have two options: Use * and. operators: (*r).i = val; Use -> operator for short: r->i = val; In assembly: register holds address of the first byte Access members with offsets struct rec { int a[4]; long i; struct rec *next; }; 15

Review: Structs in Lab 0 // Use typedef to create a type: FourInts typedef struct { int a, b, c, d; } FourInts; // Name of type is FourInts int main(int argc, char* argv[]) { FourInts f1; // Allocates memory to hold a FourInts // (16 bytes) on stack (local variable) f1.a = 0; // Assign first field in f1 to be zero FourInts* f2; // Declare f2 as a pointer to FourInts } // Allocate space for a FourInts on the heap, // f2 is a pointer to / address of this space. f2 = (FourInts*) malloc(sizeof(fourints)); f2->b = 17; // Assign the second field to be 17... 16

Java side note class Record {... } Record x = new Record(); An instance of a class is like a pointer to a struct containing the fields (Ignoring methods and subclassing for now) So Java s x.f is like C s x->f or (*x).f In Java, almost everything is a pointer ( reference ) to an object Cannot declare variables or fields that are structs or arrays Always a pointer to a struct or array So every Java variable or field is 8 bytes (but can point to lots of data) 17

Structure Representation struct rec { int a[4]; long i; struct rec *next; } *r; r a i next 0 16 24 32 Characteristics Contiguously allocated region of memory Refer to members within structure by names Members may be of different types 18

Structure Representation struct rec { int a[4]; long i; struct rec *next; } *r; r a i next 0 16 24 32 Structure represented as block of memory Big enough to hold all of the fields Fields ordered according to declaration order Even if another ordering would be more compact Compiler determines overall size + positions of fields Machine level program has no understanding of the structures in the source code 19

Accessing a Structure Member struct rec { int a[4]; long i; struct rec *next; } *r; Compiler knows the offset of each member within a struct Compute as *(r+offset) Referring to absolute offset, so no pointer arithmetic r r->i a i next 0 16 24 32 long get_i(struct rec *r) { return r->i; } # r in %rdi, index in %rsi movq 16(%rdi), %rax ret 20

Exercise: Pointer to Structure Member struct rec { int a[4]; long i; struct rec *next; } *r; r a i next 0 16 24 32 long* addr_of_i(struct rec *r) { return &(r->i); } # r in %rdi ret,%rax struct rec** addr_of_next(struct rec *r) { return &(r->next); } # r in %rdi ret,%rax 21

Generating Pointer to Array Element struct rec { int a[4]; long i; struct rec *next; } *r; Generating Pointer to Array Element Offset of each structure member determined at compile time Compute as: r+4*index r r+4*index a i next 0 16 24 32 int* find_addr_of_array_elem (struct rec *r, long index) { return &r->a[index]; } &(r->a[index]) # r in %rdi, index in %rsi leaq (%rdi,%rsi,4), %rax ret 22

Review: Memory Alignment in x86 64 For good memory system performance, Intel recommends data be aligned However the x86 64 hardware will work correctly regardless of alignment of data Aligned means that any primitive object of bytes must have an address that is a multiple of Aligned addresses for data types: Type Addresses 1 char No restrictions 2 short Lowest bit must be zero: 0 2 4 int, float Lowest 2 bits zero: 00 2 8 long, double, * Lowest 3 bits zero: 000 2 16 long double Lowest 4 bits zero: 0000 2 23

Alignment Principles Aligned Data Primitive data type requires bytes Address must be multiple of Required on some machines; advised on x86 64 Motivation for Aligning Data Memory accessed by (aligned) chunks of 4 or 8 bytes (system dependent) Inefficient to load or store value that spans quad word boundaries Virtual memory trickier when value spans 2 pages (more on this later) 24

Structures & Alignment Unaligned Data c i[0] i[1] v p p+1 p+5 p+9 p+17 struct S1 { char c; int i[2]; double v; } *p; Aligned Data Primitive data type requires Address must be multiple of bytes c i[0] i[1] v 3 bytes 4 bytes p+0 p+4 p+8 p+16 p+24 Multiple of 4 Multiple of 8 Multiple of 8 Multiple of 8 internal fragmentation 25

Satisfying Alignment with Structures (1) Within structure: Must satisfy each element s alignment requirement Overall structure placement Each structure has alignment requirement = Largest alignment of any element Counts array elements individually as elements Address of structure & structure length must be multiples of Example: = 8, due to double element struct S1 { char c; int i[2]; double v; } *p; c i[0] i[1] v 3 bytes 4 bytes p+0 p+4 p+8 p+16 p+24 Multiple of 4 Multiple of 8 Multiple of 8 Multiple of 8 internal fragmentation 26

Satisfying Alignment with Structures (2) Can find offset of individual fields using offsetof() Need to #include <stddef.h> Example: offsetof(struct S2,c) returns 16 struct S2 { double v; int i[2]; char c; } *p; For largest alignment requirement, overall structure size must be multiple of Compiler will add padding at end of structure to meet overall structure alignment requirement v i[0] i[1] c 7 bytes p+0 p+8 p+16 p+24 external fragmentation Multiple of 8 27

Alignment of Structs Compiler will do the following: Maintains declared ordering of fields in struct Each field must be aligned within the struct (may insert padding) offsetof can be used to get actual field offset Overall struct must be aligned according to largest field Total struct size must be multiple of its alignment (may insert padding) sizeof should be used to get true size of structs 28

Arrays of Structures Overall structure length multiple of Satisfy alignment requirement for every element in array struct S2 { double v; int i[2]; char c; } a[10]; a[0] a[1] a[2] a+0 a+24 a+48 a+72 v i[0] i[1] c 7 bytes a+24 a+32 a+40 a+48 external fragmentation 29

Accessing Array Elements Compute start of array element as: 12*index sizeof(s3) = 12, including alignment padding Element j is at offset 8 within structure Assembler gives offset a+8 struct S3 { short i; float v; short j; } a[10]; a[0] a[index] a+0 a+12 a+12*index i 2 bytes v j 2 bytes a+12*index a+12*index+8 short get_j(int index) { return a[index].j; } # %rdi = index leaq (%rdi,%rdi,2),%rax movzwl a+8(,%rax,4),%eax # 3*index 30

How the Programmer Can Save Space Compiler must respect order elements are declared in Sometimes the programmer can save space by declaring large data types first struct S4 { char c; int i; char d; } *p; struct S5 { int i; char c; char d; } *p; c 3 bytes i d 3 bytes i c d 2 bytes 12 bytes 8bytes 31

Peer Instruction Question Vote on sizeof(struct old): http://pollev.com/justinh Minimize the size of the struct by re ordering the vars struct old { int i; short s[3]; char *c; struct new { int i; ; ; float f; }; What are the old and new sizes of the struct? sizeof(struct old) = sizeof(struct new) = A. 16 bytes B. 22 bytes C. 28 bytes D. 32 bytes E. We re lost ; }; 32

Unions Only allocates enough space for the largest element in union Can only use one member at a time struct S { char c; int i[2]; double v; } *sp; union U { char c; int i[2]; double v; } *up; c i[0] i[1] v up+0 up+4 up+8 c 3 bytes i[0] i[1] 4 bytes v sp+0 sp+4 sp+8 sp+16 sp+24 33

Summary Arrays in C Aligned to satisfy every element s alignment requirement Structures Allocate bytes in order declared Pad in middle and at end to satisfy alignment Unions Provide different views of the same memory location 34