From fcf63e42aa65e226ab661edb956cd36110d95e31 Mon Sep 17 00:00:00 2001 From: Zaaf Hachem rachid <117745305+ZAAFHachemrachid@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:12:31 -0700 Subject: [PATCH 1/5] Create index.ar.md --- .../edition-2/posts/01-freestanding-rust-binary/index.ar.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md new file mode 100644 index 000000000..3f2926262 --- /dev/null +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md @@ -0,0 +1,3 @@ +تتمثل الخطوة الأولى في إنشاء نواة نظام التشغيل الخاصة بنا في إنشاء ملف Rust قابل للتنفيذ لا يربط المكتبة القياسية. هذا يجعل من الممكن تشغيل شيفرة Rust على المعدن العاري دون نظام تشغيل أساسي. + +تم تطوير هذه المدونة بشكل مفتوح على GitHub. إذا كان لديك أي مشاكل أو أسئلة، يرجى فتح مشكلة هناك. يمكنك أيضًا ترك تعليقات في الأسفل. يمكن العثور على الشيفرة المصدرية الكاملة لهذا المنشور في فرع post-01. From 9150885e82d805b97dc5306093bed79ce6dc7c1a Mon Sep 17 00:00:00 2001 From: Zaaf Hachem rachid <117745305+ZAAFHachemrachid@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:37:47 -0700 Subject: [PATCH 2/5] Update index.ar.md Add Introduction , Disabling the Standard Library --- .../01-freestanding-rust-binary/index.ar.md | 72 ++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md index 3f2926262..13b18b3f6 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md @@ -1,3 +1,71 @@ -تتمثل الخطوة الأولى في إنشاء نواة نظام التشغيل الخاصة بنا في إنشاء ملف Rust قابل للتنفيذ لا يربط المكتبة القياسية. هذا يجعل من الممكن تشغيل شيفرة Rust على المعدن العاري دون نظام تشغيل أساسي. ++++ +title = "A Freestanding Rust Binary" +weight = 1 +path = "freestanding-rust-binary" +date = 2018-02-10 + +[extra] +chapter = "Bare Bones" ++++ + +تتمثل الخطوة الأولى في إنشاء نواة نظام التشغيل الخاصة بنا في إنشاء ملف Rust قابل للتنفيذ لا يربط المكتبة القياسية. هذا يجعل من الممكن تشغيل شيفرة Rust على [bare metal] دون نظام تشغيل أساسي. +[bare metal]: https://en.wikipedia.org/wiki/Bare_machine + + +تم تطوير هذه المدونة بشكل مفتوح على [GitHub]. إذا كان لديك أي مشاكل أو أسئلة، يرجى فتح مشكلة هناك. يمكنك أيضًا ترك تعليقات [في الأسفل]. يمكن العثور على الشيفرة المصدرية الكاملة لهذا المنشور في فرع [post-01]. + + +[GitHub]: https://github.com/phil-opp/blog_os +[at the bottom]: #comments + +[post branch]: https://github.com/phil-opp/blog_os/tree/post-01 + + + +## مقدمة +لكتابة نواة نظام تشغيل، نحتاج إلى شيفرة لا تعتمد على أي ميزات نظام تشغيل. هذا يعني أنه لا يمكننا استخدام سلاسل الرسائل(threads) أو الملفات(File System) أو Heap ram أو الشبكة أو الأرقام العشوائية أو الإخراج القياسي(I/O) أو أي ميزات أخرى تتطلب تجريدات نظام التشغيل أو أجهزة معينة. وهذا منطقي، لأننا نحاول كتابة نظام التشغيل الخاص بنا (OS) وبرامج التشغيل الخاصة بنا (drivers). + +هذا يعني أنه لا يمكننا استخدام معظم [Rust standard 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 قائم بذاته ويشرح سبب الحاجة إلى هذه الخطوات. إذا كنت مهتمًا بمثال بسيط فقط، يمكنك **[الانتقال إلى الملخص] (#ملخص)**. + + + +## تعطيل المكتبة القياسية +بشكل افتراضي، تربط جميع صناديق Rust [standard library]، والتي تعتمد على نظام التشغيل لميزات (مثل threads, files, or networking). كما أنها تعتمد أيضًا على مكتبة C القياسية 'libc'، والتي تتفاعل بشكل وثيق مع خدمات نظام التشغيل. نظرًا لأن خطتنا هي كتابة نظام تشغيل، لا يمكننا استخدام أي مكتبات تعتمد على نظام التشغيل. لذا يجب علينا تعطيل التضمين التلقائي للمكتبة القياسية من خلال سمة [no_std]. + + +[standard library]: https://doc.rust-lang.org/std/ +[`no_std` attribute]: https://doc.rust-lang.org/1.30.0/book/first-edition/using-rust-without-the-standard-library.html + +``` +cargo new blog_os --bin --edition 2018 +``` + +لقد أطلقتُ على المشروع اسم ”Blog_os“، ولكن بالطبع يمكنك اختيار اسمك الخاص. تُحدّد علامة ”bin“ أننا نريد إنشاء نسخة binary قابلة للتنفيذ (على عكس المكتبة) وتحدّد علامة ”--- Edition 2018“ أننا نريد استخدام [2018 edition] من Rust لصندوقنا. عندما نُشغّل الأمر، تُنشئ لنا الشحنة بنية الدليل التالية: +[2018 edition]: https://doc.rust-lang.org/nightly/edition-guide/rust-2018/index.html + +``` +blog_os +├── Cargo.toml +└── src + └── main.rs +``` +يحتوي ملف 'Cargo.toml' على تكوين الصندوق، على سبيل المثال اسم الصندوق، والمؤلف، ورقم [semantic version]، والتبعيات. يحتوي الملف 'src/main.rs' على الوحدة النمطية الجذرية للصندوق والدالة 'الرئيسية'. يمكنك تجميع قفصك من خلال 'cargo build' ثم تشغيل الملف الثنائي 'blog_os' المجمّع في المجلد الفرعي 'target/debug'. +[semantic version]: https://semver.org/ -تم تطوير هذه المدونة بشكل مفتوح على GitHub. إذا كان لديك أي مشاكل أو أسئلة، يرجى فتح مشكلة هناك. يمكنك أيضًا ترك تعليقات في الأسفل. يمكن العثور على الشيفرة المصدرية الكاملة لهذا المنشور في فرع post-01. From d2ee259bfd9b0a79e6092523b41afeb2de646bfb Mon Sep 17 00:00:00 2001 From: Zaaf Hachem rachid <117745305+ZAAFHachemrachid@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:38:41 -0700 Subject: [PATCH 3/5] Update index.ar.md fix some ui thing --- .../edition-2/posts/01-freestanding-rust-binary/index.ar.md | 1 + 1 file changed, 1 insertion(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md index 13b18b3f6..d86d20e03 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md @@ -58,6 +58,7 @@ cargo new blog_os --bin --edition 2018 ``` لقد أطلقتُ على المشروع اسم ”Blog_os“، ولكن بالطبع يمكنك اختيار اسمك الخاص. تُحدّد علامة ”bin“ أننا نريد إنشاء نسخة binary قابلة للتنفيذ (على عكس المكتبة) وتحدّد علامة ”--- Edition 2018“ أننا نريد استخدام [2018 edition] من Rust لصندوقنا. عندما نُشغّل الأمر، تُنشئ لنا الشحنة بنية الدليل التالية: + [2018 edition]: https://doc.rust-lang.org/nightly/edition-guide/rust-2018/index.html ``` From cd348bbe3ce33d6ceb532e27f4834d45cbc35359 Mon Sep 17 00:00:00 2001 From: Zaaf Hachem rachid <117745305+ZAAFHachemrachid@users.noreply.github.com> Date: Mon, 3 Jun 2024 08:12:26 -0700 Subject: [PATCH 4/5] Create _index.ar.md create new file index.ar.md --- blog/content/_index.ar.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 blog/content/_index.ar.md diff --git a/blog/content/_index.ar.md b/blog/content/_index.ar.md new file mode 100644 index 000000000..c226500ce --- /dev/null +++ b/blog/content/_index.ar.md @@ -0,0 +1,10 @@ ++++ template = "edition-2/index.html" +++ + + +

