From 545fed4bdf2930b4574f692e5cf5140158339667 Mon Sep 17 00:00:00 2001
From: Andriy Redko <drreta@gmail.com>
Date: Mon, 20 May 2024 15:40:52 -0400
Subject: [PATCH] uk: Bare-Metal Rust (afternoon) (#2088)

uk: Bare-Metal Rust (afternoon)

Signed-off-by: Andriy Redko <drreta@gmail.com>
---
 po/uk.po | 883 ++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 646 insertions(+), 237 deletions(-)

diff --git a/po/uk.po b/po/uk.po
index b04c422e..c79aacc9 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -971,7 +971,7 @@ msgstr "Драйвер"
 
 #: src/SUMMARY.md
 msgid "Using It"
-msgstr "Його використання"
+msgstr "Використання"
 
 #: src/SUMMARY.md src/bare-metal/aps/exceptions.md
 msgid "Exceptions"
@@ -16986,7 +16986,7 @@ msgstr "Написання мікропрограм для мікроконтр
 
 #: src/bare-metal.md
 msgid "Writing bootloader / kernel code for application processors."
-msgstr "Написання коду завантажувача/ядра для процесорів програм."
+msgstr "Написання коду завантажувача/ядра для прикладних процесорів."
 
 #: src/bare-metal.md
 msgid "Some useful crates for bare-metal Rust development."
@@ -17942,7 +17942,7 @@ msgstr ""
 
 #: src/bare-metal/aps.md
 msgid "Application processors"
-msgstr "Процесори додатків"
+msgstr "Прикладні процесори"
 
 #: src/bare-metal/aps.md
 msgid ""
@@ -17963,8 +17963,8 @@ msgid ""
 "processors do."
 msgstr ""
 "Загалом кажучи, мікроконтролери не мають MMU або кількох рівнів привілеїв "
-"(рівні винятків на центральних процесорах Arm, кільця на x86), тоді як "
-"процесори додатків мають."
+"(рівні виключень на центральних процесорах Arm, кільця на x86), тоді як "
+"процесори прикладних програм мають."
 
 #: src/bare-metal/aps.md
 msgid ""
@@ -17973,7 +17973,7 @@ msgid ""
 "hardware, but is designed purely for virtual machines."
 msgstr ""
 "QEMU підтримує емуляцію різних машин або моделей плат для кожної "
-"архітектури. Плата virt не відповідає жодному конкретному реальному "
+"архітектури. Плата 'virt' не відповідає жодному конкретному реальному "
 "апаратному забезпеченню, а розроблена виключно для віртуальних машин."
 
 #: src/bare-metal/aps/entry-point.md
@@ -18058,6 +18058,79 @@ msgid ""
 "    b 2b\n"
 "```"
 msgstr ""
+"```armasm\n"
+".section .init.entry, \"ax\"\n"
+".global entry\n"
+"entry:\n"
+"    /*\n"
+"     * Завантаження та застосування конфігурації керування пам'яттю, "
+"готової\n"
+"     * до ввімкнення MMU та кешів.\n"
+"     */\n"
+"    adrp x30, idmap\n"
+"    msr ttbr0_el1, x30\n"
+"\n"
+"    mov_i x30, .Lmairval\n"
+"    msr mair_el1, x30\n"
+"\n"
+"    mov_i x30, .Ltcrval\n"
+"    /* Скопіювати підтримуваний діапазон PA у TCR_EL1.IPS. */\n"
+"    mrs x29, id_aa64mmfr0_el1\n"
+"    bfi x30, x29, #32, #4\n"
+"\n"
+"    msr tcr_el1, x30\n"
+"\n"
+"    mov_i x30, .Lsctlrval\n"
+"\n"
+"    /*\n"
+"     * Перевірити все до завершення цього пункту, а потім зробити недійсними "
+"всі\n"
+"     * потенційно застарілі локальні записи TLB до того, як вони почнуть "
+"використовуватися.\n"
+"     */\n"
+"    isb\n"
+"    tlbi vmalle1\n"
+"    ic iallu\n"
+"    dsb nsh\n"
+"    isb\n"
+"\n"
+"    /*\n"
+"     * Налаштувати sctlr_el1 на ввімкнення MMU та кешу і не продовжувати,  "
+"доки це\n"
+"     * не буде зроблено.\n"
+"     */\n"
+"    msr sctlr_el1, x30\n"
+"    isb\n"
+"\n"
+"    /* Вимкнути перехоплення доступу з плаваючою комою в EL1. */\n"
+"    mrs x30, cpacr_el1\n"
+"    orr x30, x30, #(0x3 << 20)\n"
+"    msr cpacr_el1, x30\n"
+"    isb\n"
+"\n"
+"    /* Обнуліть секцію bss. */\n"
+"    adr_l x29, bss_begin\n"
+"    adr_l x30, bss_end\n"
+"0:  cmp x29, x30\n"
+"    b.hs 1f\n"
+"    stp xzr, xzr, [x29], #16\n"
+"    b 0b\n"
+"\n"
+"1:  /* Підготувати стек. */\n"
+"    adr_l x30, boot_stack_end\n"
+"    mov sp, x30\n"
+"\n"
+"    /* Налаштування вектора виключень. */\n"
+"    adr x30, vector_table_el1\n"
+"    msr vbar_el1, x30\n"
+"\n"
+"    /* Виклик коду Rust. */\n"
+"    bl main\n"
+"\n"
+"    /* Постійно циклічно чекаємо на переривання. */\n"
+"2:  wfi\n"
+"    b 2b\n"
+"```"
 
 #: src/bare-metal/aps/entry-point.md
 msgid ""
@@ -18077,7 +18150,7 @@ msgid ""
 msgstr ""
 "BSS (символ початку блоку, з історичних причин) — це частина об’єктного "
 "файлу, яка містить статично виділені змінні, які ініціалізуються нулем. Вони "
-"пропущені на зображенні, щоб не витрачати місце на нулі. Компілятор "
+"пропущені на зображенні, щоб не витрачати місце на зайві нулі. Компілятор "
 "припускає, що завантажувач подбає про їх обнулення."
 
 #: src/bare-metal/aps/entry-point.md
@@ -18103,10 +18176,10 @@ msgid ""
 "generating unaligned accesses, so it should be fine in this case, but this "
 "is not necessarily the case in general."
 msgstr ""
-"Невирівняні доступи призведуть до помилок. Ми створюємо код Rust для цілі "
+"Невирівняні доступи призведуть до помилки. Ми створюємо код Rust для цілі "
 "`aarch64-unknown-none`, яка встановлює `+strict-align`, щоб запобігти "
 "створенню компілятором невирівняних доступів, тому в цьому випадку це має "
-"бути добре, але це не обов’язково так загалом."
+"бути гаразд, але це не обов’язково так загалом."
 
 #: src/bare-metal/aps/entry-point.md
 msgid ""
@@ -18118,13 +18191,14 @@ msgid ""
 "is cleaned or the VM enables the cache. (Cache is keyed by physical address, "
 "not VA or IPA.)"
 msgstr ""
-"Якщо він працював у віртуальній машині, це може призвести до проблем "
-"узгодженості кешу. Проблема полягає в тому, що віртуальна машина звертається "
-"до пам’яті безпосередньо з вимкненим кеш-пам’яттю, тоді як хост має кешовані "
-"псевдоніми для тієї самої пам’яті. Навіть якщо хост не має явного доступу до "
+"Якщо це було запущено у віртуальній машині, це може призвести до проблеми з "
+"узгодженістю кешу. Проблема полягає в тому, що віртуальна машина звертається "
+"до пам'яті безпосередньо з вимкненим кешем, в той час як хост має кешовані "
+"псевдоніми до тієї ж пам'яті. Навіть якщо хост не має явного доступу до "
 "пам’яті, спекулятивні доступи можуть призвести до заповнення кешу, а потім "
 "зміни з того чи іншого будуть втрачені, коли кеш буде очищено або віртуальна "
-"машина ввімкне кеш. (Кеш використовується фізичною адресою, а не VA чи IPA.)"
+"машина ввімкне кеш. (Кеш використовується за фізичною адресою, а не VA чи "
+"IPA.)"
 
 #: src/bare-metal/aps/entry-point.md
 msgid ""
@@ -18134,16 +18208,16 @@ msgid ""
 "memory layout that QEMU uses."
 msgstr ""
 "Для спрощення ми просто використовуємо жорстко закодовану таблицю сторінок "
-"(див. `idmap.S`), яка ідентифікує перший 1 ГіБ адресного простору для "
+"(дивиться `idmap.S`), яка ідентифікує перший 1 ГіБ адресного простору для "
 "пристроїв, наступний 1 ГіБ для DRAM і ще 1 ГіБ вище для інших пристроїв. Це "
-"відповідає макету пам’яті, який використовує QEMU."
+"відповідає розміщенню пам'яті, яке використовує QEMU."
 
 #: src/bare-metal/aps/entry-point.md
 msgid ""
 "We also set up the exception vector (`vbar_el1`), which we'll see more about "
 "later."
 msgstr ""
-"Ми також встановили вектор винятків (`vbar_el1`), про який ми розповімо "
+"Ми також встановили вектор виключень (`vbar_el1`), про який ми розповімо "
 "більше пізніше."
 
 #: src/bare-metal/aps/entry-point.md
@@ -18152,72 +18226,74 @@ msgid ""
 "(EL1). If you need to run at a different exception level you'll need to "
 "modify `entry.S` accordingly."
 msgstr ""
-"Усі приклади цього дня припускають, що ми будемо працювати на рівні винятку "
-"1 (EL1). Якщо вам потрібно запустити на іншому рівні винятку, вам потрібно "
-"буде відповідно змінити `entry.S`."
+"Усі приклади цього дня припускають, що ми будемо працювати на рівні "
+"виключення 1 (EL1). Якщо вам потрібно запустити на іншому рівні виключення, "
+"вам потрібно буде відповідно змінити `entry.S`."
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "Inline assembly"
-msgstr "Внутрішнє складання"
+msgstr "Вбудований асемблер"
 
 #: src/bare-metal/aps/inline-assembly.md
-#, fuzzy
 msgid ""
 "Sometimes we need to use assembly to do things that aren't possible with "
 "Rust code. For example, to make an HVC (hypervisor call) to tell the "
 "firmware to power off the system:"
 msgstr ""
-"Іноді нам потрібно використовувати збірку, щоб робити те, що неможливо з "
-"кодом Rust. Наприклад, зробити"
+"Іноді нам потрібно використовувати асемблер для того, щоб робити речі, які "
+"неможливо зробити за допомогою коду на Rust. Наприклад, зробити HVC (виклик "
+"гіпервізора), щоб сказати прошивці вимкнути систему:"
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid ""
 "// Safe because this only uses the declared registers and doesn't do\n"
 "    // anything with memory.\n"
 msgstr ""
+"// Безпечно, тому що тут використовуються тільки оголошені регістри\n"
+"    // і нічого не робиться з пам'яттю.\n"
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"hvc #0\""
-msgstr ""
+msgstr "\"hvc #0\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w0\""
-msgstr ""
+msgstr "\"w0\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w1\""
-msgstr ""
+msgstr "\"w1\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w2\""
-msgstr ""
+msgstr "\"w2\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w3\""
-msgstr ""
+msgstr "\"w3\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w4\""
-msgstr ""
+msgstr "\"w4\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w5\""
-msgstr ""
+msgstr "\"w5\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w6\""
-msgstr ""
+msgstr "\"w6\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid "\"w7\""
-msgstr ""
+msgstr "\"w7\""
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid ""
 "(If you actually want to do this, use the [`smccc`](https://crates.io/crates/"
 "smccc) crate which has wrappers for all these functions.)"
 msgstr ""
-"(Якщо ви справді хочете це зробити, скористайтеся ящиком [`smccc`](https://"
+"(Якщо ви справді хочете це зробити, скористайтеся крейтом [`smccc`](https://"
 "crates.io/crates/smccc), у якому є оболонки для всіх цих функцій.)"
 
 #: src/bare-metal/aps/inline-assembly.md
@@ -18227,8 +18303,8 @@ msgid ""
 "implemented by EL3 firmware and hypervisors on many systems."
 msgstr ""
 "PSCI — це Arm Power State Coordination Interface, стандартний набір функцій "
-"для керування станами живлення системи та ЦП, серед іншого. Він реалізований "
-"прошивкою EL3 і гіпервізорами на багатьох системах."
+"для керування станами живлення системи та CPU, серед іншого. Він "
+"реалізований прошивкою EL3 і гіпервізорами на багатьох системах."
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid ""
@@ -18238,9 +18314,9 @@ msgid ""
 "contents of the registers."
 msgstr ""
 "Синтаксис `0 => _` означає ініціалізацію реєстру до 0 перед виконанням "
-"вбудованого коду складання та ігнорування його вмісту після цього. Нам "
-"потрібно використовувати `inout`, а не `in`, оскільки виклик потенційно може "
-"знищити вміст реєстрів."
+"вбудованого асемблеру та ігнорування його вмісту після цього. Нам потрібно "
+"використовувати `inout`, а не `in`, оскільки виклик потенційно може знищити "
+"вміст реєстрів."
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid ""
@@ -18263,9 +18339,9 @@ msgstr ""
 "використовуються завантажувачем для передачі таких речей, як покажчик на "
 "дерево пристроїв. Відповідно до стандартної угоди про виклики aarch64 (це "
 "те, що вказує `extern \"C\"`), регістри `x0`–`x7` використовуються для "
-"перших 8 аргументів, що передаються до функції, тому `entry.S` не не "
-"потрібно робити нічого особливого, крім того, щоб переконатися, що він не "
-"змінює ці регістри."
+"перших 8 аргументів, що передаються до функції, тому `entry.S` не потрібно "
+"робити нічого особливого, окрім як переконатися, що він не змінює ці "
+"регістри."
 
 #: src/bare-metal/aps/inline-assembly.md
 msgid ""
@@ -18277,7 +18353,7 @@ msgstr ""
 
 #: src/bare-metal/aps/mmio.md
 msgid "Volatile memory access for MMIO"
-msgstr "Доступ до енергозалежної пам'яті для MMIO"
+msgstr "Здійснення непостійного доступу до пам'яті для MMIO"
 
 #: src/bare-metal/aps/mmio.md
 msgid "Use `pointer::read_volatile` and `pointer::write_volatile`."
@@ -18320,7 +18396,7 @@ msgid ""
 "this is unsound. Whenever a reference exist, the compiler may choose to "
 "dereference it."
 msgstr ""
-"Деякі існуючі ящики для непостійного доступу до апаратного забезпечення "
+"Деякі існуючі крейти для непостійного доступу до апаратного забезпечення "
 "містять посилання, але це нерозумно. Кожного разу, коли існує посилання, "
 "компілятор може вирішити розіменувати його."
 
@@ -18346,7 +18422,7 @@ msgstr ""
 
 #: src/bare-metal/aps/uart.md
 msgid "/// Minimal driver for a PL011 UART.\n"
-msgstr ""
+msgstr "/// Мінімальний драйвер для PL011 UART.\n"
 
 #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md
 msgid ""
@@ -18361,32 +18437,43 @@ msgid ""
 "process\n"
 "    /// as device memory and not have any other aliases.\n"
 msgstr ""
+"/// Створює новий екземпляр драйвера UART для пристрою PL011\n"
+"    /// за заданою базовою адресою.\n"
+"    ///\n"
+"    /// # Безпека\n"
+"    ///\n"
+"    /// Задана базова адреса повинна вказувати на 8 керуючих регістрів MMIO "
+"пристрою \n"
+"    /// PL011, які повинні бути відображені в адресному просторі процесу\n"
+"    /// як пам'ять пристрою і не мати ніяких інших псевдонімів.\n"
 
 #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md
 #: src/exercises/bare-metal/rtc.md
 msgid "/// Writes a single byte to the UART.\n"
-msgstr ""
+msgstr "/// Записує один байт до UART.\n"
 
 #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md
 #: src/exercises/bare-metal/rtc.md
 msgid "// Wait until there is room in the TX buffer.\n"
-msgstr ""
+msgstr "// Чекаємо, поки не звільниться місце в буфері TX.\n"
 
 #: src/bare-metal/aps/uart.md
 msgid ""
 "// Safe because we know that the base address points to the control\n"
 "        // registers of a PL011 device which is appropriately mapped.\n"
 msgstr ""
+"// Безпечно, тому що ми знаємо, що базова адреса вказує на регістри\n"
+"        // керування пристрою PL011, які відповідним чином відображені.\n"
 
 #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md
 #: src/exercises/bare-metal/rtc.md
 msgid "// Write to the TX buffer.\n"
-msgstr ""
+msgstr "// Записуємо в буфер TX.\n"
 
 #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md
 #: src/exercises/bare-metal/rtc.md
 msgid "// Wait until the UART is no longer busy.\n"
-msgstr ""
+msgstr "// Чекаємо, поки UART більше не буде зайнято.\n"
 
 #: src/bare-metal/aps/uart.md
 msgid ""
@@ -18397,12 +18484,12 @@ msgid ""
 "it is always safe to call `write_byte` later because we can assume the "
 "necessary preconditions."
 msgstr ""
-"Зауважте, що `Uart::new` небезпечний, тоді як інші методи безпечні. Це "
-"пов’язано з тим, що якщо виклик `Uart::new` гарантує виконання вимог безпеки "
-"(тобто, що існує лише один екземпляр драйвера для даного UART, і нічого "
-"іншого не створює псевдонімів для його адресного простору), він завжди "
-"безпечно викликати `write_byte` пізніше, оскільки ми можемо припустити "
-"необхідні попередні умови."
+"Зауважте, що `Uart::new` є небезпечним, тоді як інші методи є безпечними. Це "
+"пов'язано з тим, що доки викликач `Uart::new` гарантує, що його вимоги "
+"безпеки дотримано (тобто, що існує лише один екземпляр драйвера для даного "
+"UART, і ніщо інше не змінює його адресний простір), доти безпечно викликати "
+"`write_byte` пізніше, оскільки ми можемо припустити, що виконано необхідні "
+"передумови."
 
 #: src/bare-metal/aps/uart.md
 msgid ""
@@ -18421,19 +18508,19 @@ msgid ""
 "number of places."
 msgstr ""
 "Це загальний шаблон для написання безпечних оболонок небезпечного коду: "
-"переміщення тягаря доказу надійності з великої кількості місць на меншу "
+"перенесення тягаря доведення правильності з великої кількості місць на меншу "
 "кількість місць."
 
 #: src/bare-metal/aps/uart/traits.md
 msgid "More traits"
-msgstr "Більше рис"
+msgstr "Більше трейтів"
 
 #: src/bare-metal/aps/uart/traits.md
 msgid ""
 "We derived the `Debug` trait. It would be useful to implement a few more "
 "traits too."
 msgstr ""
-"Ми вивели ознаку `Debug`. Також було б корисно реалізувати ще кілька ознак."
+"Ми вивели трейт `Debug`. Також було б корисно реалізувати ще кілька трейтів."
 
 #: src/bare-metal/aps/uart/traits.md src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
@@ -18441,6 +18528,8 @@ msgid ""
 "// Safe because it just contains a pointer to device memory, which can be\n"
 "// accessed from any context.\n"
 msgstr ""
+"// Безпечно, тому що це всього лише вказівник на пам'ять пристрою, до якого\n"
+"// можна отримати доступ з будь-якого контексту.\n"
 
 #: src/bare-metal/aps/uart/traits.md
 msgid ""
@@ -18470,19 +18559,19 @@ msgid ""
 "read. Plus, some of them are bit fields which would be nice to access in a "
 "structured way."
 msgstr ""
-"PL011 насправді має [багато більше регістрів](https://developer.arm.com/"
+"PL011 насправді має [набагато більше регістрів](https://developer.arm.com/"
 "documentation/ddi0183/g/programmers-model/summary-of-registers), і додавання "
-"зсувів для створення вказівників для доступу до них є помилкою. схильний і "
-"важко читається. Крім того, деякі з них є бітовими полями, до яких було б "
-"добре мати структурований доступ."
+"зміщень до вказівників для конструювання доступу до них може призвести до "
+"помилок, і читається важко. Крім того, деякі з них є бітовими полями, до "
+"яких було б добре мати структурований доступ."
 
 #: src/bare-metal/aps/better-uart.md
 msgid "Offset"
-msgstr "Зсув"
+msgstr "Зміщення"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "Register name"
-msgstr "Зареєструвати ім'я"
+msgstr "Ім'я регістру"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "Width"
@@ -18494,7 +18583,7 @@ msgstr "0x00"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "DR"
-msgstr "ДОКТОР"
+msgstr "DR"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "12"
@@ -18526,7 +18615,7 @@ msgstr "0x20"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "ILPR"
-msgstr "ІЛПР"
+msgstr "ILPR"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "0x24"
@@ -18534,7 +18623,7 @@ msgstr "0x24"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "IBRD"
-msgstr "МБРР"
+msgstr "IBRD"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "16"
@@ -18590,7 +18679,7 @@ msgstr "0x3c"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "RIS"
-msgstr "РІС"
+msgstr "RIS"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "0x40"
@@ -18618,55 +18707,55 @@ msgstr "DMACR"
 
 #: src/bare-metal/aps/better-uart.md
 msgid "There are also some ID registers which have been omitted for brevity."
-msgstr "Є також деякі ідентифікаційні реєстри, які були опущені для стислості."
+msgstr "Є також деякі ID регістри, які були пропущені для стислості."
 
 #: src/bare-metal/aps/better-uart/bitflags.md
 msgid ""
 "The [`bitflags`](https://crates.io/crates/bitflags) crate is useful for "
 "working with bitflags."
 msgstr ""
-"Ящик [`bitflags`](https://crates.io/crates/bitflags) корисний для роботи з "
+"Крейт [`bitflags`](https://crates.io/crates/bitflags) корисний для роботи з "
 "бітовими флагами."
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Flags from the UART flag register.\n"
-msgstr ""
+msgstr "/// Прапорці з регістру прапорів UART.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Clear to send.\n"
-msgstr ""
+msgstr "/// Очистити для відправки.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Data set ready.\n"
-msgstr ""
+msgstr "/// Набір даних готовий.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Data carrier detect.\n"
-msgstr ""
+msgstr "/// Визначення носія даних.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// UART busy transmitting data.\n"
-msgstr ""
+msgstr "/// UART зайнятий передачею даних.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Receive FIFO is empty.\n"
-msgstr ""
+msgstr "/// FIFO отримання порожній.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Transmit FIFO is full.\n"
-msgstr ""
+msgstr "/// FIFO передачі заповнено.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Receive FIFO is full.\n"
-msgstr ""
+msgstr "/// FIFO отримання заповнено.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Transmit FIFO is empty.\n"
-msgstr ""
+msgstr "/// FIFO передачі порожній.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md
 msgid "/// Ring indicator.\n"
-msgstr ""
+msgstr "/// Індикатор кільця.\n"
 
 #: src/bare-metal/aps/better-uart/bitflags.md
 msgid ""
@@ -18684,7 +18773,7 @@ msgstr "Кілька регістрів"
 msgid ""
 "We can use a struct to represent the memory layout of the UART's registers."
 msgstr ""
-"Ми можемо використовувати структуру для представлення макета пам’яті "
+"Ми можемо використовувати структуру для представлення розташування пам’яті "
 "регістрів UART."
 
 #: src/bare-metal/aps/better-uart/registers.md
@@ -18696,11 +18785,11 @@ msgid ""
 "(among other things) reorder fields however it sees fit."
 msgstr ""
 "[`#[repr(C)]`](https://doc.rust-lang.org/reference/type-layout.html#the-c-"
-"representation) повідомляє компілятору розмістити поля структури в порядку, "
-"дотримуючись тих самих правил, що й C. Це необхідно для того, щоб наша "
-"структура мала передбачуваний макет, оскільки представлення Rust за "
-"замовчуванням дозволяє компілятору (між іншим) змінювати порядок полів, як "
-"він вважає за потрібне."
+"representation) каже компілятору розмістити поля структури в потрібному "
+"порядку, дотримуючись тих самих правил, що й C. Це необхідно для того, щоб "
+"наша структура мала передбачуваний порядок розміщення, оскільки "
+"представлення Rust за замовчуванням дозволяє компілятору (між іншим) "
+"змінювати порядок полів, як він вважає за потрібне."
 
 #: src/bare-metal/aps/better-uart/driver.md
 msgid "Now let's use the new `Registers` struct in our driver."
@@ -18709,23 +18798,27 @@ msgstr ""
 
 #: src/bare-metal/aps/better-uart/driver.md
 msgid "/// Driver for a PL011 UART.\n"
-msgstr ""
+msgstr "/// Драйвер для PL011 UART.\n"
 
 #: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md
 msgid ""
 "// Safe because we know that self.registers points to the control\n"
 "        // registers of a PL011 device which is appropriately mapped.\n"
 msgstr ""
+"// Безпечно, тому що ми знаємо, що self.registers вказує на керуючі\n"
+"        // регістри пристрою PL011, який відповідним чином відображено.\n"
 
 #: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md
 msgid ""
 "/// Reads and returns a pending byte, or `None` if nothing has been\n"
 "    /// received.\n"
 msgstr ""
+"/// Читає і повертає байт очікування, або `None`, якщо нічого не було\n"
+"    /// отримано.\n"
 
 #: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md
 msgid "// TODO: Check for error conditions in bits 8-11.\n"
-msgstr ""
+msgstr "// TODO: Перевірити на наявність помилок у бітах 8-11.\n"
 
 #: src/bare-metal/aps/better-uart/driver.md
 msgid ""
@@ -18738,7 +18831,7 @@ msgstr ""
 
 #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md
 msgid "Using it"
-msgstr "Використовуючи його"
+msgstr "Використання"
 
 #: src/bare-metal/aps/better-uart/using.md
 msgid ""
@@ -18746,13 +18839,13 @@ msgid ""
 "and echo incoming bytes."
 msgstr ""
 "Давайте напишемо невелику програму, використовуючи наш драйвер для запису в "
-"послідовну консоль і відтворення вхідних байтів."
+"послідовну консоль і відлуння вхідних байтів."
 
 #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md
 #: src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Base address of the primary PL011 UART.\n"
-msgstr ""
+msgstr "/// Базова адреса основного PL011 UART.\n"
 
 #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md
 #: src/exercises/bare-metal/rtc.md
@@ -18761,26 +18854,29 @@ msgid ""
 "// Safe because `PL011_BASE_ADDRESS` is the base address of a PL011 device,\n"
 "    // and nothing else accesses that address range.\n"
 msgstr ""
+"// Безпечно, оскільки `PL011_BASE_ADDRESS` є базовою адресою пристрою "
+"PL011,\n"
+"    // і ніщо інше не має доступу до цього діапазону адресації.\n"
 
 #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md
 msgid "\"main({x0:#x}, {x1:#x}, {x2:#x}, {x3:#x})\""
-msgstr ""
+msgstr "\"main({x0:#x}, {x1:#x}, {x2:#x}, {x3:#x})\""
 
 #: src/bare-metal/aps/better-uart/using.md
 msgid "b'\\r'"
-msgstr ""
+msgstr "b'\\r'"
 
 #: src/bare-metal/aps/better-uart/using.md src/async/pitfalls/cancellation.md
 msgid "b'\\n'"
-msgstr ""
+msgstr "b'\\n'"
 
 #: src/bare-metal/aps/better-uart/using.md
 msgid "b'q'"
-msgstr ""
+msgstr "b'q'"
 
 #: src/bare-metal/aps/better-uart/using.md
 msgid "\"Bye!\""
-msgstr ""
+msgstr "\"Бувайте!\""
 
 #: src/bare-metal/aps/better-uart/using.md
 msgid ""
@@ -18788,8 +18884,8 @@ msgid ""
 "function is called from our entry point code in `entry.S`. See the speaker "
 "notes there for details."
 msgstr ""
-"Як і у прикладі [inline-assembly](../inline-assembly.md), ця функція main "
-"викликається з нашого коду точки входу в `entry.S`. Докладніше див. у "
+"Як і у прикладі [inline-assembly](../inline-assembly.md), ця функція `main` "
+"викликається з нашого коду точки входу в `entry.S`. Докладніше дивиться у "
 "примітках доповідача."
 
 #: src/bare-metal/aps/better-uart/using.md
@@ -18805,17 +18901,17 @@ msgid ""
 "(https://crates.io/crates/log) crate. We can do this by implementing the "
 "`Log` trait."
 msgstr ""
-"Було б чудово мати можливість використовувати макроси журналювання з ящика "
+"Було б чудово мати можливість використовувати макроси журналювання з крейту "
 "[`log`](https://crates.io/crates/log). Ми можемо зробити це, реалізувавши "
-"властивість `Log`."
+"трейт `Log`."
 
 #: src/bare-metal/aps/logging.md src/exercises/bare-metal/rtc.md
 msgid "\"[{}] {}\""
-msgstr ""
+msgstr "\"[{}] {}\""
 
 #: src/bare-metal/aps/logging.md src/exercises/bare-metal/rtc.md
 msgid "/// Initialises UART logger.\n"
-msgstr ""
+msgstr "/// Ініціалізує логгер UART.\n"
 
 #: src/bare-metal/aps/logging.md
 msgid ""
@@ -18827,12 +18923,12 @@ msgstr ""
 
 #: src/bare-metal/aps/logging/using.md
 msgid "We need to initialise the logger before we use it."
-msgstr "Нам потрібно ініціалізувати реєстратор перед його використанням."
+msgstr "Нам потрібно ініціалізувати логгер перед його використанням."
 
 #: src/bare-metal/aps/logging/using.md src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"{info}\""
-msgstr ""
+msgstr "\"{info}\""
 
 #: src/bare-metal/aps/logging/using.md
 msgid "Note that our panic handler can now log details of panics."
@@ -18857,13 +18953,13 @@ msgid ""
 msgstr ""
 "AArch64 визначає векторну таблицю винятків із 16 записами для 4 типів "
 "винятків (синхронний, IRQ, FIQ, SError) із 4 станів (поточний EL із SP0, "
-"поточний EL із SPx, нижчий EL із використанням AArch64, нижній EL із "
+"поточний EL із SPx, нижчий EL із використанням AArch64, нижчий EL із "
 "застосуванням AArch32). Ми реалізуємо це в асемблері, щоб зберегти "
 "непостійні регістри в стеку перед викликом коду Rust:"
 
 #: src/bare-metal/aps/exceptions.md
 msgid "EL is exception level; all our examples this afternoon run in EL1."
-msgstr ""
+msgstr "EL - це рівень винятків; усі наші приклади сьогодні працюють на EL1."
 
 #: src/bare-metal/aps/exceptions.md
 msgid ""
@@ -18879,7 +18975,7 @@ msgid ""
 "expect any of them to actually happen."
 msgstr ""
 "У цьому прикладі ми просто реєструємо виняток і вимикаємо живлення, оскільки "
-"ми не очікуємо, що будь-яке з них станеться."
+"ми не очікуємо, що будь-що з цього станеться."
 
 #: src/bare-metal/aps/exceptions.md
 msgid ""
@@ -18891,12 +18987,11 @@ msgid ""
 "it in something like a `Mutex` and put it in a static."
 msgstr ""
 "Ми можемо розглядати обробники винятків і наш основний контекст виконання "
-"більш-менш як різні потоки. [`Надіслати` і `Синхронізувати`](../../"
-"concurrency/send-sync.md) керуватимуть тим, чим ми можемо обмінюватися між "
-"ними, як і з потоками. Наприклад, якщо ми хочемо поділитися деяким значенням "
-"між обробниками винятків та рештою програми, і це `Send`, але не `Sync`, "
-"тоді нам потрібно буде загорнути його в щось на зразок `Mutex` і помістити в "
-"статика."
+"більш-менш як різні потоки. [`Send` і `Sync`](../../concurrency/send-sync."
+"md) керуватимуть тим, чим ми можемо обмінюватися між ними, як і з потоками. "
+"Наприклад, якщо ми хочемо поділитися деяким значенням між обробниками "
+"винятків та рештою програми, і це `Send`, але не `Sync`, тоді нам потрібно "
+"буде загорнути його в щось на зразок `Mutex` і помістити у статику."
 
 #: src/bare-metal/aps/other-projects.md
 msgid "[oreboot](https://github.com/oreboot/oreboot)"
@@ -18912,14 +19007,15 @@ msgstr "Підтримує x86, aarch64 і RISC-V."
 
 #: src/bare-metal/aps/other-projects.md
 msgid "Relies on LinuxBoot rather than having many drivers itself."
-msgstr "Покладається на LinuxBoot, а не на багато драйверів."
+msgstr ""
+"Покладається на LinuxBoot, замість того, щоб самому мати багато драйверів."
 
 #: src/bare-metal/aps/other-projects.md
 msgid ""
 "[Rust RaspberryPi OS tutorial](https://github.com/rust-embedded/rust-"
 "raspberrypi-OS-tutorials)"
 msgstr ""
-"[Навчальний посібник з ОС Rust RaspberryPi](https://github.com/rust-embedded/"
+"[Навчальний посібник Rust з ОС RaspberryPi](https://github.com/rust-embedded/"
 "rust-raspberrypi-OS-tutorials)"
 
 #: src/bare-metal/aps/other-projects.md
@@ -18936,7 +19032,7 @@ msgid ""
 "necessarily a good example to copy for production code."
 msgstr ""
 "Деякі хитрощі щодо обслуговування кешу та ініціалізації в Rust, не "
-"обов’язково хороший приклад для копіювання для робочого коду."
+"обов’язково хороший приклад для копіювання для виробничого коду."
 
 #: src/bare-metal/aps/other-projects.md
 msgid "[`cargo-call-stack`](https://crates.io/crates/cargo-call-stack)"
@@ -18961,10 +19057,10 @@ msgid ""
 "generating unaligned accesses so it should be alright, but this is not "
 "necessarily the case in general."
 msgstr ""
-"Без MMU та кешу невирівняний доступ буде несправним. Він створюється за "
-"допомогою `aarch64-unknown-none`, який встановлює `+strict-align`, щоб "
+"Без MMU та кешу невирівняні доступи призведуть до помилки. Код створюється "
+"за допомогою `aarch64-unknown-none`, який встановлює `+strict-align`, щоб "
 "запобігти генерації компілятором невирівняних доступів, тому це має бути "
-"добре, але це не обов’язково так загалом."
+"гаразд, але це не обов’язково так загалом."
 
 #: src/bare-metal/aps/other-projects.md
 msgid ""
@@ -18976,14 +19072,14 @@ msgid ""
 "alright in this particular case (running directly on the hardware with no "
 "hypervisor), but isn't a good pattern in general."
 msgstr ""
-"Якщо він працював у віртуальній машині, це може призвести до проблем "
+"Якщо код працював у віртуальній машині, це може призвести до проблем "
 "узгодженості кешу. Проблема полягає в тому, що віртуальна машина звертається "
-"до пам’яті безпосередньо з вимкненим кеш-пам’яттю, тоді як хост має кешовані "
+"до пам’яті безпосередньо з вимкненою кеш-пам’яттю, тоді як хост має кешовані "
 "псевдоніми для тієї самої пам’яті. Навіть якщо хост явно не звертається до "
-"пам’яті, спекулятивні доступи можуть призвести до заповнення кешу, а потім "
-"зміни, внесені тим чи іншим, будуть втрачені. Знову ж таки, це нормально в "
+"пам’яті, спекулятивні доступи можуть призвести до заповнення кешу, і тоді "
+"зміни з одного або іншого боку будуть втрачені. Знову ж таки, це нормально в "
 "цьому конкретному випадку (працює безпосередньо на апаратному забезпеченні "
-"без гіпервізора), але це не дуже хороший шаблон загалом."
+"без гіпервізора), але це не дуже гарний шаблон загалом."
 
 #: src/bare-metal/useful-crates.md
 msgid "Useful crates"
@@ -18994,7 +19090,7 @@ msgid ""
 "We'll go over a few crates which solve some common problems in bare-metal "
 "programming."
 msgstr ""
-"Ми розглянемо кілька ящиків, які вирішують деякі поширені проблеми "
+"Ми розглянемо кілька крейтів, які вирішують деякі поширені проблеми "
 "програмування на голому залізі."
 
 #: src/bare-metal/useful-crates/zerocopy.md
@@ -19003,7 +19099,7 @@ msgid ""
 "traits and macros for safely converting between byte sequences and other "
 "types."
 msgstr ""
-"Ящик [`zerocopy`](https://docs.rs/zerocopy/) (від Fuchsia) надає ознаки та "
+"Крейт [`zerocopy`](https://docs.rs/zerocopy/) (від Fuchsia) надає трейти та "
 "макроси для безпечного перетворення між послідовностями байтів та іншими "
 "типами."
 
@@ -19013,9 +19109,10 @@ msgid ""
 "but can be useful for working with structures shared with hardware e.g. by "
 "DMA, or sent over some external interface."
 msgstr ""
-"Це не підходить для MMIO (оскільки він не використовує незалежне читання та "
-"запис), але може бути корисним для роботи зі структурами, спільними з "
-"обладнанням, наприклад. через DMA або надіслано через зовнішній інтерфейс."
+"Це не підходить для MMIO (оскільки він не використовує непостійні читання та "
+"записи), але може бути корисним для роботи зі структурами, спільними з "
+"обладнанням, наприклад, з прямим доступом до пам'яті (DMA), або переданими "
+"через зовнішній інтерфейс."
 
 #: src/bare-metal/useful-crates/zerocopy.md
 msgid ""
@@ -19050,8 +19147,8 @@ msgid ""
 "dependency.)"
 msgstr ""
 "Запустіть приклад із `cargo run` у `src/bare-metal/useful-crates/zerocopy-"
-"example/`. (Він не працюватиме на ігровому майданчику через залежність "
-"ящика.)"
+"example/`. (Він не працюватиме на Rust Playground через залежність від "
+"крейту.)"
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid ""
@@ -19059,29 +19156,31 @@ msgid ""
 "you create page tables according to the AArch64 Virtual Memory System "
 "Architecture."
 msgstr ""
-"Ящик [`aarch64-paging`](https://crates.io/crates/aarch64-paging) дозволяє "
+"Крейт [`aarch64-paging`](https://crates.io/crates/aarch64-paging) дозволяє "
 "створювати таблиці сторінок відповідно до архітектури системи віртуальної "
 "пам’яті AArch64."
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid "// Create a new page table with identity mapping.\n"
-msgstr ""
+msgstr "// Створити нову таблицю сторінок з відображенням ідентичності.\n"
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid "// Map a 2 MiB region of memory as read-only.\n"
 msgstr ""
+"// Відобразити область пам'яті розміром 2 MiB як доступну тільки для "
+"читання.\n"
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid "// Set `TTBR0_EL1` to activate the page table.\n"
-msgstr ""
+msgstr "// Встановити `TTBR0_EL1` для активації таблиці сторінок.\n"
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid ""
 "For now it only supports EL1, but support for other exception levels should "
 "be straightforward to add."
 msgstr ""
-"Наразі він підтримує лише EL1, але підтримку для інших рівнів винятків слід "
-"додати просто."
+"Наразі він підтримує лише EL1, але підтримка інших рівнів винятків має бути "
+"легко додана."
 
 #: src/bare-metal/useful-crates/aarch64-paging.md
 msgid ""
@@ -19113,18 +19212,18 @@ msgid ""
 "space for PCI BARs:"
 msgstr ""
 "[`buddy_system_allocator`](https://crates.io/crates/buddy_system_allocator) "
-"— це сторонній ящик, який реалізує базовий системний розподільник приятелів. "
-"Його можна використовувати як для [`LockedHeap`](https://docs.rs/"
+"— це сторонній крейт, який реалізує базовий системний розподільник між "
+"друзями. Його можна використовувати як для [`LockedHeap`](https://docs.rs/"
 "buddy_system_allocator/0.9.0/buddy_system_allocator/struct.LockedHeap.html), "
 "так і для реалізації [`GlobalAlloc`](https://doc.rust-lang .org/core/alloc/"
-"trait.GlobalAlloc.html), щоб ви могли використовувати стандартний ящик "
+"trait.GlobalAlloc.html), щоб ви могли використовувати стандартний крейт "
 "`alloc` (як ми бачили [раніше](../alloc.md)), або для виділення іншого "
 "адресного простору. Наприклад, ми можемо захотіти виділити простір MMIO для "
 "шин PCI:"
 
 #: src/bare-metal/useful-crates/buddy_system_allocator.md
 msgid "PCI BARs always have alignment equal to their size."
-msgstr "Штуки PCI завжди мають вирівнювання відповідно до їх розміру."
+msgstr "Шини PCI завжди мають вирівнювання відповідно до їх розміру."
 
 #: src/bare-metal/useful-crates/buddy_system_allocator.md
 msgid ""
@@ -19133,8 +19232,8 @@ msgid ""
 "dependency.)"
 msgstr ""
 "Запустіть приклад із `cargo run` у `src/bare-metal/useful-crates/allocator-"
-"example/`. (Він не працюватиме на ігровому майданчику через залежність "
-"ящика.)"
+"example/`. (Він не працюватиме на Rust Playground через залежність від "
+"крейту.)"
 
 #: src/bare-metal/useful-crates/tinyvec.md
 msgid ""
@@ -19146,9 +19245,9 @@ msgid ""
 msgstr ""
 "Іноді вам потрібне щось, розмір якого можна змінити, наприклад `Vec`, але "
 "без виділення купи. [`tinyvec`](https://crates.io/crates/tinyvec) надає це: "
-"вектор, підкріплений масивом або фрагментом, який може бути статично "
-"розміщений або в стеку, який відстежує, скільки елементів використовується "
-"та впадає в паніку, якщо ви намагаєтеся використати більше, ніж виділено."
+"вектор, підкріплений масивом або зрізом, який може бути статично розміщений "
+"або в стеку, який відстежує, скільки елементів використовується та впадає в "
+"паніку, якщо ви намагаєтеся використати більше, ніж виділено."
 
 #: src/bare-metal/useful-crates/tinyvec.md
 msgid ""
@@ -19172,14 +19271,14 @@ msgid ""
 msgstr ""
 "`std::sync::Mutex` та інші примітиви синхронізації з `std::sync` недоступні "
 "в `core` або `alloc`. Як ми можемо керувати синхронізацією або внутрішньою "
-"мінливістю, наприклад, для обміну станом між різними ЦП?"
+"мутабельністю, наприклад, для обміну станом між різними CPU?"
 
 #: src/bare-metal/useful-crates/spin.md
 msgid ""
 "The [`spin`](https://crates.io/crates/spin) crate provides spinlock-based "
 "equivalents of many of these primitives."
 msgstr ""
-"Ящик [`spin`](https://crates.io/crates/spin) надає еквіваленти багатьох із "
+"Крейт [`spin`](https://crates.io/crates/spin) надає еквіваленти багатьох із "
 "цих примітивів на основі спін-блокування."
 
 #: src/bare-metal/useful-crates/spin.md
@@ -19193,6 +19292,9 @@ msgid ""
 "`spin` also has a ticket lock mutex implementation; equivalents of `RwLock`, "
 "`Barrier` and `Once` from `std::sync`; and `Lazy` for lazy initialisation."
 msgstr ""
+"`spin` також має реалізацію квиткового м'ютексу блокування; еквіваленти "
+"`RwLock`, `Barrier` і `Once` з `std::sync`; і `Lazy` для ледачої "
+"ініціалізації."
 
 #: src/bare-metal/useful-crates/spin.md
 msgid ""
@@ -19200,7 +19302,7 @@ msgid ""
 "useful types for late initialisation with a slightly different approach to "
 "`spin::once::Once`."
 msgstr ""
-"Ящик [`once_cell`](https://crates.io/crates/once_cell) також має кілька "
+"Крейт [`once_cell`](https://crates.io/crates/once_cell) також має кілька "
 "корисних типів для пізньої ініціалізації з дещо іншим підходом до `spin::"
 "once::Once`."
 
@@ -19217,7 +19319,7 @@ msgid ""
 "with a linker script to produce the binary itself, and then a `raw_binary` "
 "to convert the ELF to a raw binary ready to be run."
 msgstr ""
-"Щоб створити голий бінарний файл Rust в AOSP, вам потрібно використати "
+"Щоб зібрати бінарник Rust в AOSP для голого заліза, вам потрібно використати "
 "правило `rust_ffi_static` Soong для створення коду Rust, потім `cc_binary` "
 "зі сценарієм компонування, щоб створити сам бінарний файл, а потім "
 "`raw_binary` для перетворення ELF у необроблений бінарний файл, готовий до "
@@ -19279,9 +19381,9 @@ msgid ""
 "documentation/ddi0224/c) real-time clock at 0x9010000. For this exercise, "
 "you should write a driver for it."
 msgstr ""
-"Машина virt QEMU aarch64 має [PL031](https://developer.arm.com/documentation/"
-"ddi0224/c) годинник реального часу на 0x9010000. Для цієї вправи ви повинні "
-"написати для неї драйвер."
+"Віртуальна машина QEMU aarch64 має [PL031](https://developer.arm.com/"
+"documentation/ddi0224/c) годинник реального часу за адресою 0x9010000. Для "
+"цієї вправи ви повинні написати для неї драйвер."
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19289,7 +19391,7 @@ msgid ""
 "[`chrono`](https://crates.io/crates/chrono) crate for date/time formatting."
 msgstr ""
 "Використовуйте його для друку поточного часу на послідовній консолі. Ви "
-"можете використовувати ящик [`chrono`](https://crates.io/crates/chrono) для "
+"можете використовувати крейт [`chrono`](https://crates.io/crates/chrono) для "
 "форматування дати/часу."
 
 #: src/exercises/bare-metal/rtc.md
@@ -19298,8 +19400,8 @@ msgid ""
 "time, e.g. 3 seconds in the future. (Call [`core::hint::spin_loop`](https://"
 "doc.rust-lang.org/core/hint/fn.spin_loop.html) inside the loop.)"
 msgstr ""
-"Використовуйте реєстр збігів і статус необробленого переривання, щоб зайняти "
-"очікування до заданого часу, наприклад. 3 секунди в майбутньому. (Викличте "
+"Використовуйте регістр збігу та необроблений стан переривання для очікування "
+"зайнятості до заданого часу, наприклад 3 секунди в майбутньому. (Викличте "
 "[`core::hint::spin_loop`](https://doc.rust-lang.org/core/hint/fn.spin_loop."
 "html) усередині циклу.)"
 
@@ -19310,7 +19412,7 @@ msgid ""
 "docs.rs/arm-gic/) crate to configure the Arm Generic Interrupt Controller."
 msgstr ""
 "_Розширення, якщо у вас є час:_ Увімкніть і обробіть переривання, створене "
-"збігом RTC. Ви можете використовувати драйвер, наданий у пакеті [`arm-gic`]"
+"збігом RTC. Ви можете використовувати драйвер, наданий у крейті [`arm-gic`]"
 "(https://docs.rs/arm-gic/), щоб налаштувати загальний контролер переривань "
 "Arm."
 
@@ -19339,12 +19441,12 @@ msgstr ""
 #: src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Base addresses of the GICv3.\n"
-msgstr ""
+msgstr "/// Базові адреси GICv3.\n"
 
 #: src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\""
-msgstr ""
+msgstr "\"main({:#x}, {:#x}, {:#x}, {:#x})\""
 
 #: src/exercises/bare-metal/rtc.md
 #: src/exercises/bare-metal/solutions-afternoon.md
@@ -19353,21 +19455,25 @@ msgid ""
 "    // addresses of a GICv3 distributor and redistributor respectively, and\n"
 "    // nothing else accesses those address ranges.\n"
 msgstr ""
+"// Безпечно, оскільки `GICD_BASE_ADDRESS` і `GICR_BASE_ADDRESS` є базовими\n"
+"    // адресами дистриб'ютора і редистриб'ютора GICv3 відповідно, і ніщо\n"
+"    // інше не має доступу до цих адресних діапазонів.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// TODO: Create instance of RTC driver and print current time.\n"
-msgstr ""
+msgstr "// TODO: Створити екземпляр драйвера RTC та вивести поточний час.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// TODO: Wait for 3 seconds.\n"
-msgstr ""
+msgstr "// TODO: Зачекати 3 секунди.\n"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid ""
 "_src/exceptions.rs_ (you should only need to change this for the 3rd part of "
 "the exercise):"
-msgstr "`src/exceptions.rs` (це потрібно змінити лише для 3-ї частини вправи):"
+msgstr ""
+"`src/exceptions.rs` (вам потрібно буде змінити його лише для 3-ї частини "
+"вправи):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19388,100 +19494,101 @@ msgstr ""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"sync_exception_current\""
-msgstr ""
+msgstr "\"sync_exception_current\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"irq_current\""
-msgstr ""
+msgstr "\"irq_current\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"No pending interrupt\""
-msgstr ""
+msgstr "\"Немає очікуваного переривання\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"IRQ {intid:?}\""
-msgstr ""
+msgstr "\"IRQ {intid:?}\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"fiq_current\""
-msgstr ""
+msgstr "\"fiq_current\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"serr_current\""
-msgstr ""
+msgstr "\"serr_current\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"sync_lower\""
-msgstr ""
+msgstr "\"sync_lower\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"irq_lower\""
-msgstr ""
+msgstr "\"irq_lower\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"fiq_lower\""
-msgstr ""
+msgstr "\"fiq_lower\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"serr_lower\""
-msgstr ""
+msgstr "\"serr_lower\""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_src/logger.rs_ (you shouldn't need to change this):"
-msgstr "`src/logger.rs` (це не потрібно змінювати):"
+msgstr "_src/logger.rs_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR: main\n"
-msgstr ""
+msgstr "// ANCHOR: main\n"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_src/pl011.rs_ (you shouldn't need to change this):"
-msgstr "`src/pl011.rs` (це не потрібно змінювати):"
+msgstr "_src/pl011.rs_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR: Flags\n"
-msgstr ""
+msgstr "// ANCHOR: Flags\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR_END: Flags\n"
-msgstr ""
+msgstr "// ANCHOR_END: Flags\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
 "/// Flags from the UART Receive Status Register / Error Clear Register.\n"
 msgstr ""
+"/// Прапори з регістру стану отримання UART / регістр очищення помилок.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "/// Framing error.\n"
-msgstr ""
+msgstr "/// Помилка фреймінгу.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "/// Parity error.\n"
-msgstr ""
+msgstr "/// Помилка паритету.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "/// Break error.\n"
-msgstr ""
+msgstr "/// Помилка переривання.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "/// Overrun error.\n"
-msgstr ""
+msgstr "/// Помилка перевиконання.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR: Registers\n"
-msgstr ""
+msgstr "// ANCHOR: Registers\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR_END: Registers\n"
-msgstr ""
+msgstr "// ANCHOR_END: Registers\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
 "// ANCHOR: Uart\n"
 "/// Driver for a PL011 UART.\n"
 msgstr ""
+"// ANCHOR: Uart\n"
+"/// Драйвер для PL011 UART.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19496,54 +19603,59 @@ msgid ""
 "process\n"
 "    /// as device memory and not have any other aliases.\n"
 msgstr ""
+"/// Створює новий екземпляр драйвера UART для пристрою PL011 за заданою\n"
+"    /// базовою адресою.\n"
+"    ///\n"
+"    /// # Безпека\n"
+"    ///\n"
+"    /// Зазначена базова адреса повинна вказувати на керуючі регістри MMIO\n"
+"    /// пристрою PL011, які повинні бути відображені в адресному просторі "
+"процесу\n"
+"    /// як пам'ять пристрою і не мати ніяких інших псевдонімів.\n"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "// ANCHOR_END: Uart\n"
-msgstr ""
+msgstr "// ANCHOR_END: Uart\n"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_build.rs_ (you shouldn't need to change this):"
-msgstr "`build.rs` (це не потрібно змінювати):"
+msgstr "_build.rs_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"linux\""
-msgstr ""
+msgstr "\"linux\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"CROSS_COMPILE\""
-msgstr ""
+msgstr "\"CROSS_COMPILE\""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "\"aarch64-linux-gnu\""
-msgstr "aarch64-paging"
+msgstr "\"aarch64-linux-gnu\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"aarch64-none-elf\""
-msgstr ""
+msgstr "\"aarch64-none-elf\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"entry.S\""
-msgstr ""
+msgstr "\"entry.S\""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "\"exceptions.S\""
-msgstr "Вийнятки"
+msgstr "\"exceptions.S\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"idmap.S\""
-msgstr ""
+msgstr "\"idmap.S\""
 
 #: src/exercises/bare-metal/rtc.md
 msgid "\"empty\""
-msgstr ""
+msgstr "\"empty\""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_entry.S_ (you shouldn't need to change this):"
-msgstr "`entry.S` (це не потрібно змінювати):"
+msgstr "_entry.S_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19708,9 +19820,8 @@ msgid ""
 msgstr ""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_exceptions.S_ (you shouldn't need to change this):"
-msgstr "`exceptions.S` (це не потрібно змінювати):"
+msgstr "_exceptions.S_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19905,11 +20016,203 @@ msgid ""
 "\tcurrent_exception_spx serr_lower\n"
 "```"
 msgstr ""
+"```armasm\n"
+"/*\n"
+" * Copyright 2023 Google LLC\n"
+" *\n"
+" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
+" * you may not use this file except in compliance with the License.\n"
+" * You may obtain a copy of the License at\n"
+" *\n"
+" *     https://www.apache.org/licenses/LICENSE-2.0\n"
+" *\n"
+" * Unless required by applicable law or agreed to in writing, software\n"
+" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+" * See the License for the specific language governing permissions and\n"
+" * limitations under the License.\n"
+" */\n"
+"\n"
+"/**\n"
+" * Зберігає непостійні регістри у стеку. Наразі це займає 14 \n"
+" * інструкцій, тому його можна використовувати в обробниках винятків з 18 "
+"інструкціями,\n"
+" * що залишилися.\n"
+" *\n"
+" * При поверненні x0 і x1 ініціалізуються значеннями elr_el2 і spsr_el2 "
+"відповідно,\n"
+" * які можуть бути використані як перший і другий аргументи наступного "
+"виклику.\n"
+" */\n"
+".macro save_volatile_to_stack\n"
+"\t/* Зарезервувати місце у стеку та зберегти регістри x0-x18, x29 та x30. \n"
+"*/\n"
+"\tstp x0, x1, [sp, #-(8 * 24)]!\n"
+"\tstp x2, x3, [sp, #8 * 2]\n"
+"\tstp x4, x5, [sp, #8 * 4]\n"
+"\tstp x6, x7, [sp, #8 * 6]\n"
+"\tstp x8, x9, [sp, #8 * 8]\n"
+"\tstp x10, x11, [sp, #8 * 10]\n"
+"\tstp x12, x13, [sp, #8 * 12]\n"
+"\tstp x14, x15, [sp, #8 * 14]\n"
+"\tstp x16, x17, [sp, #8 * 16]\n"
+"\tstr x18, [sp, #8 * 18]\n"
+"\tstp x29, x30, [sp, #8 * 20]\n"
+"\n"
+"\t/*\n"
+"\t * Зберігаємо elr_el1 та spsr_el1. Таким чином, ми можемо отримати "
+"вкладені \n"
+"\t * виключення і все ще мати можливість розмотати.\n"
+"\t */\n"
+"\tmrs x0, elr_el1\n"
+"\tmrs x1, spsr_el1\n"
+"\tstp x0, x1, [sp, #8 * 22]\n"
+".endm\n"
+"\n"
+"/**\n"
+" * Відновлює непостійні регістри зі стеку. Наразі це займає 14 інструкцій,\n"
+" * тому цей метод можна використовувати у обробниках виключень, залишаючи "
+"18\n"
+" * інструкцій; у поєднанні з save_volatile_to_stack залишається ще 4\n"
+" * інструкції у запасі.\n"
+" */\n"
+".macro restore_volatile_from_stack\n"
+"\t/* Відновити регістри x2-x18, x29 та x30. */\n"
+"\tldp x2, x3, [sp, #8 * 2]\n"
+"\tldp x4, x5, [sp, #8 * 4]\n"
+"\tldp x6, x7, [sp, #8 * 6]\n"
+"\tldp x8, x9, [sp, #8 * 8]\n"
+"\tldp x10, x11, [sp, #8 * 10]\n"
+"\tldp x12, x13, [sp, #8 * 12]\n"
+"\tldp x14, x15, [sp, #8 * 14]\n"
+"\tldp x16, x17, [sp, #8 * 16]\n"
+"\tldr x18, [sp, #8 * 18]\n"
+"\tldp x29, x30, [sp, #8 * 20]\n"
+"\n"
+"\t/* Відновити регістри elr_el1 та spsr_el1, використовуючи x0 та x1 як "
+"скретч.*/\n"
+"\tldp x0, x1, [sp, #8 * 22]\n"
+"\tmsr elr_el1, x0\n"
+"\tmsr spsr_el1, x1\n"
+"\n"
+"\t/* Відновити x0 та x1 і звільнити місце у стеку. */\n"
+"\tldp x0, x1, [sp], #8 * 24\n"
+".endm\n"
+"\n"
+"/**\n"
+" * Це загальний обробник виключень, що виникають у поточному EL під час "
+"використання\n"
+" * SP0. Він поводиться подібно до випадку SPx, спочатку перемикаючись на "
+"SPx, виконуючи\n"
+" * роботу, а потім перемикаючись назад на SP0 перед поверненням.\n"
+" *\n"
+" * Перехід до SPx і виклик обробника Rust займає 16 інструкцій. Для\n"
+" * відновлення і повернення нам потрібно ще 16 інструкцій, тому ми можемо "
+"реалізувати\n"
+" * весь обробник у межах виділених 32 інструкцій.\n"
+" */\n"
+".macro current_exception_sp0 handler:req\n"
+"\tmsr spsel, #1\n"
+"\tsave_volatile_to_stack\n"
+"\tbl \\handler\n"
+"\trestore_volatile_from_stack\n"
+"\tmsr spsel, #0\n"
+"\teret\n"
+".endm\n"
+"\n"
+"/**\n"
+" * Це загальний обробник виключень, що виникають у поточному EL під час "
+"використання\n"
+" * SPx. Він зберігає непостійні регістри, викликає обробник Rust, відновлює "
+"непостійні\n"
+" * регістри, а потім повертається.\n"
+" *\n"
+" * Це також працює для виключень, отриманих з EL0, якщо нас не цікавлять \n"
+" * постійні регістри.\n"
+" *\n"
+" * Збереження стану та перехід до обробника Rust займає 15 інструкцій, \n"
+" * відновлення та повернення також займає 15 інструкцій, тож ми можемо "
+"вмістити\n"
+" * весь обробник у 30 інструкцій, при обмеженні у 32.\n"
+" */\n"
+".macro current_exception_spx handler:req\n"
+"\tsave_volatile_to_stack\n"
+"\tbl \\handler\n"
+"\trestore_volatile_from_stack\n"
+"\teret\n"
+".endm\n"
+"\n"
+".section .text.vector_table_el1, \"ax\"\n"
+".global vector_table_el1\n"
+".balign 0x800\n"
+"vector_table_el1:\n"
+"sync_cur_sp0:\n"
+"\tcurrent_exception_sp0 sync_exception_current\n"
+"\n"
+".balign 0x80\n"
+"irq_cur_sp0:\n"
+"\tcurrent_exception_sp0 irq_current\n"
+"\n"
+".balign 0x80\n"
+"fiq_cur_sp0:\n"
+"\tcurrent_exception_sp0 fiq_current\n"
+"\n"
+".balign 0x80\n"
+"serr_cur_sp0:\n"
+"\tcurrent_exception_sp0 serr_current\n"
+"\n"
+".balign 0x80\n"
+"sync_cur_spx:\n"
+"\tcurrent_exception_spx sync_exception_current\n"
+"\n"
+".balign 0x80\n"
+"irq_cur_spx:\n"
+"\tcurrent_exception_spx irq_current\n"
+"\n"
+".balign 0x80\n"
+"fiq_cur_spx:\n"
+"\tcurrent_exception_spx fiq_current\n"
+"\n"
+".balign 0x80\n"
+"serr_cur_spx:\n"
+"\tcurrent_exception_spx serr_current\n"
+"\n"
+".balign 0x80\n"
+"sync_lower_64:\n"
+"\tcurrent_exception_spx sync_lower\n"
+"\n"
+".balign 0x80\n"
+"irq_lower_64:\n"
+"\tcurrent_exception_spx irq_lower\n"
+"\n"
+".balign 0x80\n"
+"fiq_lower_64:\n"
+"\tcurrent_exception_spx fiq_lower\n"
+"\n"
+".balign 0x80\n"
+"serr_lower_64:\n"
+"\tcurrent_exception_spx serr_lower\n"
+"\n"
+".balign 0x80\n"
+"sync_lower_32:\n"
+"\tcurrent_exception_spx sync_lower\n"
+"\n"
+".balign 0x80\n"
+"irq_lower_32:\n"
+"\tcurrent_exception_spx irq_lower\n"
+"\n"
+".balign 0x80\n"
+"fiq_lower_32:\n"
+"\tcurrent_exception_spx fiq_lower\n"
+"\n"
+".balign 0x80\n"
+"serr_lower_32:\n"
+"\tcurrent_exception_spx serr_lower\n"
+"```"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_idmap.S_ (you shouldn't need to change this):"
-msgstr "`idmap.S` (це не потрібно змінювати):"
+msgstr "_idmap.S_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -19961,9 +20264,8 @@ msgid ""
 msgstr ""
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_image.ld_ (you shouldn't need to change this):"
-msgstr "`image.ld` (це не потрібно змінювати):"
+msgstr "_image.ld_  (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid ""
@@ -20075,32 +20377,139 @@ msgid ""
 "}\n"
 "```"
 msgstr ""
+"```ld\n"
+"/*\n"
+" * Copyright 2023 Google LLC\n"
+" *\n"
+" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
+" * you may not use this file except in compliance with the License.\n"
+" * You may obtain a copy of the License at\n"
+" *\n"
+" *     https://www.apache.org/licenses/LICENSE-2.0\n"
+" *\n"
+" * Unless required by applicable law or agreed to in writing, software\n"
+" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+" * See the License for the specific language governing permissions and\n"
+" * limitations under the License.\n"
+" */\n"
+"\n"
+"/*\n"
+" * Код почне виконуватися з цього символу, який розміщено на початку * "
+"образу.\n"
+" */\n"
+"ENTRY(entry)\n"
+"\n"
+"MEMORY\n"
+"{\n"
+"\timage : ORIGIN = 0x40080000, LENGTH = 2M\n"
+"}\n"
+"\n"
+"SECTIONS\n"
+"{\n"
+"\t/*\n"
+"\t * Збираємо код разом.\n"
+"\t */\n"
+"\t.init : ALIGN(4096) {\n"
+"\t\ttext_begin = .;\n"
+"\t\t*(.init.entry)\n"
+"\t\t*(.init.*)\n"
+"\t} >image\n"
+"\t.text : {\n"
+"\t\t*(.text.*)\n"
+"\t} >image\n"
+"\ttext_end = .;\n"
+"\n"
+"\t/*\n"
+"\t * Збираємо разом дані тільки для читання..\n"
+"\t */\n"
+"\t.rodata : ALIGN(4096) {\n"
+"\t\trodata_begin = .;\n"
+"\t\t*(.rodata.*)\n"
+"\t} >image\n"
+"\t.got : {\n"
+"\t\t*(.got)\n"
+"\t} >image\n"
+"\trodata_end = .;\n"
+"\n"
+"\t/*\n"
+"\t * Збираємо разом дані для читання і запису, включаючи .bss в кінці,\n"
+"\t * який буде обнулено кодом входу.\n"
+"\t */\n"
+"\t.data : ALIGN(4096) {\n"
+"\t\tdata_begin = .;\n"
+"\t\t*(.data.*)\n"
+"\t\t/*\n"
+"\t\t * Код точки входу передбачає, що .data має довжину, кратну 32\n"
+"\t\t * байтам.\n"
+"\t\t */\n"
+"\t\t. = ALIGN(32);\n"
+"\t\tdata_end = .;\n"
+"\t} >image\n"
+"\n"
+"\t\t/*\n"
+"\t\t * Все, що знаходиться за цією точкою, не буде включено до бінарного\n"
+"\t\t * файлу.\n"
+"\t\t */\n"
+"\tbin_end = .;\n"
+"\n"
+"\t/* Код точки входу передбачає, що .bss вирівняно по 16 байтів. */\n"
+"\t.bss : ALIGN(16)  {\n"
+"\t\tbss_begin = .;\n"
+"\t\t*(.bss.*)\n"
+"\t\t*(COMMON)\n"
+"\t\t. = ALIGN(16);\n"
+"\t\tbss_end = .;\n"
+"\t} >image\n"
+"\n"
+"\t.stack (NOLOAD) : ALIGN(4096) {\n"
+"\t\tboot_stack_begin = .;\n"
+"\t\t. += 40 * 4096;\n"
+"\t\t. = ALIGN(4096);\n"
+"\t\tboot_stack_end = .;\n"
+"\t} >image\n"
+"\n"
+"\t. = ALIGN(4K);\n"
+"\tPROVIDE(dma_region = .);\n"
+"\n"
+"\t/*\n"
+"\t * Видалити з образу невикористані секції.\n"
+"\t */\n"
+"\t/DISCARD/ : {\n"
+"\t\t/* Образ завантажується сам, тому йому не потрібні ці секції. */\n"
+"\t\t*(.gnu.hash)\n"
+"\t\t*(.hash)\n"
+"\t\t*(.interp)\n"
+"\t\t*(.eh_frame_hdr)\n"
+"\t\t*(.eh_frame)\n"
+"\t\t*(.note.gnu.build-id)\n"
+"\t}\n"
+"}\n"
+"```"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "_Makefile_ (you shouldn't need to change this):"
-msgstr "`Makefile` (це не потрібно змінювати):"
+msgstr "_Makefile_ (вам не потрібно це змінювати):"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "# Copyright 2023 Google LLC"
-msgstr ""
+msgstr "# Copyright 2023 Google LLC"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "$(shell uname -s)"
-msgstr ""
+msgstr "$(shell uname -s)"
 
 #: src/exercises/bare-metal/rtc.md
-#, fuzzy
 msgid "aarch64-linux-gnu"
-msgstr "aarch64-paging"
+msgstr "aarch64-linux-gnu"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "stdio -display none -kernel $< -s"
-msgstr ""
+msgstr "stdio -display none -kernel $< -s"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "cargo clean"
-msgstr ""
+msgstr "cargo clean"
 
 #: src/exercises/bare-metal/rtc.md
 msgid "Run the code in QEMU with `make qemu`."
@@ -20108,96 +20517,96 @@ msgstr "Запустіть код у QEMU за допомогою `make qemu`."
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "Bare Metal Rust Afternoon"
-msgstr "Rust на голому залізі Після обіду"
+msgstr "Rust на голому залізі. Полудень."
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "([back to exercise](rtc.md))"
 msgstr "([назад до вправи](rtc.md))"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
-#, fuzzy
 msgid "_main.rs_:"
-msgstr "`main.rs`:"
+msgstr "_main.rs_:"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Base address of the PL031 RTC.\n"
-msgstr ""
+msgstr "/// Базова адреса PL031 RTC.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// The IRQ used by the PL031 RTC.\n"
-msgstr ""
+msgstr "/// IRQ, що використовується PL031 RTC.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid ""
 "// Safe because `PL031_BASE_ADDRESS` is the base address of a PL031 device,\n"
 "    // and nothing else accesses that address range.\n"
 msgstr ""
+"// Безпечно, оскільки `PL031_BASE_ADDRESS` є базовою адресою пристрою "
+"PL031,\n"
+"    // і ніщо інше не має доступу до цього діапазону адресації.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"RTC: {time}\""
-msgstr ""
+msgstr "\"RTC: {time}\""
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "// Wait for 3 seconds, without interrupts.\n"
-msgstr ""
+msgstr "// Чекаємо 3 секунди, без переривань.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"Waiting for {}\""
-msgstr ""
+msgstr "\"Чекаємо на {}\""
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"matched={}, interrupt_pending={}\""
-msgstr ""
+msgstr "\"matched={}, interrupt_pending={}\""
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "\"Finished waiting\""
-msgstr ""
+msgstr "\"Дочекалися\""
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "// Wait another 3 seconds for an interrupt.\n"
-msgstr ""
+msgstr "// Чекаємо ще 3 секунди на переривання.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
-#, fuzzy
 msgid "_pl031.rs_:"
-msgstr "`pl031.rs`:"
+msgstr "_pl031.rs_:"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Data register\n"
-msgstr ""
+msgstr "/// Регістр даних\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Match register\n"
-msgstr ""
+msgstr "/// Регістр збігів\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Load register\n"
-msgstr ""
+msgstr "/// Регістр завантаження\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Control register\n"
-msgstr ""
+msgstr "/// Регістр управління\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Interrupt Mask Set or Clear register\n"
-msgstr ""
+msgstr "/// Регістр установки або очищення маски переривання\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Raw Interrupt Status\n"
-msgstr ""
+msgstr "/// Необроблений стан переривання\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Masked Interrupt Status\n"
-msgstr ""
+msgstr "/// Маскований статус переривання\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid "/// Interrupt Clear Register\n"
-msgstr ""
+msgstr "/// Регістр очищення переривання\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
-#, fuzzy
 msgid "/// Driver for a PL031 real-time clock.\n"
-msgstr "Напишемо драйвер для пристрою годин реального часу PL031."
+msgstr "/// Драйвер для годинника реального часу PL031.\n"
 
 #: src/exercises/bare-metal/solutions-afternoon.md
 msgid ""