Rust тілін қолдауы бар Linux ядросына арналған патчтардың сегізінші нұсқасы

Мигель Охеда, Rust-for-Linux жобасының авторы Linux ядросын жасаушылардың қарауы үшін Rust тілінде құрылғы драйверлерін әзірлеуге арналған v8 компоненттерін шығаруды ұсынды. Бұл нұсқа нөмірінсіз жарияланған бірінші нұсқаны ескере отырып, патчтардың түзетілген нұсқасы. Rust қолдауы эксперименталды болып саналады, бірақ Linux-келесі тармағына енгізілген, 5.20/6.0 күзгі шығарылымына біріктірілгенін мәлімдейді және ядроның ішкі жүйелері арқылы абстракциялық қабаттарды жасау, сондай-ақ драйверлерді жазу бойынша жұмысты бастау үшін жеткілікті жетілген. және модульдер. Әзірлеуді Google және ISRG (Интернет қауіпсіздігін зерттеу тобы) қаржыландырады, ол Let's Encrypt жобасының негізін қалаушы және HTTPS және интернет қауіпсіздігін жақсарту үшін технологияларды дамытуға ықпал етеді.

Жаңа нұсқада:

  • Қателер орын алған кезде «дүрбелең» күйін тудырмайтын құралдар жинағы және бөлу кітапханасының нұсқасы Rust 1.62 шығарылымы үшін жаңартылды. Бұрын пайдаланылған нұсқамен салыстырғанда, Rust құралдар жинағы ядро ​​патчтарында пайдаланылатын const_fn_trait_bound функциясына қолдауды тұрақтандырды.
  • Байланыстыру коды «байланыстырулар» жеке жәшік бумасына бөлінген, ол «ядроның» негізгі бумасына ғана өзгертулер енгізілсе, қайта құруды жеңілдетеді.
  • «concat_idents!» макросын енгізу concat_idents функционалдығымен байланысы жоқ және жергілікті айнымалыларға сілтемелерді пайдалануға мүмкіндік беретін процедуралық макрос түрінде қайта жазылған.
  • Тұрақты мәндердің орнына кез келген контексте «core::assert!()» қолдануға мүмкіндік беретін «static_asssert!» макросы қайта жазылды.
  • Макрос "build_error!" модульдер үшін «RUST_BUILD_ASSERT_{ЕСКЕРТУ, РҰҚСАТ БЕРУ}» режимі орнатылғанда жұмыс істеуге бейімделген.
  • «kernel/configs/rust.config» параметрлері бар бөлек файл қосылды.
  • Макрос алмастыруларда өңделген «*.i» файлдары «*.rsi» деп өзгертілді.
  • C коды үшін пайдаланылатындардан басқа оңтайландыру деңгейлері бар Rust құрамдастарын құруға қолдау көрсету тоқтатылды.
  • Файлдық жүйелермен жұмыс істеу үшін байланыстыруды қамтамасыз ететін fs модулі қосылды. Rust тілінде жазылған қарапайым файлдық жүйенің мысалы келтірілген.
  • Жүйелік кезектермен жұмыс істеуге арналған жұмыс кезегі модулі қосылды (work_struct және workqueue_struct ядро ​​құрылымдары арқылы байланыстыруды қамтамасыз етеді).
  • kasync модулінің дамуы асинхронды бағдарламалау әдістерін (асинхронды) енгізумен жалғасты. Rust тілінде жазылған негізгі деңгейдегі TCP серверінің мысалы қосылды.
  • [Threaded]Handler түрлерін және [Threaded]Registration` түрлерін пайдаланып Rust тіліндегі үзулерді өңдеу мүмкіндігі қосылды.
  • file_operations құрылымы сияқты функция көрсеткіштерінің кестелерімен жұмыс істеуді жеңілдету үшін "#[vtable]" процедуралық макросы қосылды.
  • «unsafe_list::List» қосбағытты байланыстырылған тізімдерді іске асыру қосылды.
  • Оқу құлпы ағымдағы ағынмен байланыстырылғанын тексеру үшін RCU (оқу-көшіру-жаңарту) және Guard түріне арналған бастапқы қолдау қосылды.
  • Ядро ағындарын жасау және автоматты түрде іске қосу үшін Task::spawn() функциясы қосылды. Сондай-ақ Task::wake_up() әдісі қосылды.
  • Кешіктірулерді пайдалануға мүмкіндік беретін кідірту модулі қосылды (msleep() үстінен қаптама).

Ұсынылған өзгерістер Rust тілін драйверлер мен ядро ​​модульдерін әзірлеу үшін екінші тіл ретінде пайдалануға мүмкіндік береді. Rust қолдауы әдепкі бойынша қосылмаған опция ретінде ұсынылады және Rust ядро ​​үшін қажетті құрастыру тәуелділігі ретінде қосылмады. Драйверді дамыту үшін Rust пайдалану сізге аз күш жұмсап, жадты босатудан кейін қол жеткізу, нөлдік көрсеткіш сілтемелері және буфердің асып кетуі сияқты проблемаларсыз қауіпсіз және жақсырақ драйверлерді жасауға мүмкіндік береді.

Жадтың қауіпсіздігі Rust бағдарламасында компиляция уақытында анықтамалық тексеру, объект иеленуі мен объектінің қызмет ету мерзімін (ауқымын) қадағалау, сондай-ақ кодты орындау кезінде жадқа қол жеткізудің дұрыстығын бағалау арқылы қамтамасыз етіледі. Rust сонымен қатар бүтін сандардың толып кетуінен қорғауды қамтамасыз етеді, пайдалану алдында айнымалы мәндерді міндетті түрде инициализациялауды талап етеді, стандартты кітапханада қателерді жақсы өңдейді, әдепкі бойынша өзгермейтін сілтемелер мен айнымалылар тұжырымдамасын қолданады, логикалық қателерді азайту үшін күшті статикалық теруді ұсынады.

Ақпарат көзі: opennet.ru

пікір қалдыру