LINUX.ORG.RU

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

 , ,


4

9

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

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

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

>>> Статья



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

Кстати Линус отзывается о расте очень положительно:

What do you think of the projects currently underway to develop OS kernels in languages like Rust (touted for having built-in safeties that C does not)?

That's not a new phenomenon at all. We've had the system people who used Modula-2 or Ada, and I have to say Rust looks a lot better than either of those two disasters.

I'm not convinced about Rust for an OS kernel (there's a lot more to system programming than the kernel, though), but at the same time there is no question that C has a lot of limitations.

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

Неплохое начинание. Ждём в продакшене.

Не дай Боже...

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

I'm not convinced about Rust for an OS kernel (there's a lot more to system programming than the kernel, though), but at the same time there is no question that C has a lot of limitations.

Ну так себе положительно-то :)

kirk_johnson ★☆
()

Вся суть этого «эксперимента»

Because it allows me to code completely stupid and useless things without anybody being on my back to tell me I shouldn’t. And what I am about to talk is precisely one of these codes…

Odalist ★★★★★
()

Я ТВОЙ ЛИНАКС НА РАСТЕ ПИСАЛ

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

если сравнивать с «total and utter crap», то очень даже положительно

Ммм... Он сказал, что не убежден, что раст подходит для ядра. И что в C есть недостатки.

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

А что еще он мог сказать? давайте перепишем ядро на раст? :)

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

Проблема кодинга на С не в том, что язык даёт возможность стрелять себе в ногу

Ассемблерные вставки в коде на RUST, позволят виртуозно прострелить обе ноги за раз)))

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

*просится Ну, в общем, имеет свои преимущества. Ядро бы получилось маленькое (влезло бы хоть и в кеш процессора), быстрое, красивое.

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

Ага, ща три с половиной просмотра добавится.

anonymous
()

Что только народ не придумает

Что только народ не придумает, что бы не использовать стандартизированные языки типа Ada(практически все для надежной разработки), ну на худой конец COBOL :)

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

маленькое (влезло бы хоть и в кеш процессора), быстрое, красивое.

маленькое и красивое - возможно, но не быстрое.

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

Экзоядро, например, должно бы быть быстрее микроядер, а может и монолитного.

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

и да, на Pascal линукс чувствовал бы себя гораздо лучше!

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

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

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

Отлучат Страуструпа, сразу раст станет каноничным. ))

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

Ну почему, я видел когда-то. Но очень не долго. Было довольно занятно оптимизировать код так, чтобы по максимуму набить VLIW.

ЗЫ ну и в компиляторе главное - точно не кодировка вывода сообщений.

prox
()

Rust слишком сложный для освоения язык. Программы на нем читаются тяжело, но это только добавляет ограничения вместо добавления свободы. В этом смысле Go гораздо легче читается.

Вопрос. Можно ли в Rust сделать такое?

#include <stdio.h>
#include <stdlib.h>

char* code="\x8B\x7\x8B\x16\x89\x17\x89\x6\xC3\xF\x1F\x80\x0\x0\x0\x0";
typedef void (*f)(int*,int*);
int main(int argc, char** argv) {
	f swap = (f) code;
	int a = 10, b = 20;
	printf("a = %d, b = %d\n",a,b);
	swap(&a,&b);
	printf("a = %d, b = %d\n",a,b);
	return (EXIT_SUCCESS);
}
lefsha
()
Ответ на: комментарий от Quasar

Дело в тотальной нестабильности Rust.

Стабильня ветка компилятора полностью обратно-совместима с релизом 1.0. Где нестабильность?

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

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

Это бред какой-то. Вот RedoxOS с полноценной графикой на 468 MB оперативки: http://img.ctrlv.in/img/17/06/05/5935724557f9e.png

Использование памяти у Rust не выше, а часто и ниже (zero-cost abstractions), чем у C.

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

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

Не надо сказки рассказывать. Если язык позволяет стрелять по ногам, на нем БУДУТ писать кривой и дырявый код, это не гипотеза, это факт.

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

Да хотя бы OpenSSL почему до сих пор такой дырявый?

А libressl не дырявый, но тоже написан на Си и асме. Что скажем на это?

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

Forth просто стековый, в современные конкатенативные языки завезли и статическую типизацию и кучу интересных штук.

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

А технические аргументы?...

Неужели сам не понимаешь?

an OS starting from scratch has almost zero chance to end up being finished, not to mention being actually used on real machines.

Так что это так, для игры, и для ЧСВ...

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

Я и не говорю что переписывать нужно)
Можно, но не нужно, ядро задизайнено без учета современных требований, нужно пробовать что-то новое, нет прогресса без движения.

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

Вот смотри, все легко читается

static CODE: [u8; 16] = [
    0x8B, 0x7, 0x8B, 0x16, 0x89, 0x17, 0x89, 0x6,
    0xC3, 0xF, 0x1F, 0x80, 0x0, 0x0, 0x0, 0x0
];
type F = fn(&mut u32, &mut u32);
fn main() {
    let swap: F = unsafe { ::std::mem::transmute(&CODE) };
    let mut a = 10;
    let mut b = 20;
    println!("a = {}, b = {}", a, b);
    swap(&mut a, &mut b);
    println!("a = {}, b = {}", a, b);
}

Даже на сайте работает: https://is.gd/2agd0F

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

Да, но зачем, если есть макрос asm?

type SwapFn = fn(_: *mut i32, _: *mut i32);

fn main() {
    let code = b"\x8B\x07\x8B\x16\x89\x17\x89\x06\xC3\x0F\x1F\x80\x00\x00\x00\x00";
    let swap: SwapFn = unsafe { std::mem::transmute(code.as_ptr()) };
    let mut a = 10i32;
    let mut b = 20i32;
    println!("a = {}, b = {}", a, b);
    swap(&mut a, &mut b);
    println!("a = {}, b = {}", a, b);
}

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

Не надо врать)
Это справедливо только для защищенного режима исполненим и там процессор в рантайме ругается что делать что-то небезопасно и ОС рушит процесс.

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

12309 — архитектурная проблема, а не банальный косяк при работе с памятью, иначе давно бы пофиксили.

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

Чувак, ты меня не понял, я не си-фанатик, который считает, что этот язык можно использовать где угодно. Я считаю, что его вполне можно и даже нужно будет заменить чем-нибудь более современным и высокоуровневым. Но все-таки степень дырявости зависит и от программиста.

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

Прекрасное подтверждение, что можно совершенно по разному написать такую простую вещь и в итоге совсем непонятно что все это такое.

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

Чтобы переопределить кусок памяти из строки в функцию Мы в одном случае берем указатель - выше, хотя казалось бы имя строки само по себе указатель. А во втором случае используем целую функцию для этого... Зачем?

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

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

Зачем все это?

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

Вот именно в этом проблема Rust!

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

ответил следующему оратору с подобным кодом. Там и про Ваш код. Я откровенно не понял про ссылки в объявлении фукции. Сравните с кодом ниже. За то у Вас взятие адреса от CODE короче. В С вообще ничего брать не нужно - естественным образом имя строки и есть адрес этой строки. Очень логично и компактно.

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

Разве это не форк, который синхронизируется с webkit?

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

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

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

Опять неосиляторы. У тебя моск, а точнее, то, что от него осталось после императивщины, превратился в переменную значения NULL.

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