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

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

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

  • Құралдар жинағы және қателер орын алған кездегі "дүрвілу" күйінің ықтимал генерациясынан босатылған бөлу кітапханасының нұсқасы ядро ​​патчтарында қолданылатын "мүмкін_uninit_extra" режимін қолдауды тұрақтандыратын Rust 1.60 шығарылымына жаңартылды.
  • Ядроны жүктеу кезінде орындалатын KUnit сынақтарына ядро ​​API байланыстырылған сынақтарды компиляция уақытына түрлендіру арқылы құжаттамадан сынақтарды іске қосу мүмкіндігі қосылды (құжаттамада мысалдар ретінде де пайдаланылатын сынақтар).
  • Тесттер Rust ядросының коды сияқты Clippy линтер ескертуіне әкелмеуі керек деген талаптар қабылданды.
  • Желілік функциялары бар «желі» модулін бастапқы енгізу ұсынылады. Rust кодының Namespace (құрылымдық желілік ядро ​​құрылымына негізделген), SkBuff (struct sk_buff), TcpListener, TcpStream (құрылым ұясы), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in6) және олардың IP мекенжайлары сияқты ядро ​​желісі құрылымдарына қатынасы бар. .
  • kasync модулі түрінде жүзеге асырылатын асинхронды бағдарламалау әдістеріне (асинхронды) бастапқы қолдау бар. Мысалы, TCP ұяшықтарын басқару үшін асинхронды кодты жазуға болады: async fn echo_server(ағын: TcpStream) -> Нәтиже { let mut buf = [0u8; 1024]; цикл { let n = stream.read(&mut buf).күту?; егер n == 0 { қайтарады Ok(()); } stream.write_all(&buf[..n]).күтемін?; } }
  • Желілік пакет сүзгілерін өңдеу үшін қосылған net::сүзгі модулі. Rust тілінде сүзгіні іске асыруы бар rust_netfilter.rs мысалы қосылды.
  • Қарапайым mutex smutex::Mutex іске асырылуы қосылды, ол бекітуді қажет етпейді.
  • Қосылған NoWaitLock, ол ешқашан құлыптауды күтпейді және басқа ағынмен жұмыс істесе, қоңырау шалушыны тоқтатудың орнына құлыпты алуға әрекеттену кезінде қате туралы хабарланады.
  • Бос тұру мүмкін емес бөлімдерге қолдану үшін ядродағы raw_spinlock_t арқылы анықталған RawSpinLock қосылды.
  • Сілтемелерді санау механизмі қолданылатын нысанға сілтемелер үшін қосылған ARef түрі (әрдайым қайта есептелетін).
  • GCC жобасындағы libgccjit кітапханасын rustc тіліндегі код генераторы ретінде GCC жүйесінде қол жетімді архитектуралар мен оңтайландыруларды қолдаумен rustc қамтамасыз ету үшін пайдалануға мүмкіндік беретін rustc компиляторын жүктеу мүмкіндігін іске асырды. Компиляторды жылжыту rustc компиляторының өзін құру үшін rustc тілінде GCC негізіндегі код генераторын пайдалану мүмкіндігін білдіреді. Бұған қоса, GCC 12.1 нұсқасының соңғы шығарылымы rustc_codegen_gcc дұрыс жұмыс істеуі үшін қажетті libgccjit түзетулерін қамтиды. Rustup утилитасын пайдаланып rustc_codegen_gcc орнату мүмкіндігін қамтамасыз ету үшін дайындық жүріп жатыр.
  • GCC негізіндегі Rust тілінің компиляторын енгізу арқылы GCC frontend gccrs әзірлеудегі прогресс атап өтілді. Қазіргі уақытта екі толық уақытты әзірлеуші ​​gccrs жұмыс істейді.

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

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

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

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