Ụdị patches nke isii maka Linux kernel na nkwado maka asụsụ Rust

Мигель Охеда (Miguel Ojeda), автор проекта Rust-for-Linux, предложил для рассмотрения разработчиками ядра Linux выпуск v6 компонентов для разработки драйверов устройств на языке Rust. Это седьмая редакция патчей с учётом первого варианта, опубликованного без номера версии. Поддержка Rust рассматривается как экспериментальная, но уже включена в ветку linux-next и достаточно развита для начала работы по созданию слоёв абстракции над подсистемами ядра, а также для написания драйверов и модулей. Разработка финансируется компанией Google и организацией ISRG (Internet Security Research Group), которая является учредителем проекта Let’s Encrypt и способствует продвижению HTTPS и развитию технологий для повышения защищённости интернета.

Na ụdị ọhụrụ:

  • Инструментарий и вариант библиотеки alloc, избавленный от возможных генераций состояния «panic» при возникновении ошибок, обновлены до выпуска Rust 1.60, в которой стабилизирована поддержка режима «maybe_uninit_extra», применяемого в патчах к ядру.
  • Добавлена возможность выполнения тестов из документации (тесты, одновременно используемые в качестве примеров в документации), через преобразование во время компиляции тестов, завязанных на API ядра, в тесты KUnit, выполняемые во время загрузки ядра.
  • Приняты требования, в соответствии с которыми тесты не должны приводить к выводу предупреждения линтера Clippy, как и код для ядра на языке Rust.
  • Предложена начальная реализация модуля «net» с сетевыми функциями. Для кода на языке Rust предоставлен доступ к таких сетевым структурам ядра, как «Namespace» (на основе структуры ядра «struct net»), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) и их эквивалентам для IPv6.
  • Реализована начальная поддержка методов асинхронного программирования (async), реализованная в форме модуля kasync. Например, можно создавать работающий в асинхронном режиме код для манипуляции с TCP-сокетами: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Добавлен модуль net::filter для манипуляции с фильтрами сетевых пакетов. Добавлен пример rust_netfilter.rs с реализацией фильтра на языке Rust.
  • Добавлена реализация простого мьютекса smutex::Mutex, не требующего привязки (pinning).
  • Добавлена блокировка NoWaitLock, которая никогда не приводит к ожиданию освобождения, а в случае занятия другим потоком приводит к выводу ошибки при попытке получения блокировки вместо остановки вызывающего.
  • Добавлена блокировка RawSpinLock отождествлённая с raw_spinlock_t в ядре, применяемая к секциям, которые не могут находиться в состоянии ожидания.
  • Добавлен тип ARef для ссылок на объект, к которому применяется механизм подсчёта ссылок (always-refcounted).
  • В бэкенде rustc_codegen_gcc, позволяющем использовать библиотеку libgccjit от проекта GCC в качестве генератора кода в rustc для обеспечения в rustc поддержки доступных в GCC архитектур и оптимизаций, реализована возможность раскрутки компилятора (bootstrapping) rustc. Под раскруткой компилятора понимается возможность использования в rustc генератора кода на основе GCC для сборки самого компилятора rustc. Кроме того, в недавний выпуск GCC 12.1 включены исправления в libgccjit, необходимые для корректной работы rustc_codegen_gcc. Ведётся подготовка к предоставлению возможности установки rustc_codegen_gcc при помощи утилиты rustup.
  • Отмечается прогресс разработки GCC-фронтэнда gccrs с реализацией компилятора языка Rust на базе GCC. В настоящее время над gccrs в режиме полного рабочего для работают два разработчика.

Cheta na mgbanwe ndị a tụrụ aro na-eme ka o kwe omume iji Rust dị ka asụsụ nke abụọ maka mmepe ọkwọ ụgbọala na modul kernel. A na-egosi nkwado nchara dị ka nhọrọ nke anaghị enyere ya aka na ndabara na anaghị eme ka nchara nchara dị ka ihe ndabere achọrọ maka kernel. Iji nchara maka mmepe ọkwọ ụgbọ ala ga-enye gị ohere ịmepụta ndị ọkwọ ụgbọ ala dị nchebe ma dị mma na obere mbọ, na-enwere onwe ya pụọ ​​​​na nsogbu dị ka ịnweta ebe nchekwa mgbe ahapụchara ya, enweghị ntụpọ pointer, na ihe nchekwa nchekwa.

A na-enye nchekwa nchekwa na nchara n'oge a na-achịkọta site na ntụle ntụaka, na-edobe ihe nwe ihe na oge ndụ ihe (oke), yana site na nyocha nke izi ezi nke ịnweta ebe nchekwa n'oge mmebe koodu. Nchara na-enyekwa nchebe pụọ na integer njupụta, na-achọ mmalite mmalite nke ụkpụrụ agbanwe agbanwe tupu eji ya, na-edozi njehie nke ọma n'ọbá akwụkwọ ọkọlọtọ, na-etinye echiche nke ntụgharị na mgbanwe na-adịghị agbanwe agbanwe na ndabara, na-enye akara static siri ike iji belata njehie ezi uche dị na ya.

isi: opennet.ru

Tinye a comment