From e6ec92131706e3b47b96a1d103cad2a1ef38f35e Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 26 Jun 2021 19:17:09 +0300 Subject: [PATCH 001/120] preabule --- .../01-freestanding-rust-binary/index.ru.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md new file mode 100644 index 000000000..220345920 --- /dev/null +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -0,0 +1,27 @@ ++++ +title = "Независимый бинанрник на Rust" +weight = 1 +path = "ru/freestanding-rust-binary" +date = 2018-02-10 + +[extra] +chapter = "С нуля" +translators = ["MrZloHex"] ++++ + +Первым шагом в создании собственного ядра операционной системы - это создание исполняемого файла на Rust, который не будет подключать стандартную библиотеку. Именно это дает возможность запускать Rust код на [голом металле][bare metal] без слоя операционной системы, которая связывает железо компьютера и программы. + +[bare metal]: https://en.wikipedia.org/wiki/Bare_machine + + + +Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-01`][post branch] ветке репозитория. + +[GitHub]: https://github.com/phil-opp/blog_os +[at the bottom]: #comments +[post branch]: https://github.com/phil-opp/blog_os/tree/post-01 + + + +## Введение +Для того, чтобы написать ядро операционной системы нужно \ No newline at end of file From 649009d71db0f830a82fd2d3f40ac184fab35e4a Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 26 Jun 2021 21:32:14 +0300 Subject: [PATCH 002/120] Introduction --- .../01-freestanding-rust-binary/index.ru.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 220345920..ef6aa0224 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -24,4 +24,23 @@ translators = ["MrZloHex"] ## Введение -Для того, чтобы написать ядро операционной системы нужно \ No newline at end of file +Для того, чтобы написать ядро операционной системы нужен код, который независит от операционной системы и ее свойств. Это озночает, что нельзя использовать потоки, файлы, [кучу][heap], сети, случайные числа, стандартный видео-вывод или другие возможности, которые предоставляет абстракция в виде ОС или очень специфичное железо. + +[heap]: https://en.wikipedia.org/wiki/Heap_(data_structure) + +Это значит, что нельзя использовать большинство [стандартных библиотек Rust][Rust Standart library], но также есть еще множество других возможностей, которые предоставляет Rust и их _можно использовать_. Как пример того, что можно использовать это: [итераторы][iterators], [замыкания][closures], [соответствия по шаблону][pattern matching], [опции][option] и[результат][result], [форматирование строк][string formatting] и, конечно же, [систему владения][ownership system]. Эти функции дают возможность для написания ядра в очень выразительном и высоко-уровневом стиле без беспокойства о [неопределенном поведении][undefined behavior] или [сохранности памяти][memory safety]. + +[option]: https://doc.rust-lang.org/core/option/ +[result]:https://doc.rust-lang.org/core/result/ +[Rust standard library]: https://doc.rust-lang.org/std/ +[iterators]: https://doc.rust-lang.org/book/ch13-02-iterators.html +[closures]: https://doc.rust-lang.org/book/ch13-01-closures.html +[pattern matching]: https://doc.rust-lang.org/book/ch06-00-enums.html +[string formatting]: https://doc.rust-lang.org/core/macro.write.html +[ownership system]: https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html +[undefined behavior]: https://www.nayuki.io/page/undefined-behavior-in-c-and-cplusplus-programs +[memory safety]: https://tonyarcieri.com/it-s-time-for-a-memory-safety-intervention + +Вместо создания ядра ОС на Rust, нужно создать исполняемы файл, который мог бы запускаться без абстракции в виде ОС. + +Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. \ No newline at end of file From c20ca02492c31e26d66f6900f3e2506c6149e432 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 26 Jun 2021 21:32:14 +0300 Subject: [PATCH 003/120] Introduction From e49aff172adb38701da68920f9b8a9080449d103 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 26 Jun 2021 21:43:58 +0300 Subject: [PATCH 004/120] Disactivation --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index ef6aa0224..88385f397 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -18,7 +18,7 @@ translators = ["MrZloHex"] Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-01`][post branch] ветке репозитория. [GitHub]: https://github.com/phil-opp/blog_os -[at the bottom]: #comments +[at the bottom]: #commentsний ком [post branch]: https://github.com/phil-opp/blog_os/tree/post-01 @@ -43,4 +43,6 @@ translators = ["MrZloHex"] Вместо создания ядра ОС на Rust, нужно создать исполняемы файл, который мог бы запускаться без абстракции в виде ОС. -Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. \ No newline at end of file +Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. + +## Дизактивация стандартной библиотеки \ No newline at end of file From 689978c88cdc137d30a16b482661ffb7a1db2237 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 26 Jun 2021 22:45:33 +0300 Subject: [PATCH 005/120] Disablaing std --- .../01-freestanding-rust-binary/index.ru.md | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 88385f397..8f3a88479 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -45,4 +45,27 @@ translators = ["MrZloHex"] Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. -## Дизактивация стандартной библиотеки \ No newline at end of file +## Дизактивация стандартной библиотеки +По стандарту, все модули Rust ссылаются на [стандартную библиотеку][standart library], которая зависит от операционной системы для таких возможностей как потоки, файлы, сети. Также она зависит от стандартной библиотки C `libc`, которая очень тесно взаимодействует с сервиса ОС. С тех пор как план - это написание операционной системы, нельзя использовать библиотеки, которые зависят от операционной системы. Следовательно стоит отключить автоматические добавление стандартной библиотеки через [`no_std` аттрибут][attribute]. + +[standard library]: https://doc.rust-lang.org/std/ +[attribute]: https://doc.rust-lang.org/1.30.0/book/first-edition/using-rust-without-the-standard-library.html + +Мы начнем с создания нового cargo проекта. Самый простой способ сделать это, через командную строку: + +``` +cargo new blog_os --bin -- edition 2018 +``` + +Я назвал этот проект `blog_os`, но вы можете назвать как вам угодно. Флаг `--bin` указывает на то, что мы хоти создать исполняемый бинарный файл (в сравнении с библиотекой) и флаг `--edition 2018` указывает, что мы хотим использовать [версию 2018][edition] Rust для нашего модуля. После выполнения комманды, cargo создаст каталог со следующей стркутурой: + +[edition]: https://doc.rust-lang.org/nightly/edition-guide/rust-2018/index.html + +``` +blog_os +├── Cargo.toml +└── src + └── main.rs +``` + +`Cargo.toml` содержит данные и конфигурацию модуля, такие как _название, автор, версию_ и _зависимости_ от других модулей и библиотек. Файл `src/main.rs` содержит корневой файл нашего модуля и главную `main` функцию. Можно скомпилировать модуль с помощью `cargo build` и после запустить скомпилированный `blog_os` бинарный файл в `target/debub` каталоге. \ No newline at end of file From 36b9727773c56caa389dbdfbaed912f0d1a64781 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 27 Jun 2021 12:04:31 +0300 Subject: [PATCH 006/120] no_std --- .../01-freestanding-rust-binary/index.ru.md | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 8f3a88479..db4e00718 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -68,4 +68,51 @@ blog_os └── main.rs ``` -`Cargo.toml` содержит данные и конфигурацию модуля, такие как _название, автор, версию_ и _зависимости_ от других модулей и библиотек. Файл `src/main.rs` содержит корневой файл нашего модуля и главную `main` функцию. Можно скомпилировать модуль с помощью `cargo build` и после запустить скомпилированный `blog_os` бинарный файл в `target/debub` каталоге. \ No newline at end of file +`Cargo.toml` содержит данные и конфигурацию модуля, такие как _название, автор, версию_ и _зависимости_ от других модулей и библиотек. Файл `src/main.rs` содержит корневой файл нашего модуля и главную `main` функцию. Можно скомпилировать модуль с помощью `cargo build` и после запустить скомпилированный `blog_os` бинарный файл в `target/debug` каталоге. + +### Аттрибут `no_std` + +В данный момент наш модуль не явно подключает стандартную библиотеку. Это можно испровить путем добавления [аттрибута `no_std`][attribute]: + +```rust +// main.rs + +#![no_std] + +fn main() { + println!("Hello, world!"); +} +``` + +Если попробывать скомпилировать прямо сейчас (с помоцью комманды `cargo build`), то появится следующая ошибка: + +``` +error: cannot find macro `println!` in this scope + --> src/main.rs:4:5 + | +4 | println!("Hello, world!"); + | ^^^^^^^ +``` + +Это ошибка объясняется тем, что [макрос `println`][macro] часть стандартной библиотеки, которая была отключена. Так что больше у накс нет возможности выводить на экран что либо. Но это имеет смысл, так как `println` печатает через [стандартный поток вывода][standart output], который, в свою очередь, является специальный файлом, описанным операционной системой. + +[macro]: https://doc.rust-lang.org/std/macro.println.html +[standart output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 + +Давайте уберем макрос `println` и попробуем скомпилировать еще раз: + +```rust +// main.rs + +#![no_std] + +fn main() {} +``` + +``` +> cargo build +error: `#[panic_handler]` function required, but not found +error: language item required, but not found: `eh_personality` +``` + +Сейчас компилятор не может найти `#[panic_handler]` функцию и _языковой предмет(`eh_personality`)_. \ No newline at end of file From 2497eb41883504c0080c43100705109eb30a97ee Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 27 Jun 2021 12:24:38 +0300 Subject: [PATCH 007/120] panic_handler --- .../01-freestanding-rust-binary/index.ru.md | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index db4e00718..52f1c5c62 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -115,4 +115,29 @@ error: `#[panic_handler]` function required, but not found error: language item required, but not found: `eh_personality` ``` -Сейчас компилятор не может найти `#[panic_handler]` функцию и _языковой предмет(`eh_personality`)_. \ No newline at end of file +Сейчас компилятор не может найти `#[panic_handler]` функцию и _языковой предмет(`eh_personality`)_. + +## Реализация _паники_ + +Аттрибут `pаnic_handler` определяет функцию, которая должна вызываться, когда происходит [паника (panic)][panic]. Стандартная библиотека предоставляет собственную функцию обработчика паники, но после отключения стандартной библиотеки ма должны написать собственный обработчик: + +[panic]: https://doc.rust-lang.org/stable/book/ch09-01-unrecoverable-errors-with-panic.html + +```rust +// in main.rs + +use core::panic::PanicInfo; + +/// This function is called on panic. +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} +``` + +Параметр [`PanicInfo`][PanicInfo] содержит название файла, строку где произошла паника и дополнительное сообщение с пояснением. Это функцию никогда ничего не должна возвращать и такая функция называется [расходящиеся функцию][diverging functions] и она возращает ["невозможный" тип]["never" type] `!`. На данный момент у нас нет особых инструментов, которые мы бы могли использовать, чтобы заполнить это функцию, поэтому мы просто войдем в бесконечный цикл. + +[PanicInfo]: https://doc.rust-lang.org/nightly/core/panic/struct.PanicInfo.html +[diverging function]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions +[“never” type]: https://doc.rust-lang.org/nightly/std/primitive.never.html + From f2eb77b095020bd500e7bb4a4cbce34e589f3a7c Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 27 Jun 2021 12:51:34 +0300 Subject: [PATCH 008/120] eh_personality --- .../posts/01-freestanding-rust-binary/index.ru.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 52f1c5c62..bf83c4526 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -141,3 +141,18 @@ fn panic(_info: &PanicInfo) -> ! { [diverging function]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions [“never” type]: https://doc.rust-lang.org/nightly/std/primitive.never.html +## Языковой предмет `eh_personality` + +Языковые предметы это специальный функции и типы, которые необходимы компилятору. Например, трэйт [`Copy`] эхто языковой предмет, которые указывает компилятору какой тип [_семантику копирования_][`Copy`]. Если мы посмотрим на исходный код [реализации][copy code] этого трэйта, то можно увидеть специальный аттрибут `#[lang = "copy"]`, которые указывает на то, что это языковой предмет. + +[`Copy`]: https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html +[copy code]: https://github.com/rust-lang/rust/blob/485397e49a02a3b7ff77c17e4a3f16c653925cb3/src/libcore/marker.rs#L296-L299 + +Хотя создание собственных реализаций языковых предметов возможна, это следует делать только в крайнем случае. Причина в том, что языковые предметы являются крайне нестабильными частями реализации и даже не проверяются на тип (поэтому компилятор даже не проверяет, имеет ли функция правильные типы аргументов). К счастью, существует более стабильный способ исправить вышеупомянутую ошибку языкового предмета. + +Языковой предмет [`eh_personality`][language item] указывает на функцию, которая используется для реализации [раскрутки стэка][stack unwinding]. По стандарту, Rust использует раскрутку для запуска деструктуров для всех _живых_ стэковых переменных в случае появлении [паники][panic]. Это гарантирует, что вся использованная память будет освобождена, и позволяет родительскому потоку перехватить панику и продолжить выполнение. Раскрутка очень сложный процесс и требует некоторых специльных библиотек ОС (например, [libunwind] для Linux или [structured exception handling] для Windows), так что мы не должны использовать их для нашей операицонной системы. + +[language item]: https://github.com/rust-lang/rust/blob/edb368491551a77d77a48446d4ee88b35490c565/src/libpanic_unwind/gcc.rs#L11-L45 +[stack unwinding]: https://www.bogotobogo.com/cplusplus/stackunwinding.php +[libunwind]: https://www.nongnu.org/libunwind/ +[structured exception handling]: https://docs.microsoft.com/de-de/windows/win32/debug/structured-exception-handling From ed106677c233da60393789797f471f9c100febe0 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 12:49:17 +0300 Subject: [PATCH 009/120] unwiding --- .../01-freestanding-rust-binary/index.ru.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index bf83c4526..f4a829d34 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -156,3 +156,28 @@ fn panic(_info: &PanicInfo) -> ! { [stack unwinding]: https://www.bogotobogo.com/cplusplus/stackunwinding.php [libunwind]: https://www.nongnu.org/libunwind/ [structured exception handling]: https://docs.microsoft.com/de-de/windows/win32/debug/structured-exception-handling + +### Отключение раскрутки + +Существуют и другие случаи использования, для которых раскрутка нежелательна, поэтому Rust предоставляет опцию [отмены при панике][abort on panic]. Это отключает генерацию информации о символах раскрутки и, таким образом, значительно уменьшает размер двоичного файла. Есть несколько мест, где мы можем отключить раскрутку. Самый простой способ - добавить следующие строки в наш `Cargo.toml`: + +```toml +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +``` + +Это устанавливает стратегию паники на `abort`(отмены) как для профиля `dev` (используемого для `cargo build`), так и для профиля `release` (используемого для `cargo build --release`). Теперь языковой предмет `eh_personality` больше не должен требоваться. + +[abort on panic]: https://github.com/rust-lang/rust/pull/32900 + +Теперь мы исправили обе вышеуказанные ошибки. Однако, если мы попытаемся скомпилировать его теперь, возникнет другая ошибка: + +``` +> cargo build +error: requires `start` lang_item +``` + +В нашей программе отсутствует языковой предмет `start`, который определяет начальную точку входа в программу. \ No newline at end of file From 5cabbbe3bde4f9a38c3c033fff3394ea6ad86a59 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 12:59:15 +0300 Subject: [PATCH 010/120] start --- .../posts/01-freestanding-rust-binary/index.ru.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index f4a829d34..0b4e54f18 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -180,4 +180,16 @@ panic = "abort" error: requires `start` lang_item ``` -В нашей программе отсутствует языковой предмет `start`, который определяет начальную точку входа в программу. \ No newline at end of file +В нашей программе отсутствует языковой предмет `start`, который определяет начальную точку входа в программу. + +## Аттрибут `start` + +Можно подумать, что функция `main` - это первая функция, вызываемая при запуске программы. Однако в большинстве языков есть [runtime система][runtime system], которая отвечает за такие вещи, как сборка мусора (например, в Java) или программные потоки (например, goroutines в Go). Эта система выполнения должна быть вызвана до `main`, поскольку ей необходимо инициализировать себя. + +[runtime system]: https://en.wikipedia.org/wiki/Runtime_system + +В типичном бинарном файле Rust, который использует стандартную библиотеку, выполнение начинается в библиотеке C runtime под названием `crt0` ("C runtime zero"), которая создает окружение для C приложения. Это включает создание стека и размещение аргументов в нужных регистрах. Затем C runtime вызывает [точку входа для приложения Rust][rt::lang_start], которая обозначается языковым предметом `start`. Rust имеет только очень маленький runtime, который заботится о некоторых мелочах, таких как установка защиты от переполнения стека или вывод сообщения при панике. Затем runtime вызывает функцию `main`. + +[rt::lang_start]: https://github.com/rust-lang/rust/blob/bb4d1491466d8239a7a5fd68bd605e3276e97afb/src/libstd/rt.rs#L32-L73 + +Наш независимый исполняемый файл не имеет доступа к runtime Rust и `crt0`, поэтому нам нужно определить собственную точку входа. Реализация языкового предмета `start` не поможет, поскольку он все равно потребует `crt0`. Вместо этого нам нужно напрямую переопределить точку входа `crt0`. From 3b2e9a31d6a8d982cfd78ca8ba515be11a0d3cde Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 13:10:20 +0300 Subject: [PATCH 011/120] entry point --- .../01-freestanding-rust-binary/index.ru.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 0b4e54f18..418b3f149 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -193,3 +193,42 @@ error: requires `start` lang_item [rt::lang_start]: https://github.com/rust-lang/rust/blob/bb4d1491466d8239a7a5fd68bd605e3276e97afb/src/libstd/rt.rs#L32-L73 Наш независимый исполняемый файл не имеет доступа к runtime Rust и `crt0`, поэтому нам нужно определить собственную точку входа. Реализация языкового предмета `start` не поможет, поскольку он все равно потребует `crt0`. Вместо этого нам нужно напрямую переопределить точку входа `crt0`. + +### Переопределение точки входа + +Чтобы сообщить компилятору Rust, что мы не хотим использовать стандартную цепочку точек входа, мы добавляем атрибут `#![no_main]`. + +```rust +#![no_std] +#![no_main] + +use core::panic::PanicInfo; + +/// This function is called on panic. +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} +``` + +Вы можете заметить, что мы удалили функцию `main`. Причина в том, что `main` не имеет смысла без стандартнлого runtime, которая ее вызывает. Вместо этого мы переопределили точку входа операционной системы нашей собственной функцией `_start`: + +```rust +#[no_mangle] +pub extern "C" fn _start() -> ! { + loop {} +} +``` + +Используя атрибут `#[no_mangle]`, мы отключаем [искажение имен][name mangling], чтобы гарантировать, что компилятор Rust действительно выводит функцию с именем `_start`. Без этого атрибута компилятор генерировал бы какой-нибудь загадочный символ `_ZN3blog_os4_start7hb173fedf945531caE`, чтобы дать каждой функции уникальное имя. Атрибут необходим, потому что на следующем этапе нам нужно сообщить имя функции точки входа компоновщику. + +Мы также должны пометить функцию как `extern "C"`, чтобы указать компилятору, что он должен использовать [соглашение о вызове C][C calling convention] для этой функции (вместо неопределенного соглашения о вызове Rust). Причина именования функции `_start` в том, что это имя точки входа по умолчанию для большинства систем. + +[name mangling]: https://en.wikipedia.org/wiki/Name_mangling +[C calling convention]: https://en.wikipedia.org/wiki/Calling_convention + +Тип возврата `!` означает, что функция является расходящейся, т.е. не имеет права возвращаться. Это необходимо, поскольку точка входа не вызывается никакой функцией, а вызывается непосредственно операционной системой или загрузчиком. Поэтому вместо возврата точка входа должна, например, вызывать [системный вызов `exit`][`exit` system call] операционной системы. В нашем случае разумным действием может быть выключение машины, поскольку в случае возврата автономного двоичного файла делать нечего. Пока что мы выполняем это требование путем бесконечного цикла. + +[`exit` system call]: https://en.wikipedia.org/wiki/Exit_(system_call) + +Если мы выполним `cargo build` сейчас, мы получаем ошибку компоновщика (_linker_ error). From 10f2e54b14c344e87dd43d72a603b28d023d159e Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 13:36:32 +0300 Subject: [PATCH 012/120] summary --- .../01-freestanding-rust-binary/index.ru.md | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 418b3f149..9c31faedb 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -232,3 +232,128 @@ pub extern "C" fn _start() -> ! { [`exit` system call]: https://en.wikipedia.org/wiki/Exit_(system_call) Если мы выполним `cargo build` сейчас, мы получаем ошибку компоновщика (_linker_ error). + +## Ошибки компоновщика + +Компоновщик - это программа, которая объединяет сгенерированный код в исполняемый файл. Поскольку формат исполняемого файла отличается в Linux, Windows и macOS, в каждой системе есть свой компоновщик, который выдает разные ошибки. Основная причина ошибок одна и та же: конфигурация компоновщика по умолчанию предполагает, что наша программа зависит от C runtime, а это не так. + +Чтобы устранить ошибки, нам нужно сообщить компоновщику, что он не должен включать C runtime. Мы можем сделать это, передав компоновщику определенный набор аргументов или выполнив компиляцию для голого железа. + +### Компиляция для голого железа + +По умолчанию Rust пытается создать исполняемый файл, который может быть запущен в вашем текущем системном окружении. Например, если вы используете Windows на `x86_64`, Rust пытается создать исполняемый файл `.exe` Windows, который использует инструкции `x86_64`. Это окружение называется вашей "хост-системой". + +Для описания различных окружений Rust использует строку [_target triple_]. Вы можете узнать тройку вашей хост-системы, выполнив команду `rustc --version --verbose`: + +[_target triple_]: https://clang.llvm.org/docs/CrossCompilation.html#target-triple + +``` +rustc 1.35.0-nightly (474e7a648 2019-04-07) +binary: rustc +commit-hash: 474e7a6486758ea6fc761893b1a49cd9076fb0ab +commit-date: 2019-04-07 +host: x86_64-unknown-linux-gnu +release: 1.35.0-nightly +LLVM version: 8.0 +``` + +Приведенный выше результат получен от системы `x86_64` Linux. Мы видим, что тройка `host` - это `x86_64-unknown-linux-gnu`, которая включает архитектуру процессора (`x86_64`), производителя (`unknown`), операционную систему (`linux`) и [ABI] (`gnu`). + +[ABI]: https://en.wikipedia.org/wiki/Application_binary_interface + +Компилируя для нашей тройки хоста, компилятор Rust и компоновщик предполагают наличие базовой операционной системы, такой как Linux или Windows, которая по умолчанию использует C runtime, что вызывает ошибки компоновщика. Поэтому, чтобы избежать ошибок компоновщика, мы можем скомпилировать для другого окружения без базовой операционной системы. + +Примером такого "голого" окружения является тройка `thumbv7em-none-eabihf`, которая описывает [ARM] архитектуру. Детали не важны, важно лишь то, что тройка не имеет базовой операционной системы, на что указывает `none` в тройке. Чтобы иметь возможность компилировать для этой системы, нам нужно добавить ее в rustup: + +[ARM]: https://en.wikipedia.org/wiki/ARM_architecture + +``` +rustup target add thumbv7em-none-eabihf +``` + +Это загружает копию стандартной (и корневой) библиотеки для системы. Теперь мы можем собрать наш независимый исполняемый файл для этой системы: + +``` +cargo build --target thumbv7em-none-eabihf +``` + +Передавая аргумент `--target`, мы [кросс-компилируем][cross compile] наш исполняемый файл для голого железа. Поскольку система, под которую мы компилируем, не имеет операционной системы, компоновщик не пытается компоновать C runtime, и наша компиляция проходит успешно без каких-либо ошибок компоновщика. + +[cross compile]: https://en.wikipedia.org/wiki/Cross_compiler + +Именно этот подход мы будем использовать для сборки ядра нашей ОС. Вместо `thumbv7em-none-eabihf` мы будем использовать [custom target], который описывает `x86_64` архитектуру окружения. Подробности будут описаны в следующем посте. + +[custom target]: https://doc.rust-lang.org/rustc/targets/custom.html + +### Аргументы компоновщика + +Вместо компиляции для голой системы можно также разрешить ошибки компоновщика, передав ему определенный набор аргументов. Мы не будем использовать этот подход для нашего ядра, поэтому данный раздел является необязательным и приводится только для полноты картины. Щелкните на _"Аргументы компоновщика"_ ниже, чтобы показать необязательное содержание. + +
+ +Аргументы компоновщика + + +
+ +## Итоги + +Минимальный независимый исполняемый бинарный файл Rust выглядит примерно так: + +`src/main.rs`: + +```rust +#![no_std] // don't link the Rust standard library +#![no_main] // disable all Rust-level entry points + +use core::panic::PanicInfo; + +#[no_mangle] // don't mangle the name of this function +pub extern "C" fn _start() -> ! { + // this function is the entry point, since the linker looks for a function + // named `_start` by default + loop {} +} + +/// This function is called on panic. +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} +``` + +`Cargo.toml`: + +```toml +[package] +name = "crate_name" +version = "0.1.0" +authors = ["Author Name "] + +# the profile used for `cargo build` +[profile.dev] +panic = "abort" # disable stack unwinding on panic + +# the profile used for `cargo build --release` +[profile.release] +panic = "abort" # disable stack unwinding on panic +``` + +Для компиляции этого бинарного файла, мы должны компиляровать для голой системы, такой как `thumbv7em-none-eabihf`: + +``` +cargo build --target thumbv7em-none-eabihf +``` + +В качестве альтернативы, мы можем скомпилировать его для хост-системы, передав дополнительные аргументы компоновщика: + +```bash +# Linux +cargo rustc -- -C link-arg=-nostartfiles +# Windows +cargo rustc -- -C link-args="/ENTRY:_start /SUBSYSTEM:console" +# macOS +cargo rustc -- -C link-args="-e __start -static -nostartfiles" +``` + +Обратите внимание, что это лишь минимальный пример независимого бинарного файла Rust. Этот бинарник ожидает различных вещей, например, что стек инициализируется при вызове функции `_start`. **Поэтому для любого реального использования такого бинарного файла требуется больше шагов разработки**. From 402ba40de3ada5430b49a1045ce023101fd01735 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 13:38:21 +0300 Subject: [PATCH 013/120] what's next --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 9c31faedb..c4da95e0d 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -357,3 +357,9 @@ cargo rustc -- -C link-args="-e __start -static -nostartfiles" ``` Обратите внимание, что это лишь минимальный пример независимого бинарного файла Rust. Этот бинарник ожидает различных вещей, например, что стек инициализируется при вызове функции `_start`. **Поэтому для любого реального использования такого бинарного файла требуется больше шагов разработки**. + +## Что дальше? + +В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание пользовательской системы, объединение нашего исполняемого файла с загрузчиком и изучение того, как вывести что-то на экран. + +[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md \ No newline at end of file From 2df9bbf03b7cba83ae3438b15cfd5058c4149848 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 29 Jun 2021 13:54:53 +0300 Subject: [PATCH 014/120] Details --- .../01-freestanding-rust-binary/index.ru.md | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index c4da95e0d..bedd08bb5 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -293,6 +293,161 @@ cargo build --target thumbv7em-none-eabihf Аргументы компоновщика +В этом разделе мы рассмотрим ошибки компоновщика, возникающие в Linux, Windows и macOS, и объясним, как их решить, передав компоновщику дополнительные аргументы. Обратите внимание, что формат исполняемого файла и компоновщик отличаются в разных операционных системах, поэтому для каждой системы требуется свой набор аргументов. + +#### Linux + +На Linux возникает следующая ошибка компоновщика (сокращенно): + +``` +error: linking with `cc` failed: exit code: 1 + | + = note: "cc" […] + = note: /usr/lib/gcc/../x86_64-linux-gnu/Scrt1.o: In function `_start': + (.text+0x12): undefined reference to `__libc_csu_fini' + /usr/lib/gcc/../x86_64-linux-gnu/Scrt1.o: In function `_start': + (.text+0x19): undefined reference to `__libc_csu_init' + /usr/lib/gcc/../x86_64-linux-gnu/Scrt1.o: In function `_start': + (.text+0x25): undefined reference to `__libc_start_main' + collect2: error: ld returned 1 exit status +``` + +Проблема заключается в том, что компоновщик по умолчанию включает процедуру запуска C runtime, которая также называется `_start`. Она требует некоторых символов стандартной библиотеки C `libc`, которые мы не включаем из-за атрибута `no_std`, поэтому компоновщик не может подключить эти библиотеки, поэтому появляются ошибки. Чтобы решить эту проблему, мы можем сказать компоновщику, что он не должен компоновать процедуру запуска C, передав флаг `-nostartfiles`. + +Одним из способов передачи атрибутов компоновщика через cargo является команда `cargo rustc`. Команда ведет себя точно так же, как `cargo build`, но позволяет передавать опции `rustc`, базовому компилятору Rust. У `rustc` есть флаг `-C link-arg`, который передает аргумент компоновщику. В совокупности наша новая команда сборки выглядит следующим образом: + +``` +cargo rustc -- -C link-arg=-nostartfiles +``` + +Теперь наш модуль собирается как независимый исполняемый файл в Linux! + +Нам не нужно было явно указывать имя нашей функции точки входа, поскольку компоновщик по умолчанию ищет функцию с именем `_start`. + +#### Windows + +В Windows возникает другая ошибка компоновщика (сокращенно): + +``` +error: linking with `link.exe` failed: exit code: 1561 + | + = note: "C:\\Program Files (x86)\\…\\link.exe" […] + = note: LINK : fatal error LNK1561: entry point must be defined +``` + +Ошибка "точка входа должна быть определена"(_"entry point must be defined"_) означает, что компоновщик не может найти точку входа. В Windows имя точки входа по умолчанию [зависит от используемой подсистемы][windows-subsystems]. Для подсистемы `CONSOLE` компоновщик ищет функцию с именем `mainCRTStartup`, а для подсистемы `WINDOWS` - функцию с именем `WinMainCRTStartup`. Чтобы переопределить названия точки входа на `_start`, мы можем передать компоновщику аргумент `/ENTRY`: + +[windows-subsystems]: https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol + +``` +cargo rustc -- -C link-arg=/ENTRY:_start +``` + +Из разного формата аргументов мы ясно видим, что компоновщик Windows - это совершенно другая программа, чем компоновщик Linux. + +Теперь возникает другая ошибка компоновщика: + +``` +error: linking with `link.exe` failed: exit code: 1221 + | + = note: "C:\\Program Files (x86)\\…\\link.exe" […] + = note: LINK : fatal error LNK1221: a subsystem can't be inferred and must be + defined +``` + +Эта ошибка возникает из-за того, что исполняемые файлы Windows могут использовать различные [подсистемы][windows-subsystems]. Для обычных программ они определяются в зависимости от имени точки входа: если точка входа называется `main`, то используется подсистема `CONSOLE`, а если точка входа называется `WinMain`, то используется подсистема `WINDOWS`. Поскольку наша функция `_start` имеет другое имя, нам нужно явно указать подсистему: + +``` +cargo rustc -- -C link-args="/ENTRY:_start /SUBSYSTEM:console" +``` + +Здесь мы используем подсистему `CONSOLE`, но подойдет и подсистема `WINDOWS`. Вместо того, чтобы передавать `-C link-arg` несколько раз, мы используем `-C link-args`, который принимает список аргументов, разделенных пробелами. + +С помощью этой команды наш исполняемый файл должен успешно скомпилироваться под Windows. + +#### macOS + +На macOS возникает следующая ошибка компоновщика (сокращенно): + +``` +error: linking with `cc` failed: exit code: 1 + | + = note: "cc" […] + = note: ld: entry point (_main) undefined. for architecture x86_64 + clang: error: linker command failed with exit code 1 […] +``` + +Это сообщение об ошибке говорит нам, что компоновщик не может найти функцию точки входа с именем по умолчанию `main` (по какой-то причине в macOS все функции имеют префикс `_`). Чтобы установить точку входа в нашу функцию `_start`, мы передаем аргумент компоновщика `-e`: + +``` +cargo rustc -- -C link-args="-e __start" +``` + +Флаг `-e` задает имя функции точки входа. Поскольку в macOS все функции имеют дополнительный префикс `_`, нам нужно установить точку входа на `__start` вместо `_start`. + +Теперь возникает следующая ошибка компоновщика: + +``` +error: linking with `cc` failed: exit code: 1 + | + = note: "cc" […] + = note: ld: dynamic main executables must link with libSystem.dylib + for architecture x86_64 + clang: error: linker command failed with exit code 1 […] +``` + +macOS [официально не поддерживает статически скомпонованные двоичные файлы][static binary] и по умолчанию требует от программ компоновки библиотеки `libSystem`. Чтобы отменить это и скомпоновать статический двоичный файл, мы передаем компоновщику флаг `-static`: + +[static binary]: https://developer.apple.com/library/archive/qa/qa1118/_index.html + +``` +cargo rustc -- -C link-args="-e __start -static" +``` + +Этого все равно недостаточно, так как возникает третья ошибка компоновщика: + +``` +error: linking with `cc` failed: exit code: 1 + | + = note: "cc" […] + = note: ld: library not found for -lcrt0.o + clang: error: linker command failed with exit code 1 […] +``` + +Эта ошибка возникает из-за того, что программы на macOS по умолчанию ссылаются на `crt0` ("C runtime zero"). Это похоже на ошибку, которую мы имели в Linux, и также может быть решена добавлением аргумента компоновщика `-nostartfiles`: + +``` +cargo rustc -- -C link-args="-e __start -static -nostartfiles" +``` + +Теперь наша программа должна успешно скомпилироваться на macOS. + +#### Объединение команд сборки + +Сейчас у нас разные команды сборки в зависимости от платформы хоста, что не идеально. Чтобы избежать этого, мы можем создать файл с именем `.cargo/config.toml`, который будет содержать аргументы для конкретной платформы: + +```toml +# in .cargo/config.toml + +[target.'cfg(target_os = "linux")'] +rustflags = ["-C", "link-arg=-nostartfiles"] + +[target.'cfg(target_os = "windows")'] +rustflags = ["-C", "link-args=/ENTRY:_start /SUBSYSTEM:console"] + +[target.'cfg(target_os = "macos")'] +rustflags = ["-C", "link-args=-e __start -static -nostartfiles"] +``` + +Ключ `rustflags` содержит аргументы, которые автоматически добавляются к каждому вызову `rustc`. Более подробную информацию о файле `.cargo/config.toml` можно найти в [официальной документации](https://doc.rust-lang.org/cargo/reference/config.html). + +Теперь наша программа должна собираться на всех трех платформах с помощью простой `cargo build`. + +#### Должны ли вы это делать? + +Хотя можно создать отдельный исполняемый файл для Linux, Windows и macOS, это, вероятно, не очень хорошая идея. Причина в том, что наш исполняемый файл все еще ожидает различных вещей, например, инициализации стека при вызове функции `_start`. Без C runtime некоторые из этих требований могут быть не выполнены, что может привести к сбою нашей программы, например, из-за ошибки сегментации. + +Если вы хотите создать минимальный двоичный файл, работающий поверх существующей операционной системы, то включение `libc` и установка атрибута `#[start]`, как описано [здесь] (https://doc.rust-lang.org/1.16.0/book/no-stdlib.html), вероятно, будет лучшей идеей. From fb9d01bae1e8f38d02443a3481c300d1268ff9c2 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 11:04:26 +0300 Subject: [PATCH 015/120] fix: title --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index bedd08bb5..00254043a 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -1,5 +1,5 @@ +++ -title = "Независимый бинанрник на Rust" +title = "Независимый бинарный файл на Rust" weight = 1 path = "ru/freestanding-rust-binary" date = 2018-02-10 @@ -517,4 +517,4 @@ cargo rustc -- -C link-args="-e __start -static -nostartfiles" В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание пользовательской системы, объединение нашего исполняемого файла с загрузчиком и изучение того, как вывести что-то на экран. -[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md \ No newline at end of file +[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md From 564431ab95f4f6ec105cd161674f36d79f4d0b8c Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:02:22 +0300 Subject: [PATCH 016/120] config --- blog/config.toml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/blog/config.toml b/blog/config.toml index f65cebdb9..d63a5f528 100644 --- a/blog/config.toml +++ b/blog/config.toml @@ -12,6 +12,7 @@ languages = [ { code = "zh-TW" }, # Chinese (traditional) { code = "ja" }, # Japanese { code = "fa" }, # Persian + { code = "ru" }, # Russian ] ignored_content = ["*/README.md"] @@ -97,3 +98,17 @@ translated_content = "محتوای ترجمه شده:" translated_content_notice = "این یک ترجمه از جامعه کاربران برای پست _original.title_ است. ممکن است ناقص، منسوخ شده یا دارای خطا باشد. لطفا هر گونه مشکل را در این ایشو گزارش دهید!" translated_by = "ترجمه توسط" word_separator = "و" + + +[translation.ru] +lang_name = "Russian" +toc = "Содержание" +all_posts = "« Все посты" +comments = "Комментарии" +comments_notice = "Пожалуйста оставляйте комментарии на английском по возможности." +readmore = "читать дальше »" +not_translated = "(Этот пост еще не переведен.)" +translated_content = "Переведенное содержание:" +translated_content_notice = "Это перевод сообщества поста _original.title_. Он может быть неполным, устаревшим или содержать ошибки. Пожалуйста, сообщайте о любых проблемах!" +translated_by = "Перевод сделан" +word_separator = "и" \ No newline at end of file From 4754dd6980f595c8af81e1af8e0f204315cfd134 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:06:29 +0300 Subject: [PATCH 017/120] next post fix --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md new file mode 100644 index 000000000..e69de29bb From 7b7b320468ee2feeb88300a6d7968a132084bf4a Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:08:51 +0300 Subject: [PATCH 018/120] tabs into spaces --- blog/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/config.toml b/blog/config.toml index d63a5f528..183ba5118 100644 --- a/blog/config.toml +++ b/blog/config.toml @@ -12,7 +12,7 @@ languages = [ { code = "zh-TW" }, # Chinese (traditional) { code = "ja" }, # Japanese { code = "fa" }, # Persian - { code = "ru" }, # Russian + { code = "ru" }, # Russian ] ignored_content = ["*/README.md"] From b45694bad0bf3d2aa53b2cff9e28f18d52ebba8b Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:11:07 +0300 Subject: [PATCH 019/120] fix: correct link to 02 post --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 00254043a..aa501a2b6 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -517,4 +517,4 @@ cargo rustc -- -C link-args="-e __start -static -nostartfiles" В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание пользовательской системы, объединение нашего исполняемого файла с загрузчиком и изучение того, как вывести что-то на экран. -[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md +[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.md diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md deleted file mode 100644 index e69de29bb..000000000 From 21c5df1883d0f1fa3e8e075cfcfa717c8fd2f724 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:16:27 +0300 Subject: [PATCH 020/120] fix: bad gateway --- blog/content/edition-2/extra/building-on-android/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/extra/building-on-android/index.md b/blog/content/edition-2/extra/building-on-android/index.md index 2e0bcb392..0ec2235a4 100644 --- a/blog/content/edition-2/extra/building-on-android/index.md +++ b/blog/content/edition-2/extra/building-on-android/index.md @@ -13,7 +13,7 @@ I finally managed to get `blog_os` building on my Android phone using [termux](h ### Install Termux and Nightly Rust -First, install [termux](https://termux.com/) from the [Google Play Store](https://play.google.com/store/apps/details?id=com.termux) or from [F-Droid](https://f-droid.org/packages/com.termux/). After installing, open it and perform the following steps: +First, install [termux](https://termux.com/) from the [Google Play Store](https://play.google.com/store/apps/details?id=com.termux) or from F-Droid. After installing, open it and perform the following steps: - Install fish shell, set as default shell, and launch it: ``` From 93f60237a26fd23055b8c3b720a66cc7ce2fded6 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Wed, 30 Jun 2021 14:18:18 +0300 Subject: [PATCH 021/120] fix: typo error --- blog/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/config.toml b/blog/config.toml index 183ba5118..db152b273 100644 --- a/blog/config.toml +++ b/blog/config.toml @@ -100,7 +100,7 @@ translated_by = "ترجمه توسط" word_separator = "و" -[translation.ru] +[translations.ru] lang_name = "Russian" toc = "Содержание" all_posts = "« Все посты" From d1a6b56949b7bf59158530694c55fcb0acd1c8bc Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:11:31 +0300 Subject: [PATCH 022/120] TRANSITION TO SECOND POST --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index aa501a2b6..00254043a 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -517,4 +517,4 @@ cargo rustc -- -C link-args="-e __start -static -nostartfiles" В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание пользовательской системы, объединение нашего исполняемого файла с загрузчиком и изучение того, как вывести что-то на экран. -[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.md +[next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md new file mode 100644 index 000000000..e69de29bb From 573abff05542533fd754039d9405506f40c7cbe9 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:14:37 +0300 Subject: [PATCH 023/120] HEADER --- .../posts/02-minimal-rust-kernel/index.ru.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index e69de29bb..e21999fed 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -0,0 +1,11 @@ ++++ +title = "Минимально возможное ядро на Rust" +weight = 2 +path = "ru/minimal-rust-kernel" +date = 2018-02-10 + +[extra] +chapter = "С нуля" +translators = ["MrZloHex"] ++++ + From 6eec17dc9d46403e9f8c0f95f29fb7b8b51a47fa Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:21:45 +0300 Subject: [PATCH 024/120] PREAMBULE --- .../posts/01-freestanding-rust-binary/index.ru.md | 2 +- .../posts/02-minimal-rust-kernel/index.ru.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 00254043a..0cf220bbc 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -18,7 +18,7 @@ translators = ["MrZloHex"] Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-01`][post branch] ветке репозитория. [GitHub]: https://github.com/phil-opp/blog_os -[at the bottom]: #commentsний ком +[at the bottom]: #comments [post branch]: https://github.com/phil-opp/blog_os/tree/post-01 diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index e21999fed..4006550e7 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -9,3 +9,15 @@ chapter = "С нуля" translators = ["MrZloHex"] +++ +В этом посте мы создадим минимальное 64-битное ядро на Rust для архитектуры x86_64. Мы будем отталкиваться от [независимого бинарного файла][freestanding Rust binary] из предыдущего поста для создания загрузочного образа диска, который может что-то выводить на экран. + +[freestanding Rust binary]: @/edition-2/posts/01-freestanding-rust-binary/index.ru.md + + +Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-02`][post branch] ветке репозитория. + +[GitHub]: https://github.com/phil-opp/blog_os +[at the bottom]: #comments +[post branch]: https://github.com/phil-opp/blog_os/tree/post-02 + + \ No newline at end of file From 0670bb297dcc25a6a3833ee615a5b0e4d3eac48d Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:29:42 +0300 Subject: [PATCH 025/120] BOOT SEQUENCE --- .../posts/02-minimal-rust-kernel/index.ru.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 4006550e7..7e6d91644 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -20,4 +20,18 @@ translators = ["MrZloHex"] [at the bottom]: #comments [post branch]: https://github.com/phil-opp/blog_os/tree/post-02 - \ No newline at end of file + + +## Последовательность процессов запуска + +Когда вы включаете компьютер, он начинает выполнять код микропрограммы, который хранится в [ПЗУ][ROM] материнской платы. Этот код выполняет [самотестирование при включении][power-on self-test], определяет доступную оперативную память и выполняет предварительную инициализацию процессора и аппаратного обеспечения. После этого он ищет загрузочный диск и начинает загрузку ядра операционной системы. + +[ROM]: https://en.wikipedia.org/wiki/Read-only_memory +[power-on self-test]: https://en.wikipedia.org/wiki/Power-on_self-test + +Для архитектуры x86 существует два стандарта прошивки: “Basic Input/Output System“ ("Базовая система ввода/вывода" **[BIOS]**) и более новый “Unified Extensible Firmware Interface” ("Унифицированный расширяемый интерфейс прошивки" **[UEFI]**). Стандарт BIOS - старый и устаревший, но простой и хорошо поддерживаемый на любой машине x86 с 1980-х годов. UEFI, напротив, более современный и имеет гораздо больше возможностей, но более сложен в настройке (по крайней мере, на мой взгляд). + +[BIOS]: https://en.wikipedia.org/wiki/BIOS +[UEFI]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface + +В данный момент, мы обеспечиваем поддержку только BIOS, но планируется поддержка и UEFI. Если вы хотите помочь нам в этом, обратитесь к [Github issue](https://github.com/phil-opp/blog_os/issues/349). \ No newline at end of file From 528d74295f00bcc1bb92e27cb091ee392f4d7d96 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:36:59 +0300 Subject: [PATCH 026/120] BOOT BIOS --- .../posts/02-minimal-rust-kernel/index.ru.md | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 7e6d91644..554220a77 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -34,4 +34,26 @@ translators = ["MrZloHex"] [BIOS]: https://en.wikipedia.org/wiki/BIOS [UEFI]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface -В данный момент, мы обеспечиваем поддержку только BIOS, но планируется поддержка и UEFI. Если вы хотите помочь нам в этом, обратитесь к [Github issue](https://github.com/phil-opp/blog_os/issues/349). \ No newline at end of file +В данный момент, мы обеспечиваем поддержку только BIOS, но планируется поддержка и UEFI. Если вы хотите помочь нам в этом, обратитесь к [Github issue](https://github.com/phil-opp/blog_os/issues/349). + +## Запуск BIOS + +Почти все системы x86 имеют поддержку загрузки BIOS, включая более новые машины на базе UEFI, которые используют эмулированный BIOS. Это замечательно, потому что вы можете использовать одну и ту же логику загрузки на всех машинах из прошлых веков. Но такая широкая совместимость одновременно является и самым большим недостатком загрузки BIOS, поскольку это означает, что перед загрузкой процессор переводится в 16-битный режим совместимости под названием [реальный режим], чтобы архаичные загрузчики 1980-х годов все еще работали. + +Но давайте начнем с самого начала: + +Когда вы включаете компьютер, он загружает BIOS из специальной флэш-памяти, расположенной на материнской плате. BIOS запускает процедуры самодиагностики и инициализации оборудования, затем ищет загрузочные диски. Если он находит такой, управление передается _загрузчику_, который представляет собой 512-байтовую порцию исполняемого кода, хранящуюся в начале диска. Большинство загрузчиков имеют размер более 512 байт, поэтому загрузчики обычно разделяются на небольшой первый этап, который помещается в 512 байт, и второй этап, который впоследствии загружается первым этапом. + +Загрузчик должен определить расположение образа ядра на диске и загрузить его в память. Он также должен переключить процессор из 16-битного [реального режима][real mode] сначала в 32-битный [защищенный режим][protected mode], а затем в 64-битный [длинный режим][long mode], где доступны 64-битные регистры и вся основная память. Третья задача - запросить определенную информацию (например, карту памяти) у BIOS и передать ее ядру ОС. + +[real mode]: https://en.wikipedia.org/wiki/Real_mode +[protected mode]: https://en.wikipedia.org/wiki/Protected_mode +[long mode]: https://en.wikipedia.org/wiki/Long_mode +[memory segmentation]: https://en.wikipedia.org/wiki/X86_memory_segmentation + +Написание загрузчика немного громоздко, поскольку требует использования языка ассемблера и множества неинтересных действий, таких как "запишите это магическое значение в этот регистр процессора". Поэтому мы не рассматриваем создание загрузчика в этом посте и вместо этого предоставляем инструмент под названием [bootimage], который автоматически добавляет загрузчик к вашему ядру. + +[bootimage]: https://github.com/rust-osdev/bootimage + +Если вы заинтересованы в создании собственного загрузчика: Оставайтесь с нами, набор постов на эту тему уже запланирован! + From 8bd6fa0b99eb2b6db4f46f8d187124831d430ddb Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:50:23 +0300 Subject: [PATCH 027/120] MULTIBOOT --- .../posts/02-minimal-rust-kernel/index.ru.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 554220a77..409d981dc 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -57,3 +57,26 @@ translators = ["MrZloHex"] Если вы заинтересованы в создании собственного загрузчика: Оставайтесь с нами, набор постов на эту тему уже запланирован! +#### Стандарт Multiboot + +Чтобы избежать того, что каждая операционная система реализует свой собственный загрузчик, который совместим только с одной ОС, [Free Software Foundation] в 1995 году создал открытый стандарт загрузчика под названием [Multiboot]. Стандарт определяет интерфейс между загрузчиком и операционной системой, так что любой совместимый с Multiboot загрузчик может загружать любую совместимую с Multiboot операционную систему. Эталонной реализацией является [GNU GRUB], который является самым популярным загрузчиком для систем Linux. + +[Free Software Foundation]: https://en.wikipedia.org/wiki/Free_Software_Foundation +[Multiboot]: https://wiki.osdev.org/Multiboot +[GNU GRUB]: https://en.wikipedia.org/wiki/GNU_GRUB + +Чтобы сделать ядро совместимым с Multiboot, нужно просто вставить так называемый [Multiboot заголовок][Multiboot header] в начало файла ядра. Это делает загрузку ОС в GRUB очень простой. Однако у GRUB и стандарта Multiboot есть и некоторые проблемы: + +[Multiboot header]: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format + +- Они поддерживают только 32-битный защищенный режим. Это означает, что для перехода на 64-битный длинный режим необходимо выполнить конфигурацию процессора. +- Они предназначены для того, чтобы упростить загрузчик вместо ядра. Например, ядро должно быть связано с [скорректированным размером страницы по умолчанию][adjusted default page size], потому что иначе GRUB не сможет найти заголовок Multiboot. Другой пример - [информация запуска][boot information], которая передается ядру, содержит множество структур, зависящих от архитектуры, вместо того, чтобы предоставлять чистые абстракции. +- И GRUB, и стандарт Multiboot документированы очень скудно. +- GRUB должен быть установлен на хост-системе, чтобы создать загрузочный образ диска из файла ядра. Это усложняет разработку под Windows или Mac. + +[adjusted default page size]: https://wiki.osdev.org/Multiboot#Multiboot_2 +[boot information]: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Boot-information-format + +Из-за этих недостатков мы решили не использовать GRUB или стандарт Multiboot. Однако мы планируем добавить поддержку Multiboot в наш инструмент [bootimage], чтобы можно было загружать ваше ядро и на системе GRUB. Если вы заинтересованы в написании ядра, совместимого с Multiboot, ознакомьтесь с [первым выпуском][first edition] этой серии блогов. + +[first edition]: @/edition-1/_index.md \ No newline at end of file From 1c975a0cc4146d421cea198f935c128f6fcaa8c6 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 4 Jul 2021 00:51:01 +0300 Subject: [PATCH 028/120] UEFI --- .../edition-2/posts/02-minimal-rust-kernel/index.ru.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 409d981dc..a61224c93 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -79,4 +79,8 @@ translators = ["MrZloHex"] Из-за этих недостатков мы решили не использовать GRUB или стандарт Multiboot. Однако мы планируем добавить поддержку Multiboot в наш инструмент [bootimage], чтобы можно было загружать ваше ядро и на системе GRUB. Если вы заинтересованы в написании ядра, совместимого с Multiboot, ознакомьтесь с [первым выпуском][first edition] этой серии блогов. -[first edition]: @/edition-1/_index.md \ No newline at end of file +[first edition]: @/edition-1/_index.md + +### UEFI + +(На данный момент мы не предоставляем поддержку UEFI, но мы бы хотели! Если вы хотите помочь, пожалуйста, сообщите нам об этом в [Github issue](https://github.com/phil-opp/blog_os/issues/349)). \ No newline at end of file From 308387ff52668be83ee81a2802f21a13519746d4 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Mon, 5 Jul 2021 13:18:48 +0300 Subject: [PATCH 029/120] MINIMAL KERNEL --- .../edition-2/posts/02-minimal-rust-kernel/index.ru.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index a61224c93..43a23f4f9 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -83,4 +83,11 @@ translators = ["MrZloHex"] ### UEFI -(На данный момент мы не предоставляем поддержку UEFI, но мы бы хотели! Если вы хотите помочь, пожалуйста, сообщите нам об этом в [Github issue](https://github.com/phil-opp/blog_os/issues/349)). \ No newline at end of file +(На данный момент мы не предоставляем поддержку UEFI, но мы бы хотели! Если вы хотите помочь, пожалуйста, сообщите нам об этом в [Github issue](https://github.com/phil-opp/blog_os/issues/349).) + +## Минимально возможное ядро + +Теперь, когда мы примерно знаем, как запускается компьютер, пришло время создать собственное минимально возможное ядро. Наша цель - создать образ диска, который при загрузке выводит на экран "Hello World!". Для этого мы будем используем [Независимый бинарный файл на Rust][freestanding Rust binary] из предыдущего поста. + +Как вы помните, мы собирали независимый бинарный файл с помощью `cargo`, но в зависимости от операционной системы нам требовались разные имена точек входа и флаги компиляции. Это потому, что `cargo` по умолчанию компилирует для _хостовой системы_, то есть системы, на которой вы работаете. Это не то, что мы хотим для нашего ядра, потому что ядро, работающее поверх, например, Windows, не имеет особого смысла. Вместо этого мы хотим компилировать для четко определенной _целевой системы_. + From bdadfafae941ceb03f43282dc4688ba933ce7a34 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Mon, 5 Jul 2021 13:24:27 +0300 Subject: [PATCH 030/120] NIGHTLY INSTALL --- .../posts/02-minimal-rust-kernel/index.ru.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 43a23f4f9..e3b512ad5 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -91,3 +91,14 @@ translators = ["MrZloHex"] Как вы помните, мы собирали независимый бинарный файл с помощью `cargo`, но в зависимости от операционной системы нам требовались разные имена точек входа и флаги компиляции. Это потому, что `cargo` по умолчанию компилирует для _хостовой системы_, то есть системы, на которой вы работаете. Это не то, что мы хотим для нашего ядра, потому что ядро, работающее поверх, например, Windows, не имеет особого смысла. Вместо этого мы хотим компилировать для четко определенной _целевой системы_. +### Установка Rust Nightly + +Rust имеет три релизный канала: _stable_, _beta_ и _nightly_. В книге Rust Book очень хорошо объясняется разница между этими каналами, поэтому уделите минуту и [ознакомьтесь с ней](https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#choo-choo-release-channels-and-riding-the-trains). Для создания операционной системы нам понадобятся некоторые экспериментальные возможности, которые доступны только на канале nightly, поэтому нам нужно установить nightly версию Rust. + +Для управления установками Rust я настоятельно рекомендую [rustup]. Он позволяет устанавливать nightly, beta и stable компиляторы рядом друг с другом и облегчает их обновление. С помощью rustup вы можете использовать nightly компилятор для текущего каталога, выполнив команду `rustup override set nightly`. В качестве альтернативы вы можете добавить файл `rust-toolchain` с содержимым `nightly` в корневой каталог проекта. Вы можете проверить, установлена ли у вас версия nightly, выполнив команду `rustc --version`: Номер версии должен содержать `-nightly` в конце. + +[rustup]: https://www.rustup.rs/ + +Nightly версия компилятора позволяет нам подключаться к различным экспериментальным возможностям с помощью так называемых _флагов_ в верхней части нашего файла. Например, мы можем включить экспериментальный [`asm!` макрос][`asm!` macro] для поточной сборки, добавив `#![feature(asm)]` в начало нашего `main.rs`. Обратите внимание, что такие экспериментальные возможности совершенно нестабильны, что означает, что будущие версии Rust могут изменить или удалить их без предварительного предупреждения. По этой причине мы будем использовать их только в случае крайней необходимости. + +[`asm!` macro]: https://doc.rust-lang.org/unstable-book/library-features/asm.html \ No newline at end of file From cb6513d52e23012cafde20747a3c9415627405a5 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Mon, 5 Jul 2021 13:49:31 +0300 Subject: [PATCH 031/120] SPECIFICATION JSON --- .../posts/02-minimal-rust-kernel/index.ru.md | 116 +++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index e3b512ad5..99ec8fa77 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -101,4 +101,118 @@ Rust имеет три релизный канала: _stable_, _beta_ и _night Nightly версия компилятора позволяет нам подключаться к различным экспериментальным возможностям с помощью так называемых _флагов_ в верхней части нашего файла. Например, мы можем включить экспериментальный [`asm!` макрос][`asm!` macro] для поточной сборки, добавив `#![feature(asm)]` в начало нашего `main.rs`. Обратите внимание, что такие экспериментальные возможности совершенно нестабильны, что означает, что будущие версии Rust могут изменить или удалить их без предварительного предупреждения. По этой причине мы будем использовать их только в случае крайней необходимости. -[`asm!` macro]: https://doc.rust-lang.org/unstable-book/library-features/asm.html \ No newline at end of file +[`asm!` macro]: https://doc.rust-lang.org/unstable-book/library-features/asm.html + +### Спецификация целевой платформы + +Cargo поддерживает различные целевые системы через параметр `--target`. Цель описывается так называемой тройкой _[target triple]_, которая описывает архитектуру процессора, производителя, операционную систему и [ABI]. Например, тройка целей `x86_64-unknown-linux-gnu` описывает систему с процессором `x86_64`, неизвестным поставщиком и операционной системой Linux с GNU ABI. Rust поддерживает [множество различных целевых троек][many different target triples] [поддержка платформы][platform-support], включая `arm-linux-androideabi` для Android или [`wasm32-unknown-unknown` для WebAssembly] (https://www.hellorust.com/setup/wasm-target/). + +[target triple]: https://clang.llvm.org/docs/CrossCompilation.html#target-triple +[ABI]: https://stackoverflow.com/a/2456882 +[platform-support]: https://forge.rust-lang.org/release/platform-support.html +[custom-targets]: https://doc.rust-lang.org/nightly/rustc/targets/custom.html + +Однако для нашей целевой системы нам требуются некоторые специальные параметры конфигурации (например, отсутствие базовой ОС), поэтому ни одна из [существующих целевых троек][platform-support] не подходит. К счастью, Rust позволяет нам определить [собственную цель][custom-targets] через JSON-файл. Например, JSON-файл, описывающий цель `x86_64-unknown-linux-gnu`, выглядит следующим образом: + +```json +{ + "llvm-target": "x86_64-unknown-linux-gnu", + "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", + "arch": "x86_64", + "target-endian": "little", + "target-pointer-width": "64", + "target-c-int-width": "32", + "os": "linux", + "executables": true, + "linker-flavor": "gcc", + "pre-link-args": ["-m64"], + "morestack": false +} +``` + +Большинство полей требуется LLVM для генерации кода для данной платформы. Например, поле [`data-layout`] определяет размер различных типов целых чисел, чисел с плавающей точкой и указателей. Затем есть поля, которые Rust использует для условной компиляции, такие как `target-pointer-width`. Третий вид полей определяет, как должен быть собран крейт. Например, поле `pre-link-args` определяет аргументы, передаваемые [компоновщику][linker]. + +[`data-layout`]: https://llvm.org/docs/LangRef.html#data-layout +[linker]: https://en.wikipedia.org/wiki/Linker_(computing) + +Нам также нужно архитектура `x86_64` системы с нашим ядром, поэтому наша спецификация цели будет очень похожа на приведенную выше. Начнем с создания файла `x86_64-blog_os.json` (выберите любое имя, которое вам нравится) с общим содержанием: + +```json +{ + "llvm-target": "x86_64-unknown-none", + "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", + "arch": "x86_64", + "target-endian": "little", + "target-pointer-width": "64", + "target-c-int-width": "32", + "os": "none", + "executables": true +} +``` + +Обратите внимание, что мы изменили ОС в поле `llvm-target` и `os` на `none`, потому что мы будем работать на пустом металле. + +Добавляем дополнительные параметры для сборки ядра: + +```json +"linker-flavor": "ld.lld", +"linker": "rust-lld", +``` + +Вместо того чтобы использовать компоновщик по умолчанию платформы (который может не поддерживать цели Linux), мы используем кроссплатформенный компоновщик [LLD], поставляемый с Rust для компоновки нашего ядра. + +[LLD]: https://lld.llvm.org/ + +```json +"panic-strategy": "abort", +``` + +Этот параметр указывает, что цель не поддерживает [раскрутку стека][stack unwinding] при панике, поэтому вместо этого программа должна прерваться напрямую. Это имеет тот же эффект, что и опция `panic = "abort"` в нашем Cargo.toml, поэтому мы можем удалить ее оттуда. (Обратите внимание, что в отличие от опции Cargo.toml, эта опция также применяется, когда мы перекомпилируем библиотеку `core` позже в этом посте. Поэтому не забудьте добавить эту опцию, даже если вы предпочитаете оставить опцию Cargo.toml). + +[stack unwinding]: https://www.bogotobogo.com/cplusplus/stackunwinding.php + +```json +"disable-redzone": true, +``` + +Мы пишем ядро, поэтому в какой-то момент нам понадобится обрабатывать прерывания. Чтобы сделать это безопасно, мы должны отключить определенную оптимизацию указателя стека, называемую _"красной зоной"_, поскольку в противном случае она приведет к повреждениям стека. Для получения дополнительной информации см. нашу отдельную статью об [отключении красной зоны][disabling the red zone]. + +[disabling the red zone]: @/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.md + +```json +"features": "-mmx,-sse,+soft-float", +``` + +Поле `features` включает/выключает функции целевой платформы. Мы отключаем функции `mmx` и `sse`, добавляя к ним минус, и включаем функцию `soft-float`, добавляя к ней плюс. Обратите внимание, что между разными флагами не должно быть пробелов, иначе LLVM не сможет интерпретировать строку features. + +Функции `mmx` и `sse` определяют поддержку инструкций [Single Instruction Multiple Data (SIMD)], которые часто могут значительно ускорить работу программ. Однако использование больших регистров SIMD в ядрах ОС приводит к проблемам с производительностью. Причина в том, что ядру необходимо восстановить все регистры в исходное состояние перед продолжением прерванной программы. Это означает, что ядро должно сохранять полное состояние SIMD в основной памяти при каждом системном вызове или аппаратном прерывании. Поскольку состояние SIMD очень велико (512-1600 байт), а прерывания могут происходить очень часто, эти дополнительные операции сохранения/восстановления значительно снижают производительность. Чтобы избежать этого, мы отключили SIMD для нашего ядра (не для приложений, работающих поверх него!). + +[Single Instruction Multiple Data (SIMD)]: https://en.wikipedia.org/wiki/SIMD + +Проблема с отключением SIMD заключается в том, что операции с плавающей точкой на `x86_64` по умолчанию требуют регистров SIMD. Чтобы решить эту проблему, мы добавили функцию `soft-float`, которая эмулирует все операции с плавающей точкой через программные функции, основанные на обычных целых числах. + +Для получения дополнительной информации см. наш пост об [отключении SIMD](@/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.md). + +#### Соединяем все вместе + +Наша спецификация целовой платформы выглядит следующим образом: + +```json +{ + "llvm-target": "x86_64-unknown-none", + "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", + "arch": "x86_64", + "target-endian": "little", + "target-pointer-width": "64", + "target-c-int-width": "32", + "os": "none", + "executables": true, + "linker-flavor": "ld.lld", + "linker": "rust-lld", + "panic-strategy": "abort", + "disable-redzone": true, + "features": "-mmx,-sse,+soft-float" +} +``` + + From 1a1b857ccea8b080da51c5526018c359106fb040 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 18:29:07 +0300 Subject: [PATCH 032/120] BUILD --- .../posts/02-minimal-rust-kernel/index.ru.md | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 99ec8fa77..a776f0bfd 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -215,4 +215,84 @@ Cargo поддерживает различные целевые системы } ``` +### Компиляция ядра +Компиляция для нашей новой целевой платформы будет использовать соглашения Linux (я не совсем уверен, почему, я предполагаю, что это просто LLVM по умолчанию). Это означает, что нам нужна точка входа с именем `_start`, как описано в [предыдущем посте][previous post]: + +[previous post]: @/edition-2/posts/01-freestanding-rust-binary/index.ru.md + +```rust +// src/main.rs + +#![no_std] // don't link the Rust standard library +#![no_main] // disable all Rust-level entry points + +use core::panic::PanicInfo; + +/// This function is called on panic. +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} + +#[no_mangle] // don't mangle the name of this function +pub extern "C" fn _start() -> ! { + // this function is the entry point, since the linker looks for a function + // named `_start` by default + loop {} +} +``` + +Обратите внимание, что точка входа должна называться `_start` независимо от используемой ОС. + +Теперь мы можем собрать ядро для нашей новой цели, передав имя файла JSON в качестве `--target`: + +``` +> cargo build --target x86_64-blog_os.json + +error[E0463]: can't find crate for `core` +``` + +Не получается! Ошибка сообщает нам, что компилятор Rust больше не находит [библиотеку `core`][`core` library]. Эта библиотека содержит основные типы Rust, такие как `Result`, `Option` и итераторы, и неявно связана со всеми модулями `no_std`. + +[`core` library]: https://doc.rust-lang.org/nightly/core/index.html + +Проблема в том, что корневая (`core`) библиотека распространяется вместе с компилятором Rust как _прекомпилированная_ библиотека. Поэтому она действительна только для поддерживаемых тройных хостов (например, `x86_64-unknown-linux-gnu`), но не для нашей пользовательской целевой платформы. Если мы хотим скомпилировать код для других целевых платформ, нам нужно сначала перекомпилировать `core` для этих целей. + +### Функция `build-std` + +Вот тут-то и приходит на помощь функция [`build-std`][`build-std` feature] в cargo. Она позволяет перекомпилировать `core` и другие стандартные библиотеки по требованию, вместо того, чтобы использовать предварительно скомпилированные версии, поставляемые вместе с установкой Rust. Эта функция очень новая и еще не закончена, поэтому она помечена как "нестабильная" и доступна только на [nightly Rust]. + +[`build-std` feature]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-std +[nightly Rust]: #установка-rust-nightly + +Чтобы использовать эту функцию, нам нужно создать файл [конфигураций cargo][cargo configuration] по адресу `.cargo/config.toml` со следующим содержимым: + +[cargo configuration]: https://doc.rust-lang.org/cargo/reference/config.html + + +```toml +# in .cargo/config.toml + +[unstable] +build-std = ["core", "compiler_builtins"] +``` + +Это говорит cargo, что он должен перекомпилировать библиотеки `core` и `compiler_builtins`. Последняя необходима, поскольку является зависимостью от `core`. Чтобы перекомпилировать эти библиотеки, cargo нужен доступ к исходному коду rust, который мы можем установить с помощью команды `rustup component add rust-src`. + +
+ +**Note:** Ключ конфигурации `unstable.build-std` требует как минимум Rust nightly от 2020-07-15. + +
+ +``` +> cargo build --target x86_64-blog_os.json + Compiling core v0.0.0 (/…/rust/src/libcore) + Compiling rustc-std-workspace-core v1.99.0 (/…/rust/src/tools/rustc-std-workspace-core) + Compiling compiler_builtins v0.1.32 + Compiling blog_os v0.1.0 (/…/blog_os) + Finished dev [unoptimized + debuginfo] target(s) in 0.29 secs +``` + +Мы видим, что `cargo build` теперь перекомпилирует библиотеки `core`, `rustc-std-workspace-core` (зависимость от `compiler_builtins`) и `compiler_builtins` для нашей пользовательской целевой платформы. \ No newline at end of file From aae05c6d6a63d36ac6199fd342922b2bbbfd01ca Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 18:51:35 +0300 Subject: [PATCH 033/120] INTRISICS --- .../posts/02-minimal-rust-kernel/index.ru.md | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index a776f0bfd..4437248dc 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -295,4 +295,27 @@ build-std = ["core", "compiler_builtins"] Finished dev [unoptimized + debuginfo] target(s) in 0.29 secs ``` -Мы видим, что `cargo build` теперь перекомпилирует библиотеки `core`, `rustc-std-workspace-core` (зависимость от `compiler_builtins`) и `compiler_builtins` для нашей пользовательской целевой платформы. \ No newline at end of file +Мы видим, что `cargo build` теперь перекомпилирует библиотеки `core`, `rustc-std-workspace-core` (зависимость от `compiler_builtins`) и `compiler_builtins` для нашей пользовательской целевой платформы. + +#### Внутренности зависимые от памяти + +Компилятор Rust предполагает, что определенный набор встроенных функций доступен для всех систем. Большинство этих функций обеспечивается модулем `compiler_builtins`, который мы только что перекомпилировали. Однако в этом модуле есть некоторые функции, связанные с памятью, которые не включены по умолчанию, потому что они обычно предоставляются библиотекой C в системе. Эти функции включают `memset`, которая устанавливает все байты в блоке памяти в заданное значение, `memcpy`, которая копирует один блок памяти в другой, и `memcmp`, которая сравнивает два блока памяти. Хотя ни одна из этих функций нам сейчас не понадобилась для компиляции нашего ядра, они потребуются, как только мы добавим в него дополнительный код (например, при копировании структур). + +Поскольку мы не можем ссылаться на С библиотеку хостовой операционной системы, нам нужен альтернативный способ предоставления этих функций компилятору. Одним из возможных подходов для этого может быть реализация наших собственных функций `memset` и т.д. и применение к ним атрибута `#[no_mangle]` (чтобы избежать автоматического переименования во время компиляции). Однако это опасно, поскольку малейшая ошибка в реализации этих функций может привести к неопределенному поведению. Например, при реализации `memcpy` с помощью цикла `for` вы можете получить бесконечную рекурсию, поскольку циклы `for` неявно вызывают метод трейта [`IntoIterator::into_iter`], который может снова вызвать `memcpy`. Поэтому хорошей идеей будет повторное использование существующих хорошо протестированных реализаций. + +[`IntoIterator::into_iter`]: https://doc.rust-lang.org/stable/core/iter/trait.IntoIterator.html#tymethod.into_iter + +К счастью, модуль `compiler_builtins` уже содержит реализации всех необходимых функций, они просто отключены по умолчанию, чтобы не столкнуться с реализациями из С библиотеки. Мы можем включить их, установив флаг cargo [`build-std-features`] на `["compiler-builtins-mem"]`. Как и флаг `build-std`, этот флаг может быть передан в командной строке как флаг `-Z` или настроен в таблице `unstable` в файле `.cargo/config.toml`. Поскольку мы всегда хотим собирать с этим флагом, вариант с конфигурационным файлом имеет для нас больше смысла: + +[`build-std-features`]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-std-features + +```toml +# in .cargo/config.toml + +[unstable] +build-std-features = ["compiler-builtins-mem"] +build-std = ["core", "compiler_builtins"] +``` + +(Поддержка функции `compiler-builtins-mem` была [добавлена совсем недавно](https://github.com/rust-lang/rust/pull/77284), поэтому для нее вам нужен как минимум Rust nightly `2020-09-30`). + From 8452ad97b90d35d56ded4c8d9a6c73f10ee7f7e9 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:11:06 +0300 Subject: [PATCH 034/120] DEFAULT TARGET --- .../posts/02-minimal-rust-kernel/index.ru.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 4437248dc..700d06612 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -319,3 +319,26 @@ build-std = ["core", "compiler_builtins"] (Поддержка функции `compiler-builtins-mem` была [добавлена совсем недавно](https://github.com/rust-lang/rust/pull/77284), поэтому для нее вам нужен как минимум Rust nightly `2020-09-30`). +За кулисами этот флаг включает функцию [`mem`][`mem` feature] модуля `compiler_builtins`. Это приводит к тому, что атрибут `#[no_mangle]` применяется к [`memcpy` и т.п. реализациям][`memcpy` etc. implementations] этого ядра, что делает их доступными для компоновщика. + +[`mem` feature]: https://github.com/rust-lang/compiler-builtins/blob/eff506cd49b637f1ab5931625a33cef7e91fbbf6/Cargo.toml#L54-L55 +[`memcpy` etc. implementations]: https://github.com/rust-lang/compiler-builtins/blob/eff506cd49b637f1ab5931625a33cef7e91fbbf6/src/mem.rs#L12-L69 + +Благодаря этому изменению наше ядро имеет валидные реализации для всех функций, требуемых компилятором, поэтому оно будет продолжать компилироваться, даже если наш код станет сложнее. + +#### Установка Стандартной цели + +Чтобы избежать передачи параметра `--target` при каждом вызове `cargo build`, мы можем переопределить цель по умолчанию. Для этого мы добавим следующее в наш файл [конфигураций cargo][cargo configuration] по адресу `.cargo/config.toml`: + +```toml +# in .cargo/config.toml + +[build] +target = "x86_64-blog_os.json" +``` + +Это указывает `cargo` использовать нашу цель `x86_64-blog_os.json`, если не передан явный аргумент `--target`. Это означает, что теперь мы можем собрать наше ядро с помощью простой `cargo build`. Для получения дополнительной информации о параметрах конфигурации cargo ознакомьтесь с [официальной документацией][cargo configuration]. + +Теперь мы можем скомпилировать наше ядро для голого металла с помощью простой `cargo build`. Однако наша точка входа `_start`, которая будет вызываться загрузчиком, все еще пуста. Пришло время вывести что-нибудь на экран. + +### Вывод на экран \ No newline at end of file From c63517266d9a37540fc1c74bf4be499c9c1d7773 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:20:12 +0300 Subject: [PATCH 035/120] PRINTING TO SCREEN --- .../posts/02-minimal-rust-kernel/index.ru.md | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 700d06612..7d31d2a79 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -341,4 +341,53 @@ target = "x86_64-blog_os.json" Теперь мы можем скомпилировать наше ядро для голого металла с помощью простой `cargo build`. Однако наша точка входа `_start`, которая будет вызываться загрузчиком, все еще пуста. Пришло время вывести что-нибудь на экран. -### Вывод на экран \ No newline at end of file +### Вывод на экран + +Самым простым способом печати текста на экран на данном этапе является [текстовый буфер VGA][VGA text buffer]. Это специальная область памяти, сопоставленная с аппаратным обеспечением VGA, которая содержит содержимое, отображаемое на экране. Обычно он состоит из 25 строк, каждая из которых содержит 80 символьных ячеек. Каждая символьная ячейка отображает символ ASCII с некоторыми цветами переднего и заднего плана. Вывод на экран выглядит следующим образом: + +[VGA text buffer]: https://en.wikipedia.org/wiki/VGA-compatible_text_mode + +![screen output for common ASCII characters](https://upload.wikimedia.org/wikipedia/commons/f/f8/Codepage-437.png) + +Точное расположение буфера VGA мы обсудим в следующем посте, где мы напишем первый небольшой драйвер для него. Для печати "Hello World!" нам достаточно знать, что буфер расположен по адресу `0xb8000` и что каждая символьная ячейка состоит из байта ASCII и байта цвета. + +Реализация выглядит следующим образом: + +```rust +static HELLO: &[u8] = b"Hello World!"; + +#[no_mangle] +pub extern "C" fn _start() -> ! { + let vga_buffer = 0xb8000 as *mut u8; + + for (i, &byte) in HELLO.iter().enumerate() { + unsafe { + *vga_buffer.offset(i as isize * 2) = byte; + *vga_buffer.offset(i as isize * 2 + 1) = 0xb; + } + } + + loop {} +} +``` + +Сначала мы приводим целое число `0xb8000` к [сырому указателю][raw pointer]. Затем мы [итерируем][iterate] по байтам [статической][static] `HELLO` [байтовой строки][byte string]. Мы используем метод [`enumerate`], чтобы дополнительно получить бегущую переменную `i`. В теле цикла for мы используем метод [`offset`] для записи байта строки и соответствующего байта цвета (`0xb` - светло-голубой). + +[iterate]: https://doc.rust-lang.org/stable/book/ch13-02-iterators.html +[static]: https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#the-static-lifetime +[`enumerate`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html#method.enumerate +[byte string]: https://doc.rust-lang.org/reference/tokens.html#byte-string-literals +[raw pointer]: https://doc.rust-lang.org/stable/book/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer +[`offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.offset + +Обратите внимание, что вокруг всех записей в память стоит блок [`unsafe`]. Причина в том, что компилятор Rust не может доказать, что сырые указатели, которые мы создаем, действительны. Они могут указывать куда угодно и привести к повреждению данных. Помещая их в блок `unsafe`, мы, по сути, говорим компилятору, что абсолютно уверены в правильности операций. Обратите внимание, что блок `unsafe` не отключает проверки безопасности Rust. Он только позволяет вам делать [пять дополнительных вещей][five additional things]. + +[`unsafe`]: https://doc.rust-lang.org/stable/book/ch19-01-unsafe-rust.html +[five additional things]: https://doc.rust-lang.org/stable/book/ch19-01-unsafe-rust.html#unsafe-superpowers + +Я хочу подчеркнуть, что **это не тот способ, которым мы хотим делать вещи в Rust!** Очень легко ошибиться при работе с сырыми указателями внутри небезопасных блоков, например, мы можем легко записать за конец буфера, если мы не будем осторожны. + +Поэтому мы хотим минимизировать использование `unsafe` настолько, насколько это возможно. Rust дает нам возможность сделать это путем создания безопасных абстракций. Например, мы можем создать тип буфера VGA, который инкапсулирует всю небезопасность и гарантирует, что извне _невозможно_ сделать что-либо неправильно. Таким образом, нам понадобится лишь минимальное количество `небезопасных` блоков и мы можем быть уверены, что не нарушаем [безопасность памяти][memory safety]. Мы создадим такую безопасную абстракцию буфера VGA в следующем посте. + +[memory safety]: https://en.wikipedia.org/wiki/Memory_safety + From d8f440cb670b11813c872c7d2cf67738617996c3 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:27:52 +0300 Subject: [PATCH 036/120] BOOTIMAGE --- .../posts/02-minimal-rust-kernel/index.ru.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 7d31d2a79..f80d518e5 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -391,3 +391,46 @@ pub extern "C" fn _start() -> ! { [memory safety]: https://en.wikipedia.org/wiki/Memory_safety +## Запуск ядра + +Теперь, когда у нас есть исполняемый файл, который делает что-то ощутимое, пришло время запустить его. Сначала нам нужно превратить наше скомпилированное ядро в загрузочный образ диска, связав его с загрузчиком. Затем мы можем запустить образ диска в виртуальной машине [QEMU] или загрузить его на реальном оборудовании с помощью USB-носителя. + +### Создание загрузочного образа + +Чтобы превратить наше скомпилированное ядро в загрузочный образ диска, нам нужно связать его с загрузчиком. Как мы узнали в [разделе о загрузке], загрузчик отвечает за инициализацию процессора и загрузку нашего ядра. + +[разделе о загрузке]: #последовательность-процессов-запуска + +Вместо того чтобы писать собственный загрузчик, который является самостоятельным проектом, мы используем модуль [`bootloader`]. Этот модуль реализует базовый BIOS-загрузчик без каких-либо C-зависимостей, только Rust и встроенный ассемблер. Чтобы использовать его для загрузки нашего ядра, нам нужно добавить зависимость от него: + +[`bootloader`]: https://crates.io/crates/bootloader + +```toml +# in Cargo.toml + +[dependencies] +bootloader = "0.9.8" +``` + +Добавление загрузчика в качестве зависимости недостаточно для создания загрузочного образа диска. Проблема в том, что нам нужно связать наше ядро с загрузчиком после компиляции, но в cargo нет поддержки [скриптов после сборки][post-build scripts]. + +[post-build scripts]: https://github.com/rust-lang/cargo/issues/545 + +Для решения этой проблемы мы создали инструмент `bootimage`, который сначала компилирует ядро и загрузчик, а затем соединяет их вместе для создания загрузочного образа диска. Чтобы установить инструмент, выполните следующую команду в терминале: + +``` +cargo install bootimage +``` + +Для запуска `bootimage` и сборки загрузчика вам необходимо установить компонент rustup `llvm-tools-preview`. Это можно сделать, выполнив команду `rustup component add llvm-tools-preview`. + +После установки `bootimage` и добавления компонента `llvm-tools-preview` мы можем создать образ загрузочного диска, выполнив команду: + +``` +> cargo bootimage +``` + +Мы видим, что инструмент перекомпилирует наше ядро с помощью `cargo build`, поэтому он автоматически подхватит все внесенные вами изменения. После этого он компилирует загрузчик, что может занять некоторое время. Как и все зависимости модулей, он собирается только один раз, а затем кэшируется, поэтому последующие сборки будут происходить гораздо быстрее. Наконец, `bootimage` объединяет загрузчик и ваше ядро в загрузочный образ диска. + +После выполнения команды вы должны увидеть загрузочный образ диска с именем `bootimage-blog_os.bin` в каталоге `target/x86_64-blog_os/debug`. Вы можете загрузить его в виртуальной машине или скопировать на USB-накопитель, чтобы загрузить его на реальном оборудовании. (Обратите внимание, что это не образ CD, который имеет другой формат, поэтому запись на CD не работает). + From 3ede20c9bfde56bf5cce715d4ee27c94b9aa3642 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:33:15 +0300 Subject: [PATCH 037/120] FIRST BOOT --- .../posts/02-minimal-rust-kernel/index.ru.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index f80d518e5..6e34ec717 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -434,3 +434,44 @@ cargo install bootimage После выполнения команды вы должны увидеть загрузочный образ диска с именем `bootimage-blog_os.bin` в каталоге `target/x86_64-blog_os/debug`. Вы можете загрузить его в виртуальной машине или скопировать на USB-накопитель, чтобы загрузить его на реальном оборудовании. (Обратите внимание, что это не образ CD, который имеет другой формат, поэтому запись на CD не работает). +#### Как этот работает? + +Инструмент `bootimage` выполняет следующие действия за кулисами: + +- Компилирует наше ядро в файл [ELF]. +- Компилирует зависимость загрузчика как отдельный исполняемый файл. +- Он связывает байты ELF-файла ядра с загрузчиком. + +[ELF]: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format +[rust-osdev/bootloader]: https://github.com/rust-osdev/bootloader + +При запуске загрузчик читает и разбирает приложенный файл ELF. Затем он сопоставляет сегменты программы с виртуальными адресами в таблицах страниц, обнуляет секцию `.bss` и устанавливает стек. Наконец, он считывает адрес точки входа (наша функция `_start`) и переходит к ней. + +### Запуск через QEMU + +Теперь мы можем загрузить образ диска в виртуальную машину. Чтобы загрузить его в [QEMU], выполните следующую команду: + +[QEMU]: https://www.qemu.org/ + +``` +> qemu-system-x86_64 -drive format=raw,file=target/x86_64-blog_os/debug/bootimage-blog_os.bin +warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5] +``` + +Откроется отдельное окно, которое выглядит следующим образом: + +![QEMU showing "Hello World!"](qemu.png) + +Мы видим, что наш "Hello World!" отображается на экране. + +### Настоящая машина + +Также можно записать его на USB-накопитель и загрузить на реальной машине: + +``` +> dd if=target/x86_64-blog_os/debug/bootimage-blog_os.bin of=/dev/sdX && sync +``` + +Где `sdX` - имя устройства вашего USB-накопителя. **Будьте внимательны**, чтобы выбрать правильное имя устройства, потому что все, что находится на этом устройстве, будет перезаписано. + +После записи образа на USB-накопитель его можно запустить на реальном оборудовании, загрузившись с него. Для загрузки с USB-накопителя вам, вероятно, потребуется использовать специальное меню загрузки или изменить порядок загрузки в конфигурации BIOS. Обратите внимание, что в настоящее время это не работает на машинах с UEFI, так как модуль `bootloader` пока не имеет поддержки UEFI. From 692a7bd17fef9c35e3a72cea604c86e7dd217504 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:42:03 +0300 Subject: [PATCH 038/120] FINISH --- .../posts/02-minimal-rust-kernel/index.ru.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 6e34ec717..3a4668892 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -475,3 +475,26 @@ warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5] Где `sdX` - имя устройства вашего USB-накопителя. **Будьте внимательны**, чтобы выбрать правильное имя устройства, потому что все, что находится на этом устройстве, будет перезаписано. После записи образа на USB-накопитель его можно запустить на реальном оборудовании, загрузившись с него. Для загрузки с USB-накопителя вам, вероятно, потребуется использовать специальное меню загрузки или изменить порядок загрузки в конфигурации BIOS. Обратите внимание, что в настоящее время это не работает на машинах с UEFI, так как модуль `bootloader` пока не имеет поддержки UEFI. + +### Использование `cargo run` + +Чтобы облегчить запуск нашего ядра в QEMU, мы можем установить ключ конфигурации `runner` для cargo: + +```toml +# in .cargo/config.toml + +[target.'cfg(target_os = "none")'] +runner = "bootimage runner" +``` + +Таблица `target.'cfg(target_os = "none")'` применяется ко всем целям, которые установили поле `"os"` своего конфигурационного файла цели на `"none"`. Это включает нашу цель `x86_64-blog_os.json`. Ключ `runner` указывает команду, которая должна быть вызвана для `cargo run`. Команда запускается после успешной сборки с путем к исполняемому файлу, переданному в качестве первого аргумента. Более подробную информацию смотрите в [документации по cargo][cargo configuration]. + +Команда `bootimage runner` специально разработана для использования в качестве исполняемого файла `runner`. Она связывает заданный исполняемый файл с зависимостью загрузчика проекта, а затем запускает QEMU. Более подробную информацию и возможные варианты конфигурации смотрите в [Readme of `bootimage`]. + +[Readme of `bootimage`]: https://github.com/rust-osdev/bootimage + +Теперь мы можем использовать `cargo run` для компиляции нашего ядра и его загрузки в QEMU. + +## Что дальше? + +В следующем посте мы более подробно рассмотрим текстовый буфер VGA и напишем безопасный интерфейс для него. Мы также добавим поддержку макроса `println`. \ No newline at end of file From 532947be99ab04f45377cb25bf3a3e2d81461aa3 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 19:54:13 +0300 Subject: [PATCH 039/120] RED ZONE --- .../disable-red-zone/index.ru.md | 29 +++++++++++++++++++ .../posts/02-minimal-rust-kernel/index.ru.md | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md new file mode 100644 index 000000000..72d4790f5 --- /dev/null +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md @@ -0,0 +1,29 @@ ++++ +title = "Отключение красной зоны" +weight = 1 +path = "ru/red-zone" +template = "edition-2/extra.html" ++++ + +[Красная зона][red zone] - это оптимизация [System V ABI], которая позволяет функциям временно использовать 128 байт ниже своего стекового кадра без корректировки указателя стека: + +[red zone]: https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64#the-red-zone +[System V ABI]: https://wiki.osdev.org/System_V_ABI + + + +![stack frame with red zone](red-zone.svg) + +На рисунке показан стековый фрейм функции с `n` локальных переменных. При входе в функцию указатель стека корректируется, чтобы освободить место в стеке для адреса возврата и локальных переменных. + +Красная зона определяется как 128 байт ниже скорректированного указателя стека. Функция может использовать эту зону для временных данных, которые не нужны при всех вызовах функции. Таким образом, в некоторых случаях (например, в небольших листовых функциях) можно обойтись без двух инструкций для корректировки указателя стека. + +Однако такая оптимизация приводит к огромным проблемам при работе с исключениями или аппаратными прерываниями. Предположим, что во время использования функцией красной зоны происходит исключение: + +![red zone overwritten by exception handler](red-zone-overwrite.svg) + +Процессор и обработчик исключений перезаписывают данные в красной зоне. Но эти данные все еще нужны прерванной функции. Поэтому функция не будет работать правильно, когда мы вернемся из обработчика исключений. Это может привести к странным ошибкам, на отладку которых [уйдут недели][take weeks to debug]. + +[take weeks to debug]: https://forum.osdev.org/viewtopic.php?t=21720 + +Чтобы избежать подобных ошибок при реализации обработки исключений в будущем, мы отключим красную зону с самого начала. Это достигается путем добавления строки `"disable-redzone": true` в наш целевой конфигурационный файл. \ No newline at end of file diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 3a4668892..ff3fbad5b 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -177,7 +177,7 @@ Cargo поддерживает различные целевые системы Мы пишем ядро, поэтому в какой-то момент нам понадобится обрабатывать прерывания. Чтобы сделать это безопасно, мы должны отключить определенную оптимизацию указателя стека, называемую _"красной зоной"_, поскольку в противном случае она приведет к повреждениям стека. Для получения дополнительной информации см. нашу отдельную статью об [отключении красной зоны][disabling the red zone]. -[disabling the red zone]: @/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.md +[disabling the red zone]: @/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md ```json "features": "-mmx,-sse,+soft-float", From ee25265cdae9d09ac7e802de0d2a9056a3996667 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Tue, 13 Jul 2021 20:03:54 +0300 Subject: [PATCH 040/120] SIMD --- .../disable-simd/index.ru.md | 44 +++++++++++++++++++ .../posts/02-minimal-rust-kernel/index.ru.md | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md new file mode 100644 index 000000000..7cccf2903 --- /dev/null +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md @@ -0,0 +1,44 @@ ++++ +title = "Отключение SIMD" +weight = 2 +path = "ru/disable-simd" +template = "edition-2/extra.html" ++++ + +Инструкции [Single Instruction Multiple Data (SIMD)] способны выполнять операцию (например, сложение) одновременно над несколькими словами данных, что может значительно ускорить работу программ. Архитектура `x86_64` поддерживает различные стандарты SIMD: + +[Single Instruction Multiple Data (SIMD)]: https://en.wikipedia.org/wiki/SIMD + + + +- [MMX]: Набор инструкций _Multi Media Extension_ был представлен в 1997 году и определяет восемь 64-битных регистров, называемых `mm0` - `mm7`. Эти регистры являются псевдонимами регистров [x87 блока с плавающей запятой][x87 floating point unit]. +- [SSE]: Набор инструкций _Streaming SIMD Extensions_ был представлен в 1999 году. Вместо повторного использования регистров с плавающей запятой он добавляет совершенно новый набор регистров. Шестнадцать новых регистров называются `xmm0` - `xmm15` и имеют размер 128 бит каждый. +- [AVX]: _Advanced Vector Extensions_ - это расширения, которые еще больше увеличивают размер мультимедийных регистров. Новые регистры называются `ymm0` - `ymm15` и имеют размер 256 бит каждый. Они расширяют регистры `xmm`, поэтому, например, `xmm0` - это нижняя половина `ymm0`. + +[MMX]: https://en.wikipedia.org/wiki/MMX_(instruction_set) +[x87 floating point unit]: https://en.wikipedia.org/wiki/X87 +[SSE]: https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions +[AVX]: https://en.wikipedia.org/wiki/Advanced_Vector_Extensions + +Используя такие стандарты SIMD, программы часто могут значительно ускориться. Хорошие компиляторы способны автоматически преобразовывать обычные циклы в такой SIMD-код с помощью процесса, называемого [автовекторизацией][auto-vectorization]. + +[auto-vectorization]: https://en.wikipedia.org/wiki/Automatic_vectorization + +Однако большие регистры SIMD приводят к проблемам в ядрах ОС. Причина в том, что ядро должно создавать резервные копии всех регистров, которые оно использует, в память при каждом аппаратном прерывании, потому что они должны иметь свои первоначальные значения, когда прерванная программа продолжает работу. Поэтому, если ядро использует SIMD-регистры, ему приходится резервировать гораздо больше данных (512-1600 байт), что заметно снижает производительность. Чтобы избежать этого снижения производительности, мы хотим отключить функции `se` и `mmx` (функция `avx` отключена по умолчанию). + +Мы можем сделать это через поле `features` в нашей целевой спецификации. Чтобы отключить функции `mmx` и `se`, мы добавим их с минусом: + +```json +"features": "-mmx,-sse" +``` + +## Плавающая точка +К сожалению для нас, архитектура `x86_64` использует регистры SSE для операций с плавающей точкой. Таким образом, каждое использование плавающей точки с отключенным SSE вызывает ошибку в LLVM. Проблема в том, что библиотека ядра Rust уже использует плавающие точки (например, в ней реализованы трейты для `f32` и `f64`), поэтому избежать плавающих точек в нашем ядре недостаточно. + +К счастью, LLVM поддерживает функцию `soft-float`, эмулирующую все операции с плавающей точкой через программные функции, основанные на обычных целых числах. Это позволяет использовать плавающие числа в нашем ядре без SSE, просто это будет немного медленнее. + +Чтобы включить функцию `soft-float` для нашего ядра, мы добавим ее в строку `features` в спецификации цели с префиксом плюс: + +```json +"features": "-mmx,-sse,+soft-float" +``` \ No newline at end of file diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index ff3fbad5b..33fc52191 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -191,7 +191,7 @@ Cargo поддерживает различные целевые системы Проблема с отключением SIMD заключается в том, что операции с плавающей точкой на `x86_64` по умолчанию требуют регистров SIMD. Чтобы решить эту проблему, мы добавили функцию `soft-float`, которая эмулирует все операции с плавающей точкой через программные функции, основанные на обычных целых числах. -Для получения дополнительной информации см. наш пост об [отключении SIMD](@/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.md). +Для получения дополнительной информации см. наш пост об [отключении SIMD](@/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md). #### Соединяем все вместе From 0996d051718d19d0240369f5d12fd4e9f64fe777 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 11:53:12 +0300 Subject: [PATCH 041/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 0cf220bbc..32ddcb7e9 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -15,7 +15,7 @@ translators = ["MrZloHex"] -Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-01`][post branch] ветке репозитория. +Этот блог открыто разрабатывается на [GitHub]. Если у вас возникли какие-либо проблемы или вопросы, пожалуйста, создайте _issue_. Также вы можете оставлять комментарии [в конце страницы][at the bottom]. Полный исходный код для этого поста вы можете найти в репозитории в ветке [`post-01`][post branch]. [GitHub]: https://github.com/phil-opp/blog_os [at the bottom]: #comments From 6c5dff3d05b356b0ac91dfe98b8e5b9367d634c2 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:23:52 +0300 Subject: [PATCH 042/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 32ddcb7e9..13e34e3a9 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -28,7 +28,7 @@ translators = ["MrZloHex"] [heap]: https://en.wikipedia.org/wiki/Heap_(data_structure) -Это значит, что нельзя использовать большинство [стандартных библиотек Rust][Rust Standart library], но также есть еще множество других возможностей, которые предоставляет Rust и их _можно использовать_. Как пример того, что можно использовать это: [итераторы][iterators], [замыкания][closures], [соответствия по шаблону][pattern matching], [опции][option] и[результат][result], [форматирование строк][string formatting] и, конечно же, [систему владения][ownership system]. Эти функции дают возможность для написания ядра в очень выразительном и высоко-уровневом стиле без беспокойства о [неопределенном поведении][undefined behavior] или [сохранности памяти][memory safety]. +Это значит, что нельзя использовать большую часть [стандартной библиотеки Rust][Rust Standard library], но остается множество других возможностей Rust, которые _можно использовать_. Например, [итераторы][iterators], [замыкания][closures], [сопоставление с образцом][pattern matching], [`Option`][option] и [`Result`][result], [форматирование строк][string formatting] и, конечно же, [систему владения][ownership system]. Эти функции дают возможность для написания ядра в очень выразительном и высоко-уровневом стиле, не беспокоясь о [неопределенном поведении][undefined behavior] или [сохранности памяти][memory safety]. [option]: https://doc.rust-lang.org/core/option/ [result]:https://doc.rust-lang.org/core/result/ From c9176b86fefd45d81e4207b564d764b406c54017 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:24:33 +0300 Subject: [PATCH 043/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 13e34e3a9..867328a88 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -41,7 +41,7 @@ translators = ["MrZloHex"] [undefined behavior]: https://www.nayuki.io/page/undefined-behavior-in-c-and-cplusplus-programs [memory safety]: https://tonyarcieri.com/it-s-time-for-a-memory-safety-intervention -Вместо создания ядра ОС на Rust, нужно создать исполняемы файл, который мог бы запускаться без абстракции в виде ОС. +Чтобы создать ядро ОС на Rust, нужно создать исполняемый файл, который мог бы запускаться без ОС. Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. From 1ae1995eff713ebf0a689b81b0d1eeaebe02f272 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:25:19 +0300 Subject: [PATCH 044/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 867328a88..34f222abf 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -43,7 +43,7 @@ translators = ["MrZloHex"] Чтобы создать ядро ОС на Rust, нужно создать исполняемый файл, который мог бы запускаться без ОС. -Этот пост описывает необходимые шаги для создания независимого исполняемого бинарного файла на Rust и объясняет зачем эти шаги нужны. Если вы заинтересованны тоьлько в простом примере, можете сразу перейти к __[итогам](#Итоги)__. +Этот пост описывает необходимые шаги для создания независимого исполняемого файла на Rust и объясняет, почему эти шаги нужны. Если вам интересен только минимальный пример, можете сразу перейти к __[итогам](#Итоги)__. ## Дизактивация стандартной библиотеки По стандарту, все модули Rust ссылаются на [стандартную библиотеку][standart library], которая зависит от операционной системы для таких возможностей как потоки, файлы, сети. Также она зависит от стандартной библиотки C `libc`, которая очень тесно взаимодействует с сервиса ОС. С тех пор как план - это написание операционной системы, нельзя использовать библиотеки, которые зависят от операционной системы. Следовательно стоит отключить автоматические добавление стандартной библиотеки через [`no_std` аттрибут][attribute]. From 505b60776d17a9c2dc2430fbcf65f2d1be1d44c9 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:26:16 +0300 Subject: [PATCH 045/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 34f222abf..e4f9dc6b1 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -45,7 +45,7 @@ translators = ["MrZloHex"] Этот пост описывает необходимые шаги для создания независимого исполняемого файла на Rust и объясняет, почему эти шаги нужны. Если вам интересен только минимальный пример, можете сразу перейти к __[итогам](#Итоги)__. -## Дизактивация стандартной библиотеки +## Отключение стандартной библиотеки По стандарту, все модули Rust ссылаются на [стандартную библиотеку][standart library], которая зависит от операционной системы для таких возможностей как потоки, файлы, сети. Также она зависит от стандартной библиотки C `libc`, которая очень тесно взаимодействует с сервиса ОС. С тех пор как план - это написание операционной системы, нельзя использовать библиотеки, которые зависят от операционной системы. Следовательно стоит отключить автоматические добавление стандартной библиотеки через [`no_std` аттрибут][attribute]. [standard library]: https://doc.rust-lang.org/std/ From 30aca43b46ffe6efd0dbbced5cdec8563a4fde01 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:27:33 +0300 Subject: [PATCH 046/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index e4f9dc6b1..5ae4f5948 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -46,7 +46,7 @@ translators = ["MrZloHex"] Этот пост описывает необходимые шаги для создания независимого исполняемого файла на Rust и объясняет, почему эти шаги нужны. Если вам интересен только минимальный пример, можете сразу перейти к __[итогам](#Итоги)__. ## Отключение стандартной библиотеки -По стандарту, все модули Rust ссылаются на [стандартную библиотеку][standart library], которая зависит от операционной системы для таких возможностей как потоки, файлы, сети. Также она зависит от стандартной библиотки C `libc`, которая очень тесно взаимодействует с сервиса ОС. С тех пор как план - это написание операционной системы, нельзя использовать библиотеки, которые зависят от операционной системы. Следовательно стоит отключить автоматические добавление стандартной библиотеки через [`no_std` аттрибут][attribute]. +По умолчанию, все Rust-крейты подключают [стандартную библиотеку][standard library], которая зависит от возможностей операционной системы, таких как потоки, файлы, сети. Она также зависит от стандартной библиотки C `libc`, которая очень тесно взаимодействует с возможностями ОС. Так как мы хотим написать операционную систему, мы не можем использовать библиотеки, которые зависят от операционной системы. Поэтому необходимо отключить автоматические подключение стандартной библиотеки через [атрибут `no_std`][attribute]. [standard library]: https://doc.rust-lang.org/std/ [attribute]: https://doc.rust-lang.org/1.30.0/book/first-edition/using-rust-without-the-standard-library.html From 4c93e8d8dfe1232a318050e2554b6f916fed6646 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:29:25 +0300 Subject: [PATCH 047/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 5ae4f5948..b7f2bac75 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -51,7 +51,7 @@ translators = ["MrZloHex"] [standard library]: https://doc.rust-lang.org/std/ [attribute]: https://doc.rust-lang.org/1.30.0/book/first-edition/using-rust-without-the-standard-library.html -Мы начнем с создания нового cargo проекта. Самый простой способ сделать это, через командную строку: +Мы начнем с создания нового проекта cargo. Самый простой способ сделать это — через командную строку: ``` cargo new blog_os --bin -- edition 2018 From 3d0097081f25d4316d499d876d13272d79f503f6 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:30:53 +0300 Subject: [PATCH 048/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index b7f2bac75..9d12ea5d0 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -57,7 +57,7 @@ translators = ["MrZloHex"] cargo new blog_os --bin -- edition 2018 ``` -Я назвал этот проект `blog_os`, но вы можете назвать как вам угодно. Флаг `--bin` указывает на то, что мы хоти создать исполняемый бинарный файл (в сравнении с библиотекой) и флаг `--edition 2018` указывает, что мы хотим использовать [версию 2018][edition] Rust для нашего модуля. После выполнения комманды, cargo создаст каталог со следующей стркутурой: +Я назвал этот проект `blog_os`, но вы можете назвать как вам угодно. Флаг `--bin` указывает на то, что мы хотим создать исполняемый файл (а не библиотеку), а флаг `--edition 2018` указывает, что мы хотим использовать [редакцию Rust 2018][edition] для нашего крейта. После выполнения команды cargo создаст каталог со следующей структурой: [edition]: https://doc.rust-lang.org/nightly/edition-guide/rust-2018/index.html From 468bd664f41c2d12247eda3b5c642eca8efc5519 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:33:14 +0300 Subject: [PATCH 049/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 9d12ea5d0..38f8b869d 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -68,7 +68,7 @@ blog_os └── main.rs ``` -`Cargo.toml` содержит данные и конфигурацию модуля, такие как _название, автор, версию_ и _зависимости_ от других модулей и библиотек. Файл `src/main.rs` содержит корневой файл нашего модуля и главную `main` функцию. Можно скомпилировать модуль с помощью `cargo build` и после запустить скомпилированный `blog_os` бинарный файл в `target/debug` каталоге. +`Cargo.toml` содержит данные и конфигурацию крейта, такие как _название, автор, версию_ и _зависимости_ от других крейтов. Файл `src/main.rs` содержит корневой модуль нашего крейта и функцию `main`. Можно скомпилировать крейт с помощью `cargo build` и запустить скомпилированную программу `blog_os` в поддиректории `target/debug`. ### Аттрибут `no_std` From 505b826a8e5a2e740910ba589cdae716a4f63443 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:33:49 +0300 Subject: [PATCH 050/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 38f8b869d..d83e70910 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -70,7 +70,7 @@ blog_os `Cargo.toml` содержит данные и конфигурацию крейта, такие как _название, автор, версию_ и _зависимости_ от других крейтов. Файл `src/main.rs` содержит корневой модуль нашего крейта и функцию `main`. Можно скомпилировать крейт с помощью `cargo build` и запустить скомпилированную программу `blog_os` в поддиректории `target/debug`. -### Аттрибут `no_std` +### Атрибут `no_std` В данный момент наш модуль не явно подключает стандартную библиотеку. Это можно испровить путем добавления [аттрибута `no_std`][attribute]: From 296725433414b02f690d9ef58e55757a0a0af12e Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:41:17 +0300 Subject: [PATCH 051/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index d83e70910..a52b13b73 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -72,7 +72,7 @@ blog_os ### Атрибут `no_std` -В данный момент наш модуль не явно подключает стандартную библиотеку. Это можно испровить путем добавления [аттрибута `no_std`][attribute]: +В данный момент наш крейт неявно подключает стандартную библиотеку. Это можно исправить путем добавления [атрибута `no_std`][attribute]: ```rust // main.rs From 94b895cb8bd2d91e0b9df4e9f51a7b4b1b321a5d Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:41:41 +0300 Subject: [PATCH 052/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index a52b13b73..3f5ff056f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -84,7 +84,7 @@ fn main() { } ``` -Если попробывать скомпилировать прямо сейчас (с помоцью комманды `cargo build`), то появится следующая ошибка: +Если сейчас попробовать скомпилировать программу (с помоцью команды `cargo build`), то появится следующая ошибка: ``` error: cannot find macro `println!` in this scope From b7c66afe2fce3d3d80cc767ab9ed6998c2266008 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:42:04 +0300 Subject: [PATCH 053/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 3f5ff056f..cb736f9a2 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -94,7 +94,7 @@ error: cannot find macro `println!` in this scope | ^^^^^^^ ``` -Это ошибка объясняется тем, что [макрос `println`][macro] часть стандартной библиотеки, которая была отключена. Так что больше у накс нет возможности выводить на экран что либо. Но это имеет смысл, так как `println` печатает через [стандартный поток вывода][standart output], который, в свою очередь, является специальный файлом, описанным операционной системой. +Эта ошибка объясняется тем, что [макрос `println`][macro] — часть стандартной библиотеки, которая была отключена. Поэтому у нас больше нет возможность выводить что-либо на экран. Это логично, так как `println` печатает через [стандартный вывод][standard output], который, в свою очередь, является специальным файловым дескриптором, предоставляемым операционной системой. [macro]: https://doc.rust-lang.org/std/macro.println.html [standart output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 From c0b917d4dc37a672eadc5c0c3675bc69ce0bbc16 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:45:05 +0300 Subject: [PATCH 054/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index cb736f9a2..b47a0e4c1 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -119,7 +119,7 @@ error: language item required, but not found: `eh_personality` ## Реализация _паники_ -Аттрибут `pаnic_handler` определяет функцию, которая должна вызываться, когда происходит [паника (panic)][panic]. Стандартная библиотека предоставляет собственную функцию обработчика паники, но после отключения стандартной библиотеки ма должны написать собственный обработчик: +Атрибут `pаnic_handler` определяет функцию, которая должна вызываться, когда происходит [паника (panic)][panic]. Стандартная библиотека предоставляет собственную функцию обработчика паники, но после отключения стандартной библиотеки мы должны написать собственный обработчик: [panic]: https://doc.rust-lang.org/stable/book/ch09-01-unrecoverable-errors-with-panic.html From 0850ee5d41e159e0f1527268b48f50943bd23672 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:45:32 +0300 Subject: [PATCH 055/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index b47a0e4c1..1d838239f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -494,7 +494,7 @@ panic = "abort" # disable stack unwinding on panic panic = "abort" # disable stack unwinding on panic ``` -Для компиляции этого бинарного файла, мы должны компиляровать для голой системы, такой как `thumbv7em-none-eabihf`: +Чтобы собрать этот исполняемый файл, его надо скомпилировать для голого железа, например, `thumbv7em-none-eabihf`: ``` cargo build --target thumbv7em-none-eabihf From 1a9e10e369e3e564ef6a01200ded5b02fa2c640d Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:46:12 +0300 Subject: [PATCH 056/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 1d838239f..08aae254d 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -511,7 +511,7 @@ cargo rustc -- -C link-args="/ENTRY:_start /SUBSYSTEM:console" cargo rustc -- -C link-args="-e __start -static -nostartfiles" ``` -Обратите внимание, что это лишь минимальный пример независимого бинарного файла Rust. Этот бинарник ожидает различных вещей, например, что стек инициализируется при вызове функции `_start`. **Поэтому для любого реального использования такого бинарного файла требуется больше шагов разработки**. +Обратите внимание, что это лишь минимальный пример независимого бинарного файла Rust. Этот бинарник ожидает различных вещей, например, инициализацию стека при вызове функции `_start`. **Поэтому для любого реального использования такого бинарного файла потребуется совершить еще больше действий**. ## Что дальше? From 529317251a282d39d6da85e317344848cb28d852 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:46:50 +0300 Subject: [PATCH 057/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 08aae254d..e55049fd2 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -515,6 +515,6 @@ cargo rustc -- -C link-args="-e __start -static -nostartfiles" ## Что дальше? -В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание пользовательской системы, объединение нашего исполняемого файла с загрузчиком и изучение того, как вывести что-то на экран. +В [следующем посте][next post] описаны шаги, необходимые для превращения нашего независимого бинарного файла в минимальное ядро операционной системы. Сюда входит создание custom target, объединение нашего исполняемого файла с загрузчиком и изучение, как вывести что-то на экран. [next post]: @/edition-2/posts/02-minimal-rust-kernel/index.ru.md From f5906aae97914e7fdc929e533d724f1d9a8ad9f4 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:47:20 +0300 Subject: [PATCH 058/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index e55049fd2..e6f109e9a 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -9,7 +9,7 @@ chapter = "С нуля" translators = ["MrZloHex"] +++ -Первым шагом в создании собственного ядра операционной системы - это создание исполняемого файла на Rust, который не будет подключать стандартную библиотеку. Именно это дает возможность запускать Rust код на [голом металле][bare metal] без слоя операционной системы, которая связывает железо компьютера и программы. +Первый шаг в создании собственного ядра операционной системы — это создание исполняемого файла на Rust, который не будет подключать стандартную библиотеку. Именно это дает возможность запускать Rust код на [голом железе][bare metal] без слоя операционной системы. [bare metal]: https://en.wikipedia.org/wiki/Bare_machine From d8d92dd085b1fe367528264b0b62992770e038c2 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:49:40 +0300 Subject: [PATCH 059/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index e6f109e9a..a2e1e45b8 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -135,7 +135,7 @@ fn panic(_info: &PanicInfo) -> ! { } ``` -Параметр [`PanicInfo`][PanicInfo] содержит название файла, строку где произошла паника и дополнительное сообщение с пояснением. Это функцию никогда ничего не должна возвращать и такая функция называется [расходящиеся функцию][diverging functions] и она возращает ["невозможный" тип]["never" type] `!`. На данный момент у нас нет особых инструментов, которые мы бы могли использовать, чтобы заполнить это функцию, поэтому мы просто войдем в бесконечный цикл. +Параметр [`PanicInfo`][PanicInfo] содержит название файла и строку, где произошла паника, и дополнительное сообщение с пояснением. Эта функция никогда не должна возвратиться, и такая функция называется [расходящейся][diverging functions] и она возращает [пустой тип]["never" type] `!`. Пока что мы ничего не можем сделать в этой функции, поэтому мы просто войдем в бесконечный цикл. [PanicInfo]: https://doc.rust-lang.org/nightly/core/panic/struct.PanicInfo.html [diverging function]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions From 8ec3d6b098c04113cefc408585e9dc74351331ff Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:51:12 +0300 Subject: [PATCH 060/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index a2e1e45b8..5b4b9f654 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -148,7 +148,7 @@ fn panic(_info: &PanicInfo) -> ! { [`Copy`]: https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html [copy code]: https://github.com/rust-lang/rust/blob/485397e49a02a3b7ff77c17e4a3f16c653925cb3/src/libcore/marker.rs#L296-L299 -Хотя создание собственных реализаций языковых предметов возможна, это следует делать только в крайнем случае. Причина в том, что языковые предметы являются крайне нестабильными частями реализации и даже не проверяются на тип (поэтому компилятор даже не проверяет, имеет ли функция правильные типы аргументов). К счастью, существует более стабильный способ исправить вышеупомянутую ошибку языкового предмета. +Несмотря на то, что можно предоставить свою реализацию элементов языка, это следует делать только в крайних случаях. Причина в том, что элементы языка являются крайне нестабильными деталями реализации, и компилятор даже не проверяет в них согласованность типов (поэтому он даже не проверяет, имеет ли функция правильные типы аргументов). К счастью, существует более стабильный способ исправить вышеупомянутую ошибку. Языковой предмет [`eh_personality`][language item] указывает на функцию, которая используется для реализации [раскрутки стэка][stack unwinding]. По стандарту, Rust использует раскрутку для запуска деструктуров для всех _живых_ стэковых переменных в случае появлении [паники][panic]. Это гарантирует, что вся использованная память будет освобождена, и позволяет родительскому потоку перехватить панику и продолжить выполнение. Раскрутка очень сложный процесс и требует некоторых специльных библиотек ОС (например, [libunwind] для Linux или [structured exception handling] для Windows), так что мы не должны использовать их для нашей операицонной системы. From 359cad83c09b04a48922916d342d56d6a1e70975 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:52:48 +0300 Subject: [PATCH 061/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 5b4b9f654..67cbda2df 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -150,7 +150,7 @@ fn panic(_info: &PanicInfo) -> ! { Несмотря на то, что можно предоставить свою реализацию элементов языка, это следует делать только в крайних случаях. Причина в том, что элементы языка являются крайне нестабильными деталями реализации, и компилятор даже не проверяет в них согласованность типов (поэтому он даже не проверяет, имеет ли функция правильные типы аргументов). К счастью, существует более стабильный способ исправить вышеупомянутую ошибку. -Языковой предмет [`eh_personality`][language item] указывает на функцию, которая используется для реализации [раскрутки стэка][stack unwinding]. По стандарту, Rust использует раскрутку для запуска деструктуров для всех _живых_ стэковых переменных в случае появлении [паники][panic]. Это гарантирует, что вся использованная память будет освобождена, и позволяет родительскому потоку перехватить панику и продолжить выполнение. Раскрутка очень сложный процесс и требует некоторых специльных библиотек ОС (например, [libunwind] для Linux или [structured exception handling] для Windows), так что мы не должны использовать их для нашей операицонной системы. +Элемент языка [`eh_personality`][language item] указывает на функцию, которая используется для реализации [раскрутки стека][stack unwinding]. По умолчанию, Rust использует раскрутку для запуска деструктуров для всех _живых_ переменных на стеке в случае [паники][panic]. Это гарантирует, что вся использованная память будет освобождена, и позволяет родительскому потоку перехватить панику и продолжить выполнение. Раскрутка — очень сложный процесс и требует некоторых специльных библиотек ОС (например, [libunwind] для Linux или [structured exception handling] для Windows), так что мы не должны использовать её для нашей операционной системы. [language item]: https://github.com/rust-lang/rust/blob/edb368491551a77d77a48446d4ee88b35490c565/src/libpanic_unwind/gcc.rs#L11-L45 [stack unwinding]: https://www.bogotobogo.com/cplusplus/stackunwinding.php From 0b99ef6bbb6b25cff1789049bb4ed9c0ddf6977c Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:53:10 +0300 Subject: [PATCH 062/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 67cbda2df..4b1b7aea2 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -115,7 +115,7 @@ error: `#[panic_handler]` function required, but not found error: language item required, but not found: `eh_personality` ``` -Сейчас компилятор не может найти `#[panic_handler]` функцию и _языковой предмет(`eh_personality`)_. +Сейчас компилятор не может найти функцию `#[panic_handler]` и «элемент языка». ## Реализация _паники_ From f5e2cfba9760bdef480e86a448e8b04a8ed4f46e Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:55:05 +0300 Subject: [PATCH 063/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 4b1b7aea2..f395f5ce5 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -169,7 +169,7 @@ panic = "abort" panic = "abort" ``` -Это устанавливает стратегию паники на `abort`(отмены) как для профиля `dev` (используемого для `cargo build`), так и для профиля `release` (используемого для `cargo build --release`). Теперь языковой предмет `eh_personality` больше не должен требоваться. +Это устанавливает стратегию паники на `abort` (прерывание) как для профиля `dev` (используемого для `cargo build`), так и для профиля `release` (используемого для `cargo build --release`). Теперь элемент языка `eh_personality` больше не должен требоваться. [abort on panic]: https://github.com/rust-lang/rust/pull/32900 From f0aab1c4a3d6c01186c96c19898fe2d1b871a75c Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:55:23 +0300 Subject: [PATCH 064/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index f395f5ce5..72af213fb 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -173,7 +173,7 @@ panic = "abort" [abort on panic]: https://github.com/rust-lang/rust/pull/32900 -Теперь мы исправили обе вышеуказанные ошибки. Однако, если мы попытаемся скомпилировать его теперь, возникнет другая ошибка: +Теперь мы исправили обе вышеуказанные ошибки. Однако, если мы сейчас попытаемся скомпилировать программу, возникнет другая ошибка: ``` > cargo build From 7d0a064ea60202a3e6656de97d77ca6202cf199c Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:55:44 +0300 Subject: [PATCH 065/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 72af213fb..579b9574f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -180,7 +180,7 @@ panic = "abort" error: requires `start` lang_item ``` -В нашей программе отсутствует языковой предмет `start`, который определяет начальную точку входа в программу. +В нашей программе отсутствует элемент языка `start`, который определяет начальную точку входа программы. ## Аттрибут `start` From 5edf474387edc80315a8cca1141c26661861dd7e Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:56:16 +0300 Subject: [PATCH 066/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 579b9574f..43b1c95e9 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -184,7 +184,7 @@ error: requires `start` lang_item ## Аттрибут `start` -Можно подумать, что функция `main` - это первая функция, вызываемая при запуске программы. Однако в большинстве языков есть [runtime система][runtime system], которая отвечает за такие вещи, как сборка мусора (например, в Java) или программные потоки (например, goroutines в Go). Эта система выполнения должна быть вызвана до `main`, поскольку ей необходимо инициализировать себя. +Можно подумать, что функция `main` — это первая функция, вызываемая при запуске программы. Однако в большинстве языков есть [среда выполнения][runtime system], которая отвечает за такие вещи, как сборка мусора (например, в Java) или программные потоки (например, goroutines в Go). Эта система выполнения должна быть вызвана до `main`, поскольку ей необходимо инициализировать себя. [runtime system]: https://en.wikipedia.org/wiki/Runtime_system From ad02986bec49d6154fde3103a855a2d9b7949e47 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 12:59:25 +0300 Subject: [PATCH 067/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 43b1c95e9..73a1ddbfe 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -188,7 +188,7 @@ error: requires `start` lang_item [runtime system]: https://en.wikipedia.org/wiki/Runtime_system -В типичном бинарном файле Rust, который использует стандартную библиотеку, выполнение начинается в библиотеке C runtime под названием `crt0` ("C runtime zero"), которая создает окружение для C приложения. Это включает создание стека и размещение аргументов в нужных регистрах. Затем C runtime вызывает [точку входа для приложения Rust][rt::lang_start], которая обозначается языковым предметом `start`. Rust имеет только очень маленький runtime, который заботится о некоторых мелочах, таких как установка защиты от переполнения стека или вывод сообщения при панике. Затем runtime вызывает функцию `main`. +В типичном исполнимом файле Rust, который использует стандартную библиотеку, выполнение начинается в runtime-библиотеке C под названием `crt0` ("C runtime zero"), которая создает окружение для C-приложения. Это включает создание стека и размещение аргументов в нужных регистрах. Затем C runtime вызывает [точку входа для Rust-приложения][rt::lang_start], которая обозначается элементом языка `start`. Rust имеет очень маленький runtime, который заботится о некоторых мелочах, таких как установка защиты от переполнения стека или вывод сообщения при панике. Затем рантайм вызывает функцию `main`. [rt::lang_start]: https://github.com/rust-lang/rust/blob/bb4d1491466d8239a7a5fd68bd605e3276e97afb/src/libstd/rt.rs#L32-L73 From 43e9b9336e8b97406e1804733bd2307a7a7d56c2 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:00:15 +0300 Subject: [PATCH 068/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 73a1ddbfe..5758f9eb5 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -24,7 +24,7 @@ translators = ["MrZloHex"] ## Введение -Для того, чтобы написать ядро операционной системы нужен код, который независит от операционной системы и ее свойств. Это озночает, что нельзя использовать потоки, файлы, [кучу][heap], сети, случайные числа, стандартный видео-вывод или другие возможности, которые предоставляет абстракция в виде ОС или очень специфичное железо. +Для того, чтобы написать ядро операционной системы, нужен код, который не зависит от операционной системы и ее возможностей. Это означает, что нельзя использовать потоки, файлы, [кучу][heap], сети, случайные числа, стандартный вывод или другие возможности, которые зависят от ОС или определённого железа. [heap]: https://en.wikipedia.org/wiki/Heap_(data_structure) From fcdfb401a2486b52b45ffcab76d1d66c1cfe38fe Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:04:25 +0300 Subject: [PATCH 069/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 5758f9eb5..d0573531e 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -220,7 +220,7 @@ pub extern "C" fn _start() -> ! { } ``` -Используя атрибут `#[no_mangle]`, мы отключаем [искажение имен][name mangling], чтобы гарантировать, что компилятор Rust действительно выводит функцию с именем `_start`. Без этого атрибута компилятор генерировал бы какой-нибудь загадочный символ `_ZN3blog_os4_start7hb173fedf945531caE`, чтобы дать каждой функции уникальное имя. Атрибут необходим, потому что на следующем этапе нам нужно сообщить имя функции точки входа компоновщику. +Используя атрибут `#[no_mangle]`, мы отключаем [искажение имен][name mangling], чтобы гарантировать, что компилятор Rust сгенерирует функцию с именем `_start`. Без этого атрибута компилятор генерировал бы какой-нибудь загадочный символ `_ZN3blog_os4_start7hb173fedf945531caE`, чтобы дать каждой функции уникальное имя. Атрибут необходим, потому что на следующем этапе нам нужно сообщить имя функции точки входа компоновщику. Мы также должны пометить функцию как `extern "C"`, чтобы указать компилятору, что он должен использовать [соглашение о вызове C][C calling convention] для этой функции (вместо неопределенного соглашения о вызове Rust). Причина именования функции `_start` в том, что это имя точки входа по умолчанию для большинства систем. From b9dcde2e92749fdf4f1f3e3c67847b20c9a6df22 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:05:33 +0300 Subject: [PATCH 070/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index d0573531e..46324b60f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -227,7 +227,7 @@ pub extern "C" fn _start() -> ! { [name mangling]: https://en.wikipedia.org/wiki/Name_mangling [C calling convention]: https://en.wikipedia.org/wiki/Calling_convention -Тип возврата `!` означает, что функция является расходящейся, т.е. не имеет права возвращаться. Это необходимо, поскольку точка входа не вызывается никакой функцией, а вызывается непосредственно операционной системой или загрузчиком. Поэтому вместо возврата точка входа должна, например, вызывать [системный вызов `exit`][`exit` system call] операционной системы. В нашем случае разумным действием может быть выключение машины, поскольку в случае возврата автономного двоичного файла делать нечего. Пока что мы выполняем это требование путем бесконечного цикла. +Возвращаемый `!` означает, что функция является расходящейся, т.е. не имеет права возвращаться. Это необходимо, поскольку точка входа не вызывается никакой функцией, а вызывается непосредственно операционной системой или загрузчиком. Поэтому вместо возврата точка входа должна, например, вызвать [системный вызов `exit`][`exit` system call] операционной системы. В нашем случае разумным действием может быть выключение машины, поскольку ничего не останется делать, если независимый исполнимый файл завершит исполнение. Пока что мы выполняем это требование путем бесконечного цикла. [`exit` system call]: https://en.wikipedia.org/wiki/Exit_(system_call) From c9e3e85e8e0364b186c719e5ee0fcc6fca2b6426 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:06:24 +0300 Subject: [PATCH 071/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 46324b60f..7d7e5dea4 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -231,7 +231,7 @@ pub extern "C" fn _start() -> ! { [`exit` system call]: https://en.wikipedia.org/wiki/Exit_(system_call) -Если мы выполним `cargo build` сейчас, мы получаем ошибку компоновщика (_linker_ error). +Если мы выполним `cargo build` сейчас, мы получим ошибку компоновщика (_linker_ error). ## Ошибки компоновщика From 2b26af2bfc9d239e153f537ba8e1d0e0a1df6c5e Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:09:17 +0300 Subject: [PATCH 072/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 7d7e5dea4..cb2bfcff5 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -235,7 +235,7 @@ pub extern "C" fn _start() -> ! { ## Ошибки компоновщика -Компоновщик - это программа, которая объединяет сгенерированный код в исполняемый файл. Поскольку формат исполняемого файла отличается в Linux, Windows и macOS, в каждой системе есть свой компоновщик, который выдает разные ошибки. Основная причина ошибок одна и та же: конфигурация компоновщика по умолчанию предполагает, что наша программа зависит от C runtime, а это не так. +Компоновщик — это программа, которая объединяет сгенерированный код в исполняемый файл. Поскольку формат исполняемого файла отличается в Linux, Windows и macOS, в каждой системе есть свой компоновщик, и каждый покажет свою ошибку. Основная причина ошибок одна и та же: конфигурация компоновщика по умолчанию предполагает, что наша программа зависит от C runtime, а это не так. Чтобы устранить ошибки, нам нужно сообщить компоновщику, что он не должен включать C runtime. Мы можем сделать это, передав компоновщику определенный набор аргументов или выполнив компиляцию для голого железа. From 30aef2b1cb77df7277af00b4c5f57b9d09cbe1ca Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:10:44 +0300 Subject: [PATCH 073/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index cb2bfcff5..9abb5300b 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -241,7 +241,7 @@ pub extern "C" fn _start() -> ! { ### Компиляция для голого железа -По умолчанию Rust пытается создать исполняемый файл, который может быть запущен в вашем текущем системном окружении. Например, если вы используете Windows на `x86_64`, Rust пытается создать исполняемый файл `.exe` Windows, который использует инструкции `x86_64`. Это окружение называется вашей "хост-системой". +По умолчанию Rust пытается создать исполняемый файл, который может быть запущен в окружении вашей текущей системы. Например, если вы используете Windows на `x86_64`, Rust пытается создать исполняемый файл Windows `.exe`, который использует инструкции `x86_64`. Это окружение называется вашей "хост-системой". Для описания различных окружений Rust использует строку [_target triple_]. Вы можете узнать тройку вашей хост-системы, выполнив команду `rustc --version --verbose`: From 4f37287bc5258573a488c33612edc77a709aa618 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:12:17 +0300 Subject: [PATCH 074/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 9abb5300b..060082f1f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -261,7 +261,7 @@ LLVM version: 8.0 [ABI]: https://en.wikipedia.org/wiki/Application_binary_interface -Компилируя для нашей тройки хоста, компилятор Rust и компоновщик предполагают наличие базовой операционной системы, такой как Linux или Windows, которая по умолчанию использует C runtime, что вызывает ошибки компоновщика. Поэтому, чтобы избежать ошибок компоновщика, мы можем скомпилировать для другого окружения без базовой операционной системы. +Компилируя для тройки нашего хоста, компилятор Rust и компоновщик предполагают наличие базовой операционной системы, такой как Linux или Windows, которая по умолчанию использует C runtime, что вызывает ошибки компоновщика. Поэтому, чтобы избежать ошибок компоновщика, мы можем настроить компиляцию для другого окружения без базовой операционной системы. Примером такого "голого" окружения является тройка `thumbv7em-none-eabihf`, которая описывает [ARM] архитектуру. Детали не важны, важно лишь то, что тройка не имеет базовой операционной системы, на что указывает `none` в тройке. Чтобы иметь возможность компилировать для этой системы, нам нужно добавить ее в rustup: From 502dd1d08a2231e6e14cae722e73224cca2bfe5a Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:12:59 +0300 Subject: [PATCH 075/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 060082f1f..04642fe4f 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -271,7 +271,7 @@ LLVM version: 8.0 rustup target add thumbv7em-none-eabihf ``` -Это загружает копию стандартной (и корневой) библиотеки для системы. Теперь мы можем собрать наш независимый исполняемый файл для этой системы: +Это загружает копию стандартной библиотеки (и `core`) для системы. Теперь мы можем собрать наш независимый исполняемый файл для этой системы: ``` cargo build --target thumbv7em-none-eabihf From 3400037403767f2d0e4f1028bf3315b3e4927853 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:16:49 +0300 Subject: [PATCH 076/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 04642fe4f..9e55386e4 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -281,7 +281,7 @@ cargo build --target thumbv7em-none-eabihf [cross compile]: https://en.wikipedia.org/wiki/Cross_compiler -Именно этот подход мы будем использовать для сборки ядра нашей ОС. Вместо `thumbv7em-none-eabihf` мы будем использовать [custom target], который описывает `x86_64` архитектуру окружения. Подробности будут описаны в следующем посте. +Именно этот подход мы будем использовать для сборки ядра нашей ОС. Вместо `thumbv7em-none-eabihf` мы будем использовать [custom target], который описывает окружение для архитектуры `x86_64`. Подробности будут описаны в следующем посте. [custom target]: https://doc.rust-lang.org/rustc/targets/custom.html From 784bffe5069d6282cac683d16eaa5a3e582338c2 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:17:32 +0300 Subject: [PATCH 077/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 9e55386e4..300fd9080 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -287,7 +287,7 @@ cargo build --target thumbv7em-none-eabihf ### Аргументы компоновщика -Вместо компиляции для голой системы можно также разрешить ошибки компоновщика, передав ему определенный набор аргументов. Мы не будем использовать этот подход для нашего ядра, поэтому данный раздел является необязательным и приводится только для полноты картины. Щелкните на _"Аргументы компоновщика"_ ниже, чтобы показать необязательное содержание. +Вместо компиляции под голое железо, ошибки компоновщика можно исправить, передав ему определенный набор аргументов. Мы не будем использовать этот подход для нашего ядра, поэтому данный раздел является необязательным и приводится только для полноты картины. Щелкните на _"Аргументы компоновщика"_ ниже, чтобы показать необязательное содержание.
From 30648979e8c69547b012f1af5ef86d51470a7f14 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:18:08 +0300 Subject: [PATCH 078/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 300fd9080..8d94de9ea 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -320,7 +320,7 @@ error: linking with `cc` failed: exit code: 1 cargo rustc -- -C link-arg=-nostartfiles ``` -Теперь наш модуль собирается как независимый исполняемый файл в Linux! +Теперь наш крейт собирается как независимый исполняемый файл в Linux! Нам не нужно было явно указывать имя нашей функции точки входа, поскольку компоновщик по умолчанию ищет функцию с именем `_start`. From 891049c1766c238aa2b8e6a4f64faa7117ec8593 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:19:40 +0300 Subject: [PATCH 079/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 8d94de9ea..890a83c52 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -396,7 +396,7 @@ error: linking with `cc` failed: exit code: 1 clang: error: linker command failed with exit code 1 […] ``` -macOS [официально не поддерживает статически скомпонованные двоичные файлы][static binary] и по умолчанию требует от программ компоновки библиотеки `libSystem`. Чтобы отменить это и скомпоновать статический двоичный файл, мы передаем компоновщику флаг `-static`: +macOS [официально не поддерживает статически скомпонованные исполняемые файлы][static binary] и по умолчанию требует от программ компоновки библиотеки `libSystem`. Чтобы переопределить это поведение и скомпоновать статический исполняемый файл, передадим компоновщику флаг `-static`: [static binary]: https://developer.apple.com/library/archive/qa/qa1118/_index.html From e43616b480d1f3c4a6bd25eb3e8b4de887847cd2 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:20:15 +0300 Subject: [PATCH 080/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 890a83c52..0af530415 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -414,7 +414,7 @@ error: linking with `cc` failed: exit code: 1 clang: error: linker command failed with exit code 1 […] ``` -Эта ошибка возникает из-за того, что программы на macOS по умолчанию ссылаются на `crt0` ("C runtime zero"). Это похоже на ошибку, которую мы имели в Linux, и также может быть решена добавлением аргумента компоновщика `-nostartfiles`: +Эта ошибка возникает из-за того, что программы на macOS по умолчанию ссылаются на `crt0` ("C runtime zero"). Она похожа на ошибку под Linux и тоже может быть решена добавлением аргумента компоновщика `-nostartfiles`: ``` cargo rustc -- -C link-args="-e __start -static -nostartfiles" From f87a267ba790554d6fa736b22d4a86a110daccc5 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:20:55 +0300 Subject: [PATCH 081/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 0af530415..87e05c59a 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -445,7 +445,7 @@ rustflags = ["-C", "link-args=-e __start -static -nostartfiles"] #### Должны ли вы это делать? -Хотя можно создать отдельный исполняемый файл для Linux, Windows и macOS, это, вероятно, не очень хорошая идея. Причина в том, что наш исполняемый файл все еще ожидает различных вещей, например, инициализации стека при вызове функции `_start`. Без C runtime некоторые из этих требований могут быть не выполнены, что может привести к сбою нашей программы, например, из-за ошибки сегментации. +Хотя можно создать независимый исполняемый файл для Linux, Windows и macOS, это, вероятно, не очень хорошая идея. Причина в том, что наш исполняемый файл все еще ожидает различных вещей, например, инициализации стека при вызове функции `_start`. Без C runtime некоторые из этих требований могут быть не выполнены, что может привести к сбою нашей программы, например, из-за ошибки сегментации. Если вы хотите создать минимальный двоичный файл, работающий поверх существующей операционной системы, то включение `libc` и установка атрибута `#[start]`, как описано [здесь] (https://doc.rust-lang.org/1.16.0/book/no-stdlib.html), вероятно, будет лучшей идеей. From 09a9563900c452d4e0221518707ed9ba380e1e25 Mon Sep 17 00:00:00 2001 From: MrZlo <71838355+MrZloHex@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:22:08 +0300 Subject: [PATCH 082/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 87e05c59a..d2ee1ea3c 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -447,7 +447,7 @@ rustflags = ["-C", "link-args=-e __start -static -nostartfiles"] Хотя можно создать независимый исполняемый файл для Linux, Windows и macOS, это, вероятно, не очень хорошая идея. Причина в том, что наш исполняемый файл все еще ожидает различных вещей, например, инициализации стека при вызове функции `_start`. Без C runtime некоторые из этих требований могут быть не выполнены, что может привести к сбою нашей программы, например, из-за ошибки сегментации. -Если вы хотите создать минимальный двоичный файл, работающий поверх существующей операционной системы, то включение `libc` и установка атрибута `#[start]`, как описано [здесь] (https://doc.rust-lang.org/1.16.0/book/no-stdlib.html), вероятно, будет лучшей идеей. +Если вы хотите создать минимальный исполняемый файл, запускаемый поверх существующей операционной системы, то включение `libc` и установка атрибута `#[start]`, как описано [здесь] (https://doc.rust-lang.org/1.16.0/book/no-stdlib.html), вероятно, будет идеей получше.
From 0dfb78acd9a7788508dcd6d040b6ea79b00d58d0 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Thu, 15 Jul 2021 13:33:25 +0300 Subject: [PATCH 083/120] FIX: CONTROVERSIAL MOMENTS --- .../posts/01-freestanding-rust-binary/index.ru.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index d2ee1ea3c..36e3f9714 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -143,7 +143,7 @@ fn panic(_info: &PanicInfo) -> ! { ## Языковой предмет `eh_personality` -Языковые предметы это специальный функции и типы, которые необходимы компилятору. Например, трэйт [`Copy`] эхто языковой предмет, которые указывает компилятору какой тип [_семантику копирования_][`Copy`]. Если мы посмотрим на исходный код [реализации][copy code] этого трэйта, то можно увидеть специальный аттрибут `#[lang = "copy"]`, которые указывает на то, что это языковой предмет. +Элементы языка — это специальные функции и типы, которые необходимы компилятору. Например, трейт [`Copy`] указывает компилятору, у каких типов есть [_семантика копирования_][`Copy`]. Если мы посмотрим на [реализацию][copy code] этого трейта, то увидим специальный атрибут `#[lang = "copy"]`, который говорит, что этот трейт является элементом языка. [`Copy`]: https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html [copy code]: https://github.com/rust-lang/rust/blob/485397e49a02a3b7ff77c17e4a3f16c653925cb3/src/libcore/marker.rs#L296-L299 @@ -192,7 +192,7 @@ error: requires `start` lang_item [rt::lang_start]: https://github.com/rust-lang/rust/blob/bb4d1491466d8239a7a5fd68bd605e3276e97afb/src/libstd/rt.rs#L32-L73 -Наш независимый исполняемый файл не имеет доступа к runtime Rust и `crt0`, поэтому нам нужно определить собственную точку входа. Реализация языкового предмета `start` не поможет, поскольку он все равно потребует `crt0`. Вместо этого нам нужно напрямую переопределить точку входа `crt0`. +Наш независимый исполняемый файл не имеет доступа к runtime Rust и `crt0`, поэтому нам нужно определить собственную точку входа. Реализация языкового элемента `start` не поможет, поскольку он все равно потребует `crt0`. Вместо этого нам нужно напрямую переопределить точку входа `crt0`. ### Переопределение точки входа @@ -211,7 +211,7 @@ fn panic(_info: &PanicInfo) -> ! { } ``` -Вы можете заметить, что мы удалили функцию `main`. Причина в том, что `main` не имеет смысла без стандартнлого runtime, которая ее вызывает. Вместо этого мы переопределили точку входа операционной системы нашей собственной функцией `_start`: +Можно заметить, что мы удалили функцию `main`. Причина в том, что `main` не имеет смысла без стандартного runtime, которая ее вызывает. Вместо этого мы переопределим точку входа операционной системы с помощью нашей собственной функции `_start`: ```rust #[no_mangle] @@ -335,7 +335,7 @@ error: linking with `link.exe` failed: exit code: 1561 = note: LINK : fatal error LNK1561: entry point must be defined ``` -Ошибка "точка входа должна быть определена"(_"entry point must be defined"_) означает, что компоновщик не может найти точку входа. В Windows имя точки входа по умолчанию [зависит от используемой подсистемы][windows-subsystems]. Для подсистемы `CONSOLE` компоновщик ищет функцию с именем `mainCRTStartup`, а для подсистемы `WINDOWS` - функцию с именем `WinMainCRTStartup`. Чтобы переопределить названия точки входа на `_start`, мы можем передать компоновщику аргумент `/ENTRY`: +Ошибка "точка входа должна быть определена" (_"entry point must be defined"_) означает, что компоновщик не может найти точку входа. В Windows имя точки входа по умолчанию [зависит от используемой подсистемы][windows-subsystems]. Для подсистемы `CONSOLE` компоновщик ищет функцию с именем `mainCRTStartup`, а для подсистемы `WINDOWS` - функцию с именем `WinMainCRTStartup`. Чтобы переопределить названия точки входа на `_start`, мы можем передать компоновщику аргумент `/ENTRY`: [windows-subsystems]: https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol From f439aeedc8c4da45a75fc8dc280280489ebdc8d5 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 11:40:48 +0300 Subject: [PATCH 084/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 36e3f9714..3d9d44ad9 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -159,7 +159,7 @@ fn panic(_info: &PanicInfo) -> ! { ### Отключение раскрутки -Существуют и другие случаи использования, для которых раскрутка нежелательна, поэтому Rust предоставляет опцию [отмены при панике][abort on panic]. Это отключает генерацию информации о символах раскрутки и, таким образом, значительно уменьшает размер двоичного файла. Есть несколько мест, где мы можем отключить раскрутку. Самый простой способ - добавить следующие строки в наш `Cargo.toml`: +Существуют и другие случаи использования, для которых раскрутка нежелательна, поэтому Rust предоставляет опцию [прерывания выполнения при панике][abort on panic]. Это отключает генерацию информации о символах раскрутки и, таким образом, значительно уменьшает размер бинарного файла. Есть несколько мест, где мы можем отключить раскрутку. Самый простой способ — добавить следующие строки в наш `Cargo.toml`: ```toml [profile.dev] From 393fe2c3affa8ec7c7b1dcad06079ee77b3aeb74 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 11:41:09 +0300 Subject: [PATCH 085/120] Update blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 3d9d44ad9..990fa6b31 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -257,7 +257,7 @@ release: 1.35.0-nightly LLVM version: 8.0 ``` -Приведенный выше результат получен от системы `x86_64` Linux. Мы видим, что тройка `host` - это `x86_64-unknown-linux-gnu`, которая включает архитектуру процессора (`x86_64`), производителя (`unknown`), операционную систему (`linux`) и [ABI] (`gnu`). +Приведенный выше результат получен от системы `x86_64` Linux. Мы видим, что тройка `host` — это `x86_64-unknown-linux-gnu`, которая включает архитектуру процессора (`x86_64`), производителя (`unknown`), операционную систему (`linux`) и [ABI] (`gnu`). [ABI]: https://en.wikipedia.org/wiki/Application_binary_interface From deb32e6747547b3b37fcd1271530fca37749c0ba Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 11:41:19 +0300 Subject: [PATCH 086/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md Co-authored-by: SnejUgal --- .../posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md index 72d4790f5..05fa97e14 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-red-zone/index.ru.md @@ -5,7 +5,7 @@ path = "ru/red-zone" template = "edition-2/extra.html" +++ -[Красная зона][red zone] - это оптимизация [System V ABI], которая позволяет функциям временно использовать 128 байт ниже своего стекового кадра без корректировки указателя стека: +[Красная зона][red zone] — это оптимизация [System V ABI], которая позволяет функциям временно использовать 128 байт ниже своего стекового кадра без корректировки указателя стека: [red zone]: https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64#the-red-zone [System V ABI]: https://wiki.osdev.org/System_V_ABI @@ -26,4 +26,4 @@ template = "edition-2/extra.html" [take weeks to debug]: https://forum.osdev.org/viewtopic.php?t=21720 -Чтобы избежать подобных ошибок при реализации обработки исключений в будущем, мы отключим красную зону с самого начала. Это достигается путем добавления строки `"disable-redzone": true` в наш целевой конфигурационный файл. \ No newline at end of file +Чтобы избежать подобных ошибок при реализации обработки исключений в будущем, мы отключим красную зону с самого начала. Это достигается путем добавления строки `"disable-redzone": true` в наш целевой конфигурационный файл. From b9a34c5f9e12f4dacc12b7cf8da8e691cf5045c8 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 11:41:36 +0300 Subject: [PATCH 087/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md Co-authored-by: SnejUgal --- .../posts/02-minimal-rust-kernel/disable-simd/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md index 7cccf2903..ee1d5b012 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md @@ -24,7 +24,7 @@ template = "edition-2/extra.html" [auto-vectorization]: https://en.wikipedia.org/wiki/Automatic_vectorization -Однако большие регистры SIMD приводят к проблемам в ядрах ОС. Причина в том, что ядро должно создавать резервные копии всех регистров, которые оно использует, в память при каждом аппаратном прерывании, потому что они должны иметь свои первоначальные значения, когда прерванная программа продолжает работу. Поэтому, если ядро использует SIMD-регистры, ему приходится резервировать гораздо больше данных (512-1600 байт), что заметно снижает производительность. Чтобы избежать этого снижения производительности, мы хотим отключить функции `se` и `mmx` (функция `avx` отключена по умолчанию). +Однако большие регистры SIMD приводят к проблемам в ядрах ОС. Причина в том, что ядро должно создавать резервные копии всех регистров, которые оно использует, в память при каждом аппаратном прерывании, потому что они должны иметь свои первоначальные значения, когда прерванная программа продолжает работу. Поэтому, если ядро использует SIMD-регистры, ему приходится резервировать гораздо больше данных (512-1600 байт), что заметно снижает производительность. Чтобы избежать этого снижения производительности, мы хотим отключить функции `sse` и `mmx` (функция `avx` отключена по умолчанию). Мы можем сделать это через поле `features` в нашей целевой спецификации. Чтобы отключить функции `mmx` и `se`, мы добавим их с минусом: @@ -41,4 +41,4 @@ template = "edition-2/extra.html" ```json "features": "-mmx,-sse,+soft-float" -``` \ No newline at end of file +``` From 4bb771453ac534986e666dfe5c0076becb530952 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:29:12 +0300 Subject: [PATCH 088/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md Co-authored-by: SnejUgal --- .../posts/02-minimal-rust-kernel/disable-simd/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md index ee1d5b012..b417735e3 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md @@ -26,7 +26,7 @@ template = "edition-2/extra.html" Однако большие регистры SIMD приводят к проблемам в ядрах ОС. Причина в том, что ядро должно создавать резервные копии всех регистров, которые оно использует, в память при каждом аппаратном прерывании, потому что они должны иметь свои первоначальные значения, когда прерванная программа продолжает работу. Поэтому, если ядро использует SIMD-регистры, ему приходится резервировать гораздо больше данных (512-1600 байт), что заметно снижает производительность. Чтобы избежать этого снижения производительности, мы хотим отключить функции `sse` и `mmx` (функция `avx` отключена по умолчанию). -Мы можем сделать это через поле `features` в нашей целевой спецификации. Чтобы отключить функции `mmx` и `se`, мы добавим их с минусом: +Мы можем сделать это через поле `features` в нашей целевой спецификации. Чтобы отключить функции `mmx` и `sse`, мы добавим их с минусом: ```json "features": "-mmx,-sse" From af0e82018d9c8f979c7d1865276e5dddea816e5b Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:30:51 +0300 Subject: [PATCH 089/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- .../edition-2/posts/02-minimal-rust-kernel/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 33fc52191..0a218af1c 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -93,7 +93,7 @@ translators = ["MrZloHex"] ### Установка Rust Nightly -Rust имеет три релизный канала: _stable_, _beta_ и _nightly_. В книге Rust Book очень хорошо объясняется разница между этими каналами, поэтому уделите минуту и [ознакомьтесь с ней](https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#choo-choo-release-channels-and-riding-the-trains). Для создания операционной системы нам понадобятся некоторые экспериментальные возможности, которые доступны только на канале nightly, поэтому нам нужно установить nightly версию Rust. +Rust имеет три релизных канала: _stable_, _beta_ и _nightly_. В книге Rust Book очень хорошо объясняется разница между этими каналами, поэтому уделите минуту и [ознакомьтесь с ней](https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#choo-choo-release-channels-and-riding-the-trains). Для создания операционной системы нам понадобятся некоторые экспериментальные возможности, которые доступны только на канале nightly, поэтому нам нужно установить nightly версию Rust. Для управления установками Rust я настоятельно рекомендую [rustup]. Он позволяет устанавливать nightly, beta и stable компиляторы рядом друг с другом и облегчает их обновление. С помощью rustup вы можете использовать nightly компилятор для текущего каталога, выполнив команду `rustup override set nightly`. В качестве альтернативы вы можете добавить файл `rust-toolchain` с содержимым `nightly` в корневой каталог проекта. Вы можете проверить, установлена ли у вас версия nightly, выполнив команду `rustc --version`: Номер версии должен содержать `-nightly` в конце. @@ -497,4 +497,4 @@ runner = "bootimage runner" ## Что дальше? -В следующем посте мы более подробно рассмотрим текстовый буфер VGA и напишем безопасный интерфейс для него. Мы также добавим поддержку макроса `println`. \ No newline at end of file +В следующем посте мы более подробно рассмотрим текстовый буфер VGA и напишем безопасный интерфейс для него. Мы также добавим поддержку макроса `println`. From 010572f2dd309e934202e812b6cb8eb12f2a0b87 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:31:31 +0300 Subject: [PATCH 090/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 0a218af1c..a9267c1d3 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -99,7 +99,7 @@ Rust имеет три релизных канала: _stable_, _beta_ и _night [rustup]: https://www.rustup.rs/ -Nightly версия компилятора позволяет нам подключаться к различным экспериментальным возможностям с помощью так называемых _флагов_ в верхней части нашего файла. Например, мы можем включить экспериментальный [`asm!` макрос][`asm!` macro] для поточной сборки, добавив `#![feature(asm)]` в начало нашего `main.rs`. Обратите внимание, что такие экспериментальные возможности совершенно нестабильны, что означает, что будущие версии Rust могут изменить или удалить их без предварительного предупреждения. По этой причине мы будем использовать их только в случае крайней необходимости. +Nightly версия компилятора позволяет нам подключать различные экспериментальные возможности с помощью так называемых _флагов_ в верхней части нашего файла. Например, мы можем включить экспериментальный [макрос `asm!``asm!` macro] для встроенного ассемблера, добавив `#![feature(asm)]` в начало нашего `main.rs`. Обратите внимание, что такие экспериментальные возможности совершенно нестабильны, что означает, что будущие версии Rust могут изменить или удалить их без предварительного предупреждения. По этой причине мы будем использовать их только в случае крайней необходимости. [`asm!` macro]: https://doc.rust-lang.org/unstable-book/library-features/asm.html From d59959be95924d8d63e62ca2ac2fe2f3c895ef92 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:32:15 +0300 Subject: [PATCH 091/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index a9267c1d3..34fc02eca 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -135,7 +135,7 @@ Cargo поддерживает различные целевые системы [`data-layout`]: https://llvm.org/docs/LangRef.html#data-layout [linker]: https://en.wikipedia.org/wiki/Linker_(computing) -Нам также нужно архитектура `x86_64` системы с нашим ядром, поэтому наша спецификация цели будет очень похожа на приведенную выше. Начнем с создания файла `x86_64-blog_os.json` (выберите любое имя, которое вам нравится) с общим содержанием: +Для нашего ядра тоже нужна архитектура `x86_64`, поэтому наша спецификация цели будет очень похожа на приведенную выше. Начнем с создания файла `x86_64-blog_os.json` (выберите любое имя, которое вам нравится) с общим содержанием: ```json { From e871e0e87de91aab9efad777a6ff26366d0d8fb6 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:32:36 +0300 Subject: [PATCH 092/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 34fc02eca..12ca888a3 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -150,7 +150,7 @@ Cargo поддерживает различные целевые системы } ``` -Обратите внимание, что мы изменили ОС в поле `llvm-target` и `os` на `none`, потому что мы будем работать на пустом металле. +Обратите внимание, что мы изменили ОС в поле `llvm-target` и `os` на `none`, потому что мы будем работать на голом железе. Добавляем дополнительные параметры для сборки ядра: From fb17c6ca8bea6ce0a1f37d78d9ddf4feb57c59b3 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:33:34 +0300 Subject: [PATCH 093/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 12ca888a3..56a308ecc 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -159,7 +159,7 @@ Cargo поддерживает различные целевые системы "linker": "rust-lld", ``` -Вместо того чтобы использовать компоновщик по умолчанию платформы (который может не поддерживать цели Linux), мы используем кроссплатформенный компоновщик [LLD], поставляемый с Rust для компоновки нашего ядра. +Вместо того чтобы использовать компоновщик по умолчанию платформы (который может не поддерживать цели Linux), мы используем кроссплатформенный компоновщик [LLD], поставляемый вместе с Rust, для компоновки нашего ядра. [LLD]: https://lld.llvm.org/ From 7f54a8467eeb7c8c18619d288380a5b209a8a424 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:33:56 +0300 Subject: [PATCH 094/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 56a308ecc..b7b266137 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -167,7 +167,7 @@ Cargo поддерживает различные целевые системы "panic-strategy": "abort", ``` -Этот параметр указывает, что цель не поддерживает [раскрутку стека][stack unwinding] при панике, поэтому вместо этого программа должна прерваться напрямую. Это имеет тот же эффект, что и опция `panic = "abort"` в нашем Cargo.toml, поэтому мы можем удалить ее оттуда. (Обратите внимание, что в отличие от опции Cargo.toml, эта опция также применяется, когда мы перекомпилируем библиотеку `core` позже в этом посте. Поэтому не забудьте добавить эту опцию, даже если вы предпочитаете оставить опцию Cargo.toml). +Этот параметр указывает, что цель не поддерживает [раскрутку стека][stack unwinding] при панике, поэтому вместо этого программа должна прерваться напрямую. Это имеет тот же эффект, что и опция `panic = "abort"` в нашем Cargo.toml, поэтому мы можем удалить ее оттуда. (Обратите внимание, что в отличие от опции Cargo.toml, эта опция также будет применяться, когда мы перекомпилируем библиотеку `core` позже в этом посте. Поэтому не забудьте добавить эту опцию, даже если вы предпочтете оставить опцию в Cargo.toml). [stack unwinding]: https://www.bogotobogo.com/cplusplus/stackunwinding.php From 855252a0742a7bbf9cbbf682aae8049f68a3d0c5 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:34:39 +0300 Subject: [PATCH 095/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index b7b266137..0221166e2 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -217,7 +217,7 @@ Cargo поддерживает различные целевые системы ### Компиляция ядра -Компиляция для нашей новой целевой платформы будет использовать соглашения Linux (я не совсем уверен, почему, я предполагаю, что это просто LLVM по умолчанию). Это означает, что нам нужна точка входа с именем `_start`, как описано в [предыдущем посте][previous post]: +Компиляция для нашей новой целевой платформы будет использовать соглашения Linux (я не совсем уверен почему — предполагаю, что это просто поведение LLVM по умолчанию). Это означает, что нам нужна точка входа с именем `_start`, как описано в [предыдущем посте][previous post]: [previous post]: @/edition-2/posts/01-freestanding-rust-binary/index.ru.md From 09f26c76342b3e5e2d993c8b1f76834fdf037351 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:34:59 +0300 Subject: [PATCH 096/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 0221166e2..76d962182 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -243,7 +243,7 @@ pub extern "C" fn _start() -> ! { } ``` -Обратите внимание, что точка входа должна называться `_start` независимо от используемой ОС. +Обратите внимание, что точка входа должна называться `_start` независимо от используемой вами ОС. Теперь мы можем собрать ядро для нашей новой цели, передав имя файла JSON в качестве `--target`: From 00d339e5fcd37e5bae56b56b5feb009466191bb6 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:35:25 +0300 Subject: [PATCH 097/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 76d962182..5eeb37bbb 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -253,7 +253,7 @@ pub extern "C" fn _start() -> ! { error[E0463]: can't find crate for `core` ``` -Не получается! Ошибка сообщает нам, что компилятор Rust больше не находит [библиотеку `core`][`core` library]. Эта библиотека содержит основные типы Rust, такие как `Result`, `Option` и итераторы, и неявно связана со всеми модулями `no_std`. +Не получается! Ошибка сообщает нам, что компилятор Rust больше не может найти [библиотеку `core`][`core` library]. Эта библиотека содержит основные типы Rust, такие как `Result`, `Option` и итераторы, и неявно связана со всеми `no_std` модулями. [`core` library]: https://doc.rust-lang.org/nightly/core/index.html From c9b7176792e0b050e6624408a281ade2898d2e9b Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:36:08 +0300 Subject: [PATCH 098/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 5eeb37bbb..c94e260f9 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -266,7 +266,7 @@ error[E0463]: can't find crate for `core` [`build-std` feature]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-std [nightly Rust]: #установка-rust-nightly -Чтобы использовать эту функцию, нам нужно создать файл [конфигураций cargo][cargo configuration] по адресу `.cargo/config.toml` со следующим содержимым: +Чтобы использовать эту функцию, нам нужно создать файл [конфигурации cargo][cargo configuration] по пути `.cargo/config.toml` со следующим содержимым: [cargo configuration]: https://doc.rust-lang.org/cargo/reference/config.html From 6cec57c8990f1bb8038a4428e90fa8fd0c031f5f Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:36:32 +0300 Subject: [PATCH 099/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index c94e260f9..362d5b934 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -278,7 +278,7 @@ error[E0463]: can't find crate for `core` build-std = ["core", "compiler_builtins"] ``` -Это говорит cargo, что он должен перекомпилировать библиотеки `core` и `compiler_builtins`. Последняя необходима, поскольку является зависимостью от `core`. Чтобы перекомпилировать эти библиотеки, cargo нужен доступ к исходному коду rust, который мы можем установить с помощью команды `rustup component add rust-src`. +Это говорит cargo, что он должен перекомпилировать библиотеки `core` и `compiler_builtins`. Последняя необходима, поскольку `core` зависит от неё. Чтобы перекомпилировать эти библиотеки, cargo нужен доступ к исходному коду rust, который мы можем установить с помощью команды `rustup component add rust-src`.
From 51b0efb01bf3e40b5a16346e026eda67e8c97cf1 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:37:03 +0300 Subject: [PATCH 100/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 362d5b934..4e80778c0 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -301,7 +301,7 @@ build-std = ["core", "compiler_builtins"] Компилятор Rust предполагает, что определенный набор встроенных функций доступен для всех систем. Большинство этих функций обеспечивается модулем `compiler_builtins`, который мы только что перекомпилировали. Однако в этом модуле есть некоторые функции, связанные с памятью, которые не включены по умолчанию, потому что они обычно предоставляются библиотекой C в системе. Эти функции включают `memset`, которая устанавливает все байты в блоке памяти в заданное значение, `memcpy`, которая копирует один блок памяти в другой, и `memcmp`, которая сравнивает два блока памяти. Хотя ни одна из этих функций нам сейчас не понадобилась для компиляции нашего ядра, они потребуются, как только мы добавим в него дополнительный код (например, при копировании структур). -Поскольку мы не можем ссылаться на С библиотеку хостовой операционной системы, нам нужен альтернативный способ предоставления этих функций компилятору. Одним из возможных подходов для этого может быть реализация наших собственных функций `memset` и т.д. и применение к ним атрибута `#[no_mangle]` (чтобы избежать автоматического переименования во время компиляции). Однако это опасно, поскольку малейшая ошибка в реализации этих функций может привести к неопределенному поведению. Например, при реализации `memcpy` с помощью цикла `for` вы можете получить бесконечную рекурсию, поскольку циклы `for` неявно вызывают метод трейта [`IntoIterator::into_iter`], который может снова вызвать `memcpy`. Поэтому хорошей идеей будет повторное использование существующих хорошо протестированных реализаций. +Поскольку мы не можем ссылаться на С библиотеку хостовой операционной системы, нам нужен альтернативный способ предоставления этих функций компилятору. Одним из возможных подходов для этого может быть реализация наших собственных функций `memset` и т.д. и применение к ним атрибута `#[no_mangle]` (чтобы избежать автоматического переименования во время компиляции). Однако это опасно, поскольку малейшая ошибка в реализации этих функций может привести к неопределенному поведению. Например, при реализации `memcpy` с помощью цикла `for` вы можете получить бесконечную рекурсию, поскольку циклы `for` неявно вызывают метод трейта [`IntoIterator::into_iter`], который может снова вызвать `memcpy`. Поэтому хорошей идеей будет повторное использование существующих, хорошо протестированных реализаций. [`IntoIterator::into_iter`]: https://doc.rust-lang.org/stable/core/iter/trait.IntoIterator.html#tymethod.into_iter From 429a54bcec35142b018f4de446d4e12338e910c1 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:37:24 +0300 Subject: [PATCH 101/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 4e80778c0..926014613 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -319,7 +319,7 @@ build-std = ["core", "compiler_builtins"] (Поддержка функции `compiler-builtins-mem` была [добавлена совсем недавно](https://github.com/rust-lang/rust/pull/77284), поэтому для нее вам нужен как минимум Rust nightly `2020-09-30`). -За кулисами этот флаг включает функцию [`mem`][`mem` feature] модуля `compiler_builtins`. Это приводит к тому, что атрибут `#[no_mangle]` применяется к [`memcpy` и т.п. реализациям][`memcpy` etc. implementations] этого ядра, что делает их доступными для компоновщика. +За кулисами этот флаг включает функцию [`mem`][`mem` feature] крейта `compiler_builtins`. Это приводит к тому, что атрибут `#[no_mangle]` применяется к [реализациям `memcpy` и т.п.][`memcpy` etc. implementations] из этого крейта, что делает их доступными для компоновщика. [`mem` feature]: https://github.com/rust-lang/compiler-builtins/blob/eff506cd49b637f1ab5931625a33cef7e91fbbf6/Cargo.toml#L54-L55 [`memcpy` etc. implementations]: https://github.com/rust-lang/compiler-builtins/blob/eff506cd49b637f1ab5931625a33cef7e91fbbf6/src/mem.rs#L12-L69 From e60c636470393b28973463ad026bee400310ee86 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:37:55 +0300 Subject: [PATCH 102/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 926014613..7a48287e5 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -297,7 +297,7 @@ build-std = ["core", "compiler_builtins"] Мы видим, что `cargo build` теперь перекомпилирует библиотеки `core`, `rustc-std-workspace-core` (зависимость от `compiler_builtins`) и `compiler_builtins` для нашей пользовательской целевой платформы. -#### Внутренности зависимые от памяти +#### Внутренние функции, работающие с памятью Компилятор Rust предполагает, что определенный набор встроенных функций доступен для всех систем. Большинство этих функций обеспечивается модулем `compiler_builtins`, который мы только что перекомпилировали. Однако в этом модуле есть некоторые функции, связанные с памятью, которые не включены по умолчанию, потому что они обычно предоставляются библиотекой C в системе. Эти функции включают `memset`, которая устанавливает все байты в блоке памяти в заданное значение, `memcpy`, которая копирует один блок памяти в другой, и `memcmp`, которая сравнивает два блока памяти. Хотя ни одна из этих функций нам сейчас не понадобилась для компиляции нашего ядра, они потребуются, как только мы добавим в него дополнительный код (например, при копировании структур). From 5f549b35b9cd7796c6b362c3784ac621f77379d1 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:38:26 +0300 Subject: [PATCH 103/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 7a48287e5..8b4917e6c 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -326,7 +326,7 @@ build-std = ["core", "compiler_builtins"] Благодаря этому изменению наше ядро имеет валидные реализации для всех функций, требуемых компилятором, поэтому оно будет продолжать компилироваться, даже если наш код станет сложнее. -#### Установка Стандартной цели +#### Переопределение цели по умолчанию Чтобы избежать передачи параметра `--target` при каждом вызове `cargo build`, мы можем переопределить цель по умолчанию. Для этого мы добавим следующее в наш файл [конфигураций cargo][cargo configuration] по адресу `.cargo/config.toml`: From dda7322c6979fa15219bde62f7e3f980feaabf28 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:38:45 +0300 Subject: [PATCH 104/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 8b4917e6c..0c3e56aec 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -328,7 +328,7 @@ build-std = ["core", "compiler_builtins"] #### Переопределение цели по умолчанию -Чтобы избежать передачи параметра `--target` при каждом вызове `cargo build`, мы можем переопределить цель по умолчанию. Для этого мы добавим следующее в наш файл [конфигураций cargo][cargo configuration] по адресу `.cargo/config.toml`: +Чтобы избежать передачи параметра `--target` при каждом вызове `cargo build`, мы можем переопределить цель по умолчанию. Для этого мы добавим следующее в наш файл [конфигураций cargo][cargo configuration] по пути `.cargo/config.toml`: ```toml # in .cargo/config.toml From 338fedf4a0768e634b5062bb70b4e0c12cb76555 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:39:14 +0300 Subject: [PATCH 105/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 0c3e56aec..1c0412b15 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -337,7 +337,7 @@ build-std = ["core", "compiler_builtins"] target = "x86_64-blog_os.json" ``` -Это указывает `cargo` использовать нашу цель `x86_64-blog_os.json`, если не передан явный аргумент `--target`. Это означает, что теперь мы можем собрать наше ядро с помощью простой `cargo build`. Для получения дополнительной информации о параметрах конфигурации cargo ознакомьтесь с [официальной документацией][cargo configuration]. +С этой конфигурацией `cargo` будет использовать нашу цель `x86_64-blog_os.json`, если не передан явный аргумент `--target`. Это означает, что теперь мы можем собрать наше ядро с помощью простой `cargo build`. Чтобы узнать больше о параметрах конфигурации cargo, ознакомьтесь с [официальной документацией][cargo configuration]. Теперь мы можем скомпилировать наше ядро для голого металла с помощью простой `cargo build`. Однако наша точка входа `_start`, которая будет вызываться загрузчиком, все еще пуста. Пришло время вывести что-нибудь на экран. From 5a6a95b0774f3aaf73c2913a6c5bf4cb88c6d22e Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:43:01 +0300 Subject: [PATCH 106/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 1c0412b15..ac0dd05ba 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -339,7 +339,7 @@ target = "x86_64-blog_os.json" С этой конфигурацией `cargo` будет использовать нашу цель `x86_64-blog_os.json`, если не передан явный аргумент `--target`. Это означает, что теперь мы можем собрать наше ядро с помощью простой `cargo build`. Чтобы узнать больше о параметрах конфигурации cargo, ознакомьтесь с [официальной документацией][cargo configuration]. -Теперь мы можем скомпилировать наше ядро для голого металла с помощью простой `cargo build`. Однако наша точка входа `_start`, которая будет вызываться загрузчиком, все еще пуста. Пришло время вывести что-нибудь на экран. +Теперь мы можем скомпилировать наше ядро под голое железо с помощью простой `cargo build`. Однако наша точка входа `_start`, которая будет вызываться загрузчиком, все еще пуста. Пришло время вывести что-нибудь на экран. ### Вывод на экран From 4cd049ac505bfe94dc42ae4ee9fb3f12686931e3 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:44:23 +0300 Subject: [PATCH 107/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index ac0dd05ba..b2ed90561 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -349,7 +349,7 @@ target = "x86_64-blog_os.json" ![screen output for common ASCII characters](https://upload.wikimedia.org/wikipedia/commons/f/f8/Codepage-437.png) -Точное расположение буфера VGA мы обсудим в следующем посте, где мы напишем первый небольшой драйвер для него. Для печати "Hello World!" нам достаточно знать, что буфер расположен по адресу `0xb8000` и что каждая символьная ячейка состоит из байта ASCII и байта цвета. +Точную разметку буфера VGA мы обсудим в следующем посте, где мы напишем первый небольшой драйвер для него. Для печати "Hello World!" нам достаточно знать, что буфер расположен по адресу `0xb8000` и что каждая символьная ячейка состоит из байта ASCII и байта цвета. Реализация выглядит следующим образом: From d61cf08be2085cdc8334900d7e75de9f65e3fe67 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:45:01 +0300 Subject: [PATCH 108/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index b2ed90561..42180d194 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -371,7 +371,7 @@ pub extern "C" fn _start() -> ! { } ``` -Сначала мы приводим целое число `0xb8000` к [сырому указателю][raw pointer]. Затем мы [итерируем][iterate] по байтам [статической][static] `HELLO` [байтовой строки][byte string]. Мы используем метод [`enumerate`], чтобы дополнительно получить бегущую переменную `i`. В теле цикла for мы используем метод [`offset`] для записи байта строки и соответствующего байта цвета (`0xb` - светло-голубой). +Сначала мы приводим целое число `0xb8000` к [сырому указателю][raw pointer]. Затем мы [итерируем][iterate] по байтам [статической][static] [байтовой строки][byte string] `HELLO`. Мы используем метод [`enumerate`], чтобы дополнительно получить бегущую переменную `i`. В теле цикла for мы используем метод [`offset`] для записи байта строки и соответствующего байта цвета (`0xb` - светло-голубой). [iterate]: https://doc.rust-lang.org/stable/book/ch13-02-iterators.html [static]: https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#the-static-lifetime From a3d0db91f9732fe265df1b3fb4b054dacea929e0 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:45:40 +0300 Subject: [PATCH 109/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 42180d194..0ba29f8d5 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -385,7 +385,7 @@ pub extern "C" fn _start() -> ! { [`unsafe`]: https://doc.rust-lang.org/stable/book/ch19-01-unsafe-rust.html [five additional things]: https://doc.rust-lang.org/stable/book/ch19-01-unsafe-rust.html#unsafe-superpowers -Я хочу подчеркнуть, что **это не тот способ, которым мы хотим делать вещи в Rust!** Очень легко ошибиться при работе с сырыми указателями внутри небезопасных блоков, например, мы можем легко записать за конец буфера, если мы не будем осторожны. +Я хочу подчеркнуть, что **это не тот способ, которым стоит что-либо делать в Rust!** Очень легко ошибиться при работе с сырыми указателями внутри блоков `unsafe`: например, мы можем легко записать за конец буфера, если не будем осторожны. Поэтому мы хотим минимизировать использование `unsafe` настолько, насколько это возможно. Rust дает нам возможность сделать это путем создания безопасных абстракций. Например, мы можем создать тип буфера VGA, который инкапсулирует всю небезопасность и гарантирует, что извне _невозможно_ сделать что-либо неправильно. Таким образом, нам понадобится лишь минимальное количество `небезопасных` блоков и мы можем быть уверены, что не нарушаем [безопасность памяти][memory safety]. Мы создадим такую безопасную абстракцию буфера VGA в следующем посте. From 91deaa7321291e14e536fe8964d9c7543888621d Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:46:06 +0300 Subject: [PATCH 110/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 0ba29f8d5..a65c8743d 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -387,7 +387,7 @@ pub extern "C" fn _start() -> ! { Я хочу подчеркнуть, что **это не тот способ, которым стоит что-либо делать в Rust!** Очень легко ошибиться при работе с сырыми указателями внутри блоков `unsafe`: например, мы можем легко записать за конец буфера, если не будем осторожны. -Поэтому мы хотим минимизировать использование `unsafe` настолько, насколько это возможно. Rust дает нам возможность сделать это путем создания безопасных абстракций. Например, мы можем создать тип буфера VGA, который инкапсулирует всю небезопасность и гарантирует, что извне _невозможно_ сделать что-либо неправильно. Таким образом, нам понадобится лишь минимальное количество `небезопасных` блоков и мы можем быть уверены, что не нарушаем [безопасность памяти][memory safety]. Мы создадим такую безопасную абстракцию буфера VGA в следующем посте. +Поэтому мы хотим минимизировать использование `unsafe` настолько, насколько это возможно. Rust дает нам возможность сделать это путем создания безопасных абстракций. Например, мы можем создать тип буфера VGA, который инкапсулирует всю небезопасность и гарантирует, что извне _невозможно_ сделать что-либо неправильно. Таким образом, нам понадобится лишь минимальное количество блоков `unsafe` и мы можем быть уверены, что не нарушаем [безопасность памяти][memory safety]. Мы создадим такую безопасную абстракцию буфера VGA в следующем посте. [memory safety]: https://en.wikipedia.org/wiki/Memory_safety From cb6cc336188552d0b34f7547e892ec66adb6f121 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:46:18 +0300 Subject: [PATCH 111/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index a65c8743d..cd7af0588 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -449,7 +449,7 @@ cargo install bootimage ### Запуск через QEMU -Теперь мы можем загрузить образ диска в виртуальную машину. Чтобы загрузить его в [QEMU], выполните следующую команду: +Теперь мы можем загрузить образ диска в виртуальной машине. Чтобы загрузить его в [QEMU], выполните следующую команду: [QEMU]: https://www.qemu.org/ From 61cf3317a26cd0cfd12d9b234c547da0b72d841d Mon Sep 17 00:00:00 2001 From: MrZlo Date: Sat, 17 Jul 2021 12:46:34 +0300 Subject: [PATCH 112/120] Update blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md Co-authored-by: SnejUgal --- blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index cd7af0588..383244f44 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -472,7 +472,7 @@ warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5] > dd if=target/x86_64-blog_os/debug/bootimage-blog_os.bin of=/dev/sdX && sync ``` -Где `sdX` - имя устройства вашего USB-накопителя. **Будьте внимательны**, чтобы выбрать правильное имя устройства, потому что все, что находится на этом устройстве, будет перезаписано. +Где `sdX` - имя устройства вашего USB-накопителя. **Внимательно проверьте**, что вы выбрали правильное имя устройства, потому что все, что находится на этом устройстве, будет перезаписано. После записи образа на USB-накопитель его можно запустить на реальном оборудовании, загрузившись с него. Для загрузки с USB-накопителя вам, вероятно, потребуется использовать специальное меню загрузки или изменить порядок загрузки в конфигурации BIOS. Обратите внимание, что в настоящее время это не работает на машинах с UEFI, так как модуль `bootloader` пока не имеет поддержки UEFI. From eb9e14b523ac13f6ff3ee173be784f1180b53ff8 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 17 Jul 2021 12:52:07 +0300 Subject: [PATCH 113/120] LANGUAGE ITEM --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 990fa6b31..665468071 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -141,7 +141,7 @@ fn panic(_info: &PanicInfo) -> ! { [diverging function]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions [“never” type]: https://doc.rust-lang.org/nightly/std/primitive.never.html -## Языковой предмет `eh_personality` +## Элемент языка `eh_personality` Элементы языка — это специальные функции и типы, которые необходимы компилятору. Например, трейт [`Copy`] указывает компилятору, у каких типов есть [_семантика копирования_][`Copy`]. Если мы посмотрим на [реализацию][copy code] этого трейта, то увидим специальный атрибут `#[lang = "copy"]`, который говорит, что этот трейт является элементом языка. From ec8e8d479506d941d18f517f4b953f349eaf651b Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 17 Jul 2021 13:02:29 +0300 Subject: [PATCH 114/120] ALL OTHER MOMENTS --- blog/config.toml | 2 +- .../posts/01-freestanding-rust-binary/index.ru.md | 6 ++++-- .../02-minimal-rust-kernel/disable-simd/index.ru.md | 6 +++--- .../edition-2/posts/02-minimal-rust-kernel/index.ru.md | 9 +++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/blog/config.toml b/blog/config.toml index db152b273..4a9b417b6 100644 --- a/blog/config.toml +++ b/blog/config.toml @@ -105,7 +105,7 @@ lang_name = "Russian" toc = "Содержание" all_posts = "« Все посты" comments = "Комментарии" -comments_notice = "Пожалуйста оставляйте комментарии на английском по возможности." +comments_notice = "Пожалуйста, оставляйте комментарии на английском по возможности." readmore = "читать дальше »" not_translated = "(Этот пост еще не переведен.)" translated_content = "Переведенное содержание:" diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 665468071..70bdb0360 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -68,7 +68,9 @@ blog_os └── main.rs ``` -`Cargo.toml` содержит данные и конфигурацию крейта, такие как _название, автор, версию_ и _зависимости_ от других крейтов. Файл `src/main.rs` содержит корневой модуль нашего крейта и функцию `main`. Можно скомпилировать крейт с помощью `cargo build` и запустить скомпилированную программу `blog_os` в поддиректории `target/debug`. +`Cargo.toml` содержит данные и конфигурацию крейта, такие как _название, автор, [семантическую версию][semantic version]_ и _зависимости_ от других крейтов. Файл `src/main.rs` содержит корневой модуль нашего крейта и функцию `main`. Можно скомпилировать крейт с помощью `cargo build` и запустить скомпилированную программу `blog_os` в поддиректории `target/debug`. + +[semantic version]: https://semver.org/ ### Атрибут `no_std` @@ -94,7 +96,7 @@ error: cannot find macro `println!` in this scope | ^^^^^^^ ``` -Эта ошибка объясняется тем, что [макрос `println`][macro] — часть стандартной библиотеки, которая была отключена. Поэтому у нас больше нет возможность выводить что-либо на экран. Это логично, так как `println` печатает через [стандартный вывод][standard output], который, в свою очередь, является специальным файловым дескриптором, предоставляемым операционной системой. +Эта ошибка объясняется тем, что [макрос `println`][macro] — часть стандартной библиотеки, которая была отключена. Поэтому у нас больше нет возможность выводить что-либо на экран. Это логично, так как `println` печатает через [стандартный вывод][standart output], который, в свою очередь, является специальным файловым дескриптором, предоставляемым операционной системой. [macro]: https://doc.rust-lang.org/std/macro.println.html [standart output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md index b417735e3..8a1feaa1c 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md @@ -32,10 +32,10 @@ template = "edition-2/extra.html" "features": "-mmx,-sse" ``` -## Плавающая точка -К сожалению для нас, архитектура `x86_64` использует регистры SSE для операций с плавающей точкой. Таким образом, каждое использование плавающей точки с отключенным SSE вызывает ошибку в LLVM. Проблема в том, что библиотека ядра Rust уже использует плавающие точки (например, в ней реализованы трейты для `f32` и `f64`), поэтому избежать плавающих точек в нашем ядре недостаточно. +## Числа с плавающей точкой +К сожалению для нас, архитектура `x86_64` использует регистры SSE для операций с числами с плавающей точкой. Таким образом, каждое использование чисел с плавающей точкой с отключенным SSE вызовёт ошибку в LLVM. Проблема в том, что библиотека `core` уже использует числа с плавающей точкой (например, в ней реализованы трейты для `f32` и `f64`), поэтому недостаточно избегать чисел с плавающей точкой в нашем ядре. -К счастью, LLVM поддерживает функцию `soft-float`, эмулирующую все операции с плавающей точкой через программные функции, основанные на обычных целых числах. Это позволяет использовать плавающие числа в нашем ядре без SSE, просто это будет немного медленнее. +К счастью, LLVM поддерживает функцию `soft-float`, эмулирующую все операции с числавами с плавающей точкой через программные функции, основанные на обычных целых числах. Это позволяет использовать плавающие числа в нашем ядре без SSE, просто это будет немного медленнее. Чтобы включить функцию `soft-float` для нашего ядра, мы добавим ее в строку `features` в спецификации цели с префиксом плюс: diff --git a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md index 383244f44..dc27b1834 100644 --- a/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md +++ b/blog/content/edition-2/posts/02-minimal-rust-kernel/index.ru.md @@ -14,7 +14,8 @@ translators = ["MrZloHex"] [freestanding Rust binary]: @/edition-2/posts/01-freestanding-rust-binary/index.ru.md -Этот блог открыто разрабатывается на [GitHub]. Если у вас есть несколько проблем или вопросов, пожалуйста откройте _issue_. Также можете оставлять комментарии [в конце файла][at the bottom]. Полный исходный код для этого поста вы можете найти [`post-02`][post branch] ветке репозитория. +Этот блог открыто разрабатывается на [GitHub]. Если у вас возникли какие-либо проблемы или вопросы, пожалуйста, создайте _issue_. Также вы можете оставлять комментарии [в конце страницы][at the bottom]. Полный исходный код для этого поста вы можете найти в репозитории в ветке [`post-02`][post branch]. + [GitHub]: https://github.com/phil-opp/blog_os [at the bottom]: #comments @@ -29,7 +30,7 @@ translators = ["MrZloHex"] [ROM]: https://en.wikipedia.org/wiki/Read-only_memory [power-on self-test]: https://en.wikipedia.org/wiki/Power-on_self-test -Для архитектуры x86 существует два стандарта прошивки: “Basic Input/Output System“ ("Базовая система ввода/вывода" **[BIOS]**) и более новый “Unified Extensible Firmware Interface” ("Унифицированный расширяемый интерфейс прошивки" **[UEFI]**). Стандарт BIOS - старый и устаревший, но простой и хорошо поддерживаемый на любой машине x86 с 1980-х годов. UEFI, напротив, более современный и имеет гораздо больше возможностей, но более сложен в настройке (по крайней мере, на мой взгляд). +Для архитектуры x86 существует два стандарта прошивки: “Basic Input/Output System“ ("Базовая система ввода/вывода" **[BIOS]**) и более новый “Unified Extensible Firmware Interface” ("Унифицированный расширяемый интерфейс прошивки" **[UEFI]**). Стандарт BIOS - старый, но простой и хорошо поддерживаемый на любой машине x86 с 1980-х годов. UEFI, напротив, более современный и имеет гораздо больше возможностей, но более сложен в настройке (по крайней мере, на мой взгляд). [BIOS]: https://en.wikipedia.org/wiki/BIOS [UEFI]: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface @@ -112,7 +113,7 @@ Cargo поддерживает различные целевые системы [platform-support]: https://forge.rust-lang.org/release/platform-support.html [custom-targets]: https://doc.rust-lang.org/nightly/rustc/targets/custom.html -Однако для нашей целевой системы нам требуются некоторые специальные параметры конфигурации (например, отсутствие базовой ОС), поэтому ни одна из [существующих целевых троек][platform-support] не подходит. К счастью, Rust позволяет нам определить [собственную цель][custom-targets] через JSON-файл. Например, JSON-файл, описывающий цель `x86_64-unknown-linux-gnu`, выглядит следующим образом: +Однако для нашей целевой системы нам требуются некоторые специальные параметры конфигурации (например, отсутствие базовой ОС), поэтому ни одна из [существующих целевых троек][platform-support] не подходит. К счастью, Rust позволяет нам определить [custom target][custom-targets] через JSON-файл. Например, JSON-файл, описывающий цель `x86_64-unknown-linux-gnu`, выглядит следующим образом: ```json { @@ -189,7 +190,7 @@ Cargo поддерживает различные целевые системы [Single Instruction Multiple Data (SIMD)]: https://en.wikipedia.org/wiki/SIMD -Проблема с отключением SIMD заключается в том, что операции с плавающей точкой на `x86_64` по умолчанию требуют регистров SIMD. Чтобы решить эту проблему, мы добавили функцию `soft-float`, которая эмулирует все операции с плавающей точкой через программные функции, основанные на обычных целых числах. +Проблема с отключением SIMD заключается в том, что операции с числами с плавающей точкой на `x86_64` по умолчанию требуют регистров SIMD. Чтобы решить эту проблему, мы добавили функцию `soft-float`, которая эмулирует все операции с числами с плавающей точкой через программные функции, основанные на обычных целых числах. Для получения дополнительной информации см. наш пост об [отключении SIMD](@/edition-2/posts/02-minimal-rust-kernel/disable-simd/index.ru.md). From c0cb80b2d997da9b84e86f678e5f36062f1e4e01 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 17 Jul 2021 13:06:58 +0300 Subject: [PATCH 115/120] standarD --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 70bdb0360..396a3f0c2 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -96,10 +96,10 @@ error: cannot find macro `println!` in this scope | ^^^^^^^ ``` -Эта ошибка объясняется тем, что [макрос `println`][macro] — часть стандартной библиотеки, которая была отключена. Поэтому у нас больше нет возможность выводить что-либо на экран. Это логично, так как `println` печатает через [стандартный вывод][standart output], который, в свою очередь, является специальным файловым дескриптором, предоставляемым операционной системой. +Эта ошибка объясняется тем, что [макрос `println`][macro] — часть стандартной библиотеки, которая была отключена. Поэтому у нас больше нет возможность выводить что-либо на экран. Это логично, так как `println` печатает через [стандартный вывод][standard output], который, в свою очередь, является специальным файловым дескриптором, предоставляемым операционной системой. [macro]: https://doc.rust-lang.org/std/macro.println.html -[standart output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 +[standard output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 Давайте уберем макрос `println` и попробуем скомпилировать еще раз: From 7ca9707b0d35501a56443a6f308c7e5ab4fa7eb1 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sat, 17 Jul 2021 19:31:51 +0300 Subject: [PATCH 116/120] ADDITIONAL SETUP FILES --- blog/content/_index.ru.md | 13 +++++++++++++ blog/content/edition-2/posts/_index.ru.md | 7 +++++++ 2 files changed, 20 insertions(+) create mode 100644 blog/content/_index.ru.md create mode 100644 blog/content/edition-2/posts/_index.ru.md diff --git a/blog/content/_index.ru.md b/blog/content/_index.ru.md new file mode 100644 index 000000000..1b00d8912 --- /dev/null +++ b/blog/content/_index.ru.md @@ -0,0 +1,13 @@ ++++ +template = "edition-2/index.html" ++++ + +

Собственная операционная система на Rust

+ +
+ +Этот блог посвящен написанию маленькой операционной системы на [языке программирования Rust](https://www.rust-lang.org/).Каждый пост это маленькое руководство, включающее в себя весь необходимый код, и если хотите можете ему следовать. Исходный код также доступен в соотвестующем [репозитории на Github](https://github.com/phil-opp/blog_os). + +Последний пост: + +
diff --git a/blog/content/edition-2/posts/_index.ru.md b/blog/content/edition-2/posts/_index.ru.md new file mode 100644 index 000000000..c7079c408 --- /dev/null +++ b/blog/content/edition-2/posts/_index.ru.md @@ -0,0 +1,7 @@ ++++ +title = "Posts" +sort_by = "weight" +insert_anchor_links = "left" +render = false +page_template = "edition-2/page.html" ++++ From 81b775ada211420dba6f8d9c587311a5b89fbaa2 Mon Sep 17 00:00:00 2001 From: MrZlo Date: Mon, 19 Jul 2021 11:57:27 +0300 Subject: [PATCH 117/120] Update blog/content/_index.ru.md Co-authored-by: SnejUgal --- blog/content/_index.ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/content/_index.ru.md b/blog/content/_index.ru.md index 1b00d8912..a9bb07ecd 100644 --- a/blog/content/_index.ru.md +++ b/blog/content/_index.ru.md @@ -6,7 +6,7 @@ template = "edition-2/index.html"
-Этот блог посвящен написанию маленькой операционной системы на [языке программирования Rust](https://www.rust-lang.org/).Каждый пост это маленькое руководство, включающее в себя весь необходимый код, и если хотите можете ему следовать. Исходный код также доступен в соотвестующем [репозитории на Github](https://github.com/phil-opp/blog_os). +Этот блог посвящен написанию маленькой операционной системы на [языке программирования Rust](https://www.rust-lang.org/). Каждый пост — это маленькое руководство, включающее в себя весь необходимый код, — вы сможете следовать ему, если пожелаете. Исходный код также доступен в соотвестующем [репозитории на Github](https://github.com/phil-opp/blog_os). Последний пост: From e4b599ed9212de3d311c84bb0b1a6f398a837b51 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Mon, 19 Jul 2021 12:29:12 +0300 Subject: [PATCH 118/120] WRONG LINKS --- .../edition-2/posts/01-freestanding-rust-binary/index.ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md index 396a3f0c2..2677ac3f2 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ru.md @@ -140,8 +140,8 @@ fn panic(_info: &PanicInfo) -> ! { Параметр [`PanicInfo`][PanicInfo] содержит название файла и строку, где произошла паника, и дополнительное сообщение с пояснением. Эта функция никогда не должна возвратиться, и такая функция называется [расходящейся][diverging functions] и она возращает [пустой тип]["never" type] `!`. Пока что мы ничего не можем сделать в этой функции, поэтому мы просто войдем в бесконечный цикл. [PanicInfo]: https://doc.rust-lang.org/nightly/core/panic/struct.PanicInfo.html -[diverging function]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions -[“never” type]: https://doc.rust-lang.org/nightly/std/primitive.never.html +[diverging functions]: https://doc.rust-lang.org/1.30.0/book/first-edition/functions.html#diverging-functions +["never" type]: https://doc.rust-lang.org/nightly/std/primitive.never.html ## Элемент языка `eh_personality` From 73a71d5bc4d80e1de210ce28b855b437021dc868 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 25 Jul 2021 14:24:05 +0300 Subject: [PATCH 119/120] INTRO --- .../posts/03-vga-text-buffer/index.ru.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md diff --git a/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md b/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md new file mode 100644 index 000000000..8e33ceac2 --- /dev/null +++ b/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md @@ -0,0 +1,25 @@ ++++ +title = "Текстовый режим VGA" +weight = 2 +path = "ru/vga-text-mode" +date = 2018-02-26 + +[extra] +chapter = "С нуля" +translators = ["MrZloHex"] ++++ + +[Текстовый режим VGA][VGA text mode] — это простой способ вывода текста на экран. В этом посте мы создадим интерфейс, который делает его использование безопасным и простым, инкапсулируя все уязвимости в отдельный модуль. Мы также реализуем поддержку [макросов форматирования][formatting macros] языка Rust. + +[VGA text mode]: https://en.wikipedia.org/wiki/VGA-compatible_text_mode +[formatting macros]: https://doc.rust-lang.org/std/fmt/#related-macros + + + +Этот блог открыто разрабатывается на [GitHub]. Если у вас возникли какие-либо проблемы или вопросы, пожалуйста, создайте _issue_. Также вы можете оставлять комментарии [в конце страницы][at the bottom]. Полный исходный код для этого поста вы можете найти в репозитории в ветке [`post-03`][post branch]. + +[GitHub]: https://github.com/phil-opp/blog_os +[at the bottom]: #comments +[post branch]: https://github.com/phil-opp/blog_os/tree/post-03 + + \ No newline at end of file From 966075a8944f15a2e4bccbaef54700cdb24c50d4 Mon Sep 17 00:00:00 2001 From: MrZloHex Date: Sun, 25 Jul 2021 14:45:17 +0300 Subject: [PATCH 120/120] TEXT BUFFER VGA --- .../posts/03-vga-text-buffer/index.ru.md | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md b/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md index 8e33ceac2..ce1f65921 100644 --- a/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md +++ b/blog/content/edition-2/posts/03-vga-text-buffer/index.ru.md @@ -22,4 +22,43 @@ translators = ["MrZloHex"] [at the bottom]: #comments [post branch]: https://github.com/phil-opp/blog_os/tree/post-03 - \ No newline at end of file + + +## Текстовый буфер VGA + +Чтобы вывести символ на экран в текстовом режиме VGA, необходимо записать его в текстовый буфер аппаратного обеспечения VGA. Текстовый буфер VGA представляет собой двумерный массив с типичными 25 строками и 80 столбцами, который непосредственно выводится на экран. Каждая запись массива описывает один экранный символ в следующем формате: + + Биты | Значения +------ | -------------------- +0-7 | ASCII Кодовая точка +8-11 | Цвет переднего плана +12-14 | Цвет фона +15 | Мигание + +Первый байт представляет символ, который должен быть напечатан в [кодировке ASCII][ASCII encoding]. Точнее говоря, это не совсем ASCII, а набор символов [_кодовая страница 437_][_code page 437_] с некоторыми дополнительными символами и небольшими модификациями. Для простоты в этой заметке мы будем называть его символом ASCII. + +[ASCII encoding]: https://en.wikipedia.org/wiki/ASCII +[_code page 437_]: https://en.wikipedia.org/wiki/Code_page_437 + +Второй байт определяет способ отображения символа. Первые четыре бита определяют цвет переднего плана, следующие три бита — цвет фона, а последний бит — должен ли символ мигать. Доступны следующие цвета: + +Номер | Цвет | Номер + Бит Яркости | Яркий Цвет +------ | ------------ | ------------------- | ------------- +0x0 | Черный | 0x8 | Темно-серый +0x1 | Синий | 0x9 | Светло-синий +0x2 | Зеленый | 0xa | Светло-зеленый +0x3 | Голубой | 0xb | Светло-голубой +0x4 | Красный | 0xc | Светло-красный +0x5 | Пурпурный | 0xd | Розовый +0x6 | Коричневый | 0xe | Желтый +0x7 | Светло-серый | 0xf | Белый + +Бит 4 — это _бит яркости_, который превращает, например, синий цвет в светло-синий. Для цвета фона этот бит перепрофилируется в бит мигания. + +Текстовый буфер VGA доступен через [отображение ввода-вывода на памяти][memory-mapped I/O] по адресу `0xb8000`. Это означает, что при чтении и записи по этому адресу доступ осуществляется не к оперативной памяти, а непосредственно к текстовому буферу VGA. Это означает, что мы можем читать и записывать его через обычные операции с памятью по этому адресу. + +[memory-mapped I/O]: https://en.wikipedia.org/wiki/Memory-mapped_I/O + +Обратите внимание, что оборудование с отображением на память может не поддерживать все обычные операции с оперативной памятью. Например, устройство может поддерживать только побайтовое чтение и возвращать мусор при чтении `u64`. К счастью, текстовый буфер [поддерживает обычное чтение и запись][supports normal reads and writes], так что нам не придется обращаться с ним особым образом. + +[supports normal reads and writes]: https://web.stanford.edu/class/cs140/projects/pintos/specs/freevga/vga/vgamem.htm#manip \ No newline at end of file