1 / 81

Heterogeneous Data Structures & Alignment * heterogeneous: 不同种类的

Heterogeneous Data Structures & Alignment * heterogeneous: 不同种类的. Outline. Struct Union Alignment Chap 3.9, 3.10. Structures P191. Group objects into a single object Each object is referenced by name Memory layout All the components are stored in a contiguous region of memory

chyna
Download Presentation

Heterogeneous Data Structures & Alignment * heterogeneous: 不同种类的

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Heterogeneous Data Structures & Alignment* heterogeneous: 不同种类的

  2. Outline • Struct • Union • Alignment • Chap 3.9, 3.10

  3. Structures P191 • Group objects into a single object • Each object is referenced by name • Memory layout • All the components are stored in a contiguous region of memory • A pointer to a structure is the address of its first byte • References to structure elements • Using offsets as displacements

  4. Structure P192 struct rect { int llx; /* X coordinate of lower-left corner */ int lly; /* Y coordinate of lower-left corner */ int color; /* Coding of color */ int width; /* Width (in pixels) */ int height; /* Height (in pixels) */ };

  5. Structure P192 struct rect r; r.llx = r.lly = 0; r.color = 0xFF00FF; r.width = 10; r.height = 20;

  6. Structure P192 int area (struct rect *rp) { return (*rp).width * (*rp).height; } void rotate_left (struct rect *rp) { /* Exchange width and height */ int t = rp->height; rp->height = rp->width; rp->width = t; }

  7. Structure struct rec { int i; int j; int a[3]; int *p; } *r;

  8. Structure P193 • Copy element r->i to element r->j: • r is in register %edx. 1 movl (%edx), %eax Get r->i 2 movl %eax, 4(%edx) Store in r->j

  9. Structure P193 • Generate the pointer &(r->a[1]) • r in %eax, • i in %edx 1 leal 8(%eax,%edx,4),%ecx %ecx = &r->a[i]

  10. Structure • r->p = &r->a[r->i + r->j]; • r in register %edx: 1 movl 4(%edx), %eax Get r->j 2 addl (%edx), %eax Add r->i 3 leal 8(%edx,%eax,4), %eax Compute &r->a[r->i + r->j] 4 movl %eax, 20(%edx) Store in r->p

  11. Unions P194 • A single object can be referenced by using different data types • The syntax of a union declaration is identical to that for structures, but its semantics are very different • Rather than having the different fields reference different blocks of memory, they all reference the same block *syntax: 语法 *semantic: 语义

  12. Unions struct S3 { char c; int i[2]; double v; }; union U3 { char c; int i[2]; double v; };

  13. Unions P195 • The offsets of the fields, as well as the total size of data types S3 and U3, are:

  14. Unions P195 struct NODE { struct NODE *left; struct NODE *right; double data; }; union NODE { struct { union NODE *left; union NODE *right; } internal; double data; };

  15. Unions (additional tag field) struct NODE { int is_leaf; union { struct { struct NODE *left; struct NODE *right; } internal; double data; } info; };

  16. Unions P196 1 unsigned float2bit(float f) 2 { 3 union { 4 float f; 5 unsigned u; 6 } temp; 7 temp.f = f; 8 return temp.u; 9 }; 1 movl 8(%ebp), %eax

  17. Unions 1 unsigned float2bit(float f) 2 { 3 union { 4 float f; 5 unsigned u; 6 } temp; 7 temp.f = f; 8 return temp.u; 9 }; 1 movl 8(%ebp), %eax

  18. Unions (Code generated identical to the procedure) 1 unsigned copy (unsigned u) 2 { 3 return u; 4 } 1 movl 8(%ebp), %eax

  19. Alignment P198 • Alignment restrictions • The address for some type of object must be a multiple of some value k(typically 2, 4, or 8) • Simplify the hardware design of the interface between the processor and the memory system

  20. Alignment • In IA32 • hardware will work correctly regardless of the alignment of data • Aligned data can improve memory system performance

  21. Alignment • Linux alignment restriction • 1-byte data types are able to have any address • 2-byte data types must have an address that is multiple of 2 • Any larger data types must have an address that is multiple of 4

  22. Alignment • Alignment is enforced by • Making sure that every data type is organized and allocated in such a way that every object within the type satisfies its alignment restrictions. • malloc() • Returns a generic pointer that is void * • Its alignment requirement is 4

  23. Alignment • Structure data type • may need to insert gaps in the field allocation • may need to add padding to the end of the structure * padding: 填充

  24. Alignment P199 struct S1 { int i; char c; int j; };

  25. Alignment P200 struct S2 { int i; int j; char c; } d[4]; xd, xd+9, xd+18, xd+27 xd, xd+12, xd+24, xd+36

  26. Putting it Together

  27. Outline • Pointer • Declaration • referencing, deferencing • memory allocation, memory free • Buffer overflow • Suggested reading • Chap 3.11, 3.13

  28. Example P202 Figure 3.26 1 struct str { /* Example Structure */ 2 int t; 3 char v; 4 }; 5 6 union uni { /* Example Union */ 7 int t; 8 char v; 9 } u; 10 11 int g = 15; 12

  29. Example P202 Figure 3.26 13 void fun(int* xp) 14 { 15 void (*f)(int*) = fun; /* f is a function pointer */ 16 17 /* Allocate structure on stack */ 18 struct str s = {1,’a’}; /* Initialize structure */ 19 20 /* Allocate union from heap */ 21 union uni *up = (union uni *) malloc(sizeof(union uni)); 22 23 /* Locally declared array */ 24 int *ip[2] = {xp, &g};

  30. Example 26 up->v = s.v+1; 27 28 printf("ip = %p, *ip = %p, **ip = %d\n", 29 ip, *ip, **ip); 30 printf("ip+1 = %p, ip[1] = %p, *ip[1] = %d\n", 31 ip+1, ip[1], *ip[1]); 32 printf ("&s.v = %p, s.v = ’%c’\n", &s.v, s.v); 33 printf ("&up->v = %p, up->v = ’%c’\n", &up->v, up->v); 34 printf ("f = %p\n", f); 35 if (--(*xp) > 0) 36 f(xp); /* Recursive call of fun */ 37 }

  31. Example P202 Figure 3.26 38 39 int test() 40 {41 int x = 2;42 fun(&x);43 return x;44 }

  32. Every pointer has a type P201 • If the object has type T • A pointer to this object has type T * • Special void * type • Represents a generic pointer • malloc returns a generic pointer

  33. Every pointer has a value

  34. Pointers are created with the & operator • Applied to lvalue expression • Lvalue expression can appear on the left side of assignment • &g, &s.v, &u->v, &x

  35. Pointers are dereferenced with the operator * • The result is a value having the type associated with the pointer • *ip, **ip, *ip[1], *xp • up->v

  36. Arrays and pointers are closed related • The name of array can be viewed as a pointer constant • ip[0] is equivalent to *ip

  37. Pointers can point to functions • void (*f)(int *) • f is a pointer to function • The function taken int * as argument • The return type of the function is void • Assignment makes f point to func • f = func void: 空的

  38. The precedence of the operators • void *f(int *) declares f is a function • (void *) f(int *)

  39. Example P203 1 ip = 0xbfffefa8, *ip = 0xbfffefe4, **ip = 2 ip[0] = xp. *xp = x = 2 2 ip+1 = 0xbfffefac, ip[1] = 0x804965c, *ip[1] = 15 ip[1] = &g. g = 15 3 &s.v = 0xbfffefb4, s.v = ’a’ s in stack frame 4 &up->v = 0x8049760, up->v = ’b’ up points to area in heap 5 f = 0x8048414 f points to code for fun 6 ip = 0xbfffef68, *ip = 0xbfffefe4, **ip = 1 ip in new frame, x = 1 7 ip+1 = 0xbfffef6c, ip[1] = 0x804965c, *ip[1] = 15 ip[1] same as before 8 &s.v = 0xbfffef74, s.v = ’a’ s in new frame 9 &up->v = 0x8049770, up->v = ’b’ up points to new area in heap 10 f = 0x8048414 f points to code for fun

  40. Pointer Declaration • char **argv ; • int (*daytab)[13] • int (*comp)() • char (*(*x())[])() • Function returning pointer to array[ ] of pointer to function returning char • char (*(*x[3])())[5] • Array[3] of pointer to function returning pointer to array[5] of char

  41. Pointer Arithmetic • Addition and subtraction • p+i , p-i (result is a pointer) • p-q (result is a int) • Referencing & dereferencing • *p, &E • Subscription • A[i], *(A+i)

  42. C operators Operators Associativity () [] -> . ++ -- left to right ! ~ ++ -- + - * & (type) sizeof right to left * / % left to right + - left to right << >> left to right < <= > >= left to right == != left to right & left to right ^ left to right | left to right && left to right || left to right ?: right to left = += -= *= /= %= &= ^= != <<= >>= right to left , left to right Note: Unary +, -, and * have higher precedence than binary forms

  43. Parameter Passing • Call by value • f(xp) • Call by reference • f(&xp)

  44. 3.13Out-of-Bounds Memory References P206 1 /* Implementation of library function gets() */ 2 char *gets(char *s) 3 { 4 int c; 5 char *dest = s; 6 while ((c = getchar()) != ’\n’ && c != EOF) 7 *dest++ = c; 8 *dest++ = ’\0’; /* Terminate String */ 9 if (c == EOF) 10 return NULL; 11 return s; 12 }

  45. Out-of-Bounds Memory References 13 14 /* Read input line and write it back */ 15 void echo() 16 { 17 char buf[4]; /* Way too small ! */ 18 gets(buf); 19 puts(buf); 20 }

  46. Out-of-Bounds Memory References %ebp buf

  47. Out-of-Bounds Memory References %ebp buf

  48. Out-of-Bounds Memory References %ebp buf

  49. Buffer Overflow P208 Figure 3.29 1 /* This is very low quality code.2 It is intended to illustrate bad programming practices3 See Practice Problem 3.24. */4 char *getline()5 {6 char buf[8];7 char *result;8 gets(buf);9 result = malloc(strlen(buf));10 strcpy(result, buf);11 return(result);12 }

  50. Buffer Overflow P208 Figure 3.29 1 08048524 <getline>: 2 8048524: 55 push %ebp 3 8048525: 89 e5 mov %esp,%ebp 4 8048527: 83 ec 10 sub $0x10,%esp 5 804852a: 56 push %esi 6 804852b: 53 push %ebx Diagram stack at this point 7 804852c: 83 c4 f4 add $0xfffffff4,%esp 8 804852f: 8d 5d f8 lea 0xfffffff8(%ebp),%ebx 9 8048532: 53 push %ebx 10 8048533: e8 74 fe ff ff call 80483ac <_init+0x50> gets

More Related