LINUX.ORG.RU

Продемонстрирована возможность разработки частей Linux на Rust

 , ,


4

9

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

В статье отмечено, что данный язык хорошо подходит для системного программирования, будучи достаточно низкоуровневым и при этом лишённым многих недостатков C, и уже используется для написания новых ОС. Однако автор не считает создание ОС с нуля перспективным для серьёзного применения, и последовательный перенос отдельных частей Linux на Rust для решения различных проблем безопасности кажется ему более целесообразным.

В качестве «Proof of Concept» была приведена реализация системного вызова, содержащая вставки на Assembler внутри unsafe-блоков. Код компилируется в объектный файл, не связанный с библиотеками и интегрируемый в ядро во время сборки. Работа производилась на основе исходного кода Linux 4.8.17.

>>> Статья



Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 5)
Ответ на: комментарий от lefsha

Что нового и лучшего придумал Rust чем выше приведенные варианты.

То, что если это не указатели на числа, а, например, что-то вроде

int free_n_array(size_t n, void* addr[])

который освобождает память в массиве NxM, а ты где-нибудь заменил одну строку на другую подменой указателя, то ты словишь double-free, например, или UB дальше по коду, зависит от компилятора.

То же самое с изменениями данных в таком массиве. Это приведет к поломке данных.
А теперь представь что эта подмена указателя происходит в ветке, которую добавил ваш джун. Тестов на нее нет, code review редко где делают добросоветно.
Но погодите, что это? Ой, уязвимость.

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

Мы только что показали как все разрушить. Вы где были? Если грабли лежат в сарае, то туда все равно можно пойти и на них наступить!

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

Когда грабли лежат, окруженные желтым заборчиком с большими надписями «WARNING», ты их видишь и знаешь что можешь оттуда получить по лбу.

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

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

Если грабли лежат в сарае, то туда все равно можно пойти и на них наступить!

Ты когда-нибудь писал что-то сложней лабораторной? У хорошего программиста грабли всегда спрятаны под горой костылей и так просто на них не наступишь

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

Архитектура — самая сложная часть, и ошибки там самые дорогие. Переписать готовую архитектуру на другой язык — не такая сложная задача как разработать с нуля.

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

Есть одно единственное слово unsafe которое позволяет нарушить правила. Но оно бывает нужно в очень редких случаях (таких как твой пример). Его не используют в обычном коде и его можно легко запретить.

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

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

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

Вот, да. Прочитав семь страниц неудержимого срача, я понял, что хайп всё же растёт.

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

Лучше бы детский садик построили!!1

Лучше б детей не рожали те кто не может воспитать и обеспечить. Извините, не смог пройти мимо.

NextGenenration ★★
()

мне интересно как далеко и глубоко пошлет его Торвальдс, если такое концептуально предложение появится на lkml.org %)

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

Подразумевается всегда «второе имя той же самой переменной»

Кем подразумевается?

Всеми, кто понимает о чем речь!

Ссылка отличается от указателя семантически, на уровне ЯП, внизу это тот же указатель, и в C++ и в Rust.

Кроме регистров абсолютно любая! переменная представляет собой адрес = указатель на область памяти, по которой хранится некое значение.

Ссылка это идентичный адрес той же самой переменной как и основная переменная. По идее ее можно передать в подпрограмму по значению. По сути это как использование глобальной переменной внутри функции.

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

В случае со ссылкой Вы не можете изменять адрес!!! Вы можете только изменять саму переменную по этому адресу.

Если коротко, то в случае указателя у Вас есть 2 сущности, а в случае ссылки одна!

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

Отлично, Вы знаете чем ссылка отличается от указателя. Поздравляю, я тоже.

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

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

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

Расскажи это Торвальдсу.

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

Раз уязвимостей так много - почему до сих пор все линуксовые сервера не попереломаны?

То что быстро подняли, то не упало

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

Это была типа шуточка. В локальных городских группах вк постоянно такая реакция на любые новости

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

Никто не говорит о том что С это супер безопасный язык. Этого близко никто не утверждал.

Речь была о том, что есть целый список так называемых безопасных языков. Как мы знаем D не взлетел. Но ведь он такой хороший...

Есть подозрения, что Rust последует та же участь.

Почему? - Неправильное позиционирование на рынке! Мы либо делаем язык, который супер безопасный и эта безопасность желательно встроена в язык и прозрачна для программиста. Либо мы делаем язык, на котором можно писать ядро и вещи, которые критичны для производительности.

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

В этом смысле Go это пример КАК надо делать.

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

Go и D это языки безопасность которых обеспечивает сборщик мусора. Если в D выключить GC то он перестанет быть безопасным языком.

Rust позволяет получить безопасность без сборщика мусора. А это очень полезно для написания операционных систем.

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

