extended high-level c-compatible memory model with limited low-level pointer cast support for jessie...

25
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language Расширенная высокоуровневая C-совместимая модель памяти для промежуточного языка Jessie с частичной поддержкой низкоуровневого приведения типа указателей Алексей Хорошилов Михаил Мандрыкин Институт системного программирования РАН

Upload: iosif-itkin

Post on 02-Jul-2015

970 views

Category:

Science


3 download

DESCRIPTION

Mikhail Mandrykin and Alexey Khoroshilov, ИСП РАН, Moscow

TRANSCRIPT

Page 1: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for

Jessie Intermediate Language

Расширенная высокоуровневаяC-совместимая модель памяти для промежуточного

языка Jessie с частичной поддержкой низкоуровневого приведения типа указателей

Алексей Хорошилов Михаил Мандрыкин

Институт системного программирования РАН

Page 2: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Моделирование памяти

int *a, *b, d[4];char c[4];int n, m;

………

a = malloc (sizeof (int) * 4);b = a;b[n] = 1;d[m] = 2;

c[1] = 'a';

Page 3: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Низкоуровневая модель

int *a, *b, d[4];char c[4];int n, m;

………

a = malloc (sizeof (int) * 4);b = a;b[n] = 1;d[m] = 2;

c[1] = 'a';

константы a0, b

0, d

0

константа c0

константы n0 и m

0

………b

1=a

0 /\

M1=M

0[b

1 +

32 n ← 0

8]

/\

M2=M

1[b

1 +

32 n +

32 1

32 ← 0

8] /\

M3=M

2[b

1 +

32 n+

32 2

32 ← 0

8]

/\

M4=M

3[b

1 +

32 n+

32 3

32← 1

8]

/\

M5=M

4[d

0 +

32 m ←0

8] /\

M6=M

5[d

0 +

32 m +

32 1

32←0

8] /\

M7=M

6[d

0 +

32 m+

32 2

32←0

8]

/\

M8=M

7[d

0 +

32 m+

32 3

32←2

8]

/\

M9=M

8[c

0 +

32 1

32←97

8]

Page 4: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Низкоуровневая модель

int *a, *b, d[4];char c[4];int n, m;

………

a = malloc (sizeof (int) * 4);b = a;b[n] = 1;d[m] = 2;

c[1] = 'a';

(a0 ≤ d

0−

16 \/

a

0 ≥ d

0+

16) /\

(a0 ≤ c

0−

16 \/

a

0 ≥ c

0+

4)

/\

(d0 ≤ c

0−

16 \/

d

0 ≥ c

0+

4)

………b

1=a

0 /\

M1=M

0[b

1 +

32 n ← 0

8]

/\

M2=M

1[b

1 +

32 n +

32 1

32 ← 0

8] /\

M3=M

2[b

1 +

32 n+

32 2

32 ← 0

8]

/\

M4=M

3[b

1 +

32 n+

32 3

32← 1

8]

/\

M5=M

4[d

0 +

32 m ←0

8] /\

M6=M

5[d

0 +

32 m +

32 1

32←0

8] /\

M7=M

6[d

0 +

32 m+

32 2

32←0

8]

/\

M8=M

7[d

0 +

32 m+

32 3

32←2

8]

/\

M9=M

8[c

0 +

32 1

32←97

8]

Page 5: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Низкоуровневая модель с регионами

a, b

d

c

a b

a b

a b

a b

a, b

a b

Page 6: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Низкоуровневая модель с регионами

int *a, *b, d[4];char c[4];int n, m;

………

a = malloc (sizeof (int) * 4);b = a;b[n] = 1;d[m] = 2;

c[1] = 'a';

………b

1=a

0 /\

Ma0, 1

=Ma0, 0

[b1 +

32 n ← 0

8] /\

Ma0, 2

=Ma0, 1

[b1 +

32 n +

32 1

32 ← 0

8]

/\

Ma0, 3

=Ma0, 2

[b1 +

32 n+

32 2

32 ← 0

8] /\

Ma0, 4

