LINUX.ORG.RU

Линус Торвальдс раскритиковал Rust в ядре

 ,


3

9

Линус Торвальдс критикует использование Rust в ядре. Причины: возможность panic(), неделимость библиотеки и соответственно опасные попытки использования 128 bit типов (в ядре запрещено), бесполезность предложенных примеров драйверов.

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

anonymous

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

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

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

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

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

Си просто напишет «Segmentation fault» и всё, а Раст ещё бросится объяснять

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

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

Exactly my point. Вот получается раздизайнили API так что нельзя. И потому это попахивает гнильцой (С++). Типо «ну че ты такой дерзкий, пиши код хорошо, багов не делай, если че сам виноват»

try_push и подобные - самый простой выход. Их нет, я ною по поводу почему try_reserve добавили, а остальные try_ одновременно с ним - нет, в чем логика?

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

Так это, в ядро вроде не тащат Box, не тащат ни alloc, ни std. В ядре по идее должен быть какой-то свой KBox<T, Allocator> c fn new() -> Result<KBox<T, Allocator>, AllocationError>. Особенно учитывая, что в ядре больше одного способа выделить память.

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

ядре по идее должен быть какой-то свой KBox<T, Allocator>

То есть по сути совершенно другой язык не совместимый ни с какими библиотеками. Не нужно.

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

Язык - тот же. Не все библиотеки Rust требуют alloc или std. И std ты туда в любом случае не впихнёшь.

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

Ну так это всё равно пахнет пересозданием stdlib только в ядерном варианте, чего как я понимаю хотят избежать.

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

У тебя один хрен не получится сохранить полноценную совместимость, кроме разве что no_std подмножества библиотек.

Да даже на си когда пишешь там всё сильно специфичнее чем в юзерспейсе.

Dark_SavanT ★★★★★
()

Зачем этот раст нужен? Давно уже надо ноду в ядро включить по просьбам трудящихся.

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

Но ведь он совсем недавно был не против. Что случилось? Финское спортивное переобувание?

Думаю нет. Линус просто выдаст живительных люлей растаманам. Это им пойдет на пользу, они пофиксят свой язык. И после нескольких таких заходов Раст станет пригоден для написания модулей ядра. Ну это мое ИМХО.

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

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

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

Но ведь он совсем недавно был не против. Что случилось? Финское спортивное переобувание?

Случилось как обычно чтение публичных девелоперских рассылок белками-истеричками.

Линус сказал: «давайте поглядим на этот ваш Rust»

Истерички заполонили интернеты криками «Линус сказал что любит Rust!!!»

Потом Линус сказал «Я поглядел на ваш Rust, ему не хватает того-то и того-то, и вот тут вот ещё судя по всему проблема»

Истеричек мотнуло в другую сторону «Линус сказал что не любит Rust!!!»

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

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

например ошибки malloc - это тоже исключения, конечно но смысл процессу жить тогда

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

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

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

например ошибки malloc - это тоже исключения, конечно но смысл процессу жить тогда

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

Это всё осложняет идиотский дизайн линукса, в котором malloc может вернуть указатель даже когда памяти не хватает и реально процесс сдохнет при попытке обращения к какой-нибудь (не обязательно этой) памяти. Поэтому в конфигурации по умолчанию malloc возвращает ошибки только когда задан ulimit у процесса, насколько я знаю. Но всё же C это не только про Linux, ну и ulimit тоже таки можно задавать и это не какая-то совсем уж экзотика.

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

Зачем ты пытаешься испортить адекватом традиционный новостной растосрач?

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

Оно и не для ядра было бы не плохо. Внезапно падающие программы — это зло.

Это первое, с чем столкнулся разработчик curl, когда решил воспользоваться библиотекой hyperium на «системном» языке Rust. Выходит, что Rust - такой «системный» язык, что при попытках использования его действительно в системном контексте обнаруживаются фундаментальные проблемы.

For example it immediately became obvious that Rust in general encourages to abort on out-of-memory issues, while this is a big nono when the code is used in a system library (such as curl).

https://daniel.haxx.se/blog/2020/10/09/rust-in-curl-with-hyper/

Ну, если бы Rust был где-то там между прочим а также «системным», то можно было бы понять, что

The Rust standard library team is doing work on allocators, fallible allocations, etc., but that is very much a WIP. We hope that our usage and needs inform them in their design.

https://lkml.org/lkml/2021/4/14/1140

всё ещё находится в состоянии WIP. Но он же, якобы, в первую очередь «системный».

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

а как там переполнение стека отлавливается?

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

это как?

Защитная страница в конце стека и sigaltstack для обработчика сигнала. Обработчик сигнала переходит на точку восстановления.

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

целая страница? так у них тогда доступный размер стека уменьшается, для прикладного кода нормальное решение, но для ядра - так себе

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

целая страница?

Её любая ОС для каждого потока создаёт по умолчанию, в том числе и в ядре. 4096/8192 байт на поток в 64-битном адресном пространстве — это мелочи (защитная страница память не потребляет). Без защитной страницы переполнение стека не будет зарегистрировано и программа продолжит исполнение, портя память перед стеком незаметно для разработчика и пользователя.

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

что дополнительная страница создаётся, кроме той, что создаёт ОС

