LINUX.ORG.RU

Создание экосистемы свободного ПО для процессоров «Эльбрус»

 


3

6

В ТАСС состоится пресс-конференция, посвященная развитию экосистемы свободно-распространяемого ПО для платформы «Эльбрус».

О текущей ситуации на рынке аппаратных технологий и влиянии публикации исходного кода системного ПО для процессоров «Эльбрус» на дальнейшее развитие IT-сферы России расскажут директор департамента цифровых технологий Минпромторга России Владимир Дождев, заместитель генерального директора по маркетингу АО «МЦСТ» Константин Трушкин, исполнительный директор Ассоциации разработчиков программных продуктов «Отечественный софт» Ренат Лашин и глава Ассоциации российских разработчиков и производителей электроники Иван Покровский.

АО «МЦСТ» объявляет о раскрытии исходных кодов ядра linux, системных библиотек, патчей совместимости для ПО с открытым исходным кодом, обеспечивающих работу с архитектурой данной платформы. Этот шаг делается для развития открытого ПО для процессоров «Эльбрус».

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)

Ответ на: комментарий от numas13

Эта «ассемблерная команда» не сможет инвалидировать все указатели на выделенную область памяти.

Почему? Все производные указатели (полученные из исходного) всё равно содержат указатель на начало объекта. В котором будет отметка «удалён».

но если этот кусок будет переиспользован, то новые данные можно будет спокойно прочитать там где не надо

Тогда бы это позволяло читать данные:

#include <stdio.h>

int main()
{
        int x = 1;
        int y = 2;
        int *p = &x, *p1 = &y;
        p++;
        printf("%p %p\n", p, p1);
        printf("%d\n", p == p1);
        *p = 3;
        printf("%d\n", y);
}

Но нет

0xc2dfff92c218 0xc2dfff92c218
1
Ошибка сегментирования

Чужой указатель на этот адрес не работает.

monk ★★★★★
() автор топика
Ответ на: комментарий от frost_ii

У штеуда есть положительное качество - если они видят бесперспективность платформы, они её закрывают и начинают работать над новым.

Какую архитектуру бы ты хотел от МЦСТ? Какой бы это дало выигрыш для оборонки?

При оборотах штеуда на убогом x86 можно сколько угодно выпендриваться. Выпендриваться же в условиях выполнения контракта и куда более скромных бюджетах куда как сложнее и гораздо бессмысленнее.

skiminok1986 ★★★★★
()
Ответ на: комментарий от rechnick

А ещё сомневаюсь, что есть какие-то мифические «фанаты VLIW».

Меня можно считать фанатом VLIW. В том смысле, что я уверен, что VLIW может достичь большей производительности, чем равной сложности OoO процессор. Потому что у компилятора больше данных для оптимизации, чем у процессора.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Вот мне думается, что разработчики Эльбруса тоже дойдут до этой мысли

Ну мсье! Странно думать, что живые разработчики живого процессора не дошли до какой-то мысли. Тут надо написать «когда руки дойдут». Полагаю, что у них масса всевозможных планов, проектов и идей для улучшения того, что уже имеется.

rechnick ★★★
()
Ответ на: комментарий от frost_ii

У штеуда есть положительное качество - если они видят бесперспективность платформы, они её закрывают и начинают работать над новым.

Действительно. Над RISC они перестали работать ещё во времена i960, а над ARM во времена XScale. Если верить штеуду, то кроме x86 перспектив нет.

monk ★★★★★
() автор топика
Ответ на: комментарий от rechnick

Странно думать, что живые разработчики живого процессора не дошли до какой-то мысли. Тут надо написать «когда руки дойдут».

Всякое может быть. Ту же самую технологию ведь и в x86 можно использовать, но руки ни у кого не дошли (Microsoft Research сделала Singularity, но дальше ядра дело не дошло).

monk ★★★★★
() автор топика
Ответ на: комментарий от numas13

Учись сколько влезет.

А описание системы команд и их кодирование раскрыли, или только общий невнятный учебник, как и раньше?

Shushundr ★★★
()
Ответ на: комментарий от monk

Почему? Все производные указатели (полученные из исходного) всё равно содержат указатель на начало объекта. В котором будет отметка «удалён».

