ສະບັບທີສາມຂອງ patches ສໍາລັບ Linux kernel ສະຫນັບສະຫນູນພາສາ Rust

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

ຈື່ໄວ້ວ່າການປ່ຽນແປງທີ່ສະເຫນີເຮັດໃຫ້ມັນສາມາດນໍາໃຊ້ Rust ເປັນພາສາທີສອງສໍາລັບການພັດທະນາໄດເວີແລະໂມດູນ kernel. ການສະຫນັບສະຫນູນ Rust ໄດ້ຖືກນໍາສະເຫນີເປັນທາງເລືອກທີ່ບໍ່ໄດ້ເປີດໃຊ້ໂດຍຄ່າເລີ່ມຕົ້ນແລະບໍ່ໄດ້ສົ່ງຜົນໃຫ້ Rust ຖືກລວມເຂົ້າໃນການກໍ່ສ້າງທີ່ຕ້ອງການສໍາລັບ kernel. ການນໍາໃຊ້ Rust ສໍາລັບການພັດທະນາຄົນຂັບຈະຊ່ວຍໃຫ້ທ່ານສ້າງໄດເວີທີ່ປອດໄພແລະດີກວ່າດ້ວຍຄວາມພະຍາຍາມຫນ້ອຍທີ່ສຸດ, ໂດຍບໍ່ມີບັນຫາເຊັ່ນ: ການເຂົ້າເຖິງຫນ່ວຍຄວາມຈໍາຫຼັງຈາກການປ່ອຍຕົວ, ການປະຕິເສດຕົວຊີ້ null, ແລະ buffer overruns.

Rust ບັງຄັບໃຊ້ຄວາມປອດໄພຂອງຫນ່ວຍຄວາມຈໍາໃນເວລາລວບລວມໂດຍຜ່ານການກວດສອບການອ້າງອິງ, ການເປັນເຈົ້າຂອງວັດຖຸແລະການຕິດຕາມຕະຫຼອດຊີວິດຂອງວັດຖຸ (ຂອບເຂດ), ແລະໂດຍການປະເມີນຄວາມຖືກຕ້ອງຂອງການເຂົ້າເຖິງຫນ່ວຍຄວາມຈໍາໃນເວລາແລ່ນ. Rust ຍັງສະຫນອງການປ້ອງກັນການ overflows integer, ຮຽກຮ້ອງໃຫ້ຄ່າຕົວແປໄດ້ຖືກເລີ່ມຕົ້ນກ່ອນທີ່ຈະນໍາໃຊ້, ມີການຈັດການຄວາມຜິດພາດທີ່ດີກວ່າໃນຫ້ອງສະຫມຸດມາດຕະຖານ, ໃຊ້ແນວຄວາມຄິດຂອງການອ້າງອີງທີ່ບໍ່ປ່ຽນແປງແລະຕົວແປໂດຍຄ່າເລີ່ມຕົ້ນ, ແລະສະຫນອງການພິມຄົງທີ່ທີ່ເຂັ້ມແຂງເພື່ອຫຼຸດຜ່ອນຄວາມຜິດພາດຢ່າງມີເຫດຜົນ.

В новом варианте патчей продолжено устранение замечаний, высказанных в процессе обсуждения первой и второй версий патчей. Наиболее заметные изменения:

  • Осуществлён переход на использование в качестве эталонного компилятора стабильного выпуска Rust 1.57 и обеспечена привязка к стабилизированной редакции языка Rust 2021. Ранее патчи были завязаны на бета-ветку Rust и использовали некоторые возможности языка, входящие в категорию нестабильных. Переход на спецификацию Rust 2021 позволил инициировать работу по уходу от использования в патчах таких нестабильных возможностей, как const_fn_transmute, const_panic, const_unreachable_unchecked и core_panic и try_reserve.
  • Продолжено развитие входящего в состав патчей варианта Rust-библиотеки alloc, изменённой для избавления функций распределения памяти от возможных генераций состояния «panic» при возникновении ошибок, таких как нехватка памяти. В новой версии реализованы опции «no_rc» и «no_sync» для отключения функциональности, не используемой в Rust-коде для ядра, делающие библиотеку более модульной. Продолжается работа с основными разработчиками alloc, нацеленная на перенос необходимых для ядра изменения в основной состав библиотеки. В базовую библиотеку Rust (core) перенесена опция «no_fp_fmt_parse», необходимая для работы библиотеки на уровне ядра.
  • Проведена чистка кода для избавления от возможных предупреждений компилятора при сборке ядра в режиме CONFIG_WERROR. При сборке кода на языке Rust включены дополнительные диагностические режимы компилятора и предупреждения линтера Clippy.
  • Предложены абстракции для использования в коде на языке Rust блокировок seqlock (sequence locks), callback-вызовов для управления питанием, I/O Memory (readX/writeX), обработчиков прерываний и потоков, GPIO, доступа к устройствам, драйверам и учётным данным.
  • Расширены средства для разработки драйверов с задействованием перемещаемых мьютексов, битовых итераторов, упрощённых обвязок над указателями, улучшенной диагностики сбоев и инфраструктуры, не зависимой от шины данных.
  • Улучшена работа со ссылками при помощи упрощённого типа Ref, базирующегося на бэкенде refcount_t, использующем одноимённый API ядра для подсчёта ссылок. Поддержка типов Arc и Rc, предоставляемых в штатной библиотеке alloc, удалена и не доступна в коде, выполняемом на уровне ядра (для самой библиотеки подготовлены опции, отключающие данные типы).
  • В состав патчей добавлен вариант драйвера PL061 GPIO, переписанный на Rust. Особенностью драйвера является то, что его реализация практически построчно повторяет имеющийся драйвер GPIO на языке Си. Для разработчиков, желающих познакомиться с созданием драйверов на Rust, подготовлено построчное сравнение, позволяющее понять в какие конструкции на Rust преобразован код на Си.
  • В основную кодовую базу Rust принят rustc_codegen_gcc, бэкенд rustc для GCC, реализующий возможность упреждающей (AOT) компиляции с использованием библиотеки libgccjit. При должном развитии бэкенда он позволит собирать задействованный в ядре Rust-код при помощи GCC.
  • Помимо компаний ARM, Google и Microsoft, интерес к использованию языка Rust в ядре Linux выразила компания Red Hat. Напомним, что Google напрямую обеспечивает поддержку проекта Rust for Linux, развивает новую реализацию механизма межпроцессного взаимодействия Binder на Rust и рассматривает возможность переработки на Rust различных драйверов. Компания Microsoft приступила к реализации драйверов для Hyper-V на Rust. Компания ARM работает над улучшением поддержи Rust для систем на базе процессоров ARM. Компания IBM реализовала поддержку Rust в ядре для систем PowerPC.

ແຫຼ່ງຂໍ້ມູນ: opennet.ru

ເພີ່ມຄວາມຄິດເຫັນ