BDD. The Outer Limits. Iosif Itkin at Youcon (in Russian)
Extended High-Level C-Compatible Memory Model with Limited Low-Level Pointer Cast Support for Jessie Intermediate Language
1. Extended High-Level C-Compatible Memory Model
with Limited Low-Level Pointer Cast Support for
Jessie Intermediate Language
Расширенная высокоуровневая
C-совместимая модель памяти для промежуточного
языка Jessie с частичной поддержкой
низкоуровневого приведения типа указателей
Алексей Хорошилов Михаил Мандрыкин
Институт системного программирования РАН
2. Моделирование памяти
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';
3. Низкоуровневая модель
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, b0, d0
константа c0
константы n0 и m0
………
b1=a0 /
M1=M0[b1 +32 n ← 08] /
M2=M1[b1 +32 n +32 132 ← 08] /
M3=M2[b1 +32 n+32 232 ← 08] /
M4=M3[b1 +32 n+32 332← 18] /
M5=M4[d0 +32 m ←08] /
M6=M5[d0 +32 m +32 132←08] /
M7=M6[d0 +32 m+32 232←08] /
M8=M7[d0 +32 m+32 332←28] /
M9=M8[c0 +32 132←978]
6. Низкоуровневая модель с регионами
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';
………
b1=a0 /
Ma0, 1 =Ma0, 0[b1 +32 n ← 08] /
Ma0, 2 =Ma0, 1[b1 +32 n +32 132 ← 08] /
Ma0, 3 =Ma0, 2[b1 +32 n+32 232 ← 08] /
Ma0, 4 =Ma0, 3[b1 +32 n+32 332 ← 18] /
Md0, 1 =Md0, 0[d0 +32 m ← 08] /
Md0, 2 =Md0, 1[d0 +32 m +32 132 ← 08] /
Md0, 3 =Md0, 2[d0 +32 m+32 232 ← 08] /
Md0, 4 =Md0, 3[d0 +32 m+32 332 ← 28] /
Mac0, 1 =Mc0, 0[c0 +32 132 ← 978]
a, b
d
c
7. Низкоуровневая модель с регионами
f(int *a, int *d,
char *c)
{
int *b;
int n, m;
………
b = a;
b[n] = 1;
d[m] = 2;
c[1] = 'a';
}
(a0 ≤ d0− 16 / a0 ≥ d0+ 16) /
(a0 ≤ c0− 16 / a0 ≥ c0+ 4) /
(d0 ≤ c0− 16 / d0 ≥ c0+ 4)
………
b1=a0 /
Ma0, 1 =Ma0, 0[b1 +32 n ← 08] /
Ma0, 2 =Ma0, 1[b1 +32 n +32 132 ← 08] /
Ma0, 3 =Ma0, 2[b1 +32 n+32 232 ← 08] /
Ma0, 4 =Ma0, 3[b1 +32 n+32 332 ← 18] /
Md0, 1 =Md0, 0[d0 +32 m ← 08] /
Md0, 2 =Md0, 1[d0 +32 m +32 132 ← 08] /
Md0, 3 =Md0, 2[d0 +32 m+32 232 ← 08] /
Md0, 4 =Md0, 3[d0 +32 m+32 332 ← 28] /
Mac0, 1 =Mc0, 0[c0 +32 132 ← 978]
предусловие
a, b
d
c
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 ≤ d0− 16 / a0 ≥ d0+ 16)
………
b1=a0 /
Mint
a0, 1=Mint
a0, 0[b1 +32 n ← 08] /
Mint
a0, 2=Mint
a0, 1[b1 +32 n +32 132 ← 08] /
Mint
a0, 3=Mint
a0, 2[b1 +32 n+32 232 ← 08] /
Mint
a0, 4=Mint
a0, 3[b1 +32 n+32 332 ← 18] /
Mint
d0, 1=Mint
d0, 0[d0 +32 m ← 08] /
Mint
d0, 2=Mint
d0, 1[d0 +32 m +32 132 ← 08] /
Mint
d0, 3=Mint
d0, 2[d0 +32 m+32 232 ← 08] /
Mint
d0, 4=Mint
d0, 3[d0 +32 m+32 332 ← 28] /
Mint
c0, 1=Mchar
c0, 0[c0 +32 132 ← 978]
предусловие
a, b
32-бит.
d
32-бит.
с
8-бит.
9. Высокоуровневая модель с регионами
f(int *a, int *d,
char *c)
{
int *b;
int n, m;
………
b = a;
b[n] = 1;
d[m] = 2;
c[1] = 'a';
}
(a0 ≤ d0− 4 / a0 ≥ d0+ 4)
………
b1=a0 /
Mint
a0, 0=Mint
a0, 0[b1 +32 n ← 132] /
Mint
d0, 0=Mint
d0, 0[d0 +32 m ← 232] /
Mint
c0, 0=Mchar
c0, 0[c0 +32 132 ← 978]
предусловие
a, b
32-бит.
d
32-бит.
с
8-бит.
10. Высокоуровневая модель с регионами
f(int *a, int *d,
char *c)
{
int *b;
int n, m;
………
b = a;
b[n] = 1;
d[m] = 2;
c[1] = 'a';
}
(a0 ≤ d0− 4 / a0 ≥ d0+ 4)
………
b1=a0 /
Mint
a0, 1=Mint
a0, 0[b1 + n ← 1] /
Mint
d0, 1=Mint
d0, 0[d0 + m ← 2] /
Mint
c0, 1=Mchar
c0, 0[c0 + 1 ← 97]
предусловие
a, b
int32
d
int32
с
int8
16. Поддержка переинтерпретации
p (unisnged char *) p
p
uint16
?
p (unisnged char *) p
p
uint16
(unsigned char *) p
uint8
(char *) p
?
(char *) p
(char *) p
int8
17. p
Поддержка переинтерпретации
p
uint16
(unisnged char *) p
(unsigned char *)
(char *) …
(...*) (p + n)
uint8
(char *) p
(char *) …
(... *) (p – n)
int8
19. Проблема когерентности обновлений
unsigned short p = 5;
unsigned short *q = &p;
*((char *) p) = 6;
if (*q == 5) {
//...
здесь нужна
синхронизация
памятей регионов
p и (char *) p
и здесь тоже!
20. Проблема когерентности обновлений
unsigned short p = 5;
unsigned short *q = &p;
//@ jessie pragma p :> char *;
*((char *) p) = 6;
//@ jessie pragma ((char * )p) :> unsigned short *;
if (*q == 5) {
//...
22. Решение проблемы когерентности
unsigned short p = 5;
unsigned short *q = &p;
*((char *) p) = 6;
//@ jessie pragma ((char * )p) :> unsigned short *;
if (q == 5) {
//...
не валидно!
25. Направления дальнейшей работы
➔ unsigned char p[5];
unsigned short *q = (unsigned short *) &p;
5 не кратно sizeof (unsigned short)
– в статье предложено дальнейшее
расширение языка Jessie;
➔ cтруктуры с несколькими полями, в том
числе с выравниванием;
➔ применение к коду модулей ядра Linux