Это так не работает. :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1024
int main(int argc, char *argv[]) {
    char *x, *y;
    x = malloc(N);
    printf("malloc %p\n", x);
    x[0] = 0;
    printf("  x[0] %d\n", x[0]);
    y = x; // dangling pointer
    printf("  free %p\n", x);
    free(x);
    for (int i = 0; i < 1000000; i++) {
        x = malloc(N);
        if (x == y) break;
        free(x);
    }
    printf("malloc %p\n", x);
    printf("  y[0] write 13\n");
    y[0] = 13;
    printf("  x[0] %d\n", x[0]);
    printf("  y[0] %d\n", y[0]);
    printf("  free %p\n", x);
    free(x);
    return 0;
}
numas13@yukari:~/dev/tmp/test$ lcc -mptr128 a.c && ./a.out
malloc 0x509a9030
  x[0] 0
  free 0x509a9030
malloc 0x509a9030
  y[0] write 13
  x[0] 13
  y[0] 13
  free 0x509a9030

Даже в МЦСТ признают («>70%»), что ЗРИ ТБВ от всех проблем не защищает.

numas13
()
Ответ на: комментарий от Shushundr

Не раскрыли, но оно уже давно есть в слитом binutils и qemu-e2k.

numas13
()
Ответ на: комментарий от monk

В котором будет отметка «удалён».

Кстати, даже формат указателя менять не придётся. Там же длина объекта есть. Её надо просто занулять.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Тебе для этого надо записывать где лежат (память, регистры, стек) все указатели на все объекты, чтобы потом инвалидировать их. ЗРИ ТБВ так не работает.

numas13
()
Ответ на: комментарий от numas13

Это так не работает. :)

Так ты привёл тот же пример, что со стеком. Есть легальный указатель на 0x509a9030 длиной 1024. От того, что его передали в free он сейчас не перестаёт быть легальным (нет такой команды в ассемблере). Естественно, через него можно получить данные, которые получены во втором malloc.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Есть легальный указатель на 0x509a9030 длиной 1024. От того, что его передали в free он сейчас не перестаёт быть легальным (нет такой команды в ассемблере).

Ты очень узко мыслишь. free будет где-то в потрохах, а время жизни указатели может быть очень неочивидно. Повторяю, хочешь больше безопасности — пиши на safe Rust, а ЗРИ ТБВ выбрось нафиг. :)

numas13
()
Ответ на: комментарий от numas13

Тебе для этого надо записывать где лежат (память, регистры, стек) все указатели на все объекты

Зачем?

Длинный указатель имеет структуру struct ptr {base *base, offset_t offset}. где база struct base {void* data, type_t type, offset_t length}.

При доступе проверяется 0 < offset < base->length.

Те же страницы, но не килобайтами, а байтами.

Инвалидация сводится к установке base->length = 0.

monk ★★★★★
() автор топика
Ответ на: комментарий от numas13

а время жизни указатели может быть очень неочивидно.

Как попал во free, так и умер.

Повторяю, хочешь больше безопасности — пиши на safe Rust

Также повторяю, что там половину алгоритмов не реализовать. Есть хоть одна библиотека для работы с произвольными графами на safe Rust?

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от numas13

Есть не только эмулятор,

Это не официальный эмулятор. Его @a1ba написал по утёкшим спекам и он вроде как даже не полон. Альба, наверное, может подробнее написать, если ему не лень.

Сами перцы из МЦСТ клали болт кому-то эмуляторы давать.

алсо

QEMU With E2K User Support

Там ОС не запустишь. Только юзерспейс.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от monk

Также повторяю, что там половину алгоритмов не реализовать. Есть хоть одна библиотека для работы с произвольными графами на safe Rust?

Слушай, если уж на хачкелле есть, то на Rust сделать вряд ли проблема. Даже на Safe Rust, да.

hateyoufeel ★★★★★
()
Ответ на: комментарий от monk

Какую такую половину, во 1-ых сейф раст тьюринг полный, во 2-ых сейф это не только и не столько то что отделяется ключевым словом unsafe. А графы, в общем случае, с самого начала реализовывали на массивах ещё задолго до раста, это вырожденные случаи вроде списков допускают реализацию на указателях

zurg
()
Ответ на: комментарий от hateyoufeel

Только юзерспейс. Я работал над system режимом, но не доделал его.