كتابة نظام تشغيل بلغة Rust

+
+ +تنشئ سلسلة المدونات هذه نظام تشغيل صغير بلغة البرمجة [Rust ](https://www.rust-lang.org/). كل منشور هو عبارة عن برنامج تعليمي صغير ويتضمن كل الشيفرة المطلوبة، لذا يمكنك المتابعة إذا أردت. الكود المصدري متاح أيضًا في مستودع [Github ](https://github.com/phil-opp/blog_os) المقابل. + +آخر منشور: +
From 7927beeffa7d36adec7632131149a77982a24d19 Mon Sep 17 00:00:00 2001 From: Zaaf Hachem rachid <117745305+ZAAFHachemrachid@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:40:11 -0700 Subject: [PATCH 5/5] Update index.ar.md --- .../01-freestanding-rust-binary/index.ar.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md index d86d20e03..1894d9985 100644 --- a/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md +++ b/blog/content/edition-2/posts/01-freestanding-rust-binary/index.ar.md @@ -9,6 +9,7 @@ chapter = "Bare Bones" +++ تتمثل الخطوة الأولى في إنشاء نواة نظام التشغيل الخاصة بنا في إنشاء ملف Rust قابل للتنفيذ لا يربط المكتبة القياسية. هذا يجعل من الممكن تشغيل شيفرة Rust على [bare metal] دون نظام تشغيل أساسي. + [bare metal]: https://en.wikipedia.org/wiki/Bare_machine @@ -68,5 +69,58 @@ blog_os └── main.rs ``` يحتوي ملف 'Cargo.toml' على تكوين الصندوق، على سبيل المثال اسم الصندوق، والمؤلف، ورقم [semantic version]، والتبعيات. يحتوي الملف 'src/main.rs' على الوحدة النمطية الجذرية للصندوق والدالة 'الرئيسية'. يمكنك تجميع قفصك من خلال 'cargo build' ثم تشغيل الملف الثنائي 'blog_os' المجمّع في المجلد الفرعي 'target/debug'. + [semantic version]: https://semver.org/ +### السمة 'no_std' + +يربط صندوقنا الآن المكتبة القياسية ضمنيًا بالمكتبة القياسية. دعونا نحاول تعطيل ذلك بإضافة سمة [no_std]: + + +```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' يكتب إلى [standard output]، وهو واصف ملف خاص يوفره نظام التشغيل. + + +[`println` macro]: https://doc.rust-lang.org/std/macro.println.html +[standard output]: https://en.wikipedia.org/wiki/Standard_streams#Standard_output_.28stdout.29 + +لذا دعنا نحذف الطباعة ونحاول مرة أخرى بدالة رئيسية فارغة: + +```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]` دالة و _language item_. + + +