LINUX.ORG.RU

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

 ,


3

8

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

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

anonymous

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

Тут проблема не в panic() как в таковом, а в том, что нельзя обработать нехватку памяти. В том же C++ есть std::bad_alloc.

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

Разрывы жоп прикладников, которые не видят разницы между userspace и kernelspace

А её по хорошему нет. Просто последствия от говнокода в ядре намного серьёзнее.

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

когда человек не сталкивается с трудностями, он деградирует

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

Оберон-то может и переживёт, но что станет с состоянием программы будет зависеть как обычно от программистов.

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

Исключения и их обработку в Rust не завезли? В Оберон и C++ давно завезли. Или им религия не позволяет кидать исключения нехватки памяти?

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

А в расте теперь есть try_new.

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

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

А её по хорошему нет.

Хорошо. Будем делать в kernelspace сисколы в ядро, которого нет.

Просто последствия от говнокода

Иди в рассылку им напиши, какой ты умный, а мы тут посмеемся.

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

Будем делать в kernelspace сисколы в ядро, которого нет.

В Windows и Haiku можно вызывать системные вызовы через библиотеку как из программ, так и из ядра. А по номерам вызывать — это bad practice везде.

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

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

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

Для ядра можно ограничить апи try_* вариантами.

…и поломать почти всю стандартную библиотеку. Не вариант.

А в юзерспейсе OOM killer как решать будем?

Одно другому не мешает.

X512 ★★★★★
()

Линус Торвальдс изнасиловал анонимуса-растохейтера

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

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

Сисколы из ядра вызывать - вообще говнокод какой-то.

Имеется в виду экспортированные функции для системных вызовов. Для ядра они экспортированы самим ядром, а в пространстве пользователя они под теми же именами экспортированы в libc, libroot.so (Haiku), ntdll.dll (Windows).

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

А в этом кто-то, кроме этого самого кого-то виноват?
(Да, были случаи, когда я считал чей-то бан несправедливым, но эти люди как раз новые аккаунты не регали и под анонимусом, имхо, не писали. Они просто ушли.)

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

Особый вариант stdlib для ядра - это как раз то, что будут делать.

Не жалко им времени и сил… Почему так сложно сразу сделать нормально и универсально?

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

Новости от анона - это что-то новое.

Новости от анона – редкость, но то и дело публикуются.

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

Почему так сложно сразу сделать нормально и универсально?

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

Раст - системный язык общего назначения с (сюрприз) ограниченным количеством разработчиков и доступного им времени. Обрабатывать OOM в юзерспейсе нужно раз в квартал. Поэтому сразу не стали делать.

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

Кидать std::bad_alloc — это так сложно? Оберон — это очень простая система, которая полностью компилируется за секунды, и там всё работает.

Раст - системный язык общего назначения с (сюрприз) ограниченным количеством разработчиков и доступного им времени.

Поэтому надо делать ещё одну stdlib для ядра, вместо того чтобы починить new(). Логика.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 2)

Почитал.

on the whole I don’t hate it

Но анон вбросил так, словно он его с говном сравнял и хрусту в ядро закрыта дорога.

Просто указал на явные проблемы, которые стоит решить перед тем, как пихать это в продакшен.

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

Кидать std::bad_alloc — это так сложно?

Исключения и stack unwinding в ядре - это то ещё приключение. И как-то нужно гарантировать отсутствие выделений памяти в cleanup коде.

Поэтому надо делать ещё одну stdlib для ядра.

И не ещё одну stdlib, а конфигурируемую stdlib с возможностью отключения фич не поддерживаемых в kernel space, но удобных в user space.

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)

да, прям так и сказал:
кто пишет драйверы на Rust
тот настоящий...сжв

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

а разве panic() в сишных драйверах невозможен?

Если одна и та же хрень, то «зачем платить больше»?

Вроде и правильно, но вроде как это примеры, а не драйверы…

Это вроде как очень хреновые примеры если из них непонятно на кой чёрт этот раст в ядре сдался.

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

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

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

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

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

ЛОР, куда ты скатился? :(

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

LamerOk ★★★★★
()

Шапито. В core нет кода, который бы выделял память. Разве что кроме памяти, выделяемой на стеке при вызове функций. И панику можно спровоцировать разве что руками.

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

Сегодня пишет он на раст, а завтра Родину предаст!

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

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

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

Что не так, нормальная просьба. Только на ЛОРе когда Линус говорит «Вау, охрененно, я разрешил Раст в ядре, у меня много энтузиазма увидеть реальный драйвер на нем», то местные борцуны слышат «Хахаха, ваш Раст ничего не может дальше хелловорлда, ставлю 500 баксов что у вас ничего не выйдет»

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

просьба то нормальная, вот только у растеров, боюсь, осилить ее не получится

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

Тут проблема не в panic() как в таковом, а в том, что нельзя обработать нехватку памяти. В том же C++ есть std::bad_alloc.

Линус:

Because kernel code is different from random user-space system tools. Running out of memory simply MUST NOT cause an abort. It needs to just result in an error return.

hummer ★
()

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

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

abcq ★★
()

Ну там ребятки сами ССЗБ в какой-то степени.

1 - там no_std во все поля будет, ну или сабсет перепиленый.
2 - паника - там с одной стороны специфичный кейс, с другой - может таки пофиксят старую проблему, что ошибка выделения памяти - это паника. Так называемые failable allocations давно напрашиваются, но всем как обычно.

Короче Линус всё правильно им втыкает, может таки начнут шевелиться.

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

А можно настроить Rust, чтобы без try оно просто не работало? Типа если не вызвал Vec::try_reserve, то push не сработает.

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

Там нет исключений же. Суть претензий примерно такая: если какой-то чудила использовал panic!(), то ядро в неё и уйдёт. Вроде всё верно? А вот тут имеем кейс типа:

let a = Box::new::<Zalupa> ();

в ситуации отсутствия памяти, если ты дёрнул kmalloc, у тебя будет шанс обработать ситуацию, вызвать OOM или ещё какой херни натворить, растовый код сразу кинет панику.

И таких нюансов закопано довольно много.

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

Running out of memory simply MUST NOT cause an abort. It needs to just result in an error return.

std::bad_alloc этому не противоречит. Главное обработать все исключения перед возвратом в код ядра.

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

Исключения и stack unwinding в ядре - это то ещё приключение.

В ядре Windows работает без проблем (SEH). Можно сделать обработку исключений через setjmp/longjmp и регистрацию cleanup-обработчиков примерно как в Обероне.

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

Там есть возможность только перехватить померший от паники дочерний процесс.

Можно написать свой обработчик паники и в нём попытаться что-то сделать, но восстановиться из него ты ЕМНИП не можешь.

Насчёт примитивнее - не скажи, они местами друг-друга стоят(да, я сейчас пишу на обоих))

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

но восстановиться из него ты ЕМНИП не можешь.

Через longjmp можно, но не будут вызваны деструкторы стековых переменных.

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