Там в каком-то виде грузился Embox, но не проходил тесты на многопоток, а Linux собранный из их сорцов не может перейти в следующую стадию загрузки. Фиг знает почему всё это. :)

a1ba ★★
()
Ответ на: комментарий от hateyoufeel

Слушай, если уж на хачкелле есть, то на Rust сделать вряд ли проблема. Даже на Safe Rust, да.

В Haskell нет ограничений на алгоритмы, потому что там сборщик мусора. А в Safe Rust контролёр заимствований требует гарантии, что ни один объект не будет записан в два места. Как при этом описывать графы (в каждом узле которого, по нормальной схеме, есть ссылки на всех соседей), я не представляю. Rc не подходит, так как в графе ссылки друг на друга и при удалении ссылки на граф они автоматически не обнулятся.

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от frost_ii

Да, под это Риск5 как раз и заточен

А в Риск5 разве есть возможность указать процессору порядок предвыполнения инструкций? Или ты хотел написать VLIW?

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Если брать вместо байткода Риск5, то там инструкций не хватает.

monk ★★★★★
() автор топика
Ответ на: комментарий от skiminok1986

Риск5, разумеется. Гораздо проще поддержка, нет проблем по росту производительности, стандартизация. И у нас в России уже есть компетенции по теме.

Может быть целая набор рисков - высокопроизводительный, для общего применения. Да, а эльбрус тоже приходится вкорячивать и ОоО и префеч и суперскаляр, но для риска то же самое гораздо проще.

На том же риске можно сделать высоконадёжные процы, сейчас это мипс, но мипс умер.

И вплоть до микроконтроллеров.

И развивать отечественное по мере появления литографов. Сплошной профит

frost_ii ★★★★★
()
Ответ на: комментарий от monk

Как при этом описывать графы (в каждом узле которого, по нормальной схеме, есть ссылки на всех соседей), я не представляю.

Массивом. Любой граф легко описывается двумерным массивом, чувак, и даже такая неоптимальная реализация будет лучше чем херачить указателями. На указателях графы делать – полная и тотальная тупость, хотя бы из-за накладных расходов по памяти. У тебя каждый указатель по 8 байт добавляет. Нахрен так вообще жить?

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от windprop2

Хоть я и не фанат RISC-V, но отступить в направлении RISC-V МЦСТ вполне может.

Шило на мыло по большому счёту. По крайней мере в текущих реалиях.

skiminok1986 ★★★★★
()
Ответ на: комментарий от frost_ii

Риск5, разумеется.

Почему именно от МЦСТ? Если всё так просто и замечательно, как ты расписываешь, то это золотая жила. Думаешь, деньги никому не нужны?

skiminok1986 ★★★★★
()
Ответ на: комментарий от hateyoufeel

Любой граф легко описывается двумерным массивом

Чтоб тебе AST программы в таком формате обрабатывать.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Чтоб тебе AST программы в таком формате обрабатывать.

AST – это дерево. На Safe Rust пишется без проблем. Вот тебе AST для JSON:

https://github.com/serde-rs/json/blob/master/src/value/mod.rs#L116

Но, кстати, даже AST лучше массивом делать. Если ты посмотришь бенчмарки, у типичного жсон парсера с деревом на указателях потребление памяти улетает просто в небеса. Типа, для 10 мегабайтового жсона дерево может вполне сожрать метров 300-400.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от hateyoufeel

На указателях графы делать – полная и тотальная тупость, хотя бы из-за накладных расходов по памяти. У тебя каждый указатель по 8 байт добавляет. Нахрен так вообще жить?

Так массив дороже. Вот возьмём простой граф-кольцо на пару тысяч точек. На указателях у меня будет N28 байт. На массиве будет N*N (пусть бит). Уже для 128 точек даже битовый массивы вырастает до того же размера, как и на структура на указателях. Плюс все операции на нём O(N).

Если же известно, что элементов меньше 256, то «указателем» может быть номер элемента массива узлов. И тогда массив становится неэффективен уже на 16 элементах.

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от skiminok1986

Не обязательно от МЦСТ, можно дать заказ тому, кто уже сейчас занимается рисками в России и помочь с воплощением в кремнии, поскольку сейчас такие вопросы без согласования в самых верхах не решаются.

Или уповать на то, что влив это правильно, потому что начальству виднее.

frost_ii ★★★★★
()
Ответ на: комментарий от monk