=Ma0, 3

[b1 +

32 n+

32 3

32 ← 1

8]

/\

Md0, 1

=Md0, 0

[d0 +

32 m ← 0

8] /\

Md0, 2

=Md0, 1

[d0 +

32 m +

32 1

32 ← 0

8]

/\

Md0, 3

=Md0, 2

[d0 +

32 m+

32 2

32 ← 0

8]

/\

Md0, 4

=Md0, 3

[d0 +

32 m+

32 3

32 ← 2

8]

/\

Mac0, 1

=Mc0, 0

[c0 +

32 1

32 ← 97

8]

a, b

d

c

Page 7: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Низкоуровневая модель с регионами

f(int *a, int *d, char *c){ int *b; int n, m;

………

b = a; b[n] = 1; d[m] = 2;

c[1] = 'a';}

(a0 ≤ d

0−

16 \/

a

0 ≥ d

0+

16) /\

(a0 ≤ c

0−

16 \/

a

0 ≥ c

0+

4)

/\

(d0 ≤ c

0−

16 \/

d

0 ≥ c

0+

4)

………

b1=a

0 /\

Ma0, 1

=Ma0, 0

[b1 +

32 n ← 0

8] /\

Ma0, 2

=Ma0, 1

[b1 +

32 n +

32 1

32 ← 0

8]

/\

Ma0, 3

=Ma0, 2

[b1 +

32 n+

32 2

32 ← 0

8] /\

Ma0, 4

=Ma0, 3

[b1 +

32 n+

32 3

32 ← 1

8]

/\

Md0, 1

=Md0, 0

[d0 +

32 m ← 0

8] /\

Md0, 2

=Md0, 1

[d0 +

32 m +

32 1

32 ← 0

8]

/\

Md0, 3

=Md0, 2

[d0 +

32 m+

32 2

32 ← 0

8]

/\

Md0, 4

=Md0, 3

[d0 +

32 m+

32 3

32 ← 2

8]

/\

Mac0, 1

=Mc0, 0

[c0 +

32 1

32 ← 97

8]

предусловие

a, b

d

c

Page 8: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Высокоуровневая модель с регионами

f(int *a, int *d, char *c){ int *b; int n, m;

………

b = a; b[n] = 1; d[m] = 2;

c[1] = 'a';}

(a0 ≤ d

0−

16 \/

a

0 ≥ d

0+

16)

………b

1=a

0 /\

Minta0, 1

=Minta0, 0

[b1 +

32 n ← 0

8] /\

Minta0, 2

=Minta0, 1

[b1 +

32 n +

32 1

32 ← 0

8] /\

Minta0, 3

=Minta0, 2

[b1 +

32 n+

32 2

32 ← 0

8]

/\

Minta0, 4

=Minta0, 3

[b1 +

32 n+

32 3

32 ← 1

8] /\

Mintd0, 1

=Mintd0, 0

[d0 +

32 m ← 0

8] /\

Mintd0, 2

=Mintd0, 1

[d0 +

32 m +

32 1

32 ← 0

8]

/\

Mintd0, 3

=Mintd0, 2

[d0 +

32 m+

32 2

32 ← 0

8]

/\

Mintd0, 4

=Mintd0, 3

[d0 +

32 m+

32 3

32 ← 2

8]

/\

Mintc0, 1

=Mcharc0, 0

[c0 +

32 1

32 ← 97

8]

предусловие

a, b32-бит.

d32-бит.

с8-бит.

Page 9: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Высокоуровневая модель с регионами

f(int *a, int *d, char *c){ int *b; int n, m;

………

b = a; b[n] = 1; d[m] = 2;

c[1] = 'a';}

(a0 ≤ d

0−

4 \/

a

0 ≥ d

0+

4)

………b

1=a

0 /\

Minta0, 0

=Minta0, 0

[b1 +

32 n ← 1

32]

/\

Mintd0, 0

=Mintd0, 0

[d0 +

32 m ← 2

32]

/\

Mintc0, 0

=Mcharc0, 0

