From 5fe3b2cac086eec4dc55461545921742fba72045 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 22 Apr 2020 08:34:00 +0200 Subject: [PATCH 001/613] Initial Commit From 5db79b3d00807ee002b4458c3bf58e97a7cc9b1b Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 22 Apr 2020 08:42:38 +0200 Subject: [PATCH 002/613] Add hello world text file --- hello.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 hello.txt diff --git a/hello.txt b/hello.txt new file mode 100644 index 00000000..e5b8f9ce --- /dev/null +++ b/hello.txt @@ -0,0 +1 @@ +World! \ No newline at end of file From bf3bd8d930f3fc4884ab2c77a2a02b509e8e68a0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 22 Apr 2020 06:45:43 +0000 Subject: [PATCH 003/613] Deploy 56d65428439bb1fc9aedf0b29724a6f25a88121f Deploy of commit https://github.com/rust-osdev/homepage/commit/56d65428439bb1fc9aedf0b29724a6f25a88121f --- 404.html | 10 + contact/index.html | 54 +++++ css/poole.css | 430 +++++++++++++++++++++++++++++++++++++ hello.txt | 1 - index.html | 71 ++++++ news/0000-01-01/index.html | 66 ++++++ news/index.html | 67 ++++++ robots.txt | 2 + sitemap.xml | 26 +++ 9 files changed, 726 insertions(+), 1 deletion(-) create mode 100644 404.html create mode 100644 contact/index.html create mode 100644 css/poole.css delete mode 100644 hello.txt create mode 100644 index.html create mode 100644 news/0000-01-01/index.html create mode 100644 news/index.html create mode 100644 robots.txt create mode 100644 sitemap.xml diff --git a/404.html b/404.html new file mode 100644 index 00000000..f7d50b1a --- /dev/null +++ b/404.html @@ -0,0 +1,10 @@ + + + + File Not Found: 404. + + +

Oops!

+

File Not Found: 404.

+ + diff --git a/contact/index.html b/contact/index.html new file mode 100644 index 00000000..b9ba54d0 --- /dev/null +++ b/contact/index.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + Contact | Rust OSDev + + + +
+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+

Contact

+

Philipp Oppermann

+

contact@phil-opp.com

+

Gerwigstraße 17, 76131 Karlsruhe, Germany

