Осмата верзија на закрпи за кернелот Линукс со поддршка за јазикот Rust

Мигел Оједа, автор на проектот Rust-for-Linux, предложи издавање на v8 компоненти за развој на двигатели на уреди во јазикот Rust за разгледување од развивачите на кернелот на Linux. Ова е ревидираната верзија на закрпи, земајќи ја предвид првата верзија, објавена без број на верзијата. Поддршката за 'рѓа се смета за експериментална, но веќе е вклучена во следната гранка на Linux, тврди дека е интегрирана во есенското издание на 5.20/6.0 и е доволно зрела да започне да работи на создавање слоеви за апстракција преку потсистеми на јадрото, како и пишување драјвери и модули. Развојот е финансиран од Google и ISRG (Internet Security Research Group), која е основач на проектот Let’s Encrypt и промовира HTTPS и развој на технологии за подобрување на безбедноста на Интернет.

Во новата верзија:

  • Комплетот со алатки и една варијанта на библиотеката за доделување, без можно генерирање на „панична“ состојба кога ќе се појават грешки, се ажурирани за издавањето на Rust 1.62. Во споредба со претходно користената верзија, комплетот со алатки Rust ја стабилизираше поддршката за функционалноста const_fn_trait_bound што се користи во закрпи на јадрото.
  • Обврзувачкиот код е поделен во посебен пакет за гајба „врзувања“, што ја поедноставува обновата ако се направат промени само на главниот пакет „кернел“.
  • Имплементација на макрото „concat_idents!“ препишано во форма на процедурално макро кое не е поврзано со функционалноста concat_idents и дозволува користење на референци за локални променливи.
  • Макрото „static_assert!“ е повторно напишано, дозволувајќи употреба на „core::assert!()“ во кој било контекст наместо константи.
  • Макро "build_error!" прилагоден да работи кога режимот „RUST_BUILD_ASSERT_{WARN, ALLOW}“ е поставен за модулите.
  • Додадена е посебна датотека со поставки „kernel/configs/rust.config“.
  • Датотеките „*.i“ обработени во макро замени се преименувани во „*.rsi“.
  • Поддршката за градење на Rust компоненти со нивоа на оптимизација различни од оние што се користат за C кодот е прекината.
  • Додаден е модул fs, кој обезбедува поврзувања за работа со датотечни системи. Даден е пример на едноставен датотечен систем напишан во Rust.
  • Додаден работник модул за работа со системски редици (обезбедува врзување преку структурите на јадрото work_struct и workqueue_struct).
  • Развојот на модулот kasync продолжи со имплементација на асинхрони методи на програмирање (async). Додаден е пример за TCP сервер на јадро на ниво напишан во Rust.
  • Додадена е способност за справување со прекини во јазикот Rust користејќи ги типовите [Threaded]Handler и [Threaded]Registration типовите.
  • Додадено е процедурално макро „#[vtable]“ за полесно да се работи со табели со покажувачи на функции, како што е структурата file_operations.
  • Додадена е имплементација на двонасочни поврзани списоци „unsafe_list::List“.
  • Додадена е почетна поддршка за RCU (Read-copy-update) и тип на чувар за да се провери дали бравата за читање е врзана за тековната нишка.
  • Додадена е функцијата Task::spawn() за креирање и автоматско стартување на нишки на јадрото. Додадено е и методот Task::wake_up().
  • Додаден е модул за одложување кој ви овозможува да користите одложувања (обвивка преку msleep()).

Предложените промени овозможуваат користење на Rust како втор јазик за развој на драјвери и модули на јадрото. Поддршката за Rust е претставена како опција што не е стандардно овозможена и не резултира со вклучување на Rust како потребна зависност од изградбата на кернелот. Користењето на Rust за развој на драјвери ќе ви овозможи да креирате побезбедни и подобри драјвери со минимален напор, без проблеми како што се пристап до меморијата по ослободувањето, дереференции на нула покажувач и пречекорувања на баферот.

Безбедното ракување со меморијата е обезбедено во Rust во времето на компајлирање преку проверка на референци, следење на сопственоста на објектот и животниот век на објектот (обем), како и преку проценка на исправноста на пристапот до меморијата за време на извршувањето на кодот. Rust исто така обезбедува заштита од прелевање на цели броеви, бара задолжителна иницијализација на вредностите на променливите пред употреба, подобро се справува со грешките во стандардната библиотека, стандардно го применува концептот на непроменливи референци и променливи, нуди силно статичко пишување за да се минимизираат логичките грешки.

Извор: opennet.ru

Додадете коментар