Нет, той, что создала ОС, достаточно.

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

ок тогда вопрос - почему тогда в С/С++ отловить переполнение стека нельзя?

Можно тем же способом, но это надо делать руками. В Windows доступно из коробки через SEH.

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

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

Ну, в общем-то, согласен. Я как понял, они и хотят делать кастомный аллокатор, который не panic!-ует при невыделении блока.

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

Аргументы весьма спорные.

Просто Линус думал скорее соскочит на Раст, и хотел почерпнуть примеров идеального кода. Не знает видно, что первый блин комом.

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

Наличие Box::try_new например подразумевает что должен быть Vec::try_push и так далее

https://github.com/rust-lang/rust/issues/48043

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

Есть Vec::try_reserve после успешного завершения которого можно будет просто сделать push и не бояться, но это 1) не та эргономики 2) попахивает тем как вещи делаются в С++ «вот талмуд документации, вы должны вызвать вот эти 7 функций в вот таком порядке иначе 2+2 не будет работать"

Но даже если написать 100500 X::try_Y, то будет не достаточно. По ходу нужны флаги для стандартной библиотеки вида no_panic, отрубающих весь непотреб. Т.е. все функции вызывающие panic, alloc_error_handler и т.п. из стандартной библиотеки (или liballoc), должны быть убраны этим флагом. Тогда компиляция с их неявным использованием не будет проходить, а обратная совместимость не пострадает (как минимум сильно не пострадает).

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

А вот то, что было предложено патчем к ядру явно надо переписывать. А значит к ближайшему релизу ядра ничего не будет. Как минимум выкидывать https://github.com/Rust-for-Linux/linux/blob/f97160690a2164b6121650794e28b4a4dcf0c311/rust/kernel/allocator.rs и всё что на нём завязано.

AlexVR ★★★★★
()
Ответ на: Удивительно от d_a

А разве компилятор rust вместе со сборочной системой ядра не должен был использоваться без stdlib? Как собственно и компилятор C. А также без cargo. Пусть господин Торвальдс мигнёт, если это не так!

Без stdlib, да. И панику свою нужно писать. И аллокаторы там всякие, если нужны. А вот cargo сносить смысла нету.

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

Так это, в ядро вроде не тащат Box, не тащат ни alloc, ни std.

Так в том и дело, что попытались пропихнуть:

В ядре по идее должен быть какой-то свой KBox<T, Allocator> c fn new() -> Result<KBox<T, Allocator>, AllocationError>. Особенно учитывая, что в ядре больше одного способа выделить память.

Почти тоже Торвальдс и сказал https://lkml.org/lkml/2021/4/14/1131

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

Вот сделать alloc совместимым - это да, это ещё возможно.

Вот тут и засада. Он тащит alloc_error_handler, которого не должно быть в ядре.

Ну и плюс ты сам говорил:

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

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

А вот cargo сносить смысла нету.

Это выкинут из дистрибутивов Linux. Точнее, вырежут всё растоговно, если оно будет требовать доступа в интернет для сборки.

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

а SIGSEGV и NULL dereference в обероне по такому же принципу отлавливаются?

Через обработчик сигнала, только нет необходимости в sigaltstack. В отличии от C/C++, в Обероне есть проверки диапазонов массивов и запрещена произвольная адресная арифметика так что SIGSEGV не приводит к фатальным последствиям и исполнение можно продолжить с точки восстановления (longjmp в обработчике сигнала).

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

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

Там же наверно предусмотрено подключение локального репозитория как у git, зачем его совсем то вырезать.

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

В отличии от C/C++, в Обероне есть проверки диапазонов массивов и запрещена произвольная адресная арифметика

Такое есть в си и си++ на эльбрусе. Ну как есть, без маллоков реаллоков и прочего.

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

Там же наверно предусмотрено подключение локального репозитория как у git, зачем его совсем то вырезать.

Безотносительно того можно ли на практике отзеркалить crates.io или нет - это тонны гемора для административного стаффа и килотонны новых уязвимостей, связанных с подменой источников пакетов и самих пакетов на вредоносные. См. https://www.opennet.ru/opennews/art.shtml?num=54566 и еще 9000+ новостей про npm. Теперь и в ядре!

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

Оно и не для ядра было бы не плохо. Внезапно падающие программы — это зло.

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

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

Хорошо. Ждем Царя, жарим попкорн.

Да он чёт с радаров пропал. Блог забросил. Канал в телегу удалил.

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

Это упрощает разработку и отладку.

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

Увлечение отловом всех ошибок в конечном итоге выходит за разумные рамки.

…для тех, кто не умеет их обрабатывать. Использование RAII вместо ручного освобождения ресурсов значительно упрощает обработку ошибок.

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

klibc - не, не слышали?

Значительную часть кода можно повторно использовать (memcpy/*printf и т.д.). В Haiku так делается и заголовки те же самые. Но куча разумеется другая.

X512 ★★★★★
()
Ответ на: комментарий от shkolnick-kun

Оказывается для Ядра нужна своя реализация стандартной библиотеки…

Потом ещё окажется что ядра Windows нужно по другому допилить. И для XNU под родной айфон тоже по другому. А потом ребятки с разноцветными причёсками внезапно решат что системное программирование им больше неинтересно.

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