+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/css/poole.css b/css/poole.css new file mode 100644 index 00000000..8ec27e7a --- /dev/null +++ b/css/poole.css @@ -0,0 +1,430 @@ +/* + * ___ + * /\_ \ + * _____ ___ ___\//\ \ __ + * /\ '__`\ / __`\ / __`\\ \ \ /'__`\ + * \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/ + * \ \ ,__/\ \____/\ \____//\____\ \____\ + * \ \ \/ \/___/ \/___/ \/____/\/____/ + * \ \_\ + * \/_/ + * + * Designed, built, and released under MIT license by @mdo. Learn more at + * https://github.com/poole/poole. + */ + + +/* + * Contents + * + * Body resets + * Custom type + * Messages + * Container + * Masthead + * Posts and pages + * Pagination + * Reverse layout + * Themes + */ + + +/* + * Body resets + * + * Update the foundational and global aspects of the page. + */ + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; +} + +html { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5; +} +@media (min-width: 38em) { + html { + font-size: 20px; + } +} + +body { + color: #515151; + background-color: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +/* No `:visited` state is required by default (browsers will use `a`) */ +a { + color: #268bd2; + text-decoration: none; +} +a strong { + color: inherit; +} +/* `:focus` is linked to `:hover` for basic accessibility */ +a:hover, +a:focus { + text-decoration: underline; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + margin-bottom: .5rem; + font-weight: bold; + line-height: 1.25; + color: #313131; + text-rendering: optimizeLegibility; +} +h1 { + font-size: 2rem; +} +h2 { + margin-top: 1rem; + font-size: 1.5rem; +} +h3 { + margin-top: 1.5rem; + font-size: 1.25rem; +} +h4, h5, h6 { + margin-top: 1rem; + font-size: 1rem; +} + +/* Body text */ +p { + margin-top: 0; + margin-bottom: 1rem; +} + +strong { + color: #303030; +} + + +/* Lists */ +ul, ol, dl { + margin-top: 0; + margin-bottom: 1rem; +} + +dt { + font-weight: bold; +} +dd { + margin-bottom: .5rem; +} + +/* Misc */ +hr { + position: relative; + margin: 1.5rem 0; + border: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #fff; +} + +abbr { + font-size: 85%; + font-weight: bold; + color: #555; + text-transform: uppercase; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #e5e5e5; +} + +/* Code */ +code, +pre { + font-family: Menlo, Monaco, "Courier New", monospace; +} +code { + padding: .25em .5em; + font-size: 85%; + color: #bf616a; + background-color: #f9f9f9; + border-radius: 3px; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + padding: 1rem; + font-size: .8rem; + line-height: 1.4; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + background-color: #f9f9f9; +} +pre code { + padding: 0; + font-size: 100%; + color: inherit; + background-color: transparent; +} + +/* Pygments via Jekyll */ +.highlight { + margin-bottom: 1rem; + border-radius: 4px; +} +.highlight pre { + margin-bottom: 0; +} + +/* Gist via GitHub Pages */ +.gist .gist-file { + font-family: Menlo, Monaco, "Courier New", monospace !important; +} +.gist .markdown-body { + padding: 15px; +} +.gist pre { + padding: 0; + background-color: transparent; +} +.gist .gist-file .gist-data { + font-size: .8rem !important; + line-height: 1.4; +} +.gist code { + padding: 0; + color: inherit; + background-color: transparent; + border-radius: 0; +} + +/* Quotes */ +blockquote { + padding: .5rem 1rem; + margin: .8rem 0; + color: #7a7a7a; + border-left: .25rem solid #e5e5e5; +} +blockquote p:last-child { + margin-bottom: 0; +} +@media (min-width: 30em) { + blockquote { + padding-right: 5rem; + padding-left: 1.25rem; + } +} + +img { + display: block; + max-width: 100%; + margin: 0 0 1rem; + border-radius: 5px; +} + +/* Tables */ +table { + margin-bottom: 1rem; + width: 100%; + border: 1px solid #e5e5e5; + border-collapse: collapse; +} +td, +th { + padding: .25rem .5rem; + border: 1px solid #e5e5e5; +} +tbody tr:nth-child(odd) td, +tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + + +/* + * Custom type + * + * Extend paragraphs with `.lead` for larger introductory text. + */ + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + + +/* + * Messages + * + * Show alert messages to users. You may add it to single elements like a `

`, + * or to a parent if there are multiple elements to show. + */ + +.message { + margin-bottom: 1rem; + padding: 1rem; + color: #717171; + background-color: #f9f9f9; +} + + +/* + * Container + * + * Center the page content. + */ + +.container { + max-width: 38rem; + padding-left: 1rem; + padding-right: 1rem; + margin-left: auto; + margin-right: auto; +} + + +/* + * Masthead + * + * Super small header above the content for site name and short description. + */ + +.masthead { + padding-top: 1rem; + padding-bottom: 1rem; + margin-bottom: 3rem; +} +.masthead-title { + margin-top: 0; + margin-bottom: 0; + color: #505050; +} +.masthead-title a { + color: #505050; +} +.masthead-title small { + font-size: 75%; + font-weight: 400; + color: #c0c0c0; + letter-spacing: 0; +} + + +/* + * Posts and pages + * + * Each post is wrapped in `.post` and is used on default and post layouts. Each + * page is wrapped in `.page` and is only used on the page layout. + */ + +.page, +.post { + margin-bottom: 4em; +} + +/* Blog post or page title */ +.page-title, +.post-title, +.post-title a { + color: #303030; +} +.page-title, +.post-title { + margin-top: 0; +} + +/* Meta data line below post title */ +.post-date { + display: block; + margin-top: -.5rem; + margin-bottom: 1rem; + color: #9a9a9a; +} + +/* Related posts */ +.related { + padding-top: 2rem; + padding-bottom: 2rem; + border-top: 1px solid #eee; +} +.related-posts { + padding-left: 0; + list-style: none; +} +.related-posts h3 { + margin-top: 0; +} +.related-posts li small { + font-size: 75%; + color: #999; +} +.related-posts li a:hover { + color: #268bd2; + text-decoration: none; +} +.related-posts li a:hover small { + color: inherit; +} + + +/* + * Pagination + * + * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when + * there are no more previous or next posts to show. + */ + +.pagination { + overflow: hidden; /* clearfix */ + margin-left: -1rem; + margin-right: -1rem; + font-family: "PT Sans", Helvetica, Arial, sans-serif; + color: #ccc; + text-align: center; +} + +/* Pagination items can be `span`s or `a`s */ +.pagination-item { + display: block; + padding: 1rem; + border: 1px solid #eee; +} +.pagination-item:first-child { + margin-bottom: -1px; +} + +/* Only provide a hover state for linked pagination items */ +a.pagination-item:hover { + background-color: #f5f5f5; +} + +@media (min-width: 30em) { + .pagination { + margin: 3rem 0; + } + .pagination-item { + float: left; + width: 50%; + } + .pagination-item:first-child { + margin-bottom: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + .pagination-item:last-child { + margin-left: -1px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } +} diff --git a/hello.txt b/hello.txt deleted file mode 100644 index e5b8f9ce..00000000 --- a/hello.txt +++ /dev/null @@ -1 +0,0 @@ -World! \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..68654990 --- /dev/null +++ b/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + Rust OSDev + + + +

+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+ +Hello! + +

News

+ +

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

+ +
+ +

This Month in Rust OSDev (Example)

+
+

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + read more » +
+ +
+ +
+ +
+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/news/0000-01-01/index.html b/news/0000-01-01/index.html new file mode 100644 index 00000000..914c42b8 --- /dev/null +++ b/news/0000-01-01/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + This Month in Rust OSDev (Example) | Rust OSDev + + + +
+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+

This Month in Rust OSDev (Example)

+ +

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Blog Posts

+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilities. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

+

Project Updates

+

Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilities.

+

Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.

+

Call for Participation

+

At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.

+

Personal Projects

+

Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/news/index.html b/news/index.html new file mode 100644 index 00000000..c1633f1a --- /dev/null +++ b/news/index.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + Rust OSDev + + + +
+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+ +

News

+ + +

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

+ + +
+ +

This Month in Rust OSDev (Example)

+
+

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + read more » +
+ +
+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..819c98e5 --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Sitemap: https://rust-osdev.com/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..8c2cc524 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,26 @@ + + + + + https://rust-osdev.com/ + + + + + https://rust-osdev.com/contact/ + + + + + https://rust-osdev.com/news/ + + + + + https://rust-osdev.com/news/0000-01-01/ + + 0000-01-01 + + + + From 11e4f6b571286d1a707533e65bc40a0cb93add68 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 22 Apr 2020 06:59:19 +0000 Subject: [PATCH 004/613] Deploy ab8e8ed92f0c5b7e21668e8b679f6e2e96a26a3c Deploy of commit https://github.com/rust-osdev/homepage/commit/ab8e8ed92f0c5b7e21668e8b679f6e2e96a26a3c --- css/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 css/CNAME diff --git a/css/CNAME b/css/CNAME new file mode 100644 index 00000000..87efc876 --- /dev/null +++ b/css/CNAME @@ -0,0 +1 @@ +rust-osdev.com \ No newline at end of file From d84e24f40d206c6784f357fb6c7b69f8cb91a54d Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 22 Apr 2020 07:01:02 +0000 Subject: [PATCH 005/613] Deploy e894ea555fde75eee9d11fb5aa1f68313bac2c59 Deploy of commit https://github.com/rust-osdev/homepage/commit/e894ea555fde75eee9d11fb5aa1f68313bac2c59 --- css/CNAME => CNAME | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename css/CNAME => CNAME (100%) diff --git a/css/CNAME b/CNAME similarity index 100% rename from css/CNAME rename to CNAME From 3aac4a9a2a630d5a81891e7f486a74b7a57322c9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 25 Apr 2020 00:03:45 +0000 Subject: [PATCH 006/613] Deploy e894ea555fde75eee9d11fb5aa1f68313bac2c59 Deploy of commit https://github.com/rust-osdev/homepage/commit/e894ea555fde75eee9d11fb5aa1f68313bac2c59 From 3304c853f81e85caed5989f4eea23e6e732a373c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 29 Apr 2020 00:03:43 +0000 Subject: [PATCH 007/613] Deploy e894ea555fde75eee9d11fb5aa1f68313bac2c59 Deploy of commit https://github.com/rust-osdev/homepage/commit/e894ea555fde75eee9d11fb5aa1f68313bac2c59 From 962d4c8a79fe6c1e5cf80a1bc18a5c07db706dea Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 1 May 2020 00:04:13 +0000 Subject: [PATCH 008/613] Deploy e894ea555fde75eee9d11fb5aa1f68313bac2c59 Deploy of commit https://github.com/rust-osdev/homepage/commit/e894ea555fde75eee9d11fb5aa1f68313bac2c59 From a81ec5ae7810919e34cdf000163c01b07e881c36 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 5 May 2020 00:04:07 +0000 Subject: [PATCH 009/613] Deploy e894ea555fde75eee9d11fb5aa1f68313bac2c59 Deploy of commit https://github.com/rust-osdev/homepage/commit/e894ea555fde75eee9d11fb5aa1f68313bac2c59 From e24ebd352e3ee8ea8b3481cf999dde9bcf577e48 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 May 2020 08:14:18 +0000 Subject: [PATCH 010/613] Deploy 173c098471d3bc563d5cddeb509b66fa3442a40f Deploy of commit https://github.com/rust-osdev/homepage/commit/173c098471d3bc563d5cddeb509b66fa3442a40f --- contact/index.html | 1 + css/main.css | 22 ++++ css/poole.css | 4 +- index.html | 21 +--- news/0000-01-01/index.html | 66 ----------- sitemap.xml | 6 +- this-month/2020-04/index.html | 188 ++++++++++++++++++++++++++++++++ {news => this-month}/index.html | 11 +- 8 files changed, 228 insertions(+), 91 deletions(-) create mode 100644 css/main.css delete mode 100644 news/0000-01-01/index.html create mode 100644 this-month/2020-04/index.html rename {news => this-month}/index.html (67%) diff --git a/contact/index.html b/contact/index.html index b9ba54d0..a5eca358 100644 --- a/contact/index.html +++ b/contact/index.html @@ -12,6 +12,7 @@ + diff --git a/css/main.css b/css/main.css new file mode 100644 index 00000000..e91c7982 --- /dev/null +++ b/css/main.css @@ -0,0 +1,22 @@ +.post-authors { + margin-left: 1rem; +} + +.post-authors a, a code, .gray a { + color: inherit; +} + +.gray { + color: gray; +} + +li ul { + margin-bottom: 0rem; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + padding: 0; + color: #a0565c; + font-size: 95%; + background-color: inherit; +} diff --git a/css/poole.css b/css/poole.css index 8ec27e7a..27f47dd6 100644 --- a/css/poole.css +++ b/css/poole.css @@ -54,7 +54,7 @@ html { } @media (min-width: 38em) { html { - font-size: 20px; + font-size: 18px; } } @@ -286,7 +286,7 @@ tbody tr:nth-child(odd) th { */ .container { - max-width: 38rem; + max-width: 42rem; padding-left: 1rem; padding-right: 1rem; margin-left: auto; diff --git a/index.html b/index.html index 68654990..b3ed6e19 100644 --- a/index.html +++ b/index.html @@ -12,6 +12,7 @@ + @@ -32,26 +33,16 @@

-Hello! +

Rust OSDev

-

News

+

This Month in Rust OSDev

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

- -
+
    -

    This Month in Rust OSDev (Example)

    -
    -

    Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    - - read more » -
    - -
- - +
diff --git a/news/0000-01-01/index.html b/news/0000-01-01/index.html deleted file mode 100644 index 914c42b8..00000000 --- a/news/0000-01-01/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - This Month in Rust OSDev (Example) | Rust OSDev - - - -
-
-
-

- Rust OSDev - Operating System Development in Rust -

-
-
- -
-
-

This Month in Rust OSDev (Example)

- -

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-

Blog Posts

-

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilities. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

-

Project Updates

-

Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilities.

-

Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

-

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.

-

Call for Participation

-

At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.

-

Personal Projects

-

Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

- -
- -
-
- - © . All rights reserved. - Contact - -
-
-
- - - - - diff --git a/sitemap.xml b/sitemap.xml index 8c2cc524..39d57d86 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -12,14 +12,14 @@ - https://rust-osdev.com/news/ + https://rust-osdev.com/this-month/ - https://rust-osdev.com/news/0000-01-01/ + https://rust-osdev.com/this-month/2020-04/ - 0000-01-01 + 2020-05-06 diff --git a/this-month/2020-04/index.html b/this-month/2020-04/index.html new file mode 100644 index 00000000..a7c605ed --- /dev/null +++ b/this-month/2020-04/index.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev (April 2020) | Rust OSDev + + + +
+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+

This Month in Rust OSDev (April 2020)

+ +

Welcome to the first issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development community.

+ +

These posts are the successor of the "Status Update" posts on the "Writing an OS in Rust" blog. Instead of only focusing on the updates to the blog and the directly related crates, we try to give an overview of the full Rust OSDev ecosystem in this new series. This includes all the projects under the rust-osdev GitHub organization, relevant projects of other organizations, and also personal OS projects.

+

This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue.

+

News and Blog Posts

+

We try to collect posts that are relevant to Rust-based OS development each month. Please create pull requests for any posts that you want linked in the next issue.

+ +

Project Updates

+

In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

+

x86_64

+

The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

+

This month, we released version 0.10.0 of x86_64, which includes some breaking changes:

+ +

After v0.10.0, the following changes were merged:

+ +

Thanks to @m-ou-se, @tomaka, @haraldh, and @imtsuki for their contributions!

+

acpi and aml

+

The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. The crate for parsing the static tables (acpi) was stabilised this month – while it needs more work to support the entire spec, it is now in the state where it can be integrated into a Rust kernel to provide useful information, and its overall architecture is unlikely to change in the near future.

+

The full set of changes is:

+ +

Thanks to @tomaka for their contribution and congratulations to the creator and maintainer @IsaacWoods on the 1.0 release!

+

bootloader

+

The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. It received the following updates this month:

+ +

Thanks to @Freax13 and @realKennyStrawn93 for these changes!

+

Right now, @rybot666 and @phil-opp are working on a rewrite of the bootloader. The goal is to port the 16-bit and 32-bit stages from assembly to Rust, which should make the crate safer, more composable, and easier to understand for outsiders. Our progress is tracked in the Rewrite milestone.

+

bootimage

+

The bootimage tool allows the creation of bootable disk images for bootloader-based kernels. It also provides a runner executable for cargo to make cargo xrun and cargo xtest work using QEMU. In April, the crate received the following updates:

+ +

Thanks to @Freax13 for their contribution!

+

uart_16550

+

The uart_16550 crate provides basic support for serial port I/O for 16550-compatible UARTs. This month, the crate received support for serial input:

+ +

Thanks to @imtsuki for their contribution!

+

cargo-xbuild

+

The cargo-xbuild project provides cargo command wrappers to cross-compile the sysroot crates core and alloc. This month, we added a new environment variable to help debugging build errors:

+ +

uefi

+

The uefi crate provides abstractions for the UEFI standard that replaces the traditional BIOS on modern systems. This month, the crate received a new cargo feature to ignore logger errors:

+ +

New Projects

+

There are a number of new projects in the rust-osdev organization:

+
    +
  • +

    homepage: As you might have noticed by now, we have a new organization-level homepage at https://rust-osdev.com/. The homepage repository contains the source code for this website. Right now, it is still a work-in-progress and only contains the very minimum to host this post, but we plan to add more content soon.

    +

    Note that we will create a branch for the upcoming May issue of "This Month in Rust OSDev". Please open pull requests for any content that you would like to see next month.

    +
  • +
  • +

    vga: The goal of the vga crate is to allow configuration of the VGA hardware. It already makes it possible to switch from a text-based buffer to a pixel-based framebuffer, which enables drawing of lines, geometric shapes, and even images. The library is created by @RKennedy9064.

    +
  • +
  • +

    ps2-mouse: The library provides a basic interface for interacting with a PS/2 mouse. It is also created by @RKennedy9064.

    +
  • +
+

Personal Projects

+

In this section, we describe updates to personal projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

+

IsaacWoods/pebble

+

(Section written by @IsaacWoods)

+

Pebble has been undergoing a bit of a reorganisation, in the interests of supporting a second architecture (ARM64). A hardware abstraction layer (HAL) has been introduced that abstracts away the platform-specifics of managing page tables, creating processes etc. so that the main kernel crate is now completely platform-independent.

+

I also wrote a little TFTP server for netbooting a Raspberry Pi 4 from a development machine. This makes iterating the kernel a lot easier because there's no need to write it to an SD card after every compile. In the next few weeks, I hope to clean this code up and publish it for use as both a library and CLI application, and maybe write a blog-post on the intricacies of netbooting the Pi.

+

rust-embedded/rust-raspberrypi-OS-tutorials

+

(Section written by @andre-richter)

+

The Operating System development tutorials in Rust on the Raspberry Pi project received the following updates recently:

+
    +
  • Add tutorial 14: Exceptions Part 2: Peripheral IRQs. +
      +
    • We write device drivers for the two interrupt controllers on the Raspberry Pi 3 (Broadcom +custom controller) and Pi 4 (ARM Generic Interrupt Controller v2, GICv2).
    • +
    • Modularity is ensured by interfacing everything through a trait named IRQManager.
    • +
    • Handling for our first peripheral IRQ is implemented: The UART's receive IRQ - one IRQ per +received character.
    • +
    +
  • +
  • Set chainloader relocation address to 32 MiB. +
      +
    • Enables booting on Pi3 A+ devices.
    • +
    +
  • +
  • Run the chainloader natively on non-Linux Unix systems. +
      +
    • Adds experimental support for macOS and other Unix systems which have Ruby available.
    • +
    +
  • +
+

phil-opp/blog_os

+

(Section written by @phil-opp)

+

Apart from a few minor fixes (thanks for all the contributions!), April was a quiet month for the "Writing an OS in Rust" project. I focused my work this month on the x86_64 library, the rewrite of the bootloader, and my job search instead. In this regard, I'm excited to announce that I have decided to do Rust-related freelance work for now, which will allow me to continue dedicating some of my time to open-source work.

+ +

Join Us?

+

Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/news/index.html b/this-month/index.html similarity index 67% rename from news/index.html rename to this-month/index.html index c1633f1a..4bff45a3 100644 --- a/news/index.html +++ b/this-month/index.html @@ -9,9 +9,10 @@ - + + @@ -32,7 +33,7 @@

-

News

+

This Month in Rust OSDev

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

@@ -40,11 +41,11 @@

News

-

This Month in Rust OSDev (Example)

+

This Month in Rust OSDev (April 2020)

-

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Welcome to the first issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development community.

- read more » + read more »
From 04e1d7d49380ad04feaa328de8c5f692e2c550b3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 May 2020 11:55:02 +0000 Subject: [PATCH 011/613] Deploy c80a3330438ee81e057f76379d5c10c78c4e0b27 Deploy of commit https://github.com/rust-osdev/homepage/commit/c80a3330438ee81e057f76379d5c10c78c4e0b27 --- rss.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 rss.xml diff --git a/rss.xml b/rss.xml new file mode 100644 index 00000000..11d7e927 --- /dev/null +++ b/rss.xml @@ -0,0 +1,22 @@ + + + + Rust OSDev + https://rust-osdev.com + Operating System Development in Rust + Zola + en + + Wed, 06 May 2020 00:00:00 +0000 + + + This Month in Rust OSDev (April 2020) + Wed, 06 May 2020 00:00:00 +0000 + https://rust-osdev.com/this-month/2020-04/ + https://rust-osdev.com/this-month/2020-04/ + <p>Welcome to the first issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we will give a regular overview of notable changes in the Rust operating system development community.</p> + + + + + From 29a27519d16185d64d817e9aaea48f32836166e2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 May 2020 11:58:21 +0000 Subject: [PATCH 012/613] Deploy 5539ccbe6c83c24f795874e65f54123886e4b399 Deploy of commit https://github.com/rust-osdev/homepage/commit/5539ccbe6c83c24f795874e65f54123886e4b399 From e1055d223074181d6fe590881d34de2c093dbb08 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 May 2020 11:59:59 +0000 Subject: [PATCH 013/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From 056130e01ffec9797b47d8113a37557dca03319f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 9 May 2020 00:03:52 +0000 Subject: [PATCH 014/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From 76dc67a76a8e320e03db03fce6a81f8fd9e159c9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 13 May 2020 00:04:28 +0000 Subject: [PATCH 015/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From ce2468ab2e09266ec9ca084793887ca2865e6d47 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 17 May 2020 00:04:31 +0000 Subject: [PATCH 016/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From 2fec0bc2031686b5c871281d8a7f022880441a44 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 21 May 2020 00:04:39 +0000 Subject: [PATCH 017/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From c25a4e3e1d640f4fe68fa7b0c5862bc22a8eb554 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 25 May 2020 00:08:15 +0000 Subject: [PATCH 018/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From 7f8233335799dfedf869dccc53d4566840240ce5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 29 May 2020 00:06:22 +0000 Subject: [PATCH 019/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From a4eae61b6135194018f736c6c386b5d437c8f3b9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 1 Jun 2020 00:06:54 +0000 Subject: [PATCH 020/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From c2bb668b41fe455b4ef7580f071161cb6a11492b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 5 Jun 2020 00:07:15 +0000 Subject: [PATCH 021/613] Deploy 497b4e894e291d219057f65310bc4cee0e7fb3bf Deploy of commit https://github.com/rust-osdev/homepage/commit/497b4e894e291d219057f65310bc4cee0e7fb3bf From 40769f461e20f7d5f1e9c85707a671f3e8afa21c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 7 Jun 2020 19:05:19 +0000 Subject: [PATCH 022/613] Deploy 62bc482e95d722852cbec57f97e4747119695b02 Deploy of commit https://github.com/rust-osdev/homepage/commit/62bc482e95d722852cbec57f97e4747119695b02 --- css/main.css | 11 ++- index.html | 2 + rss.xml | 9 ++ sitemap.xml | 8 +- this-month/2020-04/index.html | 16 +-- this-month/2020-05/index.html | 181 ++++++++++++++++++++++++++++++++++ this-month/index.html | 68 ------------- 7 files changed, 214 insertions(+), 81 deletions(-) create mode 100644 this-month/2020-05/index.html delete mode 100644 this-month/index.html diff --git a/css/main.css b/css/main.css index e91c7982..c52b73b0 100644 --- a/css/main.css +++ b/css/main.css @@ -1,9 +1,14 @@ -.post-authors { - margin-left: 1rem; +a code, .gray a { + color: inherit; +} + +h3 a code { + color: inherit; } -.post-authors a, a code, .gray a { +.post-authors a { color: inherit; + font-style: italic; } .gray { diff --git a/index.html b/index.html index b3ed6e19..f8b78ad5 100644 --- a/index.html +++ b/index.html @@ -40,6 +40,8 @@

This Month in Rust OSDev

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

diff --git a/rss.xml b/rss.xml index 11d7e927..fdfa7009 100644 --- a/rss.xml +++ b/rss.xml @@ -18,5 +18,14 @@ + + This Month in Rust OSDev (May 2020) + Sat, 01 Jan 0000 00:00:00 +0000 + https://rust-osdev.com/this-month/2020-05/ + https://rust-osdev.com/this-month/2020-05/ + <p>Welcome to the second issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + + diff --git a/sitemap.xml b/sitemap.xml index 39d57d86..193126d5 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -12,14 +12,16 @@ - https://rust-osdev.com/this-month/ + https://rust-osdev.com/this-month/2020-04/ + + 2020-05-06 - https://rust-osdev.com/this-month/2020-04/ + https://rust-osdev.com/this-month/2020-05/ - 2020-05-06 + 0000-01-01 diff --git a/this-month/2020-04/index.html b/this-month/2020-04/index.html index a7c605ed..bb1bac20 100644 --- a/this-month/2020-04/index.html +++ b/this-month/2020-04/index.html @@ -33,14 +33,16 @@

This Month in Rust OSDev (April 2020)

- + +

Welcome to the first issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development community.

These posts are the successor of the "Status Update" posts on the "Writing an OS in Rust" blog. Instead of only focusing on the updates to the blog and the directly related crates, we try to give an overview of the full Rust OSDev ecosystem in this new series. This includes all the projects under the rust-osdev GitHub organization, relevant projects of other organizations, and also personal OS projects.

diff --git a/this-month/2020-05/index.html b/this-month/2020-05/index.html new file mode 100644 index 00000000..10706ed6 --- /dev/null +++ b/this-month/2020-05/index.html @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev (May 2020) | Rust OSDev + + + +
+
+
+

+ Rust OSDev + Operating System Development in Rust +

+
+
+ +
+
+

This Month in Rust OSDev (May 2020)

+ + + +

Welcome to the second issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.

+ +

This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue.

+ + +

Project Updates

+

In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

+

x86_64

+

The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

+

In May, the crate received a bugfix for inclusive page/frame ranges. We also landed a long-awaited change to the Mapper::map_to function to set certain page table flags also in higher level page tables:

+ +

Thanks to @haraldh and @mrll for their contributions!

+

cargo-xbuild

+

The cargo-xbuild project provides cargo command wrappers to cross-compile the sysroot crates core and alloc.

+

This month, rustc/cargo changed their codegen behavior for builds with link-time optimization (LTO), which lead to breakage for LTO builds with cargo-xbuild. Fixing this issue was not easy and required multiple tries until we found a proper solution.

+

Unfortunately, the solution still led to link issues for some people, which was caused by a bug in cargo/rustc. Thanks to @alexcrichton, this was quickly fixed in rustc, so that now everything should work again.

+

Apart from these bugfixes, there were also two other changes this month:

+ +

Thanks to @Nils-TUD for their contribution and to all the people that helped investigating the build errors!

+

acpi

+

The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern +computers use to relay information about the hardware to the OS.

+

Not a lot happened this month, but preparations +were made to change how the AML namespace is stored on the heap, in order to avoid a lot of small heap allocations +for AML paths, and reduce the number of heap allocations overall. However, some more profiling infrastructure will +need to be built before starting this.

+

In preparation, a change to how DefNames are stored in the namespace was made, which avoids an extra heap +allocation per DefName, and also allows us to simplify some code around the aml crate.

+

bootloader

+

The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. It received the following updates this month:

+ +

Thanks to @mark-i-m and @Aaron1011 for their contributions!

+

bootimage

+

The bootimage tool allows the creation of bootable disk images for bootloader-based kernels. It also provides a runner executable for cargo to make cargo xrun and cargo xtest work using QEMU. In May, the crate was almost completely rewritten with a smaller API to make it more maintainable:

+ +

uart_16550

+

The uart_16550 crate provides basic support for serial port I/O for 16550-compatible UARTs. This month, the crate received the following updates:

+ +

Thanks to @dbeckwith for their contribution!

+

uefi

+

The uefi crate provides abstractions for the UEFI standard that replaces the traditional BIOS on modern systems. This month, the crate's dependencies were updated, and a bug was fixed in the graphics protocol:

+ +

Thanks to @imtsuki and @BinaryTENSHi for their contributions!

+ +

Personal Projects

+

In this section, we describe updates to personal projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

+

IsaacWoods/pebble

+

(Section written by @IsaacWoods)

+

This month, I've been tracking down a bug in the kernel that causes usermode stacks to become corrupted on the +return of some system calls. While I've not found the root cause, I've taken this opportunity to add some more +debugging capabilities, which have found a number of other kernel bugs.

+

I also started working on the Rust implementation of Ptah, +the wire format for Pebble's message passing interface. It allows libraries to easily use Serde to +serialize and deserialize Rust types to and from the wire format. In the future, a compiler will be able to +generate bindings for Ptah for a number of different supported languages, which will allow tasks written in +different languages to communicate over Pebble Channels using idiomatic types.

+

RustyHermit

+

(Section written by @stlankes)

+

RustyHermit is a unikernel targeting a scalable and predictable runtime. Unikernel means, you bundle your application directly with the kernel library, so that it can run without any installed operating system. +This reduces image size and overhead, therefore, interesting applications include virtual machines and high-performance computing.

+

This month the integration of smoltcp has been improved and first support for virtio has been integrated. The integration in Rust's standard runtime is already in progress and clients can be developed with TcpStream. Server side applications will follow soon.

+

phil-opp/blog_os

+

(Section written by @phil-opp)

+

This month, support for the legacy asm! macro was removed from rustc. This lead to build errors for the Writing an OS in Rust project because some dependencies were still using the macro. To fix this, I landed a number of dependency updates:

+ +

I also decided to change the design of the executor in the Async/Await post to simplify it:

+ +

While I already started a draft on the next blog post about processes, I currently plan to look into adding UEFI support to the bootloader crate first. The reason is that UEFI support will require some fundamental changes to the blog because the VGA text buffer and the legacy PIC are not supported on UEFI. This is also relevant to the upcoming post about processes, since different designs would be possible if we used the APIC instead of the legacy PIC. It therefore makes most sense to me to sort this out first.

+

rust-embedded/rust-raspberrypi-OS-tutorials

+

(Section written by @andre-richter)

+

May was a quiet month for the project, since I am currently taking a little hiatus. I am planning to restart working on new content two or three months down the road.

+

Therefore, only some maintenance updates went in, e.g. bumping all dependency crates to versions that support the new llvm_asm! macros. Also, the :cn: chinese translations received updates/additions (main Readme; 00_before_we_start).

+ +

Join Us?

+

Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

+ +
+ +
+
+ + © . All rights reserved. + Contact + +
+
+
+ + + + + diff --git a/this-month/index.html b/this-month/index.html deleted file mode 100644 index 4bff45a3..00000000 --- a/this-month/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - Rust OSDev - - - -
-
-
-

- Rust OSDev - Operating System Development in Rust -

-
-
- -
-
- -

This Month in Rust OSDev

- - -

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

- - -
- -

This Month in Rust OSDev (April 2020)

-
-

Welcome to the first issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development community.

- - read more » -
- -
- -
- -
-
- - © . All rights reserved. - Contact - -
-
-
- - - - - From 04bc55e46c560ffc69457b31b42bb31dfc6cf812 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 7 Jun 2020 19:42:28 +0000 Subject: [PATCH 023/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 --- index.html | 4 ++-- rss.xml | 20 ++++++++++---------- sitemap.xml | 2 +- this-month/2020-05/index.html | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/index.html b/index.html index f8b78ad5..d64cecbc 100644 --- a/index.html +++ b/index.html @@ -40,10 +40,10 @@

This Month in Rust OSDev

These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

diff --git a/rss.xml b/rss.xml index fdfa7009..dc5bba5c 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,16 @@ Zola en - Wed, 06 May 2020 00:00:00 +0000 + Sun, 07 Jun 2020 00:00:00 +0000 + + + This Month in Rust OSDev (May 2020) + Sun, 07 Jun 2020 00:00:00 +0000 + https://rust-osdev.com/this-month/2020-05/ + https://rust-osdev.com/this-month/2020-05/ + <p>Welcome to the second issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev (April 2020) @@ -18,14 +27,5 @@ - - This Month in Rust OSDev (May 2020) - Sat, 01 Jan 0000 00:00:00 +0000 - https://rust-osdev.com/this-month/2020-05/ - https://rust-osdev.com/this-month/2020-05/ - <p>Welcome to the second issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.</p> - - - diff --git a/sitemap.xml b/sitemap.xml index 193126d5..96b795cc 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -21,7 +21,7 @@ https://rust-osdev.com/this-month/2020-05/ - 0000-01-01 + 2020-06-07 diff --git a/this-month/2020-05/index.html b/this-month/2020-05/index.html index 10706ed6..a4ced1db 100644 --- a/this-month/2020-05/index.html +++ b/this-month/2020-05/index.html @@ -37,8 +37,8 @@

This Month in Rust OSDev (May 2020)

From 2d61b0d580d96b97c32130218d0b2ec84f242d0c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 9 Jun 2020 00:07:00 +0000 Subject: [PATCH 024/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 2100db81b18aef6bf023ae22d75ae53af7307a63 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 13 Jun 2020 00:07:19 +0000 Subject: [PATCH 025/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 7c681b8648d19f76cdb20c215f34edee390673ee Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 17 Jun 2020 00:06:50 +0000 Subject: [PATCH 026/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From c300198353486aecd1ee82b3301861134ce394b5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 21 Jun 2020 00:07:34 +0000 Subject: [PATCH 027/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 6ab99937c6bfce4bdf51eaa58127f2319d794a98 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 25 Jun 2020 00:07:28 +0000 Subject: [PATCH 028/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 4b7c4f1f3e9a74bb10ffad356cca41df445cc2a9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 29 Jun 2020 00:08:41 +0000 Subject: [PATCH 029/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 25e7ce0f79e38a912127d993c35267c9599d60e0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 1 Jul 2020 00:09:21 +0000 Subject: [PATCH 030/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 3d5d93d9cfecab143485c655f94ca225635dae7b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 5 Jul 2020 00:09:28 +0000 Subject: [PATCH 031/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 1d08c72b570ddf4dd019ca077a519170d31bc953 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 9 Jul 2020 00:09:13 +0000 Subject: [PATCH 032/613] Deploy ab66a6d261a59454bd8e96a497ba618c91b8b1a0 Deploy of commit https://github.com/rust-osdev/homepage/commit/ab66a6d261a59454bd8e96a497ba618c91b8b1a0 From 709676e0670e83caab7eac1311d2b34f23cbfaff Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 12 Jul 2020 10:59:23 +0000 Subject: [PATCH 033/613] Deploy e76235213957d59162f5145198cc7adec933310f Deploy of commit https://github.com/rust-osdev/homepage/commit/e76235213957d59162f5145198cc7adec933310f --- index.html | 2 + rss.xml | 11 ++- sitemap.xml | 7 ++ this-month/2020-06/index.html | 130 ++++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 this-month/2020-06/index.html diff --git a/index.html b/index.html index d64cecbc..e3fd389e 100644 --- a/index.html +++ b/index.html @@ -44,6 +44,8 @@

This Month in Rust OSDev

  • May 2020
  • +
  • June 2020
  • +

    diff --git a/rss.xml b/rss.xml index dc5bba5c..034b4d9c 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,16 @@ Zola en - Sun, 07 Jun 2020 00:00:00 +0000 + Sun, 12 Jul 2020 00:00:00 +0000 + + + This Month in Rust OSDev (June 2020) + Sun, 12 Jul 2020 00:00:00 +0000 + https://rust-osdev.com/this-month/2020-06/ + https://rust-osdev.com/this-month/2020-06/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev (May 2020) diff --git a/sitemap.xml b/sitemap.xml index 96b795cc..3b46865f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -25,4 +25,11 @@ + + https://rust-osdev.com/this-month/2020-06/ + + 2020-07-12 + + + diff --git a/this-month/2020-06/index.html b/this-month/2020-06/index.html new file mode 100644 index 00000000..4db29fee --- /dev/null +++ b/this-month/2020-06/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev (June 2020) | Rust OSDev + + + +
    +
    +
    +

    + Rust OSDev + Operating System Development in Rust +

    +
    +
    + +
    +
    +

    This Month in Rust OSDev (June 2020)

    + + + +

    Welcome to a new issue of "This Month in Rust OSDev". In these posts, we will give a regular overview of notable changes in the Rust operating system development ecosystem.

    + +

    This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue.

    + +

    Project Updates

    +

    In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

    +

    x86_64

    +

    The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

    +

    In June, the crate received some smaller improvements:

    + +

    Thanks to @samueltardieu and @leecannon for their contributions!

    +

    cargo-xbuild

    +

    The cargo-xbuild project provides cargo command wrappers to cross-compile the sysroot crates core and alloc. This month, support for the cargo-features manifest key was added and a deprecated dependency was replaced:

    + +

    Thanks to @eggyal and @Eijebong for these contributions!

    +

    bootloader

    +

    The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we fixed a newly introduced Rust warning:

    + +

    Thanks to @Freax13 for this contribution!

    +

    While we do not have to report any news yet, we are still working on a rewrite of the crate in order to make it more robust (use Rust instead of assembly for boot stages) and composable (in order to add UEFI and multiboot2 support).

    +

    acpi

    +

    The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. This month, the crate received two small improvements to the RSDP-related code:

    + +

    uefi

    +

    The uefi crate provides abstractions for the UEFI standard that replaces the traditional BIOS on modern systems. This month, the contribution docs were extended with information how to add new UEFI protocols:

    + +

    Personal Projects

    +

    In this section, we describe updates to personal projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

    +

    phil-opp/blog_os

    +

    (Section written by @phil-opp)

    +

    In June, I pushed two small improvements to the blog_os repository and the Writing an OS in Rust blog:

    + +

    There were also lots of small contributions this month that fixed typos and dead links and updated the Chinese translation. Thanks a lot to all contributors!

    +

    Join Us?

    +

    Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

    + +
    + +
    +
    + + © . All rights reserved. + Contact + +
    +
    +
    + + + + + From 12f6a3e4b3a3aafcfe0009850d8de651cd71dac3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 12 Jul 2020 11:04:20 +0000 Subject: [PATCH 034/613] Deploy de60c5f18c45e8af5cc2819aa98e79a199206193 Deploy of commit https://github.com/rust-osdev/homepage/commit/de60c5f18c45e8af5cc2819aa98e79a199206193 --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index e3fd389e..180e1f1a 100644 --- a/index.html +++ b/index.html @@ -40,11 +40,11 @@

    This Month in Rust OSDev

    These posts give a regular overview of the most important changes to the RustOSDev tools and libraries.

    From 62ba406ca5a5248d040e8533dbd4a1eeb8f89329 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 13 Jul 2020 00:09:46 +0000 Subject: [PATCH 035/613] Deploy de60c5f18c45e8af5cc2819aa98e79a199206193 Deploy of commit https://github.com/rust-osdev/homepage/commit/de60c5f18c45e8af5cc2819aa98e79a199206193 From c90638d7d92ce4ca0f39dfd75a75a74a715260f5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 17 Jul 2020 00:09:30 +0000 Subject: [PATCH 036/613] Deploy de60c5f18c45e8af5cc2819aa98e79a199206193 Deploy of commit https://github.com/rust-osdev/homepage/commit/de60c5f18c45e8af5cc2819aa98e79a199206193 From 153b604d26f6dcc9d16e1b34763db03d5560e914 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 21 Jul 2020 00:09:26 +0000 Subject: [PATCH 037/613] Deploy de60c5f18c45e8af5cc2819aa98e79a199206193 Deploy of commit https://github.com/rust-osdev/homepage/commit/de60c5f18c45e8af5cc2819aa98e79a199206193 From 9697c818cf43234cd1fa9f16956fb15288e448c5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 21 Jul 2020 12:37:10 +0000 Subject: [PATCH 038/613] Deploy f6bd274f6bd2e6c816f206c6e281ccf6a901b5f9 Deploy of commit https://github.com/rust-osdev/homepage/commit/f6bd274f6bd2e6c816f206c6e281ccf6a901b5f9 --- contact/index.html | 2 +- index.html | 2 +- this-month/2020-04/index.html | 2 +- this-month/2020-05/index.html | 2 +- this-month/2020-06/index.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contact/index.html b/contact/index.html index a5eca358..8f9f987b 100644 --- a/contact/index.html +++ b/contact/index.html @@ -41,7 +41,7 @@

    Contact

    +

    + + + + + From 37f61239846c8401137d1f25109c1cb18360ebb5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 9 Dec 2022 00:43:11 +0000 Subject: [PATCH 310/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From bf4db29da97c4227a7f5982d2b9df8162aa66ade Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 13 Dec 2022 00:46:57 +0000 Subject: [PATCH 311/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 4ced6a2a3621411153b4859e565e82969df32610 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 17 Dec 2022 00:39:42 +0000 Subject: [PATCH 312/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 73d912930ed6d104eb839da48c54069aa4a99557 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 21 Dec 2022 00:39:22 +0000 Subject: [PATCH 313/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From e62a00e7e661fe415d0ebf2dd419d1fa301b1952 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 25 Dec 2022 00:43:30 +0000 Subject: [PATCH 314/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 1b1199331b4c28697f9eb2b615090fa09ca9d75a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 29 Dec 2022 00:42:32 +0000 Subject: [PATCH 315/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 16719f546bcafd8ee8d05ba19350e3463c364b41 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 1 Jan 2023 00:48:40 +0000 Subject: [PATCH 316/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From d087c04f656d6af32e424d4e78edd097070e242e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 5 Jan 2023 00:43:31 +0000 Subject: [PATCH 317/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 54f46122840169215898e6c31015b5ab0b068c1a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 9 Jan 2023 00:42:56 +0000 Subject: [PATCH 318/613] Deploy e733a7caa0c054638dc721153b156f2ad5323ccd Deploy of commit https://github.com/rust-osdev/homepage/commit/e733a7caa0c054638dc721153b156f2ad5323ccd From 12d936bc769fd31b30e5de5d68ac818eef030f6f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 9 Jan 2023 14:20:58 +0000 Subject: [PATCH 319/613] Deploy 2d1a1c11ccb032109d3b5727032692c2ace4a437 Deploy of commit https://github.com/rust-osdev/homepage/commit/2d1a1c11ccb032109d3b5727032692c2ace4a437 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2022-12/aero.png | Bin 0 -> 42252 bytes this-month/2022-12/index.html | 341 ++++++++++++++++++++++++++++++++++ 5 files changed, 356 insertions(+), 1 deletion(-) create mode 100644 this-month/2022-12/aero.png create mode 100644 this-month/2022-12/index.html diff --git a/index.html b/index.html index 41b574db..5c57fd2e 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

    This Month in Rust OSDev

      +
    • December 2022
    • +
    • November 2022
    • October 2022
    • diff --git a/rss.xml b/rss.xml index 24c5ac1c..4d4c0844 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Wed, 07 Dec 2022 00:00:00 +0000 + Mon, 09 Jan 2023 00:00:00 +0000 + + This Month in Rust OSDev: December 2022 + Mon, 09 Jan 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2022-12/ + https://rust-osdev.com/this-month/2022-12/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: November 2022 Wed, 07 Dec 2022 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 36f0b35b..64772a24 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -141,4 +141,8 @@ https://rust-osdev.com/this-month/2022-11/ 2022-12-07 + + https://rust-osdev.com/this-month/2022-12/ + 2023-01-09 + diff --git a/this-month/2022-12/aero.png b/this-month/2022-12/aero.png new file mode 100644 index 0000000000000000000000000000000000000000..9839dd78d7ae693f7f98a47658134d931fc51dbd GIT binary patch literal 42252 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 RC}1uBf{CSZ$vJey{{uJWMqU5_ literal 0 HcmV?d00001 diff --git a/this-month/2022-12/index.html b/this-month/2022-12/index.html new file mode 100644 index 00000000..ec0d6df1 --- /dev/null +++ b/this-month/2022-12/index.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: December 2022 | Rust OSDev + + + +
      +
      +
      +

      + Rust OSDev + Operating System Development in Rust +

      +
      +
      + +
      +
      +

      This Month in Rust OSDev: December 2022

      + + + +

      Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

      + +

      This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

      + +

      Infrastructure and Tooling

      +

      In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

      + +

      Experimental feature gate proposal interoperable_abi

      +

      This Rust language proposal suggests to create a new extern "interop" ABI as a strict superset of the C ABI. +The goal of this new ABI is to "define a standard way to make calls across high-level languages, passing high-level data types, without dropping to the lowest common denominator of C". +For example, it will define a specific memory representation for strings, tuples, and common standard library types such as Option and Result.

      +

      This new ABI would be very useful for operating system development because there are often multiple executables that need to communicate with each other using a stable ABI. +For example, user-space programs communicate with the kernel using system calls, and with each other porgrams using different forms of inter-process communication. +With new extern "interop" ABI, these communication boundaries could use safe, higher-level types when both sides are written in Rust.

      +

      default_alloc_error_handler has been stabilized

      +

      On no_std targets, enabling alloc requires providing an OOM (out-of-memory) handler. The usual implementation of this handler just panics, but implementing the handler requires an unstable feature: alloc_error_handler. The newly-stabilized default_alloc_error_handler automatically provides an OOM handler that panics if no custom handler is implemented. This is an important step towards using some targets on the stable channel.

      +

      Announcements, News, and Blog Posts

      + + +

      rust-osdev Projects

      +

      In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

      + +

      uefi-rs

      +

      Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

      +

      The uefi crate provides safe and performant wrappers for UEFI, the successor to the BIOS.

      +

      We merged the following changes last month:

      +

      Features

      + +

      Fixes

      + +

      Docs

      + +

      Tooling

      + +

      Thanks to @veluca93, @phip1611, and @raccog for their contributions!

      +

      x86_64

      +

      Maintained by @phil-opp, @josephlr, @Freax13, and @rybot666

      +

      The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

      +

      We merged the following changes in December:

      + +

      Thanks to @TornaxO7 for their contribution!

      +

      Call for Participation

      +

      Want to contribute to a Rust OSDev project, but don't know where to start? Help with one of these outstanding issues!

      + + +

      No tasks were proposed for this section this month.

      +
      +

      If you maintain a Rust project related to operating system development and are looking for contributors, especially for tasks suited to people getting started in this space, please create a PR against the next branch with the tasks you want to include in the next issue.

      +

      Other Projects

      +

      In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

      +

      Theseus OS

      +

      (Section written by Kevin Boos (@kevinaboos))

      +

      Theseus is a safe-language OS written from scratch in Rust that is in the midst of a shift from academic research to usability and legacy compatibility. +Theseus loads and links all components at runtime, and executes everything at a single privilege level in a single address space, relying on Rust safety for isolation and correctness.

      +

      As a fully open-source project, we welcome and encourage contributions from everyone!

      +

      Since our last update here a few months ago, we have worked on the following things:

      +
        +
      • Introduced dreadnought, a basic async executor that brings Rust's async/await syntax to Theseus +
          +
        • Usable by both applications and low-level kernel components
        • +
        • Integrated the concept of wakers with Theseus's native task subsystem
        • +
        • Currently, there is a 1-to-1 relationship between async dreadnought tasks and native Theseus tasks
        • +
        +
      • +
      • Rewrote our networking interface to offer better, simpler, and cleaner abstractions +
          +
        • It now supports the latest smoltcp version, 0.8
        • +
        +
      • +
      • Added support for booting Theseus on UEFI +
          +
        • Previously, Theseus could boot from only multiboot2-compliant bootloaders using legacy BIOS
        • +
        • UEFI on x86_64 now successfully boots after significant redesign of early bootstrap routines
        • +
        • New custom uefi_loader tool, loosely based on the rust-osdev org's bootloader project
        • +
        • Early graphical display for basic text printing is a work-in-progress
        • +
        • UEFI is required to boot Theseus on aarch64; this is also a work-in-progress
        • +
        +
      • +
      • Almost completed porting core subsystems to aarch64 +
          +
        • Bootstrap and logging over UART
        • +
        • Memory management: page table modification, arch-agnostic PTE flags and basic memory types, etc
        • +
        • Basic context switching and task bootstrap
        • +
        • SMP multicore, plus identification of CPU cores
        • +
        • Interrupt handling via GIC
        • +
        +
      • +
      • Redesigned the drivers for PS/2 controller, keyboard, and mouse in an intralingual manner that fully leverages Rust's strong type system.
      • +
      • Started implementing a brand new graphics stack and window manager, Porthole, from scratch +
          +
        • Added support for x86's Page Attribute Table, which allows Theseus to control the caching properties of individual memory pages
        • +
        • We now map graphics video memory as write-combining instead of cache-disabled, which significantly improves performance
        • +
        +
      • +
      • Redesigned task management to give arbitrary tasks fewer privileges +
          +
        • Two new types: JoinableTaskRef and ExitableTaskRef +
            +
          • JoinableTaskRef is similar to std::task::JoinHandle, but is fully safe +
              +
            • Ensures that a task can only be joined by the "parent" task that spawned it
            • +
            • Remove distinction between joining a task and obtaining its ExitValue
            • +
            • Automatically reaps "orphan" tasks that are no longer joinable
            • +
            +
          • +
          • ExitableTaskRef statically ensures that only a task itself can mark itself as exited +
              +
            • Now, a given task can no longer invalidly mark another arbitrary task as exited
            • +
            +
          • +
          +
        • +
        • Refactored scheduler and task switching to not hold any TaskRefs during a context switch +
            +
          • Ensures that exited tasks are dropped and cleaned up expediently
          • +
          +
        • +
        • Native ELF Thread-Local Storage (TLS) variables are used to store the current task +
            +
          • Accessing the current task is much faster, albeit slightly more complicated to initialize
          • +
          +
        • +
        +
      • +
      • Implemented a new shell called hull, plus new terminal, console, and TTY components +
          +
        • Theseus can now run headlessly, e.g., interactively over a serial port instead of via a graphical display.
        • +
        +
      • +
      • Removed usage of owning_ref, a crate with unsoundness, in favor of our own types: +
          +
        • BorrowedMappedPages<T>: a pseudo-self-referential type that allows persistent, efficient borrowing of a MappedPages memory region as a specific type T +
            +
          • Accepts a Mutability type parameter for either immutable (&T) or mutable (&mut T) borrowing
          • +
          • Sister type BorrowedSliceMappedPages also supports dynamically-sized slices, i.e., &[T] and &mut [T]
          • +
          • Much more efficient than owning_ref because MappedPages is always pinned in memory, avoiding the need for Box allocation
          • +
          +
        • +
        • dereffer: a new library crate that provides DerefsTo<T>, a generic wrapper type that allows the enclosed object T to be arbitrarily dereferenced to any inner type reachable from that object T +
            +
          • Supports much more arbitrary and complex deref functions than std::ops::Deref
          • +
          +
        • +
        +
      • +
      • Canonicalized the content of Theseus's x86_64-unknown-theseus target spec +
          +
        • Codegen flags are now moved into the target spec, making out-of-tree builds easier and more repeatable
        • +
        • Target specs are now ready to be upstreamed into rustc as built-in targets
        • +
        +
      • +
      • owned_borrowed_trait: a new library crate that abstracts over Owned values vs. Borrowed refs +
          +
        • Uses traits and marker types instead of the existing enum-based designs (like Cow)
        • +
        • Doesn't require Clone or care about any characteristics of the inner type T
        • +
        • Allows you to use generics and associated consts to conditionally branch based on whether an owned value or borrowed reference was passed into a function
        • +
        • Allows you to return a different (generic) type from a function based on whether an owned value or borrowed reference was passed in
        • +
        +
      • +
      +

      Check out the Theseus OS blog for more.

      +

      Andy-Python-Programmer/Aero

      +

      (Section written by @Andy-Python-Programmer)

      +

      Aero is a new modern, experimental, unix-like operating system following the monolithic kernel design. Supporting modern PC features such as long mode, 5-level paging, and SMP (multicore), to name a few.

      +

      This month, Aero successfully managed to get mesa-demos and alacritty running.

      +

      Aero

      +

      In addition, deps.sh script was added to automate the process of installing the required dependencies on the host to build the sysroot.

      +

      phil-opp/blog_os

      +

      (Section written by @phil-opp)

      +

      We merged the following changes to the Writing an OS in Rust blog in the past two months:

      + + +

      Join Us?

      +

      Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

      + + +

      Comments

      + + +
      + +
      +
      + Join us on Gitter.
      + © -. All rights reserved. + Contact +
      +
      +
      +
      + + + + + From 31ac9d2fe52a56711b6510e22ae9a26b5f09d41b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 10 Jan 2023 10:57:11 +0000 Subject: [PATCH 320/613] Deploy f4f53a18f5ecff116856e6a1af9abc0300cbf0bc Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f53a18f5ecff116856e6a1af9abc0300cbf0bc --- this-month/2022-12/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/this-month/2022-12/index.html b/this-month/2022-12/index.html index ec0d6df1..bd9d8b8d 100644 --- a/this-month/2022-12/index.html +++ b/this-month/2022-12/index.html @@ -65,7 +65,7 @@

      system calls, and with each other porgrams using different forms of inter-process communication. +For example, user-space programs communicate with the kernel using system calls, and with other programs using different forms of inter-process communication. With new extern "interop" ABI, these communication boundaries could use safe, higher-level types when both sides are written in Rust.

      default_alloc_error_handler has been stabilized

      On no_std targets, enabling alloc requires providing an OOM (out-of-memory) handler. The usual implementation of this handler just panics, but implementing the handler requires an unstable feature: alloc_error_handler. The newly-stabilized default_alloc_error_handler automatically provides an OOM handler that panics if no custom handler is implemented. This is an important step towards using some targets on the stable channel.

      From 791ee26eca942d42b4aecf669141eaad8ed807f0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 17 Jan 2023 00:43:28 +0000 Subject: [PATCH 321/613] Deploy f4f53a18f5ecff116856e6a1af9abc0300cbf0bc Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f53a18f5ecff116856e6a1af9abc0300cbf0bc From 8ee1faceb824d0302cdba0d475f6624be3ffd5f6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 21 Jan 2023 00:43:00 +0000 Subject: [PATCH 322/613] Deploy f4f53a18f5ecff116856e6a1af9abc0300cbf0bc Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f53a18f5ecff116856e6a1af9abc0300cbf0bc From c13a85ccb32010eee5536ca5ac779bc4cf4d9754 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 25 Jan 2023 00:42:00 +0000 Subject: [PATCH 323/613] Deploy f4f53a18f5ecff116856e6a1af9abc0300cbf0bc Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f53a18f5ecff116856e6a1af9abc0300cbf0bc From b8484d2b724933ad85473978fd43dc749630d213 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 25 Jan 2023 16:45:31 +0000 Subject: [PATCH 324/613] Deploy 3c845444b2789fac2c9551bcdc1cd5a2411385a3 Deploy of commit https://github.com/rust-osdev/homepage/commit/3c845444b2789fac2c9551bcdc1cd5a2411385a3 From 58cf76599906074e218c4f86744f9662c06da614 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 25 Jan 2023 16:45:53 +0000 Subject: [PATCH 325/613] Deploy eb00494eaa364a7ed548f9f841b7100b729af0b7 Deploy of commit https://github.com/rust-osdev/homepage/commit/eb00494eaa364a7ed548f9f841b7100b729af0b7 From cdefa362d405b68f77ad47a8e123df3f441cdab1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 25 Jan 2023 16:46:55 +0000 Subject: [PATCH 326/613] Deploy 382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 Deploy of commit https://github.com/rust-osdev/homepage/commit/382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 From ffb07e2b04a51cdbbd4e9fd4e9688575ae3c80b0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 29 Jan 2023 00:47:51 +0000 Subject: [PATCH 327/613] Deploy 382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 Deploy of commit https://github.com/rust-osdev/homepage/commit/382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 From 84d71336d3b83ad098cd3988e199c88db67ac83e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 1 Feb 2023 00:50:18 +0000 Subject: [PATCH 328/613] Deploy 382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 Deploy of commit https://github.com/rust-osdev/homepage/commit/382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 From fe62234ff298ea5d86e209e474e0543a4956c13a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 5 Feb 2023 00:48:26 +0000 Subject: [PATCH 329/613] Deploy 382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 Deploy of commit https://github.com/rust-osdev/homepage/commit/382e9ad369d7420ae266d1d7b4c0afec4c1db4c9 From dd91b40d9414cbfd69d17cbf5f252ef7ab24eae9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 7 Feb 2023 09:05:07 +0000 Subject: [PATCH 330/613] Deploy c45352d2fa27b87e2e4c002220dce3f9bd040ceb Deploy of commit https://github.com/rust-osdev/homepage/commit/c45352d2fa27b87e2e4c002220dce3f9bd040ceb From 84d131beea6fcaba32e8c16f07ced0dc89dea866 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 7 Feb 2023 11:09:24 +0000 Subject: [PATCH 331/613] Deploy e48ecb450132cd786f2e2d750a478a428f597711 Deploy of commit https://github.com/rust-osdev/homepage/commit/e48ecb450132cd786f2e2d750a478a428f597711 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-01/index.html | 273 ++++++++++++++++++++++++++++++++++ 4 files changed, 288 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-01/index.html diff --git a/index.html b/index.html index 5c57fd2e..90633722 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

      This Month in Rust OSDev

      Fixes

        -
      • PXE: Fix BaseCode::discover optional argument
      • +
      • PXE: Fix BaseCode::discover optional argument
      • Fix warnings from abi_efiapi stabilization
      • uefi: Fix protocol functions to work with unsized protocols
      • Fix new lints related to derives on a packed struct
      • From db8b726e2e4d88a28d2701a4c07bca651a81b5f0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 21 Feb 2023 00:47:01 +0000 Subject: [PATCH 336/613] Deploy df261e897a90f6e22182a5467dac03c6fd66bbb6 Deploy of commit https://github.com/rust-osdev/homepage/commit/df261e897a90f6e22182a5467dac03c6fd66bbb6 From 6a445b1361e6796dc2a5b4455424afeae66abc19 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 25 Feb 2023 00:45:15 +0000 Subject: [PATCH 337/613] Deploy df261e897a90f6e22182a5467dac03c6fd66bbb6 Deploy of commit https://github.com/rust-osdev/homepage/commit/df261e897a90f6e22182a5467dac03c6fd66bbb6 From 6cb41ed6ed60d837cd1e65da26cf90c76ffbf0a5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 1 Mar 2023 00:51:37 +0000 Subject: [PATCH 338/613] Deploy df261e897a90f6e22182a5467dac03c6fd66bbb6 Deploy of commit https://github.com/rust-osdev/homepage/commit/df261e897a90f6e22182a5467dac03c6fd66bbb6 From 45a8c1f49fa3ea44e6c6cfea811586628d13041f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 5 Mar 2023 00:52:30 +0000 Subject: [PATCH 339/613] Deploy df261e897a90f6e22182a5467dac03c6fd66bbb6 Deploy of commit https://github.com/rust-osdev/homepage/commit/df261e897a90f6e22182a5467dac03c6fd66bbb6 From e7a8de6cd1f3f9789c28349c818bfd55c5550807 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 8 Mar 2023 18:02:07 +0000 Subject: [PATCH 340/613] Deploy 26af88c754417ba0bba6eb0756a9f18ad1a1ca24 Deploy of commit https://github.com/rust-osdev/homepage/commit/26af88c754417ba0bba6eb0756a9f18ad1a1ca24 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-02/index.html | 186 ++++++++++++++++++++++++++++++++++ 4 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-02/index.html diff --git a/index.html b/index.html index 90633722..db019fac 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

        This Month in Rust OSDev

          +
        • February 2023
        • +
        • January 2023
        • December 2022
        • diff --git a/rss.xml b/rss.xml index c81654d7..0b49a35b 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Tue, 07 Feb 2023 00:00:00 +0000 + Wed, 08 Mar 2023 00:00:00 +0000 + + This Month in Rust OSDev: February 2023 + Wed, 08 Mar 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-02/ + https://rust-osdev.com/this-month/2023-02/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: January 2023 Tue, 07 Feb 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 9fda4824..834eb752 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -149,4 +149,8 @@ https://rust-osdev.com/this-month/2023-01/ 2023-02-07 + + https://rust-osdev.com/this-month/2023-02/ + 2023-03-08 + diff --git a/this-month/2023-02/index.html b/this-month/2023-02/index.html new file mode 100644 index 00000000..7eb23364 --- /dev/null +++ b/this-month/2023-02/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: February 2023 | Rust OSDev + + + +
          +
          +
          +

          + Rust OSDev + Operating System Development in Rust +

          +
          +
          + +
          +
          +

          This Month in Rust OSDev: February 2023

          + + + +

          Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

          + +

          This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

          + +

          Infrastructure and Tooling

          +

          In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

          + +

          rust-lang/rust

          + +

          Cargo: Add '-C' flag for changing current dir before build

          +

          This new flag makes cargo switch to the specified directory before building. +This means that the .cargo/config.toml file is also read from that directory, which can be very useful when configuring features such as build-std.

          +

          Announcements, News, and Blog Posts

          +

          Here we collect news, blog posts, etc. related to OS development in Rust.

          + + +

          rust-osdev Projects

          +

          In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

          + +

          uefi-rs

          + +

          bootloader

          + +

          acpi

          + +

          Thanks to @rw-vanc for their contributions!

          +

          spinning_top

          + +

          Thanks to @jannic for this contribution!

          +

          linked-list-allocator

          + +

          Thanks to @jannic for this contribution!

          +

          Other Projects

          +

          In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

          + +

          phil-opp/blog_os

          +

          (Section written by @phil-opp)

          +

          We merged the following changes to the Writing an OS in Rust blog this month:

          + +

          Join Us?

          +

          Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

          + + +

          Comments

          + + +
          + +
          +
          + Join us on Gitter.
          + © -. All rights reserved. + Contact +
          +
          +
          +
          + + + + + From 53419caa8743aa38faaaf5dd48c4cf60e9cecc31 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 9 Mar 2023 00:46:31 +0000 Subject: [PATCH 341/613] Deploy 26af88c754417ba0bba6eb0756a9f18ad1a1ca24 Deploy of commit https://github.com/rust-osdev/homepage/commit/26af88c754417ba0bba6eb0756a9f18ad1a1ca24 From 5efb2cf4386f19ff28571f7b8da5cf43a101105c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 9 Mar 2023 13:02:20 +0000 Subject: [PATCH 342/613] Deploy 59958d28ffe487cfd34ff885cd0388096875f24b Deploy of commit https://github.com/rust-osdev/homepage/commit/59958d28ffe487cfd34ff885cd0388096875f24b From 402f4cde0351cb6fa5cc259a517d28f7b4442369 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 13 Mar 2023 00:43:59 +0000 Subject: [PATCH 343/613] Deploy 59958d28ffe487cfd34ff885cd0388096875f24b Deploy of commit https://github.com/rust-osdev/homepage/commit/59958d28ffe487cfd34ff885cd0388096875f24b From 39a17b994e3ad7c327cf550148185e0ac350b0e1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 17 Mar 2023 00:43:39 +0000 Subject: [PATCH 344/613] Deploy 59958d28ffe487cfd34ff885cd0388096875f24b Deploy of commit https://github.com/rust-osdev/homepage/commit/59958d28ffe487cfd34ff885cd0388096875f24b From a2553c118cab76f254108512da683fad54c62ae7 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 25 Mar 2023 00:40:38 +0000 Subject: [PATCH 345/613] Deploy 59958d28ffe487cfd34ff885cd0388096875f24b Deploy of commit https://github.com/rust-osdev/homepage/commit/59958d28ffe487cfd34ff885cd0388096875f24b From 0a1474790e6fc50b02dbfc99be932312ffa232d0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 25 Mar 2023 09:44:32 +0000 Subject: [PATCH 346/613] Deploy fa79e9c99510b77c8a54826bc196288b9e9c5710 Deploy of commit https://github.com/rust-osdev/homepage/commit/fa79e9c99510b77c8a54826bc196288b9e9c5710 From 73de30aaccb32d178b5f10fc4e2dc4f6b7f2b1d6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 29 Mar 2023 00:46:25 +0000 Subject: [PATCH 347/613] Deploy fa79e9c99510b77c8a54826bc196288b9e9c5710 Deploy of commit https://github.com/rust-osdev/homepage/commit/fa79e9c99510b77c8a54826bc196288b9e9c5710 From 23888ababe1b1a836c1bff4ec75ed484a1ae1c29 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 1 Apr 2023 00:42:00 +0000 Subject: [PATCH 348/613] Deploy fa79e9c99510b77c8a54826bc196288b9e9c5710 Deploy of commit https://github.com/rust-osdev/homepage/commit/fa79e9c99510b77c8a54826bc196288b9e9c5710 From b1b8135251c480738c359e13464a12b890aa6f1a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 5 Apr 2023 00:34:45 +0000 Subject: [PATCH 349/613] Deploy fa79e9c99510b77c8a54826bc196288b9e9c5710 Deploy of commit https://github.com/rust-osdev/homepage/commit/fa79e9c99510b77c8a54826bc196288b9e9c5710 From 2f83c52b38fb9e590cc66d9f6c9058f2b85705b5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 8 Apr 2023 18:37:03 +0000 Subject: [PATCH 350/613] Deploy 7f62a40b59579790961d0c046489c1deb388e8a1 Deploy of commit https://github.com/rust-osdev/homepage/commit/7f62a40b59579790961d0c046489c1deb388e8a1 --- css/main.css | 4 + index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2021-03/index.html | 2 +- this-month/2022-04/index.html | 2 +- this-month/2023-03/index.html | 348 ++++++++++++++++++ .../screenshot-paging-calculator-x86-pae.png | Bin 0 -> 183551 bytes 8 files changed, 369 insertions(+), 3 deletions(-) create mode 100644 this-month/2023-03/index.html create mode 100644 this-month/2023-03/screenshot-paging-calculator-x86-pae.png diff --git a/css/main.css b/css/main.css index 7afc2f93..08cf4c4f 100644 --- a/css/main.css +++ b/css/main.css @@ -50,3 +50,7 @@ h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { .maintainers a { color: #9a9a9a; } + +details summary { + cursor: pointer; +} diff --git a/index.html b/index.html index db019fac..13f10285 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

          This Month in Rust OSDev

          The two tutorials implement the generation of backtraces that show address and symbol information. Here is an example of the of a backtrace generated as part of the kernel's panic handler:

          -
          [    0.002782] Writing to bottom of address space to address 1 GiB...
          +
          [    0.002782] Writing to bottom of address space to address 1 GiB...
           [    0.004623] Kernel panic!
           
           Panic location:
          diff --git a/this-month/2023-03/index.html b/this-month/2023-03/index.html
          new file mode 100644
          index 00000000..d27c8f91
          --- /dev/null
          +++ b/this-month/2023-03/index.html
          @@ -0,0 +1,348 @@
          +
          +
          +
          +
          +
          +    
          +    
          +    
          +    
          +
          +    
          +        
          +    
          +    
          +    
          +
          +    
          +
          +    This Month in Rust OSDev: March 2023 | Rust OSDev
          +
          +
          +
          +    
          +
          +
          +

          + Rust OSDev + Operating System Development in Rust +

          +
          +
          + +
          +
          +

          This Month in Rust OSDev: March 2023

          + + + +

          Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

          + +

          This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

          + +

          Infrastructure and Tooling

          +

          In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

          + + +

          Announcements, News, and Blog Posts

          +

          Here we collect news, blog posts, etc. related to OS development in Rust.

          + + +

          rust-osdev Projects

          +

          In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

          + +

          multiboot2

          +

          Maintained by @IsaacWoods, @phip1611, @robert-w-gries, @ahmedcharles, and @Caduser2020

          +

          The multiboot2 crate provides abstraction types for the multiboot information +structure (MBI) of multiboot2 bootloaders. The latest release of the +multiboot2-crate is now v0.15.0 (was v0.14.0), which fixed a +bug. Furthermore, the +documentation was improved. However, the biggest change is that the library now +allows the parsing of custom multiboot tags, which are not prohibited by the +spec. For a full changelog, please refer to the +GitHub repo.

          +

          CI Refactoring

          +

          In the CI, we want to run many tests that cover a big portion of the cartesian +product of the following properties:

          +
            +
          • rust version: stable, nightly, msrv
          • +
          • type: build, test, style check
          • +
          • target: default, no_std
          • +
          +

          As I (@phip1611) was annoyed by all the boilerplate configuration and +repetition, I've investigated new ways to improve that situation and created +a reusable workflow can be used like that:

          +
          jobs:
          +  build_msrv:
          +    name: build (msrv)
          +    uses: ./.github/workflows/_build-rust.yml
          +    with:
          +      rust-version: 1.56.1
          +      do-style-check: false
          +
          +  style_nightly:
          +    name: style (nightly)
          +    needs: build_nightly
          +    uses: ./.github/workflows/_build-rust.yml
          +    with:
          +      rust-version: nightly
          +      do-style-check: true
          +      do-test: false
          +
          +

          The ./.github/workflows/_build-rust.yml workflow abstracts setting up the +toolchain, setting up a cargo cache for a faster CI, and, depending on the +configuration, running cargo test|clippy|doc|build|fmt. I think that the +outcome is quite nice and might also help others. Feel free to check out the +corresponding PR.

          +

          uefi-rs

          +

          Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

          +

          Features

          + +

          Other Improvements

          + +

          Docs

          + +

          CI & Testing

          +
          show changes + +
          +

          Dependencies

          +
          show changes + +
            +

            Thanks to @hughsie, @nicholasbishop, @JohnAZoidberg, @phip1611, @JarlEvanson, and @dependabot[bot] for their contributions!

            +

            x86_64

            +

            Maintained by @phil-opp, @josephlr, and @Freax13

            + +

            Thanks to @joycebrum for their contributions!

            +

            acpi

            +

            Maintained by @IsaacWoods

            + +

            Thanks to @A0lson, @rcerc, and @rw-vanc for their contributions!

            +

            pci_types

            +

            Maintained by @IsaacWoods

            + +

            Thanks to @devsnek for their contributions!

            +

            bootloader

            +

            Maintained by @phil-opp

            + +

            Thanks to @jasoncouture for their contributions!

            +

            vga

            +

            Maintained by @RKennedy9064

            + +

            Thanks to @bendudson for their contributions!

            +

            pic8259

            +

            Maintained by @phil-opp

            + +

            Thanks to @Virux for their contributions!

            +

            volatile

            +

            Maintained by @phil-opp

            + +

            Thanks to @joycebrum for their contributions!

            +

            Other Projects

            +

            In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

            + +

            phip1611/paging-calculator

            +

            (Section written by @phip1611)

            +

            In the November newsletter, I announced the initial release of my +paging-calculator CLI utility. Recently, I released a new version, which now +covers page table indices for x86, x86 with physical address extension (PAE), +x86_64, and x86_64 with 5 levels. For example, just type $ paging-calculator 0xdeadbeef x86 +and $ paging-calculator 0xdeadbeef x86 --paeand compare the result. You can +install it from crates.io or with +the pkgs.paging-calculator attribute, +if you are a Nix user.

            +

            Screenshot: Paging Calculator CLI Utility

            +

            xiaoyang-sde/rust-kernel-riscv

            +

            (Section written by @xiaoyang-sde)

            +

            rust-kernel-riscv is an experimental operating system kernel built using Rust's asynchronous programming model to schedule threads in both kernel and user space. This approach allows for more efficient context switching and eliminates the need for allocating a separate kernel stack for each user process. In its current iteration, the kernel provides a basic shell capable of running several executables that demonstrate various kernel mechanisms.

            +

            The kernel provides a built-in executor, which manages the scheduling and execution of threads. Threads are executed for a time slice before an exception or interrupt occurs, and then the executor switches to another thread. To give you a better understanding, I included the async function that represents the lifetime of a user thread below, and I wrote a detailed design document.

            +
            async fn thread_loop(thread: Arc<Thread>) {
            +    loop {
            +        let trap_context = thread.state().lock().user_trap_context_mut();
            +        _enter_user_space(trap_context, thread.satp());
            +
            +        // Invokes related methods to handle the exception or interrupt,
            +        // which returns a variant of the `ControlFlow` enum
            +
            +        match control_flow {
            +            ControlFlow::Continue => continue,
            +            ControlFlow::Yield => yield_now().await,
            +            ControlFlow::Exit(exit_code) => {
            +                thread.exit(exit_code);
            +                break;
            +            }
            +        }
            +    }
            +}
            +
            +

            The idea behind rust-kernel-riscv was inspired by Phil's recent blog post on using async/await in the kernel. Thanks Phil for his invaluable support to the Rust community!

            +

            Join Us?

            +

            Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

            + + +

            Comments

            + + +
            + +
            +
            + Join us on Gitter.
            + © -. All rights reserved. + Contact +
            +
            +
            +
            + + + + + diff --git a/this-month/2023-03/screenshot-paging-calculator-x86-pae.png b/this-month/2023-03/screenshot-paging-calculator-x86-pae.png new file mode 100644 index 0000000000000000000000000000000000000000..6381a3aa1f45b164518d96744ea5e2f1fc2edd5e GIT binary patch literal 183551 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

            yjcBbo3{(<0T$!A^drCc=LVx#u6G!2% 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 Zq(Qd6CWWTExHz{TWd#lSYFYD;e*-a9*=GO% literal 0 HcmV?d00001 From 62f098b691b1ee10b326347b5b8ce565f089140e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 9 Apr 2023 00:41:29 +0000 Subject: [PATCH 351/613] Deploy 7f62a40b59579790961d0c046489c1deb388e8a1 Deploy of commit https://github.com/rust-osdev/homepage/commit/7f62a40b59579790961d0c046489c1deb388e8a1 From 2d8055693d8cbcc7cece7b3281f99bd43ad9f654 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 13 Apr 2023 06:30:28 +0000 Subject: [PATCH 352/613] Deploy efe10f9d53effe62216b750e143075f4f000f5ee Deploy of commit https://github.com/rust-osdev/homepage/commit/efe10f9d53effe62216b750e143075f4f000f5ee From 927a5a465feaafe3d72a1a2748f09ea51ee718c6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 17 Apr 2023 00:40:55 +0000 Subject: [PATCH 353/613] Deploy efe10f9d53effe62216b750e143075f4f000f5ee Deploy of commit https://github.com/rust-osdev/homepage/commit/efe10f9d53effe62216b750e143075f4f000f5ee From f668f5e6448ac1d9d42cd56412339fc3e86d22cc Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 18 Apr 2023 11:44:17 +0000 Subject: [PATCH 354/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From 065544ba35500b806f8548173186346dbf3e02d6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 21 Apr 2023 00:39:26 +0000 Subject: [PATCH 355/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From d34d8a4b203eb1148b2cc5b78bd8b7fa5a36bcc1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 25 Apr 2023 00:41:07 +0000 Subject: [PATCH 356/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From f9790314b133bdd0a97c81ce2dc98acdddafe7bc Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 29 Apr 2023 09:57:02 +0000 Subject: [PATCH 357/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From 8d723f992f61923347515b6aa849da7bcdbb9937 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 1 May 2023 00:42:18 +0000 Subject: [PATCH 358/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From e418766680d0a6d67563ae702756392029a2c448 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 5 May 2023 00:37:36 +0000 Subject: [PATCH 359/613] Deploy 52998d6a76c2d35c367f288c356e30e9e7f114c8 Deploy of commit https://github.com/rust-osdev/homepage/commit/52998d6a76c2d35c367f288c356e30e9e7f114c8 From a12d1923cafc85a6d64af3f6f051e24f0569260e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 5 May 2023 17:21:22 +0000 Subject: [PATCH 360/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-04/index.html | 206 ++++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-04/index.html diff --git a/index.html b/index.html index 13f10285..904dd0f9 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

            This Month in Rust OSDev

              +
            • April 2023
            • +
            • March 2023
            • February 2023
            • diff --git a/rss.xml b/rss.xml index fc3029e5..629e0858 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Sat, 08 Apr 2023 00:00:00 +0000 + Fri, 05 May 2023 00:00:00 +0000 + + This Month in Rust OSDev: April 2023 + Fri, 05 May 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-04/ + https://rust-osdev.com/this-month/2023-04/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: March 2023 Sat, 08 Apr 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 5ea920a0..a6de3097 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -157,4 +157,8 @@ https://rust-osdev.com/this-month/2023-03/ 2023-04-08 + + https://rust-osdev.com/this-month/2023-04/ + 2023-05-05 + diff --git a/this-month/2023-04/index.html b/this-month/2023-04/index.html new file mode 100644 index 00000000..e7a515ab --- /dev/null +++ b/this-month/2023-04/index.html @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: April 2023 | Rust OSDev + + + +
              +
              +
              +

              + Rust OSDev + Operating System Development in Rust +

              +
              +
              + +
              +
              +

              This Month in Rust OSDev: April 2023

              + + + +

              Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

              + +

              This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

              + +

              Infrastructure and Tooling

              +

              In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

              + +

              No updates were proposed for this section this month.

              +

              Announcements, News, and Blog Posts

              +

              Here we collect news, blog posts, etc. related to OS development in Rust.

              + + +

              rust-osdev Projects

              +

              In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

              + +

              uefi-rs

              +

              Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

              +

              Features

              + +

              Docs

              + +

              Other

              + +

              Thanks to @JohnAZoidberg and @felipebalbi for their contributions!

              +

              bootloader

              +

              Maintained by @phil-opp

              + +

              Thanks to @kennystrawnmusic and @JarlEvanson for their contributions!

              +

              pic8259

              +

              Maintained by @phil-opp

              + +

              Thanks to @rasheedmhd for their contributions!

              +

              x86_64

              +

              Maintained by @phil-opp, @josephlr, and @Freax13

              + +

              acpi

              +

              Maintained by @IsaacWoods

              + +

              Thanks to @A0lson, and @rw-vanc for their contributions!

              +

              ucs2-rs

              +

              Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

              + +

              Other Projects

              +

              In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

              + +

              phil-opp/blog_os

              +

              (Section written by @phil-opp)

              +

              We merged the following changes to the Writing an OS in Rust blog this month:

              + +

              I also continued writing on the upcoming third edition of the blog. I finished a draft of the second post, which is about booting using v0.11 of the bootloader crate. You can already read it on GitHub if you like.

              +

              Join Us?

              +

              Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

              + + +

              Comments

              + + +
              + +
              +
              + Join us on Gitter.
              + © -. All rights reserved. + Contact +
              +
              +
              +
              + + + + + From 8e5bd60f707fa2ae3cce23ba88485442a620c4f1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 9 May 2023 00:41:17 +0000 Subject: [PATCH 361/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From e65d5a3c0f035630a4dcdedcd7f65de6cfc92a16 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 13 May 2023 00:38:20 +0000 Subject: [PATCH 362/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 3e2a8ab487807ef66168aff78cd3197e377096e2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 17 May 2023 00:43:25 +0000 Subject: [PATCH 363/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 2eae8de09dac772bd99d12396b7b3dfb8c051a13 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 21 May 2023 00:43:38 +0000 Subject: [PATCH 364/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 63bf948eb3e02b89a95b4ee7cd3f5dbce330167a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 25 May 2023 00:40:18 +0000 Subject: [PATCH 365/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 866d5ee1877eeaa5220142cdc37c4efd387da933 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 29 May 2023 00:45:06 +0000 Subject: [PATCH 366/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 9d35666d9456ad327f5cc2d73f7cb31301e9efe2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 1 Jun 2023 00:57:41 +0000 Subject: [PATCH 367/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 5cc7f0c17bc849876452cb9d869764874e97820d Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 5 Jun 2023 00:46:41 +0000 Subject: [PATCH 368/613] Deploy 8c24487b4acf9399a3174d917db352ffc84d8748 Deploy of commit https://github.com/rust-osdev/homepage/commit/8c24487b4acf9399a3174d917db352ffc84d8748 From 11aad23d7aff32fe4a815bc6ebd3d971f395bc8b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 6 Jun 2023 12:59:16 +0000 Subject: [PATCH 369/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-05/index.html | 235 ++++++++++++++++++++++++++++++++++ 4 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-05/index.html diff --git a/index.html b/index.html index 904dd0f9..c346cc7b 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

              This Month in Rust OSDev

                +
              • May 2023
              • +
              • April 2023
              • March 2023
              • diff --git a/rss.xml b/rss.xml index 629e0858..210eb654 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Fri, 05 May 2023 00:00:00 +0000 + Tue, 06 Jun 2023 00:00:00 +0000 + + This Month in Rust OSDev: May 2023 + Tue, 06 Jun 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-05/ + https://rust-osdev.com/this-month/2023-05/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: April 2023 Fri, 05 May 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index a6de3097..b697711f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -161,4 +161,8 @@ https://rust-osdev.com/this-month/2023-04/ 2023-05-05 + + https://rust-osdev.com/this-month/2023-05/ + 2023-06-06 + diff --git a/this-month/2023-05/index.html b/this-month/2023-05/index.html new file mode 100644 index 00000000..afe8ea24 --- /dev/null +++ b/this-month/2023-05/index.html @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: May 2023 | Rust OSDev + + + +
                +
                +
                +

                + Rust OSDev + Operating System Development in Rust +

                +
                +
                + +
                +
                +

                This Month in Rust OSDev: May 2023

                + + + +

                Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                + +

                This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                + +

                Infrastructure and Tooling

                +

                In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                + +

                No updates were proposed for this section this month.

                +

                Announcements, News, and Blog Posts

                +

                Here we collect news, blog posts, etc. related to OS development in Rust.

                + + +

                rust-osdev Projects

                +

                In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                + +

                uefi-rs

                +

                Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                + +

                Thanks to @RaitoBezarius and @medhefgo for their contributions!

                +

                multiboot2

                +

                Maintained by @IsaacWoods, @phip1611, @robert-w-gries, @ahmedcharles, and @Caduser2020

                + +

                Thanks to @YtvwlD for their contributions!

                +

                vga

                +

                Maintained by @RKennedy9064

                + +

                Thanks to @tsatke for their contribution!

                +

                ovmf-prebuilt

                +

                Maintained by @phil-opp

                + +

                Thanks to @nicholasbishop for this contribution!

                +

                acpi

                +

                Maintained by @IsaacWoods

                + +

                Thanks to @YtvwlD, @semiviral, and @A0lson for their contributions!

                +

                pci_types

                +

                Maintained by @IsaacWoods

                + +

                Thanks to @stlankes for their contributions!

                +

                bootloader

                +

                Maintained by @phil-opp

                + +

                Thanks to @mgr0dzicki for their contributions!

                +

                Other Projects

                +

                In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                + +

                phil-opp/blog_os

                +

                (Section written by @phil-opp)

                +

                We merged the following changes to the Writing an OS in Rust blog this month:

                + +

                Thanks to @SPuntte, @Firenezz, and @twilfredo for these contributions!

                +

                There wasn't much progress on the upcoming third edition this month, as I've been on vacation for the past few weeks. I still have a lot of catching up to do, but I'll try my best to continue writing soon :).

                +

                Join Us?

                +

                Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                + + +

                Comments

                + + +
                + +
                +
                + Join us on Gitter.
                + © -. All rights reserved. + Contact +
                +
                +
                +
                + + + + + From b422e8e6895cc34e8e8c14dc1ec0357a182b184b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 9 Jun 2023 00:49:31 +0000 Subject: [PATCH 370/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From dca6b5a34b3577abf34e35dbc63282524b7f152b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 13 Jun 2023 00:46:38 +0000 Subject: [PATCH 371/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From c35ee8c4368611d974676c4fc8e434aab57ecb8c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 17 Jun 2023 00:42:45 +0000 Subject: [PATCH 372/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From d70ffb988751745aae3a4f4d8e9b8d5db04fe921 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 21 Jun 2023 00:47:16 +0000 Subject: [PATCH 373/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From b3e9f538ac7b6db055056bda0e160df0a62e2a93 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 25 Jun 2023 00:56:52 +0000 Subject: [PATCH 374/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From ba99e7b0f24505c55e4138be84dfef221c1ef311 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 29 Jun 2023 00:51:24 +0000 Subject: [PATCH 375/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From 1ed15efb3da9c7a769587a42ef488fb05629bb66 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 1 Jul 2023 00:56:53 +0000 Subject: [PATCH 376/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From b5ef2070a024229cb67a017b0afecdc105c50ea3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 5 Jul 2023 00:53:51 +0000 Subject: [PATCH 377/613] Deploy 3f238641093d5033a03133cf44eede55da28c2eb Deploy of commit https://github.com/rust-osdev/homepage/commit/3f238641093d5033a03133cf44eede55da28c2eb From fa043b8810fc8dfd538347b703a361e0a52b5963 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 6 Jul 2023 18:55:56 +0000 Subject: [PATCH 378/613] Deploy c41c74f88aaf5d70a9de606c1e0d5225dbb3f8a5 Deploy of commit https://github.com/rust-osdev/homepage/commit/c41c74f88aaf5d70a9de606c1e0d5225dbb3f8a5 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2020-09/index.html | 4 +- this-month/2023-06/index.html | 285 ++++++++++++++++++++++++++++++++++ 5 files changed, 302 insertions(+), 3 deletions(-) create mode 100644 this-month/2023-06/index.html diff --git a/index.html b/index.html index c346cc7b..b3fa2924 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                This Month in Rust OSDev

                  +
                • June 2023
                • +
                • May 2023
                • April 2023
                • diff --git a/rss.xml b/rss.xml index 210eb654..3f4cb226 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Tue, 06 Jun 2023 00:00:00 +0000 + Thu, 06 Jul 2023 00:00:00 +0000 + + This Month in Rust OSDev: June 2023 + Thu, 06 Jul 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-06/ + https://rust-osdev.com/this-month/2023-06/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: May 2023 Tue, 06 Jun 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index b697711f..67970520 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -165,4 +165,8 @@ https://rust-osdev.com/this-month/2023-05/ 2023-06-06 + + https://rust-osdev.com/this-month/2023-06/ + 2023-07-06 + diff --git a/this-month/2020-09/index.html b/this-month/2020-09/index.html index cef52d1f..a1d219ee 100644 --- a/this-month/2020-09/index.html +++ b/this-month/2020-09/index.html @@ -95,8 +95,8 @@

                  x86_64Thanks to @ecstatic-morse, @toku-sa-n, @h33p, and @josephlr for their contributions!

                  We would also like to welcome @josephlr to our x86_64 review and maintenance team!

                  volatile

                  -

                  The volatile crate provides safe wrapper types for implementing volatile read and write operations. This month, we published version 0.4.0, which completely rewrites the crate based on reference values. Instead of wrapping the target value directly as e.g. Volatile<u32>, the new implementation works by wrapping reference types such as Volatile<&mut u32>. See our completely revamped documentation for more details.

                  -

                  The main advantage of the new reference-based implementation is that it is now possible to work with volatile arrays and slices, at least on nightly Rust. Through the index and index_mut methods it is possible to create sub-slices, which can then be read and written efficiently through the copy_into_slice and copy_from_slice methods. All these operations perform volatile memory accesses, so that the compiler won't optimize them away.

                  +

                  The volatile crate provides safe wrapper types for implementing volatile read and write operations. This month, we published version 0.4.0, which completely rewrites the crate based on reference values. Instead of wrapping the target value directly as e.g. Volatile<u32>, the new implementation works by wrapping reference types such as Volatile<&mut u32>. See our completely revamped documentation for more details.

                  +

                  The main advantage of the new reference-based implementation is that it is now possible to work with volatile arrays and slices, at least on nightly Rust. Through the index and index_mut methods it is possible to create sub-slices, which can then be read and written efficiently through the copy_into_slice and copy_from_slice methods. All these operations perform volatile memory accesses, so that the compiler won't optimize them away.

                  pci_types

                  pci_types is a new library in the Rust OSDev organisation that provides types for accessing and configuring PCI devices from Rust operating systems. Lots of this code (e.g. identifying devices by class codes) can be shared diff --git a/this-month/2023-06/index.html b/this-month/2023-06/index.html new file mode 100644 index 00000000..1db30c30 --- /dev/null +++ b/this-month/2023-06/index.html @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: June 2023 | Rust OSDev + + + +

                  +
                  +
                  +

                  + Rust OSDev + Operating System Development in Rust +

                  +
                  +
                  + +
                  +
                  +

                  This Month in Rust OSDev: June 2023

                  + + + +

                  Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                  + +

                  This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                  + +

                  Announcements, News, and Blog Posts

                  +

                  Here we collect news, blog posts, etc. related to OS development in Rust.

                  + + +

                  Infrastructure and Tooling

                  +

                  In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                  + +

                  No updates were proposed for this section this month.

                  +

                  rust-osdev Projects

                  +

                  In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                  + +

                  volatile

                  +

                  Maintained by @phil-opp

                  +

                  The volatile crate provides a safe wrapper type for implementing volatile read and write operations. This is useful for accessing memory regions that have side-effects, such as memory-mapped hardware registers or framebuffers.

                  +

                  Unfortunately, the design crate had a soundness issue because it used reference types for accessing the volatile memory. This is problematic because the Rust compiler marks references are "dereferencable", which allows LLVM to insert spurious read operations. This is fine for accessing "normal" memory, but it can lead to correctness issues when used in combination with memory-mapped device registers. These registers look like normal memory, but they are actually accessing some device-specific registers, which might change at any time. So they might change between spurious reads, which violates the assumptions of LLVM and can lead to undefined behavior.

                  +

                  To solve this issue, we started a full redesign of the crate that uses raw pointers only. This solves the issue because raw pointers are not considered "dereferencable", so LLVM is not allowed to insert spurious reads. While we started working on the new design more than 2 years ago, we didn't merge it until this month because we weren't sure about the implementation details. The main discussion point was whether we should treat the proposed VolatilePointer type like Rust's reference types or like Rust's raw pointer types. The difference is that raw pointers implement the Copy trait, but are not Send to prevent aliasing. References, on the other hand, can safely implement Send because they're only Copy if the reference is read-only.

                  +

                  After a lot of back and forth, we decided to provide both options and finally publish volatile v0.5. So the new design has two wrapper types, VolatilePtr (behaves like a raw pointer) and VolatileRef (behaves like a reference). We hope that we support most use cases this way!

                  +

                  Note that there is also some ongoing discussion about a potential VolatileCell type to wrap values in-place. Most implementations of such a type would require support from the Rust compiler, which needs an RFC. However, there is one promising design based on zero-sized types and proc-macros by @Freax13 that should not require any new language features. We will continue to investigate.

                  +

                  multiboot2

                  +

                  Maintained by @IsaacWoods, @phip1611, @robert-w-gries, and @ahmedcharles

                  +

                  The multiboot2 and the multiboot2-header +crates got a big overhaul. The list of new features includes but is not limited to:

                  +
                    +
                  • use DSTs for tags where applicable (#134)
                  • +
                  • model the MBI as DST (#155)
                  • +
                  • add a runtime builder for an MBI (#133)
                    +Huge thanks to YtvwlD / Niklas for this greate external contribution
                  • +
                  • added an integration test including a multiboot2 chainloader for better test coverage (#129)
                  • +
                  • added miri to the CI for more memory safety (#128)
                  • +
                  • several fixes and small improvements
                  • +
                  +

                  multiboot2 was updated from 0.15.1 to 0.16.0 and multiboot2-header was updated from 0.2.0 to 0.3.0. Both +releases come with a large amount of breaking changes. +However, after a sensible consideration, they are all worth it for a more streamlined API and more memory safety.

                  +
                  +Merged pull requests: + +

                  Thanks to @YtvwlD and @scholzp for their contributions!

                  +
                  +

                  x86_64

                  +

                  Maintained by @phil-opp, @josephlr, and @Freax13

                  +

                  The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                  +

                  We merged the following changes this month:

                  + +

                  Thanks to @Qix-, @grant0417, and @Egggggg for their contributions!

                  +

                  vga

                  +

                  Maintained by @RKennedy9064

                  +

                  The work-in-progress vga crate allows the configuration of the VGA hardware, e.g. switching from text-based mode to a pixel-based graphics mode. This month, we merged the following pull request:

                  + +

                  Thanks to @tsatke for their contribution!

                  +

                  uefi-rs

                  +

                  Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                  +

                  The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. In September, the crate was updated to Rust's new inline assembly implemenation. We also published version 0.6.0 of the crate, including all the improvements added in the past two months.

                  +

                  We merged the following PRs this month:

                  + +

                  Thanks to @medhefgo for their contribution!

                  +

                  Other Projects

                  +

                  In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                  +

                  hermitcore/rusty-hermit

                  +

                  (Section written by @mkroening)

                  +

                  The Hermit library operating system allows you to bundle a whole OS directly with your application, creating a freestanding, bootable Unikernel image. +This month, we achieved several milestones for reaching more users with Hermit:

                  +
                    +
                  • +

                    Stable Rust support.

                    +

                    You can now compile your programs for Hermit using the stable Rust toolchain! 🥳

                    +

                    While the Hermit targets (x86_64-unknown-hermit and aarch64-unknown-hermit) are still at tier 3, we now distribute pre-built artifacts of the Rust standard library for use with stable toolchains! +This means, no more -Zbuild-std, resulting in faster builds, and the bliss of the stable Rust compiler.

                    +

                    See hermitcore/rust-std-hermit for details on our rust-std artifacts.

                    +
                  • +
                  • +

                    Windows support.

                    +

                    Thanks to Rust's awesome cross-compilation capabilities, you can now compile Hermit applications from anywhere! 😎

                    +

                    We have resolved a longstanding issue when building Hermit applications on Windows (hermitcore/rusty-hermit#431). +The issue is all sorted out now and Windows, macOS, and Linux are tested and verified by our CI.

                    +
                  • +
                  • +

                    AArch64 (ARM64) support.

                    +

                    You can now run real applications on AArch64, with scheduling, network and everything! 🤯

                    + +
                  • +
                  +

                  We'd love if you gave Hermit a try. Just start with our "Hello, World!" application template: hermitcore/rusty-demo.

                  + +

                  Join Us?

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  + + +

                  Comments

                  + + +
                  + +
                  +
                  + Join us on Gitter.
                  + © -. All rights reserved. + Contact +
                  +
                  +
                  +
                  + + + + + From cf9765ab13a62595dae4bab52a6997d7301183b9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 6 Jul 2023 21:11:57 +0000 Subject: [PATCH 379/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e --- this-month/2023-06/index.html | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/this-month/2023-06/index.html b/this-month/2023-06/index.html index 1db30c30..5b1ee95e 100644 --- a/this-month/2023-06/index.html +++ b/this-month/2023-06/index.html @@ -162,7 +162,16 @@

                  vgaThanks to @tsatke for their contribution!

                  uefi-rs

                  Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                  -

                  The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. In September, the crate was updated to Rust's new inline assembly implemenation. We also published version 0.6.0 of the crate, including all the improvements added in the past two months.

                  +

                  The uefi crate provides safe and performant wrappers for UEFI, +the successor to the BIOS firmware. It empowers everyone to write EFI- +applications with Rust in a convenient way, such as your own bootloader.

                  +

                  In June, we added multiple small improvements for developers using +Nix(OS) and simplifications for working with device +paths. Additionally, we moved more definitions to the new uefi-raw crate.

                  +

                  Furthermore, we'd like to mention the new high-level File-System API. +It was merged in April +actually, but not mentioned in this newsletter so far. Feel free to give it a +try!

                  We merged the following PRs this month:

                  • Release uefi-raw-0.2.0, uefi-0.22.0, and uefi-services-0.19.0
                  • From 29bb23f2c6beeef76388880337b96a8e8d7ea79d Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 9 Jul 2023 00:56:33 +0000 Subject: [PATCH 380/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From 6bfaf57901ae49275f974d6401d35f0fd95482bc Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 13 Jul 2023 00:53:43 +0000 Subject: [PATCH 381/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From fe21286f9abdc523ffb0bb5b975113a645b17703 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 17 Jul 2023 00:55:20 +0000 Subject: [PATCH 382/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From aad84728342bede13a5ab0221f37135a888d9c68 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 21 Jul 2023 00:44:37 +0000 Subject: [PATCH 383/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From 9ce5a65e41326de89e781f17f5a025b7aa245ef1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 25 Jul 2023 00:48:30 +0000 Subject: [PATCH 384/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From 342c930470401197e19dfbf8b87b26e4af09f051 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 29 Jul 2023 00:41:57 +0000 Subject: [PATCH 385/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From afd5e718da2f801b0fe62821345fad82da440f40 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 1 Aug 2023 00:48:19 +0000 Subject: [PATCH 386/613] Deploy 25f526278dc6c702beb5b49f5a0a159e1ab4cf3e Deploy of commit https://github.com/rust-osdev/homepage/commit/25f526278dc6c702beb5b49f5a0a159e1ab4cf3e From 6dc3e27119f87fe9cd5ea5b4ffe0861b2b6fd620 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 4 Aug 2023 15:19:39 +0000 Subject: [PATCH 387/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd --- css/poole.css | 85 +++++++++++-- index.html | 4 + rss.xml | 21 +++- showcase/cluu/index.html | 115 +++++++++++++++++ showcase/cluu/screen.png | Bin 0 -> 5447 bytes showcase/cluu/serial_out.png | Bin 0 -> 10641 bytes showcase/index.html | 10 ++ sitemap.xml | 8 ++ this-month/2023-06/index.html | 2 +- this-month/2023-07/index.html | 228 ++++++++++++++++++++++++++++++++++ 10 files changed, 459 insertions(+), 14 deletions(-) create mode 100644 showcase/cluu/index.html create mode 100644 showcase/cluu/screen.png create mode 100644 showcase/cluu/serial_out.png create mode 100644 this-month/2023-07/index.html diff --git a/css/poole.css b/css/poole.css index 7227a2ff..2b1e112f 100644 --- a/css/poole.css +++ b/css/poole.css @@ -37,8 +37,8 @@ * { -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } html, @@ -52,6 +52,7 @@ html { font-size: 16px; line-height: 1.5; } + @media (min-width: 38em) { html { font-size: 18px; @@ -62,7 +63,7 @@ body { color: #515151; background-color: #fff; -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } /* No `:visited` state is required by default (browsers will use `a`) */ @@ -70,9 +71,11 @@ a { color: #268bd2; text-decoration: none; } + a strong { color: inherit; } + /* `:focus` is linked to `:hover` for basic accessibility */ a:hover, a:focus { @@ -80,25 +83,36 @@ a:focus { } /* Headings */ -h1, h2, h3, h4, h5, h6 { +h1, +h2, +h3, +h4, +h5, +h6 { margin-bottom: .5rem; font-weight: bold; line-height: 1.25; color: #313131; text-rendering: optimizeLegibility; } + h1 { font-size: 2rem; } + h2 { margin-top: 2.5rem; font-size: 1.75rem; } + h3 { margin-top: 1.5rem; font-size: 1.25rem; } -h4, h5, h6 { + +h4, +h5, +h6 { margin-top: 1rem; font-size: 1rem; } @@ -115,7 +129,9 @@ strong { /* Lists */ -ul, ol, dl { +ul, +ol, +dl { margin-top: 0; margin-bottom: 1rem; } @@ -123,6 +139,7 @@ ul, ol, dl { dt { font-weight: bold; } + dd { margin-bottom: .5rem; } @@ -142,6 +159,7 @@ abbr { color: #555; text-transform: uppercase; } + abbr[title] { cursor: help; border-bottom: 1px dotted #e5e5e5; @@ -152,6 +170,7 @@ code, pre { font-family: Menlo, Monaco, "Courier New", monospace; } + code { padding: .25em .5em; font-size: 85%; @@ -159,6 +178,7 @@ code { background-color: #f9f9f9; border-radius: 3px; } + pre { display: block; margin-top: 0; @@ -172,6 +192,7 @@ pre { word-wrap: break-word; background-color: #f9f9f9; } + pre code { padding: 0; font-size: 100%; @@ -184,6 +205,7 @@ pre code { margin-bottom: 1rem; border-radius: 4px; } + .highlight pre { margin-bottom: 0; } @@ -192,17 +214,21 @@ pre code { .gist .gist-file { font-family: Menlo, Monaco, "Courier New", monospace !important; } + .gist .markdown-body { padding: 15px; } + .gist pre { padding: 0; background-color: transparent; } + .gist .gist-file .gist-data { font-size: .8rem !important; line-height: 1.4; } + .gist code { padding: 0; color: inherit; @@ -217,9 +243,11 @@ blockquote { color: #7a7a7a; border-left: .25rem solid #e5e5e5; } + blockquote p:last-child { margin-bottom: 0; } + @media (min-width: 30em) { blockquote { padding-right: 5rem; @@ -241,11 +269,13 @@ table { border: 1px solid #e5e5e5; border-collapse: collapse; } + td, th { padding: .25rem .5rem; border: 1px solid #e5e5e5; } + tbody tr:nth-child(odd) td, tbody tr:nth-child(odd) th { background-color: #f9f9f9; @@ -287,9 +317,9 @@ tbody tr:nth-child(odd) th { .container { max-width: 45rem; - padding-left: 1rem; + padding-left: 1rem; padding-right: 1rem; - margin-left: auto; + margin-left: auto; margin-right: auto; } @@ -301,18 +331,21 @@ tbody tr:nth-child(odd) th { */ .masthead { - padding-top: 1rem; + padding-top: 1rem; padding-bottom: 1rem; margin-bottom: 3rem; } + .masthead-title { margin-top: 0; margin-bottom: 0; color: #505050; } + .masthead-title a { color: #505050; } + .masthead-title small { font-size: 75%; font-weight: 400; @@ -339,11 +372,16 @@ tbody tr:nth-child(odd) th { .post-title a { color: #303030; } + .page-title, .post-title { margin-top: 0; } +.post-summary { + margin-bottom: 2rem; +} + /* Meta data line below post title */ .post-date { display: block; @@ -352,27 +390,45 @@ tbody tr:nth-child(odd) th { color: #9a9a9a; } +.post-summary .badges { + display: none; +} + +.badges { + margin-bottom: 0; +} + +.badges img { + display: inline-block; + margin-bottom: 0; +} + /* Related posts */ .related { padding-top: 2rem; padding-bottom: 2rem; border-top: 1px solid #eee; } + .related-posts { padding-left: 0; list-style: none; } + .related-posts h3 { margin-top: 0; } + .related-posts li small { font-size: 75%; color: #999; } + .related-posts li a:hover { color: #268bd2; text-decoration: none; } + .related-posts li a:hover small { color: inherit; } @@ -386,7 +442,8 @@ tbody tr:nth-child(odd) th { */ .pagination { - overflow: hidden; /* clearfix */ + overflow: hidden; + /* clearfix */ margin-left: -1rem; margin-right: -1rem; font-family: "PT Sans", Helvetica, Arial, sans-serif; @@ -400,6 +457,7 @@ tbody tr:nth-child(odd) th { padding: 1rem; border: 1px solid #eee; } + .pagination-item:first-child { margin-bottom: -1px; } @@ -413,18 +471,21 @@ a.pagination-item:hover { .pagination { margin: 3rem 0; } + .pagination-item { float: left; width: 50%; } + .pagination-item:first-child { margin-bottom: 0; - border-top-left-radius: 4px; + border-top-left-radius: 4px; border-bottom-left-radius: 4px; } + .pagination-item:last-child { margin-left: -1px; - border-top-right-radius: 4px; + border-top-right-radius: 4px; border-bottom-right-radius: 4px; } } diff --git a/index.html b/index.html index b3fa2924..73a76567 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                    This Month in Rust OSDev

                      +
                    • July 2023
                    • +
                    • June 2023
                    • May 2023
                    • @@ -127,6 +129,8 @@

                      Showcase

                      diff --git a/rss.xml b/rss.xml index 3f4cb226..a2c97b27 100644 --- a/rss.xml +++ b/rss.xml @@ -7,13 +7,32 @@ Zola en - Thu, 06 Jul 2023 00:00:00 +0000 + Fri, 04 Aug 2023 00:00:00 +0000 + + This Month in Rust OSDev: July 2023 + Fri, 04 Aug 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-07/ + https://rust-osdev.com/this-month/2023-07/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: June 2023 Thu, 06 Jul 2023 00:00:00 +0000 https://rust-osdev.com/this-month/2023-06/ https://rust-osdev.com/this-month/2023-06/ <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + + + CLUU (Compact Lightweight Unix Utopia) + Wed, 14 Jun 2023 00:00:00 +0000 + https://rust-osdev.com/showcase/cluu/ + https://rust-osdev.com/showcase/cluu/ + <div class="badges"> +<p><a href="https://github.com/valibali/cluu/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License" /></a> <a href="https://valibali.github.io/cluu/"><img src="https://img.shields.io/badge/documentation-RUSTDOCS-blue.svg" alt="Documentation" /></a> <a href="https://github.com/valibali/cluu"><img src="https://img.shields.io/badge/repository-GitHub-green.svg" alt="Repository" /></a></p> +</div> +<p>CLUU is a hobby operating system being written in Rust - in the active development phase - targeting x86_64 and with plans to support aarch64 in the future. The project is made for <strong>fun and joy</strong>, drawing inspiration from various operating systems and projects while incorporating unique approaches and ideas.</p> diff --git a/showcase/cluu/index.html b/showcase/cluu/index.html new file mode 100644 index 00000000..076e3d65 --- /dev/null +++ b/showcase/cluu/index.html @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + CLUU (Compact Lightweight Unix Utopia) | Rust OSDev + + + +
                      +
                      +
                      +

                      + Rust OSDev + Operating System Development in Rust +

                      +
                      +
                      + +
                      +
                      +

                      CLUU (Compact Lightweight Unix Utopia)

                      + + + +
                      +

                      License Documentation Repository

                      +
                      +

                      CLUU is a hobby operating system being written in Rust - in the active development phase - targeting x86_64 and with plans to support aarch64 in the future. The project is made for fun and joy, drawing inspiration from various operating systems and projects while incorporating unique approaches and ideas.

                      + + + +

                      Motivation

                      +

                      CLUU is driven by the motivation to explore operating system development in a powerful language like Rust. The project seeks to break away from the traditional approach using languages like C, which can sometimes feel limiting or mundane. With CLUU, the goal is to embark on a learning journey and have fun in the process. Contributions from the community are highly encouraged and welcomed.

                      +

                      Project Information

                      +

                      CLUU draws inspiration from the following operating systems:

                      +
                        +
                      • Plan 9: Plan 9 from Bell Labs is a distributed operating system developed at Bell Labs in the late 1980s. It provides a unique approach to system organization, with a focus on simplicity and distributed computing.
                      • +
                      • BSD: FreeBSD is a modern, advanced operating system for x86 and ARM architectures. It offers a rich feature set and has a long history of stability and reliability.
                      • +
                      +

                      As well as heavily influenced by the following projects:

                      +
                        +
                      • RedoxOS: RedoxOS is an operating system written in Rust, aiming to bring the innovations of Rust to a modern microkernel and full set of applications. It's fair to say it is the most advanced of all Rust OS-es.
                      • +
                      • k4dos: k4dos is another hobby-os of that sort, it's fairly cool, with userspace, that can run FreeDoom for example. It has a nice shell implementation: kash
                      • +
                      • blog_os: blog_os is a cutting-edge project by Philipp Oppermann that provides a detailed tutorial on building an operating system in Rust. It covers various aspects, including the bootloader, memory management, and device drivers.
                      • +
                      +

                      CLUU aims to create a UNIX-like operating system, although not plannig to fully adhere to the POSIX standards. The goal is to get as close to the UNIX philosophy and compatibility as possible. This would enable easier porting of Linux software to CLUU and provide a familiar environment for developers.

                      +

                      Current State and Goals

                      +

                      CLUU is currently in the early stages of development, with the focus on building a solid foundation for the operating system. At this stage, the following basic functionalities have been implemented:

                      +
                        +
                      • UART16550 driver: A driver for UART16550, allowing communication with the serial port for debugging and logging purposes.
                      • +
                      • Preparation for PIO and MMIO: The groundwork has been laid for implementing both Programmed I/O (PIO) and Memory-Mapped I/O (MMIO) for interacting with hardware devices.
                      • +
                      • Framebuffer driver: A driver for the framebuffer, providing a graphical output display.
                      • +
                      • Simple graphics and writing: Basic graphical capabilities have been implemented, allowing for drawing and writing on the screen using a PSF font.
                      • +
                      • Basic Logging framework: A basic logging framework has been developed to facilitate debugging and information output during the development process.
                      • +
                      +

                      Screencheck serial_output

                      +

                      As the project progresses, the focus will shift towards implementing additional features, such as:

                      +
                        +
                      • Kernel Implementation: Further development of the microkernel's core functionality, including process management, interprocess communication, and resource management.
                      • +
                      • Device Drivers: Continued development of drivers for essential hardware components, including keyboard, storage devices, and other peripherals.
                      • +
                      • Filesystem Support: Introducing filesystem support to enable file I/O operations and provide a foundation for user-level processes and applications.
                      • +
                      +

                      The project remains open-source, and contributions from the community are highly encouraged. If you're interested in exploring the code, contributing enhancements, or reporting issues, please visit the GitHub repository.

                      +

                      License

                      +

                      CLUU is licensed under the MIT License. See LICENSE for more information.

                      + + +

                      Comments

                      + + +
                      + +
                      +
                      + Join us on Gitter.
                      + © -. All rights reserved. + Contact +
                      +
                      +
                      +
                      + + + + + diff --git a/showcase/cluu/screen.png b/showcase/cluu/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..45c07a7c68be8ee0ad9643b9a487365d2d9e89ad GIT binary patch literal 5447 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

                  +

                  CLUU (Compact Lightweight Unix Utopia)

                  +
                  +
                  +

                  License Documentation Repository

                  +
                  +

                  CLUU is a hobby operating system being written in Rust - in the active development phase - targeting x86_64 and with plans to support aarch64 in the future. The project is made for fun and joy, drawing inspiration from various operating systems and projects while incorporating unique approaches and ideas.

                  + + read more » +
                  +

                  The RustyHermit Unikernel

                  RustyHermit is a unikernel, which is completely written Rust. Unikernels are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). They are typical used in virtualized environments, which build the backbone of typical cloud / edge infrastructures.

                  diff --git a/sitemap.xml b/sitemap.xml index 67970520..b1bae28b 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -9,6 +9,10 @@ https://rust-osdev.com/showcase/ + + https://rust-osdev.com/showcase/cluu/ + 2023-06-14 + https://rust-osdev.com/showcase/rusty-hermit/ 2021-01-22 @@ -169,4 +173,8 @@ https://rust-osdev.com/this-month/2023-06/ 2023-07-06 + + https://rust-osdev.com/this-month/2023-07/ + 2023-08-04 + diff --git a/this-month/2023-06/index.html b/this-month/2023-06/index.html index 5b1ee95e..6a603707 100644 --- a/this-month/2023-06/index.html +++ b/this-month/2023-06/index.html @@ -98,7 +98,7 @@

                  volatil

                  After a lot of back and forth, we decided to provide both options and finally publish volatile v0.5. So the new design has two wrapper types, VolatilePtr (behaves like a raw pointer) and VolatileRef (behaves like a reference). We hope that we support most use cases this way!

                  Note that there is also some ongoing discussion about a potential VolatileCell type to wrap values in-place. Most implementations of such a type would require support from the Rust compiler, which needs an RFC. However, there is one promising design based on zero-sized types and proc-macros by @Freax13 that should not require any new language features. We will continue to investigate.

                  multiboot2

                  -

                  Maintained by @IsaacWoods, @phip1611, @robert-w-gries, and @ahmedcharles

                  +

                  Maintained by @phip1611

                  The multiboot2 and the multiboot2-header crates got a big overhaul. The list of new features includes but is not limited to:

                    diff --git a/this-month/2023-07/index.html b/this-month/2023-07/index.html new file mode 100644 index 00000000..911d30fc --- /dev/null +++ b/this-month/2023-07/index.html @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: July 2023 | Rust OSDev + + + +
                    +
                    +
                    +

                    + Rust OSDev + Operating System Development in Rust +

                    +
                    +
                    + +
                    +
                    +

                    This Month in Rust OSDev: July 2023

                    + + + +

                    Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                    + +

                    This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                    + +

                    Announcements, News, and Blog Posts

                    +

                    Here we collect news, blog posts, etc. related to OS development in Rust.

                    + + +

                    Infrastructure and Tooling

                    +

                    In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                    + + +

                    rust-osdev Projects

                    +

                    In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                    + +

                    multiboot2

                    +

                    Maintained by @phip1611

                    +

                    The multiboot2 was bumped from 0.16.0 +to 0.17.0. The new release includes the builder pattern for the MBI builder +and the ability to use custom memory types in the memory map in addition to +pre-defined ones. For more info, look here.

                    +

                    uefi-rs

                    +

                    Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                    +

                    The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

                    + +

                    Thanks to @devsnek for their contribution!

                    +

                    xhci

                    +

                    Maintained by @toku-sa-n

                    +

                    The xhci crate provides types of xHCI structures, such as Registers and TRBs. We merged the following PRs this month:

                    + +

                    Thanks to @lemolatoon for their contribution!

                    +

                    x86_64

                    +

                    Maintained by @phil-opp, @josephlr, and @Freax13

                    +

                    The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                    +

                    We merged the following PR this month:

                    + +

                    Thanks to @SamZhang3 for their contribution!

                    +

                    bootloader

                    +

                    Maintained by @phil-opp

                    +

                    The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we released a new patch version to fix the build on the latest nightlies:

                    + +

                    ovmf-prebuilt

                    +

                    Maintained by @phil-opp

                    +

                    The ovmf-prebuilt project provides pre-built edk2 releases to make it easier to set up OVMF. We merged the following improvement this month:

                    + +

                    Thanks to @nicholasbishop for their contribution!

                    +

                    Other Projects

                    +

                    In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                    + +

                    SFBdragon/talc

                    +

                    (Section written by @SFBdragon)

                    +

                    Talc is a recently published, fast, and flexible no-std memory allocator.

                    +
                      +
                    • It's the fastest allocator I've tested as of yet (galloc falls short, buddy_alloc is close but lacks heap efficiency).
                    • +
                    • It features a OOM-handling component with dynamic arena resizing.
                    • +
                    +

                    By the time you're seeing this, hopefully v2 should be out or coming soon:

                    +
                      +
                    • The OOM handler system has been made more powerful.
                    • +
                    • lock_api is used to allow for custom allocator synchronization.
                    • +
                    • The internals and API has been improved to pass miri's stacked borrows validation.
                    • +
                    • You can now move the allocator struct around freely.
                    • +
                    • And more :3
                    • +
                    +

                    I hope you find it useful!

                    +

                    vinc/moros

                    +

                    (Section written by @vinc)

                    +

                    MOROS is a text-based hobby operating system targeting computers with a x86-64 architecture and a BIOS.

                    +

                    Since last month's release, I focused on adding new syscalls to interact with network sockets from userspace. The DNS and HTTP clients are now using the new UDP and TCP sockets.

                    +

                    I also added another syscall to poll multiple handles at the same time, to read from the console and a socket, improving the main network tool that can now be used as a simple chat program.

                    +

                    The VGA driver, the filesystem, and the editor got a few significant improvements as well, to support downloading and reading larger files.

                    +

                    valibali/cluu

                    +

                    (Section written by @phil-opp)

                    +

                    There is a new project featured in our Showcase series:

                    + +

                    Join Us?

                    +

                    Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                    + + +

                    Comments

                    + + +
                    + +
                    +
                    + Join us on Gitter.
                    + © -. All rights reserved. + Contact +
                    +
                    +
                    +
                    + + + + + From 78b2c4742abd0ba4ec9c8936f8156bc3e62d88f2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 5 Aug 2023 00:41:41 +0000 Subject: [PATCH 388/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From ac8128229dc253ba3994be523485edd9b8d82271 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 9 Aug 2023 00:42:59 +0000 Subject: [PATCH 389/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 16d62a92040e4c2a69b3252d0d2b285a5b5779d4 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 13 Aug 2023 00:36:17 +0000 Subject: [PATCH 390/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 06b4d3b60bac707030689b60c80fb535211837be Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 17 Aug 2023 00:33:38 +0000 Subject: [PATCH 391/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 641127453b7470062f268425dad13a100b0035c4 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 21 Aug 2023 00:34:46 +0000 Subject: [PATCH 392/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From f902993cf848a532a39f78f4d06b75ef16dacebb Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 25 Aug 2023 00:34:53 +0000 Subject: [PATCH 393/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 60bf695cf647a135b8fd9292f2bfe208dfdc999b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 29 Aug 2023 00:35:10 +0000 Subject: [PATCH 394/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 71e77fc6775fcd867fe3f9e3d6979601b93112d3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 1 Sep 2023 00:38:02 +0000 Subject: [PATCH 395/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From bd8f619d099a567a39e479a2c1710d71d5b771f8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 5 Sep 2023 00:34:46 +0000 Subject: [PATCH 396/613] Deploy 0a71314333066c7ccc34941783673c03ad88c2cd Deploy of commit https://github.com/rust-osdev/homepage/commit/0a71314333066c7ccc34941783673c03ad88c2cd From 98fc4d6e2e3cf82670daf09d2ace36d498bfd6cc Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 Sep 2023 18:13:27 +0000 Subject: [PATCH 397/613] Deploy eb2b91d5bb536dfb3d8dc81c40bda6eaf08c22f2 Deploy of commit https://github.com/rust-osdev/homepage/commit/eb2b91d5bb536dfb3d8dc81c40bda6eaf08c22f2 --- index.html | 4 +- rss.xml | 20 +- .../{rusty-hermit => hermit}/bandwidth.png | Bin .../{rusty-hermit => hermit}/common_vm.png | Bin showcase/hermit/index.html | 148 ++++++++++ showcase/{rusty-hermit => hermit}/libos.png | Bin showcase/index.html | 8 +- showcase/rusty-hermit/index.html | 200 +------------- sitemap.xml | 6 +- this-month/2021-01/index.html | 2 +- this-month/2021-12/index.html | 2 +- this-month/2022-07/index.html | 2 +- this-month/2023-08/index.html | 252 ++++++++++++++++++ 13 files changed, 436 insertions(+), 208 deletions(-) rename showcase/{rusty-hermit => hermit}/bandwidth.png (100%) rename showcase/{rusty-hermit => hermit}/common_vm.png (100%) create mode 100644 showcase/hermit/index.html rename showcase/{rusty-hermit => hermit}/libos.png (100%) create mode 100644 this-month/2023-08/index.html diff --git a/index.html b/index.html index 73a76567..954d6b66 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                    This Month in Rust OSDev

                    diff --git a/rss.xml b/rss.xml index a2c97b27..d9c21b8b 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Fri, 04 Aug 2023 00:00:00 +0000 + Wed, 06 Sep 2023 00:00:00 +0000 + + This Month in Rust OSDev: August 2023 + Wed, 06 Sep 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-08/ + https://rust-osdev.com/this-month/2023-08/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: July 2023 Fri, 04 Aug 2023 00:00:00 +0000 @@ -268,11 +276,13 @@ - The <code>RustyHermit</code> Unikernel + The Hermit Operating System Fri, 22 Jan 2021 00:00:00 +0000 - https://rust-osdev.com/showcase/rusty-hermit/ - https://rust-osdev.com/showcase/rusty-hermit/ - <p><a href="https://github.com/hermitcore/rusty-hermit">RustyHermit</a> is a unikernel, which is completely written Rust. <a href="http://unikernel.org/">Unikernels</a> are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). They are typical used in virtualized environments, which build the backbone of typical cloud / edge infrastructures.</p> + https://rust-osdev.com/showcase/hermit/ + https://rust-osdev.com/showcase/hermit/ + <p><a href="http://hermit-os.org">Hermit</a> is a unikernel project, that is completely written in Rust. +<a href="http://unikernel.org/">Unikernels</a> are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). +They are typically used in virtualized environments, which build the backbone of typical cloud and edge infrastructures.</p> diff --git a/showcase/rusty-hermit/bandwidth.png b/showcase/hermit/bandwidth.png similarity index 100% rename from showcase/rusty-hermit/bandwidth.png rename to showcase/hermit/bandwidth.png diff --git a/showcase/rusty-hermit/common_vm.png b/showcase/hermit/common_vm.png similarity index 100% rename from showcase/rusty-hermit/common_vm.png rename to showcase/hermit/common_vm.png diff --git a/showcase/hermit/index.html b/showcase/hermit/index.html new file mode 100644 index 00000000..e207a0c4 --- /dev/null +++ b/showcase/hermit/index.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + The Hermit Operating System | Rust OSDev + + + +
                    +
                    +
                    +

                    + Rust OSDev + Operating System Development in Rust +

                    +
                    +
                    + +
                    +
                    +

                    The Hermit Operating System

                    + + + +

                    Hermit is a unikernel project, that is completely written in Rust. +Unikernels are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). +They are typically used in virtualized environments, which build the backbone of typical cloud and edge infrastructures.

                    + + + +

                    Virtualization Designs

                    +

                    Common virtualized environments are based on classical virtual machines. +In this case, complete machines are emulated or virtualized, and common operating systems are running on both the host and guest sides:

                    +

                    Structure of a common virtualization environment

                    +

                    This technique is established (VMware, Hyper-V, etc.) and widely used. +However, it introduces additional overhead, especially regarding memory consumption and performance.

                    +

                    An alternative approach to common virtual machines is OS-level virtualization, where the kernel allows the existence of multiple isolated user-space instances. +These isolated instances are also known as “containers.” +Typical representatives are LXC and Docker, which promise less overhead in comparison to common virtual machines. +However, the isolation between the processes is weaker and may provide less security.

                    +

                    Unikernels

                    +

                    Often, only one application (e.g., a web server) is running in the container or the virtual machine. +In this case, a unikernel is an attractive solution. +The kernel is provided as a static library and linked to the application. +As the images directly contain the OS kernel, unikernels can be directly booted inside a virtual machine and do not require the typical software stack containing a Linux kernel and its user land within the VM.

                    +

                    Unikernels do not provide system calls in the classical sense, as everything is running with the privilege level of a kernel, and what is typically done via system calls is provided via a common function call. +At first glance, this sounds more insecure than previous approaches. +However, these kernels are expected to run within a virtual machine, which isolates the application from the real system. +In addition, common compiler analysis is used to check the complete software stack, and unneeded components can even be removed, which can reduce the attack surface of the application.

                    +

                    Structure of a library operating system

                    +

                    Well-known unikernels are kernels such as MirageOS and Unikraft. +MirageOS is written in OCaml, while Unikraft still uses C as the programming language of choice. +In contrast to these kernels, Hermit is completely written in Rust to benefit from Rust's performance and security behavior.

                    +

                    Hermit

                    +

                    In principle, every existing Rust application can be built on top of Hermit. +However, unikernels are single-tasking operating systems. +Consequently, support for the system call fork and inter-process communication is missing. +In addition, a classical C library is missing, which is typically used as an interface to the operating system. +Every crate that bypasses the standard runtime and tries to communicate directly with the operating system does not work without modifications. +However, many applications do not depend on these features and work on Hermit.

                    +

                    Performance

                    +

                    Unikernels can be highly optimized. +For instance, we optimized the network stack of Hermit. +Hermit uses smoltcp as the network stack, which is completely written in Rust. +As the interface between the guest and host operating systems, we use virtio, which is a para-virtualized driver for KVM and widely used in virtualized Linux environments.

                    +

                    The following figure compares Linux with Hermit, where both are running as guests inside a virtual machine running on top of a Linux-based host system:

                    +

                    Bandwidth of the Hermit's experimental network interface

                    +

                    Especially for small messages, Hermit is faster than Linux.

                    +

                    Research

                    +

                    Hermit is also a research project to evaluate new operating system designs, that improve the scalability and security of operating systems in cloud environments. +For instance, Hermit provides classical techniques to improve security behavior, like stack guards and separating the application stack from the libOS stack. +However, a library operating system typically uses a common function call to enter the kernel. +A classical separation of user and kernel space by entering a higher privilege level is missing.

                    +

                    In a paper, we presented a modified version of Hermit, which provides intra-unikernel isolation with Intel Memory Protection Keys (MPK). +MPK is a relatively new hardware primitive that provides per-thread permission control over groups of pages in a single address space with negligible switching overhead, making it a compelling candidate for use in unikernels.

                    +

                    MPK requires modification of page tables at a small performance cost. +Four previously unused bits of each page table entry (the 62nd to the 59th on x86-64) are exploited by MPK. +Since MPK exploits four bits of the page table entry, it supports up to 15 protection keys. +MPK controls per-thread permission on groups of pages. +Each core has a PKRU register (32 bits) containing a permission value. +The value of the PKRU register defines the permission of the thread currently running on that core for each group of pages containing a protection key in their page table entries. +Unlike page-table-level permission, MPK provides thread-local memory permission.

                    +

                    We provide user and kernel separation, so we simply see the entire application as an untrusted component, independently of application-specific characteristics such as the language it is written in or the level of skill of the application’s programmer. +In addition, we divide the kernel code into trusted and untrusted components. +Trusted kernel components represent pieces of code written in a memory-safe language, i.e., offering strong security guarantees. +Untrusted kernel components correspond to code written either in memory-unsafe languages or in unsafe Rust code blocks.

                    +

                    By entering the library operating system through the application binary interface, the protection keys will be automatically changed, which allows access to the kernel stack and the kernel heap. +Unauthorized access from within the application will trigger a page fault, which will be handled by the library operating system.

                    +

                    Getting Started

                    +

                    Take a look at hermit-os/hermit-rs-template for a simple starter application.

                    +

                    The Hermit platform is an official Rust target. +You can either use our prebuilt rust-std artifacts on stable Rust or use build-std on nightly Rust. +Alternatively, you can compile the whole Rust compiler for Hermit, of course.

                    +

                    Roadmap

                    +

                    In the near future, we plan to stabilize the interface to the hardware. +For instance, the support of virtiofs is at an early stage. +In addition, the integration into the Rust standard library isn't finalized yet, and the current version runs only on x86-64. +In the future, we want to also support AArch64 as a processor architecture.

                    + + +

                    Comments

                    + + +
                    + +
                    +
                    + Join us on Gitter.
                    + © -. All rights reserved. + Contact +
                    +
                    +
                    +
                    + + + + + diff --git a/showcase/rusty-hermit/libos.png b/showcase/hermit/libos.png similarity index 100% rename from showcase/rusty-hermit/libos.png rename to showcase/hermit/libos.png diff --git a/showcase/index.html b/showcase/index.html index 57a3b492..7b75d476 100644 --- a/showcase/index.html +++ b/showcase/index.html @@ -52,11 +52,13 @@

                    CLUU (Compact Lightweight Unix read more »

                  -

                  The RustyHermit Unikernel

                  +

                  The Hermit Operating System

                  -

                  RustyHermit is a unikernel, which is completely written Rust. Unikernels are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). They are typical used in virtualized environments, which build the backbone of typical cloud / edge infrastructures.

                  +

                  Hermit is a unikernel project, that is completely written in Rust. +Unikernels are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). +They are typically used in virtualized environments, which build the backbone of typical cloud and edge infrastructures.

                  - read more » + read more »
                  diff --git a/showcase/rusty-hermit/index.html b/showcase/rusty-hermit/index.html index 2f790b48..e70d2d8f 100644 --- a/showcase/rusty-hermit/index.html +++ b/showcase/rusty-hermit/index.html @@ -1,196 +1,6 @@ - - - - - - - - - - - - - - - - - - The RustyHermit Unikernel | Rust OSDev - - - -
                  -
                  -
                  -

                  - Rust OSDev - Operating System Development in Rust -

                  -
                  -
                  - -
                  -
                  -

                  The RustyHermit Unikernel

                  - - - -

                  RustyHermit is a unikernel, which is completely written Rust. Unikernels are application images that directly contain the kernel as a library, so they do not require an installed operating system (OS). They are typical used in virtualized environments, which build the backbone of typical cloud / edge infrastructures.

                  - - - -

                  Virtualization Designs

                  -

                  Common virtualized environments are based on classical virtual machines. In this case, complete machines are emulated or virtualized and common operating systems are running on both host and guest site:

                  -

                  Structure of a common virtualitation environment

                  -

                  This technique is established (VMware, Hyper-V, etc.) and widely used. However, it introduces additional overhead especially regarding memory consumption and performance.

                  -

                  An alternative approach to common virtual machines is OS-level -virtualization, where the kernel allows the existence of multiple -isolated user space instances. These isolated instances are also known -as container. A typical representative is LXC or Docker and promise less -overhead in comparison to common virtual machines. However, the -isolation between the processes is weaker and may provide less security.

                  -

                  Unikernels

                  -

                  Often only one application (e.g. a web server) is running in the container or the virtual machine. In this case, a unikernel is an attractive solution. The kernel is provided as static library and linked to the application. As the images directly contain the OS kernel, unikernels can directly be booted inside a virtual machine and do not require the typical software stack containing a Linux kernel and its userland within the VM.

                  -

                  Unikernels do not provide system calls in the classical sense, as everything is running with the privilege level of a kernel and what is typically done via system calls is provided via a common function call. At first glance, this sounds more insecure than previous approaches. However, these kernels are expected to run within a virtual machine, which isolates the application from the real system. In addition, common compiler analysis is used to check the complete software stack and unneeded components can even be removed, which can reduce the attack surface of the application.

                  -

                  Structure of a library operating system

                  -

                  Well known unikernels are kernels such as MirageOS -and Unikraft. MirageOS is written in OCaml, -while Unikraft still uses C as programming language. In contrast to these -kernels, RustyHermit is completely written in Rust to benefit from -Rust's performance and security behavior.

                  -

                  RustyHermit

                  -

                  In principle, every existing -Rust application can be built on top of RustyHermit. However, unikernels -are a single tasking operating system. Consequently, the support of the -system call fork and inter-process communication are missing. In -addition, a classical C library is missing, which is typical used as -interface to the operating system. Every crate, which bypasses the -standard runtime and tries to communicate directly to operating system -does not work without modifications. However, many applications do not -depend on these features and work on RustyHermit.

                  -

                  Performance

                  -

                  Unikernels can be highly optimized. For instance, we optimized the -network stack of RustyHermit. RustyHermit uses -smoltcp as network stack, which -is completely written in Rust. As interface between guest and host -operating system, we use -Virtio, which is in a -para-virtualized driver for KVM and widely used in virtualized Linux -environments.

                  -

                  The following figure compares Linux with RustyHermit, -where both are running as guests inside a virtual machine running on top -of a Linux-based host system:

                  -

                  Bandwidth of the RustyHermit's exerimental network interface

                  -

                  Especially for small messages RustHermit -is faster in than Linux.

                  -

                  Research

                  -

                  RustyHermit is also a research project to evaluate new operating -system designs, which improves the scalability and the security of operating systems in cloud environments. For instance, RustyHermit provides classical -techniques to improve the security behavior like stack guards and -separating the application stack from the libOS stack. However, a -library operating system typically uses a common function call to enter -the kernel. A classical separation of user- and kernel space by -entering a higher privilege level is missing.

                  -

                  We presented in a -paper a modified -version of RustyHermit, which provides an intra-unikernel isolation with -Intel Memory Protection Keys (MPK). MPK is a relatively new hardware -primitive that provides per-thread permission control over groups of -pages in a single address space with negligible switching overhead, -making it a compelling candidate for use in unikernels.

                  -

                  MPK is requiring modification of page tables at a small performance cost. Four previously-unused bits of each page table entry (the 62nd to the 59th on x86-64) are exploited by MPK. Since MPK exploits four bits of the page table entry, it supports up to 15 protection keys. -MPK controls per-thread permission on groups of pages. Each core has a PKRU register (32 bits) containing a permission value. The value of the PKRU register defines the permission of the thread currently running on that core for each group of pages containing a protection key in their page table entries. Unlike page-table-level permission, MPK provides thread-local memory permission.

                  -

                  We provide user / kernel separation so we simply see the entire application as an untrusted component, independently of application-specific characteristics such as the language it is written in or the level of skill of the application’s programmer. In addition, we divide the kernel code into trusted and untrusted components. Trusted kernel components represent pieces of code written with a memory-safe language, i.e., offering strong security guarantees. Untrusted kernel components correspond to code written either in memory-unsafe languages or in unsafe Rust code blocks.

                  -

                  By entering the library operating system through the application binary interface the protection keys will be automatically changed, which allows access to the kernel stack and the kernel heap. Unauthorized access from within the application will trigger a pagefault, which will be handled by the library operating system.

                  -

                  Example Project

                  -

                  To give you an example on how to build an RustyHermit application, lets create a new cargo project:

                  -
                  cargo new hello_world
                  -cd hello_world
                  -
                  -

                  RustyHermit currently requires the nightly versions of the Rust toolchain. -To simplify the workflow, we recommend to create the configuration -rust-toolchain as follows to define the required components and to -tested version of nightly compiler:

                  -
                  [toolchain]
                  -channel = "nightly-2020-12-23"
                  -components = [ "rustfmt", "rust-src", "llvm-tools-preview"]
                  -targets = [ "x86_64-unknown-hermit" ]
                  -
                  -

                  The configuration file specifies the required components and the version of the nightly compiler to use.

                  -

                  The RustyHermit's target x86_64-unknown-hermit is part of Rust -supported platforms, but doesn't belong to the tier 1 platforms, -which means that official binary releases aren't available and the -standard runtime must be build from scratch. -To simplify this build process, we recommend to create the configuration -file .cargo/config as follows:

                  -
                  [unstable]
                  -build-std = ["std", "core", "alloc", "panic_abort"]
                  -
                  -[build]
                  -target = "x86_64-unknown-hermit"
                  -
                  -

                  To bind the library operating system to the application, we have to add the crate hermit-sys to the dependencies in the file Cargo.toml:

                  -
                  # Cargo.toml
                  -
                  -[target.'cfg(target_os = "hermit")'.dependencies]
                  -hermit-sys = "0.1.*"
                  -features = ["smoltcp"]
                  -
                  -

                  The feature smoltcp is required if your application tries -to establish a TCP connection. In this case, the library operating systems -includes the TCP/stack smoltcp. -In addition hermit-sys depends on the tool cargo-download to download required components and must be installed with the command cargo install cargo-download. -Finally, the application can be build with the common command cargo build.

                  -

                  The result is a 64-bit excutable in the executable link format (ELF). -To start the application within a common virtual machine, a loader is required, which initialize the processor and start the applications. -We provide a simple loader on GitHub. -A makefile to build the loader is part of the project. -After that, Qemu can be used to start RustyHermit in a VM as follows:

                  -
                  qemu-system-x86_64 -display none -smp 1 -m 64M -serial stdio  -kernel path_to_loader/rusty-loader -initrd path_to_app/app -cpu qemu64,apic,fsgsbase,rdtscp,xsave,fxsr
                  -
                  -

                  To improve the performance, KVM can be used to use the virtualization extension of modern processors.

                  -
                  qemu-system-x86_64 -display none -smp 1 -m 64M -serial stdio  -kernel path_to_loader/rusty-loader -initrd path_to_hello_world/hello_world -enable-kvm -cpu host
                  -
                  -

                  Roadmap

                  -

                  For the near future, we plan to stabilize the interface to the hardware. -For instance, the support of Virtio-fs -is in an early stage. In addition, the integration into Rust standard -library isn't finalized yet and the current version runs only on x86. In the -future, we want to also support aarch64 as processor architecture.

                  - - -

                  Comments

                  - - -
                  - -
                  -
                  - Join us on Gitter.
                  - © -. All rights reserved. - Contact -
                  -
                  -
                  -
                  - - - - - + + + +Redirect +

                  Click here to be redirected.

                  diff --git a/sitemap.xml b/sitemap.xml index b1bae28b..595c3a60 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -14,7 +14,7 @@ 2023-06-14 - https://rust-osdev.com/showcase/rusty-hermit/ + https://rust-osdev.com/showcase/hermit/ 2021-01-22 @@ -177,4 +177,8 @@ https://rust-osdev.com/this-month/2023-07/ 2023-08-04 + + https://rust-osdev.com/this-month/2023-08/ + 2023-09-06 + diff --git a/this-month/2021-01/index.html b/this-month/2021-01/index.html index 002ab3fb..e6127288 100644 --- a/this-month/2021-01/index.html +++ b/this-month/2021-01/index.html @@ -54,7 +54,7 @@

                  This Month in Rust OSDev (January 2021)

                  Showcase

                  We started a new Showcase section this month, where we introduce and present interesting Rust OSDev projects. The first post of this section is:

                  If you like to present your project too, just let us know!

                  Project Updates

                  diff --git a/this-month/2021-12/index.html b/this-month/2021-12/index.html index 6d922908..519978b4 100644 --- a/this-month/2021-12/index.html +++ b/this-month/2021-12/index.html @@ -157,7 +157,7 @@

                  rust

                  (Section written by @stlankes)

                  RustyHermit is a unikernel targeting a scalable and predictable runtime for high-performance and cloud computing.

                  This month, we integrated a virtual i/o device driver, which is based on memory mapped i/o and doesn't depend on PCI device specification. -For instance, micro VMs like Firecracker and Qemu's microvm machine type don't support the PCI specification to accelerate the boot time and to improve the performance. +For instance, micro VMs like Firecracker and Qemu's microvm machine type don't support the PCI specification to accelerate the boot time and to improve the performance. With this device driver, rusty-hermit is able to run on Qemu's microvm platform. We are working to support Firecracker in the near future.

                  phil-opp/blog_os

                  diff --git a/this-month/2022-07/index.html b/this-month/2022-07/index.html index 2fbdfd99..37b53839 100644 --- a/this-month/2022-07/index.html +++ b/this-month/2022-07/index.html @@ -104,7 +104,7 @@

                  Other Projects

                  In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                  rust-lang/rust

                  (Section written by @phil-opp)

                  -

                  This Month, @dvdhrm started an initiative to get the *-unknown-uefi targets to Tier-2. As a first step, they added a detailed description of the platform to the rustc book. The entry is already published in the nightly release of the book.

                  +

                  This Month, @dvdhrm started an initiative to get the *-unknown-uefi targets to Tier-2. As a first step, they added a detailed description of the platform to the rustc book. The entry is already published in the nightly release of the book.

                  Please reach out if you would like to help with this!

                  Theseus OS

                  (Section written by Kevin Boos (@kevinaboos))

                  diff --git a/this-month/2023-08/index.html b/this-month/2023-08/index.html new file mode 100644 index 00000000..519c7cb7 --- /dev/null +++ b/this-month/2023-08/index.html @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: August 2023 | Rust OSDev + + + +
                  +
                  +
                  +

                  + Rust OSDev + Operating System Development in Rust +

                  +
                  +
                  + +
                  +
                  +

                  This Month in Rust OSDev: August 2023

                  + + + +

                  Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                  + +

                  This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                  + +

                  Announcements, News, and Blog Posts

                  +

                  Here we collect news, blog posts, etc. related to OS development in Rust.

                  + +

                  Redox Summer of Code

                  + + +

                  Infrastructure and Tooling

                  +

                  In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                  + + +

                  rust-osdev Projects

                  +

                  In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                  + +

                  uefi-rs

                  +

                  Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                  +

                  The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

                  + + +

                  Thanks to @cmoylan and @julic20s for their contributions!

                  +

                  bootloader

                  +

                  Maintained by @phil-opp

                  +

                  The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we merged the following PRs:

                  + +

                  Thanks to @frisoft, @devsnek, and @kuzeyardabulut for their contributions!

                  +

                  x86_64

                  +

                  Maintained by @phil-opp, @josephlr, and @Freax13

                  +

                  The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                  +

                  We merged the following PR this month:

                  + +

                  Thanks to @tsoutsman, @NathanKolpa, and @xzmeng for their contributions!

                  +

                  acpi

                  +

                  Maintained by @IsaacWoods

                  +

                  The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. We merged the following changes this month:

                  + +

                  Thanks to @alnyan for their contributions!

                  +

                  uart_16550

                  +

                  Maintained by @phil-opp

                  +

                  The uart_16550 crate provides basic support for serial port I/O for 16550-compatible UARTs. We merged the following change this month:

                  + +

                  Thanks to @phip1611 for their contributions!

                  +

                  Other Projects

                  +

                  In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                  +

                  mkroening/take-static

                  +

                  (Section written by @mkroening)

                  +

                  I published a tiny new crate, allowing you to get a mutable reference to static items safely (only once, though):

                  +
                  use take_static::take_static;
                  +
                  +take_static! {
                  +    static NUMBER: usize = 5;
                  +}
                  +
                  +assert_eq!(NUMBER.take(), Some(&mut 5));
                  +assert_eq!(NUMBER.take(), None);
                  +
                  +

                  This allows you to easily use statically allocated memory before dynamic memory allocators may be available. +Compared to cortex_m::singleton, take_static is thread-safe. +Compared to takecell::TakeCell, take_static also supports !Send types.

                  +

                  hermit-os/kernel

                  +

                  (Section written by @mkroening)

                  + +

                  The Hermit unikernel project allows you to bundle your Rust application with our library operating system to create a bootable unikernel image. +Hermit is a single-address-space operating system. +Since there is only one application running in the virtual machine, no isolation between applications or between user space and kernel space is necessary. +This reduces system call overhead immensely, since every system call is just a library call. +For more information, see our The Hermit Operating System showcase post.

                  +

                  The RustyHermit project has been renamed. +We have renamed our GitHub organization from @hermitcore to @hermit-os and reserved the http://hermit-os.org domain.

                  +

                  We have also renamed some of our core projects to reduce confusion:

                  + +

                  We have a new logo! +As hermit crabs occupy empty shells produced by other organisms, the original HermitCore occupied one or several cores on a computer. +Because we migrated to Rust in 2018, our new logo of a hermit crab occupying the Rust logo's bike gear fits quite nicely with the Rust logo as well as Rust's Ferris.

                  +

                  And as always, please come and try Hermit! :)

                  +

                  phil-opp/blog_os

                  +

                  (Section written by @phil-opp)

                  +

                  We merged the following changes to the Writing an OS in Rust blog this month:

                  + +

                  Thanks to @Connortsui20 and @xzmeng for these contributions!

                  + +

                  Join Us?

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  + + +

                  Comments

                  + + +
                  + +
                  +
                  + Join us on Gitter.
                  + © -. All rights reserved. + Contact +
                  +
                  +
                  +
                  + + + + + From aec08639512e6569126e29c7a7eb2891688554d9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 7 Sep 2023 07:16:35 +0000 Subject: [PATCH 398/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From f1d55dee11279baf351b4a152e20dbad0cd32ad1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 9 Sep 2023 00:34:34 +0000 Subject: [PATCH 399/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From 11f1bcbf80f25b14bf7b9aa5f3b80442166f622c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 13 Sep 2023 00:35:44 +0000 Subject: [PATCH 400/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From 9bdff2b2d59f0ee1044e7a6becd7ac9434e8c5d1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 17 Sep 2023 00:37:57 +0000 Subject: [PATCH 401/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From 5c32f6cbed5c8aa61701fec2f513b1a8e49078b6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 21 Sep 2023 00:35:40 +0000 Subject: [PATCH 402/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From e102c18853d7b7b852559c94d2f5316322c73c18 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 25 Sep 2023 00:36:27 +0000 Subject: [PATCH 403/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From c471892a72f5a3cdc2812294490a8d4f448554fb Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 29 Sep 2023 00:36:27 +0000 Subject: [PATCH 404/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From c720b183d41bc586fa4c8eb06fb8a3a4866ad68c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 1 Oct 2023 00:41:20 +0000 Subject: [PATCH 405/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From 3c293cf63558e5e0a2993c282a3dfaaacc123e5f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 5 Oct 2023 00:36:32 +0000 Subject: [PATCH 406/613] Deploy 40961354cf797a50e6376f827d0787c5c55625db Deploy of commit https://github.com/rust-osdev/homepage/commit/40961354cf797a50e6376f827d0787c5c55625db From ab802c0e6b307133f4aa46d0d028ce299072ec52 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 5 Oct 2023 05:36:09 +0000 Subject: [PATCH 407/613] Deploy f1031e6bc31d88db31a8458909c3fa9861cf53c9 Deploy of commit https://github.com/rust-osdev/homepage/commit/f1031e6bc31d88db31a8458909c3fa9861cf53c9 From 5471a1191ba6cac9a98e7c1d33bf421070b2d890 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 5 Oct 2023 07:56:18 +0000 Subject: [PATCH 408/613] Deploy 819ff5d5e34de707bb5e25268fec93c4c5ed3004 Deploy of commit https://github.com/rust-osdev/homepage/commit/819ff5d5e34de707bb5e25268fec93c4c5ed3004 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2020-09/index.html | 4 +- this-month/2021-01/index.html | 2 +- this-month/2021-05/index.html | 2 +- this-month/2021-07/index.html | 2 +- this-month/2022-08/index.html | 2 +- this-month/2023-01/index.html | 2 +- this-month/2023-04/index.html | 2 +- this-month/2023-06/index.html | 6 +- this-month/2023-09/index.html | 231 ++++++++++++++++++++++++++++++++++ 12 files changed, 257 insertions(+), 12 deletions(-) create mode 100644 this-month/2023-09/index.html diff --git a/index.html b/index.html index 954d6b66..c658c614 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                  This Month in Rust OSDev

                    +
                  • September 2023
                  • +
                  • August 2023
                  • July 2023
                  • diff --git a/rss.xml b/rss.xml index d9c21b8b..4e33b5de 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Wed, 06 Sep 2023 00:00:00 +0000 + Thu, 05 Oct 2023 00:00:00 +0000 + + This Month in Rust OSDev: September 2023 + Thu, 05 Oct 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-09/ + https://rust-osdev.com/this-month/2023-09/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: August 2023 Wed, 06 Sep 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 595c3a60..3599fd24 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -181,4 +181,8 @@ https://rust-osdev.com/this-month/2023-08/ 2023-09-06 + + https://rust-osdev.com/this-month/2023-09/ + 2023-10-05 + diff --git a/this-month/2020-09/index.html b/this-month/2020-09/index.html index a1d219ee..14e3b446 100644 --- a/this-month/2020-09/index.html +++ b/this-month/2020-09/index.html @@ -105,11 +105,11 @@

                    pci_t allows the library to access the PCIe configuration space in whichever way the platform exposes it.

                    Thanks to @toku-sa-n for their contribution!

                    uefi-rs

                    -

                    The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. In September, the crate was updated to Rust's new inline assembly implemenation. We also published version 0.6.0 of the crate, including all the improvements added in the past two months.

                    +

                    The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. In September, the crate was updated to Rust's new inline assembly implementation. We also published version 0.6.0 of the crate, including all the improvements added in the past two months.

                    Thanks to @toku-sa-n for their contribution!

                    bootloader

                    The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we published versions 0.9.9 to 0.9.11 to fix build errors on the latest nightlies, caused by the new feature gate names for some const fn features.

                    -

                    We also made some more progress on the rewrite with UEFI support. It now passes additional framebuffer information and the address of the RSDP structure of ACPI in the boot info. (We later updated the RSDP code to use the new rsdp crate). The bootloader also gained support for setting up a recursive page table mapping, which makes it almost feature-equivalent with the current implementation. There are still a few things missings, but it should be ready to be published soon.

                    +

                    We also made some more progress on the rewrite with UEFI support. It now passes additional framebuffer information and the address of the RSDP structure of ACPI in the boot info. (We later updated the RSDP code to use the new rsdp crate). The bootloader also gained support for setting up a recursive page table mapping, which makes it almost feature-equivalent with the current implementation. There are still a few things missing, but it should be ready to be published soon.

                    cargo-xbuild

                    The cargo-xbuild project provides cargo command wrappers to cross-compile the sysroot crates core and alloc. This month, we merged some maintenance updates to increase platform compatibility:

                      diff --git a/this-month/2021-01/index.html b/this-month/2021-01/index.html index e6127288..35257dee 100644 --- a/this-month/2021-01/index.html +++ b/this-month/2021-01/index.html @@ -73,7 +73,7 @@

                      boo

                    acpi

                    The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern -computers use to relay information about the hardware to the OS. In Januar, we added some updates to the aml crate:

                    +computers use to relay information about the hardware to the OS. In January, we added some updates to the aml crate:

                    • Parse DefNoop
                    • Parse DefBreakPoint
                    • diff --git a/this-month/2021-05/index.html b/this-month/2021-05/index.html index 7f33c036..a152290e 100644 --- a/this-month/2021-05/index.html +++ b/this-month/2021-05/index.html @@ -129,7 +129,7 @@

                      acpi

                      Thanks to @michaelmelanson for his contribution!

                      xhci

                      The xhci crate provides types of xHCI structures such as Contexts, Extended Capabilities, Registers, and TRBs.

                      -

                      In May we finished implementing all of these structures and field getters/setters. Still there may exist missings. If you find one, feel free to send a PR!

                      +

                      In May we finished implementing all of these structures and field getters/setters. Still there may exist missing. If you find one, feel free to send a PR!

                      spinning_top

                      The spinning_top crate provides a simple spinlock implementation based on the abstractions of the lock_api crate. This month, we released version v0.2.4 with the following small improvements:

                      x86_64

                      diff --git a/this-month/2022-08/index.html b/this-month/2022-08/index.html index 764f015e..61efa3d2 100644 --- a/this-month/2022-08/index.html +++ b/this-month/2022-08/index.html @@ -114,7 +114,7 @@

                      security advisory with more details and released a fix in v0.10.2, with the following changes:

                      • The initialization functions now panic if the given size is not large enough to store the necessary metadata. Depending on the alignment of the heap bottom pointer, the minimum size is between 2 * size_of::<usize> and 3 * size_of::<usize>.
                      • -
                      • The extend method now panics when trying to extend an unitialized heap.
                      • +
                      • The extend method now panics when trying to extend an uninitialized heap.
                      • Extend calls with a size smaller than size_of::<usize>() * 2 are now buffered internally and not added to the list directly. The buffered region will be merged with future extend calls.
                      • The size() method now returns the usable size of the heap, which might be slightly smaller than the top() - bottom() difference because of alignment constraints.
                      diff --git a/this-month/2023-01/index.html b/this-month/2023-01/index.html index 96704cfc..5f8a0bb6 100644 --- a/this-month/2023-01/index.html +++ b/this-month/2023-01/index.html @@ -223,7 +223,7 @@

                      Lets go 2! panicked at 'Off you go!', src/main.rs:34:5

            -

            And "not working" is the kernel either panicing on boot in arch64, for which I've extracted panic message but I have low confidence this is what actually happens - panic was in once_cell detecting it is initializing a second time, which I discounted as potentially just a bug in linker script layout and not an actual code generation bug. This code is even completely removed in the latest reproduction (no once_cells) but the kernel still crashes before it even can write anything to serial.

            +

            And "not working" is the kernel either panicking on boot in arch64, for which I've extracted panic message but I have low confidence this is what actually happens - panic was in once_cell detecting it is initializing a second time, which I discounted as potentially just a bug in linker script layout and not an actual code generation bug. This code is even completely removed in the latest reproduction (no once_cells) but the kernel still crashes before it even can write anything to serial.

            In the qemu repro it's even weirder:

            🚜 Run QEMU -M raspi3b -semihosting with vesper/target/nucleus.bin
             
            diff --git a/this-month/2023-04/index.html b/this-month/2023-04/index.html
            index e7a515ab..3d1ef5f0 100644
            --- a/this-month/2023-04/index.html
            +++ b/this-month/2023-04/index.html
            @@ -132,7 +132,7 @@ 

            boo

            pic8259

            Maintained by @phil-opp

            Thanks to @rasheedmhd for their contributions!

            x86_64

            diff --git a/this-month/2023-06/index.html b/this-month/2023-06/index.html index 6a603707..0a2be3e2 100644 --- a/this-month/2023-06/index.html +++ b/this-month/2023-06/index.html @@ -93,8 +93,8 @@

            rust-osdev Projects

            volatile

            Maintained by @phil-opp

            The volatile crate provides a safe wrapper type for implementing volatile read and write operations. This is useful for accessing memory regions that have side-effects, such as memory-mapped hardware registers or framebuffers.

            -

            Unfortunately, the design crate had a soundness issue because it used reference types for accessing the volatile memory. This is problematic because the Rust compiler marks references are "dereferencable", which allows LLVM to insert spurious read operations. This is fine for accessing "normal" memory, but it can lead to correctness issues when used in combination with memory-mapped device registers. These registers look like normal memory, but they are actually accessing some device-specific registers, which might change at any time. So they might change between spurious reads, which violates the assumptions of LLVM and can lead to undefined behavior.

            -

            To solve this issue, we started a full redesign of the crate that uses raw pointers only. This solves the issue because raw pointers are not considered "dereferencable", so LLVM is not allowed to insert spurious reads. While we started working on the new design more than 2 years ago, we didn't merge it until this month because we weren't sure about the implementation details. The main discussion point was whether we should treat the proposed VolatilePointer type like Rust's reference types or like Rust's raw pointer types. The difference is that raw pointers implement the Copy trait, but are not Send to prevent aliasing. References, on the other hand, can safely implement Send because they're only Copy if the reference is read-only.

            +

            Unfortunately, the design crate had a soundness issue because it used reference types for accessing the volatile memory. This is problematic because the Rust compiler marks references are "dereferenceable", which allows LLVM to insert spurious read operations. This is fine for accessing "normal" memory, but it can lead to correctness issues when used in combination with memory-mapped device registers. These registers look like normal memory, but they are actually accessing some device-specific registers, which might change at any time. So they might change between spurious reads, which violates the assumptions of LLVM and can lead to undefined behavior.

            +

            To solve this issue, we started a full redesign of the crate that uses raw pointers only. This solves the issue because raw pointers are not considered "dereferenceable", so LLVM is not allowed to insert spurious reads. While we started working on the new design more than 2 years ago, we didn't merge it until this month because we weren't sure about the implementation details. The main discussion point was whether we should treat the proposed VolatilePointer type like Rust's reference types or like Rust's raw pointer types. The difference is that raw pointers implement the Copy trait, but are not Send to prevent aliasing. References, on the other hand, can safely implement Send because they're only Copy if the reference is read-only.

            After a lot of back and forth, we decided to provide both options and finally publish volatile v0.5. So the new design has two wrapper types, VolatilePtr (behaves like a raw pointer) and VolatileRef (behaves like a reference). We hope that we support most use cases this way!

            Note that there is also some ongoing discussion about a potential VolatileCell type to wrap values in-place. Most implementations of such a type would require support from the Rust compiler, which needs an RFC. However, there is one promising design based on zero-sized types and proc-macros by @Freax13 that should not require any new language features. We will continue to investigate.

            multiboot2

            @@ -105,7 +105,7 @@

            mul
          • use DSTs for tags where applicable (#134)
          • model the MBI as DST (#155)
          • add a runtime builder for an MBI (#133)
            -Huge thanks to YtvwlD / Niklas for this greate external contribution
          • +Huge thanks to YtvwlD / Niklas for this great external contribution
          • added an integration test including a multiboot2 chainloader for better test coverage (#129)
          • added miri to the CI for more memory safety (#128)
          • several fixes and small improvements
          • diff --git a/this-month/2023-09/index.html b/this-month/2023-09/index.html new file mode 100644 index 00000000..85d8d933 --- /dev/null +++ b/this-month/2023-09/index.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: September 2023 | Rust OSDev + + + +
            +
            +
            +

            + Rust OSDev + Operating System Development in Rust +

            +
            +
            + +
            +
            +

            This Month in Rust OSDev: September 2023

            + + + +

            Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

            + +

            This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

            + +

            Announcements, News, and Blog Posts

            +

            Here we collect news, blog posts, etc. related to OS development in Rust.

            + + +

            Infrastructure and Tooling

            +

            In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

            + + +

            rust-osdev Projects

            +

            In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

            + +

            multiboot2

            +

            Maintained by @phip1611

            +

            The multiboot2 was bumped from 0.18.1 +to 0.19.0. The new release includes the ability to add custom tags to the MBI +builder and a bugfix when parsing Multiboot strings, such as the command line +from a Module tag.

            +

            For more details, please have a look at the changelog.

            +

            Thanks to @A0lson for their contribution +that helped to fix the string parsing bug.

            +

            acpi

            +

            Maintained by @IsaacWoods

            +

            The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS.

            +

            This month, a new major version of acpi was published, offering greater control over how the crate allocates +memory. Specifically, the new allocator_api and alloc features allow you to opt-out of allocation altogether +(allowing the crate to be used from slimmer environments like bootloaders), or to provide your own allocator using +the new (and still unstable) core::alloc::Allocator API. +Enabling both features makes the crate behave very similarly to before, so migration should be relatively easy.

            +

            Because the acpi crate can now be used from environements without allocation, the rsdp crate has been +deprecated, and all functionality moved into acpi. The rsdp crate will continue to work, but will not receive +further updates. This should not affect users using rsdp to simply find the address of the RSDP, but is a +breaking change as types that have been moved to acpi will no longer be usable across the crate boundary.

            +

            Some improvements were also made to the aml crate this month, adding functionality and improving our correctness

            +
              +
            • many thanks to our contributors!
            • +
            +

            We merged the following changes this month:

            + +

            Thanks to @alnyan for their contributions!

            +

            x86_64

            +

            Maintained by @phil-opp, @josephlr, and @Freax13

            +

            The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

            +

            We merged the following PR this month:

            + +

            Thanks to @brandonchinn178 and @mkroening for their contributions!

            +

            uefi-rs

            +

            Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

            +

            The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

            + + +

            Thanks to @JohnAZoidberg for their contribution!

            +

            Other Projects

            +

            In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

            +

            mkroening/interrupts

            +

            (Section written by @mkroening)

            +

            I created a dependency-free interrupts crate, allowing you to temporarily disable interrupts on AArch64, 64-bit RISC-V, and x86-64. +Two different paradigms allow you to run code without interrupts and synchronize with interrupt handlers running on the same hardware thread (core):

            +

            Use disable to disable interrupts with a guard:

            +
            // interrupts may or may not be enabled
            +let guard = interrupts::disable();
            +// interrupts are disabled
            +drop(guard);
            +// interrupts are restored to the previous state
            +
            +

            Use without (similar to x86_64::instructions::interrupts::without_interrupts) to run a closure with disabled interrupts:

            +
            // interrupts may or may not be enabled
            +interrupts::without(|| {
            +    // interrupts are disabled
            +});
            +// interrupts are restored to the previous state
            +
            +

            I would appreciate you dropping by and giving it a try. :)

            + +

            Join Us?

            +

            Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

            + + +

            Comments

            + + +
            + +
            +
            + Join us on Gitter.
            + © -. All rights reserved. + Contact +
            +
            +
            +
            + + + + + From b6017c63967a67f42f9fa7183453e715420d8a40 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 5 Oct 2023 08:07:32 +0000 Subject: [PATCH 409/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 --- this-month/2023-09/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/this-month/2023-09/index.html b/this-month/2023-09/index.html index 85d8d933..08202bcc 100644 --- a/this-month/2023-09/index.html +++ b/this-month/2023-09/index.html @@ -65,6 +65,7 @@

            Announcements, News, and Blog PostsThe Embedded Rust ESP Development Ecosystem
          • ESP Embedded Rust: Multithreading with FreeRTOS Bindings
          • How Rust can build an elegant API around raw memory
          • +
          • Redox: Development Priorities for 2023/24

          Infrastructure and Tooling

          In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

          From a7cb1e4ddefe5bed6c742c608b3c69c9b41ff53f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 9 Oct 2023 00:36:49 +0000 Subject: [PATCH 410/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From d729e698f75a83ec67a5693782863e84fc3e6b92 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 13 Oct 2023 00:37:18 +0000 Subject: [PATCH 411/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From 5d4353e2bff2009fe0e0aeb21b1fdba100ca587f Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 17 Oct 2023 00:36:53 +0000 Subject: [PATCH 412/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From e7739853fd3e03a68bcf456eaaf915a21ce09471 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 21 Oct 2023 00:35:05 +0000 Subject: [PATCH 413/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From e8e0568568f8f588860aa81b2f2e45378a976cd5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 25 Oct 2023 00:36:04 +0000 Subject: [PATCH 414/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From 1083fc4359322f8fabdf15ebac4af0f2e2c20a86 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 29 Oct 2023 00:38:41 +0000 Subject: [PATCH 415/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From d025ce045dff83fb652d853a430b01c981e5fa44 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 1 Nov 2023 00:39:11 +0000 Subject: [PATCH 416/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From 2a1b82d11a236be29218d700e23f7bb47a0d78fd Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 5 Nov 2023 00:39:42 +0000 Subject: [PATCH 417/613] Deploy f4f941269542b762604a6d9e3f3279d5ea5f8615 Deploy of commit https://github.com/rust-osdev/homepage/commit/f4f941269542b762604a6d9e3f3279d5ea5f8615 From 90fb7e1d1e316021fccddf11f090ccb58cef32a4 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 6 Nov 2023 17:50:57 +0000 Subject: [PATCH 418/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-10/index.html | 318 ++++++++++++++++++++++++++++++++++ 4 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-10/index.html diff --git a/index.html b/index.html index c658c614..55f1c787 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

          This Month in Rust OSDev

            +
          • October 2023
          • +
          • September 2023
          • August 2023
          • diff --git a/rss.xml b/rss.xml index 4e33b5de..a70af39c 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Thu, 05 Oct 2023 00:00:00 +0000 + Mon, 06 Nov 2023 00:00:00 +0000 + + This Month in Rust OSDev: October 2023 + Mon, 06 Nov 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-10/ + https://rust-osdev.com/this-month/2023-10/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: September 2023 Thu, 05 Oct 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 3599fd24..139b6758 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -185,4 +185,8 @@ https://rust-osdev.com/this-month/2023-09/ 2023-10-05 + + https://rust-osdev.com/this-month/2023-10/ + 2023-11-06 + diff --git a/this-month/2023-10/index.html b/this-month/2023-10/index.html new file mode 100644 index 00000000..952fbc05 --- /dev/null +++ b/this-month/2023-10/index.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: October 2023 | Rust OSDev + + + +
            +
            +
            +

            + Rust OSDev + Operating System Development in Rust +

            +
            +
            + +
            +
            +

            This Month in Rust OSDev: October 2023

            + + + +

            Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

            + +

            This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

            + +

            Announcements, News, and Blog Posts

            +

            Here we collect news, blog posts, etc. related to OS development in Rust.

            + + +

            Infrastructure and Tooling

            +

            In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

            +

            There weren't really any OS-related infrastructure updates this month, but there was some great progress on several upcoming language and tooling features that may also be of interest to OS development:

            + + +

            rust-osdev Projects

            +

            In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

            + +

            spinning_top

            +

            Maintained by @phil-opp

            +

            The spinning_top crate provides a simple spinlock implementation based on the abstractions of the lock_api crate.

            +

            We merged the following changes this month:

            +

            Features

            + +

            Other

            + +

            Thanks to @mkroening for their contributions!

            +

            uefi-rs

            +

            Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

            +

            The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

            + + + + + + + + + + + +

            Thanks to @JohnAZoidberg and @JarlEvanson for their contributions!

            +

            x86_64

            +

            Maintained by @phil-opp, @josephlr, and @Freax13

            +

            The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

            +

            We merged the following changes this month:

            + +

            Thanks to @Wasabi375, @joycebrum, and @mkroening for their contributions!

            +

            acpi

            +

            Maintained by @IsaacWoods

            +

            The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. We merged the following changes this month:

            + +

            Thanks to @alnyan for their contribution!

            +

            ovmf-prebuilt

            +

            Maintained by @phil-opp and @nicholasbishop

            +

            The ovmf-prebuilt project provides pre-built edk2 releases to make it easier to set up OVMF. We merged the following improvement this month:

            + +

            Thanks to @Firenezz for their contribution!

            +

            bootloader

            +

            Maintained by @phil-opp

            +

            The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we merged the following PRs:

            + +

            Thanks to @kennystrawnmusic for their contribution!

            +

            linked-list-allocator

            +

            Maintained by @phil-opp and @jamesmunns

            +

            The linked-list-allocator crate provides a basic no_std allocator that builds a linked list from freed memory blocks and thus needs no additional data structures. We merged the following PR this month:

            + +

            Thanks to @00xc for their contribution!

            +

            Other Projects

            +

            In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

            +

            RavnOS

            +

            RanvOS, (from norwegian; raven), is a operative system programmed in Rust. Aims to be; minimal, stable, secure and modern ( this maybe you know as; state-of-art ).

            +

            The objective of RavnOS is make an operative system minimalist, self hosted (no external crates, all programmed by me), stable and secure.

            + +

            mkroening/interrupt-mutex

            +

            (Section written by @mkroening)

            +

            Building upon last month's interrupts crate, I created a mutex for sharing data with interrupt handlers or signal handlers.

            +

            RawInterruptMutex wraps any lock_api::RawMutex, be it a parking_lot::RawMutex on Unix or a spinning_top::RawSpinlock on bare metal. +When such an InterruptMutex is locked, interrupts are disabled. +When the InterruptMutex is unlocked again, the previous interrupt state is restored. +This does not completely rule out deadlocks, since you can just enable interrupts manually when you should not. +Still, it is very convenient to just change the mutex type of data that is shared with interrupt handlers instead of disabling and enabling interrupts manually on every access.

            +
            // Make a mutex of your choice into an `InterruptMutex`.
            +type InterruptSpinlock<T> = interrupt_mutex::InterruptMutex<spinning_top::RawSpinlock, T>;
            +
            +static X: InterruptSpinlock<Vec<i32>> = InterruptSpinlock::new(Vec::new());
            +
            +fn interrupt_handler() {
            +    X.lock().push(1);
            +}
            +
            +let v = X.lock();
            +// Raise an interrupt
            +raise_interrupt();
            +assert_eq!(*v, vec![]);
            +drop(v);
            +
            +// The interrupt handler runs
            +
            +let v = X.lock();
            +assert_eq!(*v, vec![1]);
            +drop(v);
            +
            +

            mkroening/interrupt-ref-cell

            +

            (Section written by @mkroening)

            +

            Also building upon last month's interrupts crate, I created a RefCell for sharing data with interrupt handlers or signal handlers on the same thread.

            +

            On the same thread (software thread or hardware thread (core)), a compiler fence is sufficient for synchronization with signal handlers (on Unix) and interrupt handlers (on bare metal). +In these cases, the new InterruptRefCell allows easy sharing without the overhead of mutexes and without the deadlock potential of mutexes. +Similar to InterruptMutex, this is helpful for disabling interrupts on accesses but does not protect you from manually enabling interrupts while holding a reference.

            +
            use interrupt_ref_cell::{InterruptRefCell, LocalKeyExt};
            + 
            +thread_local! {
            +    static X: InterruptRefCell<Vec<i32>> = InterruptRefCell::new(Vec::new());
            +}
            + 
            +fn interrupt_handler() {
            +    X.with_borrow_mut(|v| v.push(1));
            +}
            +
            +X.with_borrow(|v| {
            +    // Raise an interrupt
            +    raise_interrupt();
            +    assert_eq!(*v, vec![]);
            +});
            + 
            +// The interrupt handler runs
            + 
            +X.with_borrow(|v| assert_eq!(*v, vec![1]));
            +
            + +

            Join Us?

            +

            Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

            + + +

            Comments

            + + +
            + +
            +
            + Join us on Gitter.
            + © -. All rights reserved. + Contact +
            +
            +
            +
            + + + + + From d9408a337809c9af3b27d436bf5fde44e0083ed0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 9 Nov 2023 00:36:59 +0000 Subject: [PATCH 419/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From fe0ae08eb574cfc3fc517b9b3047885ea146c5e8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 13 Nov 2023 00:38:05 +0000 Subject: [PATCH 420/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From 461cc6c27535bcca24ab4ffb45267894488e5a9a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 17 Nov 2023 00:38:18 +0000 Subject: [PATCH 421/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From 79b4d1229399a5648a2adbb14a8671d52687baf1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 21 Nov 2023 00:39:03 +0000 Subject: [PATCH 422/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From 4735c7b8b7781c867ba25cc576a0a6d7d4ccc779 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 25 Nov 2023 00:36:44 +0000 Subject: [PATCH 423/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From d7e29faf28ad8e0cfdc0fe3986829de050d799d9 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 29 Nov 2023 00:39:13 +0000 Subject: [PATCH 424/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From b6b3b19fefe9ecc239ad6b5ec7d22b88b1acb426 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 1 Dec 2023 00:42:16 +0000 Subject: [PATCH 425/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From 39dddfe5d3d7b96f2c72662289f95a592bcc6305 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 5 Dec 2023 00:39:13 +0000 Subject: [PATCH 426/613] Deploy fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 Deploy of commit https://github.com/rust-osdev/homepage/commit/fcf1cedd39dd5cc6fa90c9145540b0ba9383cb98 From fd55b0ef4c9c12260ad0677c30593cbff1a815ea Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 7 Dec 2023 17:07:18 +0000 Subject: [PATCH 427/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-11/index.html | 176 ++++++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-11/index.html diff --git a/index.html b/index.html index 55f1c787..2f68e9f0 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

            This Month in Rust OSDev

              +
            • November 2023
            • +
            • October 2023
            • September 2023
            • diff --git a/rss.xml b/rss.xml index a70af39c..b6db57f5 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Mon, 06 Nov 2023 00:00:00 +0000 + Thu, 07 Dec 2023 00:00:00 +0000 + + This Month in Rust OSDev: November 2023 + Thu, 07 Dec 2023 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-11/ + https://rust-osdev.com/this-month/2023-11/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: October 2023 Mon, 06 Nov 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 139b6758..c091a93e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -189,4 +189,8 @@ https://rust-osdev.com/this-month/2023-10/ 2023-11-06 + + https://rust-osdev.com/this-month/2023-11/ + 2023-12-07 + diff --git a/this-month/2023-11/index.html b/this-month/2023-11/index.html new file mode 100644 index 00000000..ac1c3522 --- /dev/null +++ b/this-month/2023-11/index.html @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: November 2023 | Rust OSDev + + + +
              +
              +
              +

              + Rust OSDev + Operating System Development in Rust +

              +
              +
              + +
              +
              +

              This Month in Rust OSDev: November 2023

              + + + +

              Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

              + +

              This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

              + +

              Announcements, News, and Blog Posts

              +

              Here we collect news, blog posts, etc. related to OS development in Rust.

              + + +

              Infrastructure and Tooling

              +

              In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

              +

              There weren't really any OS-related infrastructure updates this month, but there was some great progress on several upcoming language and tooling features that may also be of interest to OS development:

              + + +

              rust-osdev Projects

              +

              In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

              + +

              uefi-rs

              +

              Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

              +

              The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

              + + +

              Thanks to @RaitoBezarius for their contributions!

              +

              linked-list-allocator

              +

              Maintained by @phil-opp and @jamesmunns

              +

              The linked-list-allocator crate provides a basic no_std allocator that builds a linked list from freed memory blocks and thus needs no additional data structures. We merged the following PR this month:

              + +

              Thanks to @00xc for their contribution!

              +

              pic8259

              +

              Maintained by @phil-opp

              +

              The pic_8259 crate provides abstractions for 8259 and 8259A Programmable Interrupt Controllers (PICs).

              +

              We merged the following PR this month:

              + +

              Thanks to @zoo868e for their contribution!

              +

              Other Projects

              +

              In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

              +

              No projects updates were submitted this month.

              + +

              Join Us?

              +

              Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

              + + +

              Comments

              + + +
              + +
              +
              + Join us on Gitter.
              + © -. All rights reserved. + Contact +
              +
              +
              +
              + + + + + From 8342a6efb5a878b3c4c18a4754efd7ac86bfce98 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 9 Dec 2023 00:37:52 +0000 Subject: [PATCH 428/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From 0b1348933b0fa15f4c6f57ff049195e962f7c79b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 13 Dec 2023 00:38:35 +0000 Subject: [PATCH 429/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From 610c5d67f23f0876ccbdd2b05ad0bb2a40960454 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 17 Dec 2023 00:42:07 +0000 Subject: [PATCH 430/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From 834ad382382c9a23d2ad743cd88159c8781fa60a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 21 Dec 2023 00:38:04 +0000 Subject: [PATCH 431/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From d70f11a1e88017eeb510cb87e92c489f6498da4e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 25 Dec 2023 00:38:56 +0000 Subject: [PATCH 432/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From f2736e28718ef8a31db481859847bdb904b7a175 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 29 Dec 2023 00:31:11 +0000 Subject: [PATCH 433/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From 8d4dc1ed5e5569911ac3ddeb416c1a69889d5fb7 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 1 Jan 2024 00:42:51 +0000 Subject: [PATCH 434/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From f2701a63b6aca2573a6d88d2e784f2c1786ec4c6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 5 Jan 2024 00:38:50 +0000 Subject: [PATCH 435/613] Deploy 8700f85f3203ed3f2896a886d91e4b61504dd884 Deploy of commit https://github.com/rust-osdev/homepage/commit/8700f85f3203ed3f2896a886d91e4b61504dd884 From 7ce2e63512137917b977270990184862d41c3132 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 5 Jan 2024 16:47:59 +0000 Subject: [PATCH 436/613] Deploy e7891360f1dc7b0f386b167eb0ead02e8ac787f5 Deploy of commit https://github.com/rust-osdev/homepage/commit/e7891360f1dc7b0f386b167eb0ead02e8ac787f5 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2023-12/index.html | 240 ++++++++++++++++++++++++++++++++++ 4 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 this-month/2023-12/index.html diff --git a/index.html b/index.html index 2f68e9f0..f34089b7 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

              This Month in Rust OSDev

                +
              • December 2023
              • +
              • November 2023
              • October 2023
              • diff --git a/rss.xml b/rss.xml index b6db57f5..59c81ac1 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Thu, 07 Dec 2023 00:00:00 +0000 + Fri, 05 Jan 2024 00:00:00 +0000 + + This Month in Rust OSDev: December 2023 + Fri, 05 Jan 2024 00:00:00 +0000 + https://rust-osdev.com/this-month/2023-12/ + https://rust-osdev.com/this-month/2023-12/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: November 2023 Thu, 07 Dec 2023 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index c091a93e..825778ce 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -193,4 +193,8 @@ https://rust-osdev.com/this-month/2023-11/ 2023-12-07 + + https://rust-osdev.com/this-month/2023-12/ + 2024-01-05 + diff --git a/this-month/2023-12/index.html b/this-month/2023-12/index.html new file mode 100644 index 00000000..4756d372 --- /dev/null +++ b/this-month/2023-12/index.html @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: December 2023 | Rust OSDev + + + +
                +
                +
                +

                + Rust OSDev + Operating System Development in Rust +

                +
                +
                + +
                +
                +

                This Month in Rust OSDev: December 2023

                + + + +

                Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                + +

                This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                + +

                Announcements, News, and Blog Posts

                +

                Here we collect news, blog posts, etc. related to OS development in Rust.

                + + +

                Infrastructure and Tooling

                +

                In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                + + +

                rust-osdev Projects

                +

                In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                + +

                bootloader

                +

                Maintained by @phil-opp

                +

                The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we merged the following PRs:

                + +

                Thanks to @mysteriouslyseeing for their contribution!

                +

                xhci

                +

                Maintained by @toku-sa-n

                +

                The xhci crate provides types of xHCI structures, such as Registers and TRBs. We merged the following PRs this month:

                + +

                Thanks to @paulsohn for their contribution!

                +

                ovmf-prebuilt

                +

                Maintained by @phil-opp and @nicholasbishop

                +

                The ovmf-prebuilt project provides pre-built edk2 releases to make it easier to set up OVMF. We merged the following improvement this month:

                + + +

                uefi-rs

                +

                Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                +

                The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

                + + + + + + + + + + + + +

                pci_types

                +

                Maintained by @IsaacWoods

                +

                The pci_types library provides types for accessing and configuring PCI devices from Rust operating systems. We merged the following change this month:

                + +

                acpi

                +

                Maintained by @IsaacWoods

                +

                The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. We merged the following changes this month:

                + +

                Thanks to @ytakano for their contributions!

                +

                multiboot2

                +

                Maintained by @phip1611

                +

                The multiboot2 crate provides abstraction types for the multiboot information structure (MBI) of multiboot2 bootloaders. We merged the following changes this month:

                + + + +

                Thanks to @elbiazofor their contribution!

                +

                x86_64

                +

                Maintained by @phil-opp, @josephlr, and @Freax13

                +

                The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                +

                We merged the following changes this month:

                + +

                Other Projects

                +

                In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                + +

                Join Us?

                +

                Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                + + +

                Comments

                + + +
                + +
                +
                + Join us on Gitter.
                + © -. All rights reserved. + Contact +
                +
                +
                +
                + + + + + From 64cc088a2c058ed965c26f1c2d0dd067f803c359 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 9 Jan 2024 00:39:50 +0000 Subject: [PATCH 437/613] Deploy e7891360f1dc7b0f386b167eb0ead02e8ac787f5 Deploy of commit https://github.com/rust-osdev/homepage/commit/e7891360f1dc7b0f386b167eb0ead02e8ac787f5 From 27b1b5ea02f58a24ed1597f714e1be0d01558bc2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 13 Jan 2024 00:38:52 +0000 Subject: [PATCH 438/613] Deploy e7891360f1dc7b0f386b167eb0ead02e8ac787f5 Deploy of commit https://github.com/rust-osdev/homepage/commit/e7891360f1dc7b0f386b167eb0ead02e8ac787f5 From fca7b6d9ce9da3727005cc6f6a32769b48f50cc5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 17 Jan 2024 00:39:38 +0000 Subject: [PATCH 439/613] Deploy e7891360f1dc7b0f386b167eb0ead02e8ac787f5 Deploy of commit https://github.com/rust-osdev/homepage/commit/e7891360f1dc7b0f386b167eb0ead02e8ac787f5 From 0e79d896dbd6f8ade0fa2031db08f491681e2bc0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 21 Jan 2024 00:43:07 +0000 Subject: [PATCH 440/613] Deploy e7891360f1dc7b0f386b167eb0ead02e8ac787f5 Deploy of commit https://github.com/rust-osdev/homepage/commit/e7891360f1dc7b0f386b167eb0ead02e8ac787f5 From b2e278f5eb9e264bfd1c8ad8fafc214b63279efc Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 24 Jan 2024 09:07:48 +0000 Subject: [PATCH 441/613] Deploy 1b1a8ee8f3a104117f411ead359e9f899ca1e83f Deploy of commit https://github.com/rust-osdev/homepage/commit/1b1a8ee8f3a104117f411ead359e9f899ca1e83f From c2af6af62c589867aeadceccae5d59d53c36aded Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 25 Jan 2024 00:40:06 +0000 Subject: [PATCH 442/613] Deploy 1b1a8ee8f3a104117f411ead359e9f899ca1e83f Deploy of commit https://github.com/rust-osdev/homepage/commit/1b1a8ee8f3a104117f411ead359e9f899ca1e83f From ff078ed0935cf09203b82b72fc91f8eee7be11b3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 29 Jan 2024 00:37:01 +0000 Subject: [PATCH 443/613] Deploy 1b1a8ee8f3a104117f411ead359e9f899ca1e83f Deploy of commit https://github.com/rust-osdev/homepage/commit/1b1a8ee8f3a104117f411ead359e9f899ca1e83f From 2516ab09b3c07dc1288646fd87da51c37a4dda17 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 1 Feb 2024 00:38:43 +0000 Subject: [PATCH 444/613] Deploy 1b1a8ee8f3a104117f411ead359e9f899ca1e83f Deploy of commit https://github.com/rust-osdev/homepage/commit/1b1a8ee8f3a104117f411ead359e9f899ca1e83f From e15fcef93c14f3f4eeb4dca31f56134c84fdf19a Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 5 Feb 2024 00:38:10 +0000 Subject: [PATCH 445/613] Deploy 1b1a8ee8f3a104117f411ead359e9f899ca1e83f Deploy of commit https://github.com/rust-osdev/homepage/commit/1b1a8ee8f3a104117f411ead359e9f899ca1e83f From 414d498b44769ae4e9fdf14f44818c136adecd71 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 8 Feb 2024 17:26:19 +0000 Subject: [PATCH 446/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2024-01/index.html | 252 ++++++++++++++++++++++++++++++++++ 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 this-month/2024-01/index.html diff --git a/index.html b/index.html index f34089b7..075d7cad 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                This Month in Rust OSDev

                  +
                • January 2024
                • +
                • December 2023
                • November 2023
                • diff --git a/rss.xml b/rss.xml index 59c81ac1..2b28effe 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Fri, 05 Jan 2024 00:00:00 +0000 + Thu, 08 Feb 2024 00:00:00 +0000 + + This Month in Rust OSDev: January 2024 + Thu, 08 Feb 2024 00:00:00 +0000 + https://rust-osdev.com/this-month/2024-01/ + https://rust-osdev.com/this-month/2024-01/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: December 2023 Fri, 05 Jan 2024 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index 825778ce..f66bf5e9 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -197,4 +197,8 @@ https://rust-osdev.com/this-month/2023-12/ 2024-01-05 + + https://rust-osdev.com/this-month/2024-01/ + 2024-02-08 + diff --git a/this-month/2024-01/index.html b/this-month/2024-01/index.html new file mode 100644 index 00000000..7fd4622a --- /dev/null +++ b/this-month/2024-01/index.html @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: January 2024 | Rust OSDev + + + +
                  +
                  +
                  +

                  + Rust OSDev + Operating System Development in Rust +

                  +
                  +
                  + +
                  +
                  +

                  This Month in Rust OSDev: January 2024

                  + + + +

                  Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                  + +

                  This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                  + +

                  Announcements, News, and Blog Posts

                  +

                  Here we collect news, blog posts, etc. related to OS development in Rust.

                  + + +

                  Infrastructure and Tooling

                  +

                  In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                  + + +

                  rust-osdev Projects

                  +

                  In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                  + +

                  x86_64

                  +

                  Maintained by @phil-opp, @josephlr, and @Freax13

                  +

                  The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                  +

                  We merged the following PR this month:

                  + +

                  We also merged the following changes into the next branch, which will be released as v0.15 soon:

                  + +

                  bootloader

                  +

                  Maintained by @phil-opp

                  +

                  The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we merged the following nightly fixes:

                  + +

                  acpi

                  +

                  Maintained by @IsaacWoods

                  +

                  The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers use to relay information about the hardware to the OS. We merged the following changes this month:

                  + +

                  Thanks to @Spartan2909 for their contribution!

                  +

                  uefi-rs

                  +

                  Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                  +

                  The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

                  + + + + +

                  Thanks to @gurry for their contribution!

                  +

                  Other Projects

                  +

                  In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                  + +

                  phip1611/phipsboot

                  +

                  (Section written by @phip1611)

                  +

                  I'd like to announce my project PhipsBoot. 🎉 PhipsBoot is a relocatable x86_64 +bootloader for legacy x86_64 boot written in Rust and assembly. It is intended +to be loaded by GRUB via Multiboot2, where it uncovers its main benefit: It is +relocatable in physical memory without having relocation information in the +ELF! It outsources a lot of complexity to GRUB which also better fits into +the ecosystem and makes it easier usable. The README contains more background +about why I have chosen to use GRUB instead of writing my own stage 1 +bootloader.

                  +

                  This project combines a lot of toolchain and binary knowledge and experience I +collected and gained in recent years about legacy x86_64 boot. The main +contribution IMHO is how the binary is assembled and that the thing boots +with all the properties described in the README, but not the high-level +functionality itself.

                  +

                  I am especially proud of the well-commented structure of the assembly files. +For example the whole page-table mappings are done IMHO very nicely even tho +it is assembly language. Also, I think it turned out quite cool how I configured +the linker script. I hope this can be a learning resource for others!

                  +

                  TL;DR: It is a learning ground and a reference for how to solve the relocation +problem with Multiboot2 and GRUB, as GRUB is not able to load DYN ELFs.

                  +

                  You have multiple options for testing it out:

                  +
                    +
                  • $ cloud-hypervisor --debug-console file=log.txt --kernel ./build/phipsboot.elf64 (using Xen PVH)
                  • +
                  • $ qemu-system-x86_64 -kernel ./build/phipsboot.elf32 -debugcon stdio (using Multiboot 1)
                  • +
                  +

                  phil-opp/blog_os

                  +

                  (Section written by @phil-opp)

                  +

                  We merged the following changes to the Writing an OS in Rust blog this month:

                  + +

                  Thanks to @acyanbird, @proudmuslim-dev, and @lachsdachs for their contributions!

                  +

                  Join Us?

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  + + +

                  Comments

                  + + +
                  + +
                  +
                  + Join us on Gitter.
                  + © -. All rights reserved. + Contact +
                  +
                  +
                  +
                  + + + + + From 6c80371668eb1abd25875ca9d302dde48b8bc47b Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 9 Feb 2024 00:36:05 +0000 Subject: [PATCH 447/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 3686594671fdc1679495a3de8dabbc2a65e4285c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 13 Feb 2024 00:37:22 +0000 Subject: [PATCH 448/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 0b9840f63195a044ca367d1382bb410ec347a3aa Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 17 Feb 2024 00:36:05 +0000 Subject: [PATCH 449/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 38239cad0b5e249cbe7a52dfbda829db9b639562 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 21 Feb 2024 00:37:10 +0000 Subject: [PATCH 450/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 3443bd25be10a623ce50308013ad138f27338465 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sun, 25 Feb 2024 00:39:57 +0000 Subject: [PATCH 451/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From b231791fbaf905661b0de8b3b9bd5bd81f714678 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 29 Feb 2024 00:36:31 +0000 Subject: [PATCH 452/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 792030317c2daa643dd5b6129bdbed2a14f61cac Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Fri, 1 Mar 2024 00:40:44 +0000 Subject: [PATCH 453/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From 1cabdd5776c04a16c5d9a7aac8d3b3beaf162225 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Tue, 5 Mar 2024 00:36:46 +0000 Subject: [PATCH 454/613] Deploy b465df6db6a0d24ca6d91af477d2258760e9b9be Deploy of commit https://github.com/rust-osdev/homepage/commit/b465df6db6a0d24ca6d91af477d2258760e9b9be From c1af690c6e027d25da02918bed864284c8b43b4e Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Wed, 6 Mar 2024 15:10:34 +0000 Subject: [PATCH 455/613] Deploy 992dd132cf4b7fe6d352bc143d5c8b9079419d84 Deploy of commit https://github.com/rust-osdev/homepage/commit/992dd132cf4b7fe6d352bc143d5c8b9079419d84 From 82f21a4b47ac07d457347f362f820cbce3160646 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Thu, 7 Mar 2024 17:10:50 +0000 Subject: [PATCH 456/613] Deploy 342d4b4664b4ea58fee458a8c419a8da5ba59b02 Deploy of commit https://github.com/rust-osdev/homepage/commit/342d4b4664b4ea58fee458a8c419a8da5ba59b02 --- index.html | 2 + rss.xml | 10 +- sitemap.xml | 4 + this-month/2024-02/index.html | 192 ++++++++++++++++++++++++++++++++++ 4 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 this-month/2024-02/index.html diff --git a/index.html b/index.html index 075d7cad..354e3980 100644 --- a/index.html +++ b/index.html @@ -41,6 +41,8 @@

                  This Month in Rust OSDev

                    +
                  • February 2024
                  • +
                  • January 2024
                  • December 2023
                  • diff --git a/rss.xml b/rss.xml index 2b28effe..94fe861b 100644 --- a/rss.xml +++ b/rss.xml @@ -7,7 +7,15 @@ Zola en - Thu, 08 Feb 2024 00:00:00 +0000 + Thu, 07 Mar 2024 00:00:00 +0000 + + This Month in Rust OSDev: February 2024 + Thu, 07 Mar 2024 00:00:00 +0000 + https://rust-osdev.com/this-month/2024-02/ + https://rust-osdev.com/this-month/2024-02/ + <p>Welcome to a new issue of <em>&quot;This Month in Rust OSDev&quot;</em>. In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.</p> + + This Month in Rust OSDev: January 2024 Thu, 08 Feb 2024 00:00:00 +0000 diff --git a/sitemap.xml b/sitemap.xml index f66bf5e9..43f6de1f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -201,4 +201,8 @@ https://rust-osdev.com/this-month/2024-01/ 2024-02-08 + + https://rust-osdev.com/this-month/2024-02/ + 2024-03-07 + diff --git a/this-month/2024-02/index.html b/this-month/2024-02/index.html new file mode 100644 index 00000000..88806742 --- /dev/null +++ b/this-month/2024-02/index.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + This Month in Rust OSDev: February 2024 | Rust OSDev + + + +
                    +
                    +
                    +

                    + Rust OSDev + Operating System Development in Rust +

                    +
                    +
                    + +
                    +
                    +

                    This Month in Rust OSDev: February 2024

                    + + + +

                    Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

                    + +

                    This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

                    + +

                    Announcements, News, and Blog Posts

                    +

                    Here we collect news, blog posts, etc. related to OS development in Rust.

                    + + +

                    Infrastructure and Tooling

                    +

                    In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

                    + + +

                    rust-osdev Projects

                    +

                    In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

                    + +

                    x86_64

                    +

                    Maintained by @phil-opp, @josephlr, and @Freax13

                    +

                    The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

                    +

                    We merged the following PRs this month:

                    + +

                    uefi-rs

                    +

                    Maintained by @GabrielMajeri, @nicholasbishop, and @phip1611

                    +

                    The uefi-rs crate provides safe and performant wrappers for UEFI, the successor to the BIOS. We merged the following PRs this month:

                    + + +

                    Thanks to @bjorn3 for their contribution!

                    +

                    bootloader

                    +

                    Maintained by @phil-opp and @Freax13

                    +

                    The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. This month, we merged the following improvements:

                    + +

                    Thanks to @vinc and @tsatke for their contributions!

                    +

                    Other Projects

                    +

                    In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

                    + +

                    No projects updates were submitted this month.

                    +

                    Join Us?

                    +

                    Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                    + + +

                    Comments

                    + + +
                    + +
                    +
                    + Join us on Gitter.
                    + © -. All rights reserved. + Contact +
                    +
                    +
                    +
                    + + + + + From 706a21f3ddb4057e76cd63177ee129e5ee964535 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Sat, 9 Mar 2024 00:35:42 +0000 Subject: [PATCH 457/613] Deploy 342d4b4664b4ea58fee458a8c419a8da5ba59b02 Deploy of commit https://github.com/rust-osdev/homepage/commit/342d4b4664b4ea58fee458a8c419a8da5ba59b02 From 61d1ea8760ca72369f2fdfbdd0ad0cdbe4b59c16 Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 11 Mar 2024 08:16:21 +0000 Subject: [PATCH 458/613] Deploy 1b99e2a407d751e5d0261bbd3fb5e619ee114948 Deploy of commit https://github.com/rust-osdev/homepage/commit/1b99e2a407d751e5d0261bbd3fb5e619ee114948 From 82cd870163731d2b32f6efcb44cf077f79ca2c3c Mon Sep 17 00:00:00 2001 From: GitHub Actions Deploy Date: Mon, 11 Mar 2024 08:17:11 +0000 Subject: [PATCH 459/613] Deploy 3c1ba29bf88968dea67837d956fbad3a46215666 Deploy of commit https://github.com/rust-osdev/homepage/commit/3c1ba29bf88968dea67837d956fbad3a46215666 --- contact/index.html | 2 +- index.html | 2 +- showcase/cluu/index.html | 2 +- showcase/hermit/index.html | 2 +- showcase/index.html | 2 +- this-month/2020-04/index.html | 4 ++-- this-month/2020-05/index.html | 4 ++-- this-month/2020-06/index.html | 4 ++-- this-month/2020-07/index.html | 4 ++-- this-month/2020-08/index.html | 4 ++-- this-month/2020-09/index.html | 4 ++-- this-month/2020-10/index.html | 4 ++-- this-month/2020-11/index.html | 4 ++-- this-month/2020-12/index.html | 4 ++-- this-month/2021-01/index.html | 4 ++-- this-month/2021-02/index.html | 4 ++-- this-month/2021-03/index.html | 4 ++-- this-month/2021-04/index.html | 4 ++-- this-month/2021-05/index.html | 4 ++-- this-month/2021-06/index.html | 4 ++-- this-month/2021-07/index.html | 4 ++-- this-month/2021-08/index.html | 4 ++-- this-month/2021-09/index.html | 4 ++-- this-month/2021-10/index.html | 4 ++-- this-month/2021-11/index.html | 4 ++-- this-month/2021-12/index.html | 4 ++-- this-month/2022-01/index.html | 4 ++-- this-month/2022-02/index.html | 4 ++-- this-month/2022-03/index.html | 4 ++-- this-month/2022-04/index.html | 4 ++-- this-month/2022-05/index.html | 4 ++-- this-month/2022-06/index.html | 4 ++-- this-month/2022-07/index.html | 4 ++-- this-month/2022-08/index.html | 4 ++-- this-month/2022-09/index.html | 4 ++-- this-month/2022-10/index.html | 4 ++-- this-month/2022-11/index.html | 4 ++-- this-month/2022-12/index.html | 4 ++-- this-month/2023-01/index.html | 4 ++-- this-month/2023-02/index.html | 4 ++-- this-month/2023-03/index.html | 4 ++-- this-month/2023-04/index.html | 4 ++-- this-month/2023-05/index.html | 4 ++-- this-month/2023-06/index.html | 4 ++-- this-month/2023-07/index.html | 4 ++-- this-month/2023-08/index.html | 4 ++-- this-month/2023-09/index.html | 4 ++-- this-month/2023-10/index.html | 4 ++-- this-month/2023-11/index.html | 4 ++-- this-month/2023-12/index.html | 4 ++-- this-month/2024-01/index.html | 4 ++-- this-month/2024-02/index.html | 4 ++-- 52 files changed, 99 insertions(+), 99 deletions(-) diff --git a/contact/index.html b/contact/index.html index 20498845..ba873eeb 100644 --- a/contact/index.html +++ b/contact/index.html @@ -41,7 +41,7 @@

                    Contact


                    - Join us on Gitter.
                    + Join us on Zulip.
                    © -. All rights reserved. Contact
                    diff --git a/index.html b/index.html index 354e3980..4d221b38 100644 --- a/index.html +++ b/index.html @@ -153,7 +153,7 @@

                    Showcase


                    - Join us on Gitter.
                    + Join us on Zulip.
                    © -. All rights reserved. Contact
                    diff --git a/showcase/cluu/index.html b/showcase/cluu/index.html index 076e3d65..2ea7fe83 100644 --- a/showcase/cluu/index.html +++ b/showcase/cluu/index.html @@ -101,7 +101,7 @@

                    Comments


                    - Join us on Gitter.
                    + Join us on Zulip.
                    © -. All rights reserved. Contact
                    diff --git a/showcase/hermit/index.html b/showcase/hermit/index.html index e207a0c4..6cfab78d 100644 --- a/showcase/hermit/index.html +++ b/showcase/hermit/index.html @@ -134,7 +134,7 @@

                    Comments


                    - Join us on Gitter.
                    + Join us on Zulip.
                    © -. All rights reserved. Contact
                    diff --git a/showcase/index.html b/showcase/index.html index 7b75d476..a2d264d4 100644 --- a/showcase/index.html +++ b/showcase/index.html @@ -67,7 +67,7 @@

                    The Hermit Operating System
                    - Join us on
                    Gitter.
                    + Join us on Zulip.
                    © -. All rights reserved. Contact
                    diff --git a/this-month/2020-04/index.html b/this-month/2020-04/index.html index e59fba46..2960a6b8 100644 --- a/this-month/2020-04/index.html +++ b/this-month/2020-04/index.html @@ -168,7 +168,7 @@

                    phil-opp/blog_os

                    -->

                    Join Us?

                    -

                    Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                    +

                    Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                    Comments

                    @@ -184,7 +184,7 @@

                    Comments

                  There were also lots of small contributions this month that fixed typos and dead links and updated the Chinese translation. Thanks a lot to all contributors!

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -124,7 +124,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-07/index.html b/this-month/2020-07/index.html index f052aeea..f0cc7e04 100644 --- a/this-month/2020-07/index.html +++ b/this-month/2020-07/index.html @@ -145,7 +145,7 @@

                  ph

                  There were also some contributions this month that fixed typos and updated links. Thanks a lot to all contributors!

                  For the next weeks/months, my plan is to finish the UEFI bootloader implementation and then adjust the blog to work with both the BIOS and UEFI bootloaders. Among other things, this will require that we switch from the VGA text buffer to a pixel-based framebuffer because the VGA text mode is not available with UEFI. While this makes things more complicated (we need to do some simple font rendering and add slice support to volatile crate), it will allow us to create our own graphical user interface, render a mouse pointer, or display images.

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -161,7 +161,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-08/index.html b/this-month/2020-08/index.html index a422a114..1cb3b845 100644 --- a/this-month/2020-08/index.html +++ b/this-month/2020-08/index.html @@ -166,7 +166,7 @@

                  Japanese translations

                  Want to participate in the translation or find a typo? Feel free to open a PR/issue on the repository (please use English in the description if possible)!

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -182,7 +182,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-09/index.html b/this-month/2020-09/index.html index 14e3b446..ed53369e 100644 --- a/this-month/2020-09/index.html +++ b/this-month/2020-09/index.html @@ -176,7 +176,7 @@

                  rust-raspberrypi-OS-tutorials project.

                  Shoutout to @phil-opp for inspiring this crate with his original blog post and to @Skallwar for his many contributions.

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -192,7 +192,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-10/index.html b/this-month/2020-10/index.html index 975146cb..fa453e38 100644 --- a/this-month/2020-10/index.html +++ b/this-month/2020-10/index.html @@ -132,7 +132,7 @@

                  ph

                  In case you speak Persian: There is currently an open pull request to add a Persian translation of Bare Bones chapter that needs reviews. Thanks to everyone involved!

                  In in our previous status update I described my plans to rewrite the blog on top of the upcoming UEFI bootloader. In the past month I started rewriting the Minimal Rust Kernel post for this. Unfortunately, I'm still facing build-related issues because of limitations of Cargo's config files. To resolve these (and other) .cargo/config issues, I created a proposal on the Rust internals forum to make some .cargo/config options available in Cargo.toml too. Feel free to join the discussion if it's relevant to you!

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -148,7 +148,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-11/index.html b/this-month/2020-11/index.html index 322a74a8..c19bf342 100644 --- a/this-month/2020-11/index.html +++ b/this-month/2020-11/index.html @@ -121,7 +121,7 @@

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -137,7 +137,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2020-12/index.html b/this-month/2020-12/index.html index 85b96c16..b6a98a0e 100644 --- a/this-month/2020-12/index.html +++ b/this-month/2020-12/index.html @@ -164,7 +164,7 @@

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -180,7 +180,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2021-01/index.html b/this-month/2021-01/index.html index 35257dee..f5b1b1eb 100644 --- a/this-month/2021-01/index.html +++ b/this-month/2021-01/index.html @@ -130,7 +130,7 @@

                  Third Edition

                  Photo of the laptop display, showing some text output

                  This is an old Acer TravelMate laptop of mine, booting from a USB stick. The output shows that it successfully sets up the local and IO-APIC for interrupt handling and then listens for timer and keyboard interrupts, just as before. The screen output is now based on a pixel-based framebuffer, using the font8x8 crate for simple font rendering. The memory management code required almost no changes, since the interface provided by the bootloader stayed almost the same (there are only some differences in the memory map format).

                  Join Us?

                  -

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                  +

                  Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                  Comments

                  @@ -146,7 +146,7 @@

                  Comments


                  - Join us on Gitter.
                  + Join us on Zulip.
                  © -. All rights reserved. Contact
                  diff --git a/this-month/2021-02/index.html b/this-month/2021-02/index.html index 37fa741e..dbe25c67 100644 --- a/this-month/2021-02/index.html +++ b/this-month/2021-02/index.html @@ -132,7 +132,7 @@

                I probably won't get all of that done in March, but those are my planned next steps. Thanks to this great community and to @phil-opp for being so helpful in the osdev journey!

                Join Us?

                -

                Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

                +

                Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

                Comments

                @@ -148,7 +148,7 @@

                Comments

              Thanks to @woodyZootopia, @kahirokunn, @HKalbasi, and @bjorn3 for their contributions!

              Join Us?

              -

              Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

              +

              Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

              Comments

              @@ -201,7 +201,7 @@

              Comments


              - Join us on Gitter.
              + Join us on Zulip.
              © -. All rights reserved. Contact
              diff --git a/this-month/2021-06/index.html b/this-month/2021-06/index.html index a6b02bad..4a79bd4b 100644 --- a/this-month/2021-06/index.html +++ b/this-month/2021-06/index.html @@ -136,7 +136,7 @@

              ph

            Unfortunately, I didn't have time to work on the upcoming third edition this month. I'll try my best to continue working on it soon!

            Join Us?

            -

            Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

            +

            Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

            Comments

            @@ -152,7 +152,7 @@

            Comments


            - Join us on Gitter.
            + Join us on Zulip.
            © -. All rights reserved. Contact
            diff --git a/this-month/2021-07/index.html b/this-month/2021-07/index.html index 959f673a..9a39ea49 100644 --- a/this-month/2021-07/index.html +++ b/this-month/2021-07/index.html @@ -146,7 +146,7 @@

            ph

          Thanks to @Foo-x, @adi-g15, @Kalbiq, and @MrZloHex for their contributions.

          Join Us?

          -

          Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

          +

          Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

          Comments

          @@ -162,7 +162,7 @@

          Comments


          - Join us on Gitter.
          + Join us on Zulip.
          © -. All rights reserved. Contact
          diff --git a/this-month/2021-08/index.html b/this-month/2021-08/index.html index 6a503923..ed4cbc89 100644 --- a/this-month/2021-08/index.html +++ b/this-month/2021-08/index.html @@ -172,7 +172,7 @@

          ph

        Thanks to @Foo-x, @adi-g15, @Kalbiq, and @non-descriptive for their contributions!

        Join Us?

        -

        Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

        +

        Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

        Comments

        @@ -188,7 +188,7 @@

        Comments


        - Join us on Gitter.
        + Join us on Zulip.
        © -. All rights reserved. Contact
        diff --git a/this-month/2021-09/index.html b/this-month/2021-09/index.html index 9e688da5..2fac962f 100644 --- a/this-month/2021-09/index.html +++ b/this-month/2021-09/index.html @@ -131,7 +131,7 @@

        ph

        Thanks to @jongillham and @non-descriptive for these contributions!

        I don't have any notable news about the upcoming third edition of the blog yet, but I'm doing my best to get back up to speed soon.

        Join Us?

        -

        Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

        +

        Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

        Comments

        @@ -147,7 +147,7 @@

        Comments

      Join Us?

      -

      Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our gitter channel.

      +

      Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way for getting in touch is our Zulip chat.

      Comments

      @@ -130,7 +130,7 @@

      Comments