[c0 +

32 1

32 ← 97

8]

предусловие

a, b32-бит.

d32-бит.

с8-бит.

Page 10: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Высокоуровневая модель с регионами

f(int *a, int *d, char *c){ int *b; int n, m;

………

b = a; b[n] = 1; d[m] = 2;

c[1] = 'a';}

(a0 ≤ d

0−

4 \/

a

0 ≥ d

0+

4)

………b

1=a

0 /\

Minta0, 1

=Minta0, 0

[b1 +

n ← 1] /\

Mintd0, 1

=Mintd0, 0

[d0 +

m ← 2]

/\

Mintc0, 1

=Mcharc0, 0

[c0 +

1 ← 97]

предусловие

a, bint32

dint32

сint8

Page 11: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка структур

struct derived { size_t size; char data[8];};

struct derived *d;struct derived *pd = &d; ………

pd->data[1] = 0; pd->size = 2;

………pd

1=d

0 /\

Mint8d0.data, 1

=Mint8d0.data, 0

[Mint8*(d0, derived.data), 0

[pd0] +1 ← 0]

/\

Muint32(d0, derived.size), 1

[pd0]=Muint32

(d0, derived.size), 0[pd

0 ← 2]

&d, pddrived.data

int8*

&d, pdderived.size

uint32

d0.data,pd→data

int8

Page 12: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка префиксного кастирования

struct base size_t size;};

struct derived { struct base base; char data[8];};

struct derived *d;struct derived *pd = &d;

((struct base *) pd)->size = 2;

Muint32(d0, base.size), 1

[pd0]=Muint32

(d0, base.size), 0[pd

0 ← 2]

&d, pddrived.data

int8*

&d, pdbase.size

uint32

d0.data,pd→data

int8

Page 13: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка префиксного кастирования

Page 14: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка переинтерпретации

void set_w16(void *p, unsigned short v){ unsigned char *ptr = (unsigned char *) p; ptr[0] = v & 0xff; ptr[1] = (v >> 8) & 0xff;}

puint16

p (unisnged char *) p

?

Page 15: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка переинтерпретации

Page 16: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка переинтерпретации

puint16

p (unisnged char *) p

?

puint16

p (unisnged char *) p

(unsigned char *) puint8

(char *) p

(char *) pint8

(char *) p

?

Page 17: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

puint16

p

(unisnged char *) p

(unsigned char *)(char *) …

(...*) (p + n)

uint8

(char *) p

(char *) …

(... *) (p – n)

int8

Поддержка переинтерпретации

Page 18: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Проблема когерентности обновлений

unsigned short p = 5;

unsigned short *q = &p;

*((char *) p) = 6;

if (*q == 5) { //...

Page 19: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Проблема когерентности обновлений

unsigned short p = 5;

unsigned short *q = &p;

*((char *) p) = 6;

if (*q == 5) { //...

здесь нужнасинхронизация

памятей регионов p и (char *) p

и здесь тоже!

Page 20: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Проблема когерентности обновлений

unsigned short p = 5;

unsigned short *q = &p;

//@ jessie pragma p :> char *;

*((char *) p) = 6;

//@ jessie pragma ((char * )p) :> unsigned short *;

if (*q == 5) { //...

Page 21: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Решение проблемы когерентности

Jessieподдерживает проверку условийкорректности защиты памяти!

Page 22: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Решение проблемы когерентности

unsigned short p = 5;

unsigned short *q = &p;

*((char *) p) = 6;

//@ jessie pragma ((char * )p) :> unsigned short *;

if (q == 5) { //...

не валидно!

Page 23: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка переинтерпретации

Page 24: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Поддержка переинтерпретации

Page 25: Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language

Направления дальнейшей работы

➔ unsigned char p[5];

unsigned short *q = (unsigned short *) &p;

5 не кратно sizeof (unsigned short)

– в статье предложено дальнейшее расширение языка Jessie;

➔ cтруктуры с несколькими полями, в том числе с выравниванием;

➔ применение к коду модулей ядра Linux