Из позитива, то что мне нравится тип данных, когда можно указывать разрядность. Правда в С сейчас такое тоже есть типа int32_t, но очень много программ с обычным int и потом мы удивляемся, когда все ломается при переходе от 32бит к 64бит.

Скрытие от программиста разрядности используемых данных это плохо. Тем более в низкоуровневом языке типа С.

Просто не надо использовать int как значение размера.

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

Ссылка (по русски псевдоним=кличка) вдруг стала указателем. Тогда как говорится нафига вводить новую сущность или новое название того, что уже есть?

Не различаешь ссылки и указатели о сишник?

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

С чего такой вывод?

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

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

Уже есть Java и другие безопасные языки с GC

Либо мы делаем язык, на котором можно писать ядро и вещи, которые критичны для производительности.

Это было так. Грейдон придумал как совместить безопасность GC (пусть и не во всех аспектах), свободу от гонок данных и производительность. Это и есть Rust.

Аргументы почему оно должно быть либо то либо то — есть?

В этом смысле Go это пример КАК надо делать.

Это тема отдельного срача, но Go далеко не эталон как делать нужно. У языка куча родовых травм, начиная с того что вместо дженериков адепты вынуждены придумывать какую-то дичь с кодогенерацией шелл-скриптами, заканчивая тем, что обработка ошибок в Go никак не мешает использовать результат при ошибке или просто забыть ее обработать.

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

В общем из того, что Вы говорите Rust пользоваться нельзя

Не изменяемых может быть сколько угодно

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

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

Тем, что это зависит от реализации и тем, что я могу изменить адрес=значение самого указателя и указывать в другое место.

Но даже если Вы говорите, что это одно и тоже, то зачем в Rust 2 разные сущности?

Мое исходное сообщение об этом и говорило. Ненужная сложность. И это в то время когда С++14 и 17 идут в сторону упрощения...

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

Фейспалм в который раз. Читайте прежде чем писать и ознакомьтесь со значением слова СЕМАНТИКА.

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

Но в одном Go очень прав. Они сами себе во время сказали - стоп! Они оставили язык простым лаконичным и понятным

Сколько ошибок в слове примитивный

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

обработка ошибок в Go никак не мешает использовать результат при ошибке

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

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

const бывает разным. без примера разговор не о чем. если вы видели мой код, то там вообще показано, что строка стала программой. и что?

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

В случае со ссылкой Вы не можете изменять адрес!!! Вы можете только изменять саму переменную по этому адресу.

let a = 10;
let b = 20;
let mut r = &a;
println!("{}", r);  // 10
r = &b;
println!("{}", r);  // 20
anonymous
()
Ответ на: комментарий от lefsha

Ненужная сложность.

int* ptr
const int* ptr
int* const ptr
const int* const ptr

В очередной раз: типы ссылок и что за ними стоит, как и различия с указателями, понятны любому, кто прочител начало учебника по Rust.
Или вы ждете, что все языки должны иметь строго синтаксис Си и быть понятными любому сишнику сходу, без чтения документации?

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

зачем в Rust 2 разные сущности?

Обычно используют только ссылки. Указатели нужны в небезопасном (unsafe) коде, потому что они позволяют делать небезопасные вещи.

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

Строить графы зависимостей и взаимодействия научились еще до появления первых ЯП.
Хотя если разработчики Линукс не имеют представления о его архитектуре, это объясняет почему в ядре такая помойка :)

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

И при чем тут указатели? Вы уверены, что сами поняли что написали?

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

Следует различать safe код на rust и код на си. В си можно получить указатель на const переменную и её подредактировать.

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

Строить графы зависимостей и взаимодействия научились еще до появления первых ЯП.
Хотя если разработчики Линукс не имеют представления о его архитектуре, это объясняет почему в ядре такая помойка :)

А этим будут заниматься специально обученные люди?

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

Обычно используют только ссылки. Указатели нужны в небезопасном (unsafe) коде, потому что они позволяют делать небезопасные вещи.

Rust позволяет вставлять код на асм? Он позволяет использовать С в виде модуля? Зачем небезопасный режим?

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

Так в том то и дело, что указатель программируется именем переменной а не физическим или относительным адресом в памяти (всего лишь чаще всего, как сказали выше). Но физическую память размечать и выделять будет уже компилятор. А он может наворотить дел на много гигов.

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

зачем в Rust 2 разные сущности?

В нормальном коде используются ссылки, указатели нужные только для вызова C-шных функций (или в чём-то очень низкоуровневом). Обычно пишется обёртка над сишной библиотекой, которая в своём API использует ссылки, а внутри вызывает C-шные функции с указателями.

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

а они планируют это сделать?

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

foror ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.