Так массив дороже. Вот возьмём простой граф-кольцо на пару тысяч точек. На указателях у меня будет N28 байт. На массиве будет N*N (пусть бит). Уже для 128 точек даже битовый массивы вырастает до того же размера, как и на структура на указателях. Плюс все операции на нём O(N).

Если же известно, что элементов меньше 256, от «указателем» может быть номер элемента массива узлов. И тогда массив становится неэффективен уже на 16 элементах.

Ага. Проще юзать Integer Map, а вместо указателей на ноды тупо нумеровать их. Сами же ноды хранить как раз в массиве. Хацкельная FGL как раз вот так и делает.

https://hackage.haskell.org/package/fgl-5.8.2.0/docs/Data-Graph-Inductive-PatriciaTree.html

Видишь? Опять unsafe и рекурсивные ссылки нахрен не всрались!

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Видишь? Опять unsafe и рекурсивные ссылки нахрен не всрались!

Вот это сделай без unsafe:

https://doc.rust-lang.org/src/alloc/collections/linked_list.rs.html#177

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

В смысле отдельно выдернутый метод в уже сформированной структуре данных на указателях? естественно это нереально, а так это как раз попадает под моё во 2-ых - т.е. доказанный и проверенный ансейф = сейф
А если с нуля: ну будет в основе какой-нибудь:

struct Node<T> {
    next: usize,
    prev: usize,
    val: T,
 }

дальше сам догадаешься.

zurg
()
Ответ на: комментарий от frost_ii

А этим будет заниматься аппаратный планировщик

Аппаратный планировщик всегда хуже программного. Он видит меньше контекста (буквально несколько десятков инструкций), у него гораздо жёстче требования по скорости (JIT компилятор может выполнять алгоритм тысячи тактов, а аппаратный обязан за один такт выдать решение на столько инструкций, сколько можно выполнить параллельно).

monk ★★★★★
() автор топика
Ответ на: комментарий от frost_ii

сейчас такие вопросы без согласования в самых верхах не решаются

То есть частная компания не может наладить разработку и производства процессора без согласования в самых верхах? Или речь о распилах бюджета и откатах?

Или уповать на то, что влив это правильно

Я так и не смог для себя определиться тупик это или нет.

потому что начальству виднее

Какому? :)

skiminok1986 ★★★★★
()
Ответ на: комментарий от monk

Так массив дороже.

А вот ни фига, реально мерять надо, на современных архитектурах и компиляторах с большей вероятностью наоборот будет

zurg
()
Ответ на: комментарий от monk

Да-да, хейтеры ржавого носятся с этим двухсвязным списком как с ссаной торбой. Уже 10 раз видели это и столько же раз обсосали. На RefCell это делается просто элементарно.

Держи: https://gist.github.com/matey-jack/3e19b6370c6f7036a9119b79a82098ca

Ей богу, у ржавого проблем просто вагон, но ты притащил высосанную из пальца, которая проблемой то даже не является.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от zurg

дальше сам догадаешься.

Кстати, а как в ваших вариантах на массивах удаление узла происходит?

То, что в нормальном коде будет

auto node = fill_data();
auto elem = node->next->next; // удалим после этого элемента

auto next = elem->next->next;
free(elem->next);
elem->next = next;
next->prex = elem;
monk ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

На RefCell это делается просто элементарно

До тех пор, пока есть гарантия, что ссылки не образуют петлю.

monk ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Ей богу, у ржавого проблем просто вагон, но ты притащил высосанную из пальца, которая проблемой то даже не является.

Основная проблема в том, что unsafe используется действительно массово. Иначе вместо того, чтобы решать задачу, решаешь ребусы от контролёра заимствования.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

В прикладном коде unsafe мало. В низкоуровневых частях либ, которые делают какие-то хитрые штуки от него не уйти, но я повторяю тезис о том, что в таком коде багов почти не бывает.

Mmmlmlm
()
Ответ на: комментарий от monk

На RefCell это делается просто элементарно

До тех пор, пока есть гарантия, что ссылки не образуют петлю.

В двухсвязном списке у тебя есть гарантия, что ссылки не образуют петлю. Иначе это не двухсвязный список, чувак.

Серьёзно, кончай тут с этим позором. Выглядит убого.

hateyoufeel ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.