Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie...
-
Upload
iosif-itkin -
Category
Science
-
view
970 -
download
3
description
Transcript of Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie...
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for
Jessie Intermediate Language
Расширенная высокоуровневаяC-совместимая модель памяти для промежуточного
языка Jessie с частичной поддержкой низкоуровневого приведения типа указателей
Алексей Хорошилов Михаил Мандрыкин
Институт системного программирования РАН
Моделирование памяти
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';
Низкоуровневая модель
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]
Низкоуровневая модель
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]
Низкоуровневая модель с регионами
a, b
d
c
a b
a b
a b
a b
a, b
a b
Низкоуровневая модель с регионами
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
Низкоуровневая модель с регионами
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
Высокоуровневая модель с регионами
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-бит.
Высокоуровневая модель с регионами
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-бит.
Высокоуровневая модель с регионами
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
Поддержка структур
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
Поддержка префиксного кастирования
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
Поддержка префиксного кастирования
Поддержка переинтерпретации
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
?
Поддержка переинтерпретации
Поддержка переинтерпретации
puint16
p (unisnged char *) p
?
puint16
p (unisnged char *) p
(unsigned char *) puint8
(char *) p
(char *) pint8
(char *) p
?
puint16
p
(unisnged char *) p
(unsigned char *)(char *) …
(...*) (p + n)
uint8
(char *) p
(char *) …
(... *) (p – n)
int8
Поддержка переинтерпретации
Проблема когерентности обновлений
unsigned short p = 5;
unsigned short *q = &p;
*((char *) p) = 6;
if (*q == 5) { //...
Проблема когерентности обновлений
unsigned short p = 5;
unsigned short *q = &p;
*((char *) p) = 6;
if (*q == 5) { //...
здесь нужнасинхронизация
памятей регионов p и (char *) p
и здесь тоже!
Проблема когерентности обновлений
unsigned short p = 5;
unsigned short *q = &p;
//@ jessie pragma p :> char *;
*((char *) p) = 6;
//@ jessie pragma ((char * )p) :> unsigned short *;
if (*q == 5) { //...
Решение проблемы когерентности
Jessieподдерживает проверку условийкорректности защиты памяти!
Решение проблемы когерентности
unsigned short p = 5;
unsigned short *q = &p;
*((char *) p) = 6;
//@ jessie pragma ((char * )p) :> unsigned short *;
if (q == 5) { //...
не валидно!
Поддержка переинтерпретации
Поддержка переинтерпретации
Направления дальнейшей работы
➔ unsigned char p[5];
unsigned short *q = (unsigned short *) &p;
5 не кратно sizeof (unsigned short)
– в статье предложено дальнейшее расширение языка Jessie;
➔ cтруктуры с несколькими полями, в том числе с выравниванием;
➔ применение к коду модулей ядра Linux