From a1ddfac5e6d617d28bb63d11a3abf41d581f03c2 Mon Sep 17 00:00:00 2001 From: Stefan Jumarea Date: Thu, 11 Jul 2024 12:39:52 +0300 Subject: [PATCH 01/15] hackathons/USW24: Add Session 05 - Debugging in Unikraft Signed-off-by: Stefan Jumarea --- content/hackathons/usw24/index.mdx | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/content/hackathons/usw24/index.mdx b/content/hackathons/usw24/index.mdx index 1867f5d8..5d6d5f6b 100644 --- a/content/hackathons/usw24/index.mdx +++ b/content/hackathons/usw24/index.mdx @@ -307,6 +307,96 @@ See the system calls. Compare the system calls from the Unikraft-based run, with those from a native Linux run. They are identical, since the application is run unmodified on Linux and on Unikraft. +### Session 05: Debugging + +Many times, when we try to port an application and to use it on top of Unikraft, we will run into issues, as we do when we use any other platform. +Unikernels can seem harder to debug, since they function as virtual machines, but having the kernel code in the same address space as the application makes it easy to jump from the application code to the kernel code.. +In this sessions, we will look at different ways we can debug our Unikraft applications, from simple debug messages to using `gdb` to attach to the guest. + +#### Enable Debug Messages + +To enable debug messages, we will need to change the unikernel configuration, like we did in session 04. +We will use the [`nginx`](https://unikraft.org/hackathons/usw24#nginx) application from the last session. + +First, let's enter the configuration menu using `make C=$(pwd)/.config.helloworld_qemu-x86_64 menuconfig`. +There are multiple types of debugging messages we can enable. +For now, let's go for the `strace`-like output. +We do that by enabling `Library Configuration -> Syscall Shim -> Debugging -> strace-like messages`. +After that, we can rebuild the application and run it, using the script from the last session. +We should get an output similar to what `strace` will show on a usual linux setup: + +```text +close(fd:7) = OK +socketpair(0x1, 0x1, ...) = 0x0 +epoll_ctl(0x3, 0x1, ...) = 0x0 +close(fd:8) = OK +epoll_wait(0x3, 0x1000158844, ...) = 0x1 +close(fd:7) = OK +epoll_ctl(0x3, 0x1, ...) = 0x0 +gettimeofday(0x1000158980, 0x0, ...) = 0x0 +``` + +This is very useful when the application requires certain files to be present in the filesystem, and we have no way of determining that at build time. +If that is the case, we will likey see a message like: + +```text +openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = No such file or directory (-2) +``` + +If the application crashes after that, we can assume that the file is a requirement and we can add it to the filesystem, using the `Dockerfile`. +If the application continues to run properly without that file, then most likely the file is not needed, it might be part of extra functionalities and we can choose if we want to add it or not. + +Another option is to enable all available debug messages. +To do this, enable `Library Configuration -> ukdebug -> uk_printd`. +This will show a lot of output, enabling debug messages globaly. + +You can toy around the configurations under `ukdebug` and see what they do and how they affect the printed messages. + +#### Using GDB + +Since we are running the applications using `qemu`, we can attach `gdb` and debug it like any other application. +To do that, we need to update the run script accordingly. + +Let's start with the [`helloworld` application](https://unikraft.org/hackathons/usw24#session-04-binary-compatibility) that we used in the last session. +The new run command will be: + +```console +qemu-system-x86_64 -cpu max -nographic -kernel .unikraft/build/elfloader_qemu-x86_64 --append "/helloworld" -S -s +``` + +Notice the extra `-S -s` flags. +The `-S` option will start the application in a paused state, while the `-s` will open a gdbserver on TCP port 1234. +After that, we can open another terminal and run gdb: + +```console +gdb --eval-command="target remote :1234" .unikraft/build/elfloader_qemu-x86_64.dbg +``` + +This will connect to the gdbserver, and we can go ahead and debug the application as usual. +Notice that we used the `.unikraft/build/elfloader_qemu-x86_64.dbg`, with the extra `.dbg` when we started `gdb`. +That is a non-stripped kernel image, that we can not run, but we will always use when debugging via gdb. +When debugging, instead of the usual breakpoints, use `hb` (hardware breakpoints). + +#### `nginx` with `gdb` + +Follow the same steps on the `nginx` application. +Attach gdb, toy around, place some breakpoints and see how the application flows. + +#### `redis` + +Follow the steps for debugging messages and gdb for [`redis`](https://github.com/unikraft/catalog/tree/main/library/redis/7.2). +Use the `redis` setup from the last session. + +#### `hugo` + +Follow the steps for debugging messages and gdb for [`hugo`](https://github.com/unikraft/catalog/tree/main/library/hugo/0.122). +Use the `hugo` setup from the last session. + +#### `node` + +Follow the steps for debugging messages and gdb for [`node`](https://github.com/unikraft/catalog/tree/main/library/node/21). +Use the `node` setup from the last session. + ### Session Recordings You can check the recordings of the initial presentations for each session on [YouTube](https://www.youtube.com/playlist?list=PL0ZXUYDfkQ61ezmByQNLlzJ8s_dkJmQ1S). From ccb521d43478fa78227ef6d6481e3bad27a88f4d Mon Sep 17 00:00:00 2001 From: Stefan Jumarea Date: Fri, 12 Jul 2024 11:53:34 +0300 Subject: [PATCH 02/15] hasckathons/USW24: Add session 06: Porting Signed-off-by: Stefan Jumarea --- content/hackathons/usw24/index.mdx | 125 +++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/content/hackathons/usw24/index.mdx b/content/hackathons/usw24/index.mdx index 5d6d5f6b..b2468f6d 100644 --- a/content/hackathons/usw24/index.mdx +++ b/content/hackathons/usw24/index.mdx @@ -397,6 +397,131 @@ Use the `hugo` setup from the last session. Follow the steps for debugging messages and gdb for [`node`](https://github.com/unikraft/catalog/tree/main/library/node/21). Use the `node` setup from the last session. +### Session 06: Porting an Application + +Now that we have learned how to debug Unikraft applications, we can move on to porting some more complex applications, that might require more then we have seen in the third session. +The workflow for porting an application is the same as the one in the third session: create a `Dockerfile`, add a `Kraftfile`, create a minimal filesystem and run the application on top of Unikraft. +Sometimes, the minimal filesystem can not be created corectly whithout running the application, so we will make use of the debugging messages from the last session. + +Let's take `nginx` as an example. +We start from the already existing [`nginx` port](https://github.com/unikraft/catalog/blob/main/library/nginx/1.25) and we remove the `Dockerfile`, since we will write that ourselves. + +Next, we start a docker container from the `nginx` official image: + +```console +docker run --rm -it nginx:1.25.3-bookworm /bin/bash +``` + +We use `ldd` to get the dependencies: + +```console +$ ldd /usr/sbin/nginx + linux-vdso.so.1 (0x00007ffdf39e8000) + libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x000073162deb9000) + libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x000073162de1f000) + libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x000073162dd75000) + libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x000073162d8f3000) + libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x000073162d8d4000) + libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000073162d6f1000) + /lib64/ld-linux-x86-64.so.2 (0x000073162e133000) +``` + +Next, we create a `Dockerfile` where we copy the dependencies to a scratch image: + +```text +FROM nginx:1.25.3-bookworm AS build + +FROM scratch + +COPY --from=build /usr/sbin/nginx /usr/bin/nginx +COPY --from=build /usr/lib/nginx /usr/lib/nginx + +# Libraries +COPY --from=build /lib/x86_64-linux-gnu/libcrypt.so.1 /lib/x86_64-linux-gnu/libcrypt.so.1 +COPY --from=build /lib/x86_64-linux-gnu/libpcre2-8.so.0 /lib/x86_64-linux-gnu/libpcre2-8.so.0 +COPY --from=build /lib/x86_64-linux-gnu/libssl.so.3 /lib/x86_64-linux-gnu/libssl.so.3 +COPY --from=build /lib/x86_64-linux-gnu/libcrypto.so.3 /lib/x86_64-linux-gnu/libcrypto.so.3 +COPY --from=build /lib/x86_64-linux-gnu/libz.so.1 /lib/x86_64-linux-gnu/libz.so.1 +COPY --from=build /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libc.so.6 +COPY --from=build /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 +COPY --from=build /etc/ld.so.cache /etc/ld.so.cache +``` + +Then, to enable debug messages, we uncomment [this line](https://github.com/unikraft/catalog/blob/main/library/nginx/1.25/Kraftfile#L112) from the `Kraftfile`. + +Now, we can run `kraft build` and `kraft run`, to see if the application works. +We will get an error message: + +```text +openat(AT_FDCWD, "/etc/nginx/nginx.conf", O_RDONLY) = No such file or directory (-2) +gettid() = pid:1 +2024/07/12 08:11:50 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory) +``` + +This tells us that `nginx` will look for a config file. +We have a minimal config in the [`conf/`](https://github.com/unikraft/catalog/tree/main/library/nginx/1.25/conf) directory, so we copy that too, adding this line in the `Dockerfile`: + +```text +COPY ./conf/nginx.conf /etc/nginx/nginx.conf +``` + +We do `kraft build` and `kraft run` again, and we get another message: + +```text +openat(AT_FDCWD, "/etc/passwd", O_RDONLY|O_CLOEXEC) = No such file or directory (-2) +gettid() = pid:1 +2024/07/12 08:19:32 [emerg] 1#1: getpwnam("root") failed (2: No such file or directory) in /etc/nginx/nginx.conf:4 +``` + +This tells us that `getpwnam("root")` failed, because no `/etc/passwd` and `/etc/group` files are provided, so we also add those in the `Dockerfile`: + +```text +COPY --from=build /etc/passwd /etc/passwd +COPY --from=build /etc/group /etc/group +``` + +We rebuild and run again, and get: + +```text +2024/07/12 08:25:31 [emerg] 1#1: open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /etc/nginx/nginx.conf:11 +``` + +So we add `/etc/nginx/` to the filesystem: + +```text +COPY --from=build /etc/nginx /etc/nginx +``` + +We repeat the same process and find out more requirements for our application: + +```text +COPY --from=build /var/cache/nginx /var/cache/nginx +COPY --from=build /var/run /var/run +COPY --from=build /usr/lib/nginx /usr/lib/nginx +COPY --from=build /var/log/nginx /var/log/nginx +``` + +After that, the application seems to run properly. +We use `kraft run -p 8080:80` and then, from another terminal, we run `curl localhost:8080` and we get a `404` page response. +This is because we also need to add an initial page for `nginx` to serve. +We have that already under `wwwroot/`, and we add that to the `Dockerfile`: + +```text +COPY ./wwwroot /wwwroot +``` + +After that, everything should work properly. + +#### `node` + +Now that you have seen how porting an application works, you can try it yourself with the [`node`](https://github.com/unikraft/catalog/tree/main/library/node/21) application. +Remove the `Dockerfile`, start from the `node:21-alpine` image and follow the same steps as above. + +#### `memcached` + +Do the same for [`memcached`](https://github.com/unikraft/catalog/blob/main/library/memcached/1.6/). +Remove the `Dockerfile` and start from `memcached:1.6.23-bookworm`. + ### Session Recordings You can check the recordings of the initial presentations for each session on [YouTube](https://www.youtube.com/playlist?list=PL0ZXUYDfkQ61ezmByQNLlzJ8s_dkJmQ1S). From cd4bc107a11b016dd5e280d27ead6b9fe167868b Mon Sep 17 00:00:00 2001 From: procub3r Date: Wed, 10 Jul 2024 17:03:47 +0530 Subject: [PATCH 03/15] blog: Add GSoC'24 UEFI GOP, Part II post This is the second post that outlines the progress on the UEFI GOP GSoC project, particulary from week four to six. Signed-off-by: procub3r --- content/blog/2024-07-10-gsoc-uefi-gop.mdx | 60 +++++++++++++++++++ public/images/uefi-gop-after-scrolling.png | Bin 0 -> 80527 bytes public/images/uefi-gop-before-scrolling.png | Bin 0 -> 87686 bytes public/images/uefi-gop-first-text-render.png | Bin 0 -> 1859 bytes public/images/uefi-gop-scaled-text-1.png | Bin 0 -> 2209 bytes public/images/uefi-gop-scaled-text-2.png | Bin 0 -> 3686 bytes 6 files changed, 60 insertions(+) create mode 100644 content/blog/2024-07-10-gsoc-uefi-gop.mdx create mode 100644 public/images/uefi-gop-after-scrolling.png create mode 100644 public/images/uefi-gop-before-scrolling.png create mode 100644 public/images/uefi-gop-first-text-render.png create mode 100644 public/images/uefi-gop-scaled-text-1.png create mode 100644 public/images/uefi-gop-scaled-text-2.png diff --git a/content/blog/2024-07-10-gsoc-uefi-gop.mdx b/content/blog/2024-07-10-gsoc-uefi-gop.mdx new file mode 100644 index 00000000..e8c7f5db --- /dev/null +++ b/content/blog/2024-07-10-gsoc-uefi-gop.mdx @@ -0,0 +1,60 @@ +--- +title: "GSoC'24: UEFI Graphics Output Protocol Support in Unikraft, Part II" +description: | + This is the second post in a series of posts where I talk about my progress with the project. +publishedDate: 2024-07-10 +image: /images/unikraft-gsoc24.png +authors: +- Sriprad Potukuchi +tags: +- gsoc +- gsoc24 +- uefi +- booting +--- + +## Project Overview + +The widely available and standardized [UEFI Graphics Output Protocol](https://uefi.org/specs/UEFI/2.10/12_Protocols_Console_Support.html#efi-graphics-output-protocol) (GOP) interface is an excellent alternative to VGA or serial port consoles for printing logs to the screen. + +This project aims to implement a UEFI GOP based console. +For more information, check out [Part I](https://unikraft.org/blog/2024-06-18-gsoc-uefi-gop) of this series. + +## Progress + +- Using a placeholder [font](https://github.com/dhepper/font8x8), it is now possible to print null-terminated strings to the screens. + + +- It is also possible to scale the font in both the axes independently + - No scaling + + - Scaled Y-axis + + +- I've also implemented scrolling. When all the lines are filled and a new log needs to be printed, the current logs on the screen are scrolled up (using `memcpy`) + + + +Right now, scrolling moves all the framebuffer data in place. +Reads and writes in framebuffer memory are slower because the video adapter actually syncs the framebuffer with the screen. +This needs to be optimized! + +## Next Steps + +- Finalize a font! +- Optimize scrolling (by maintaining an additional buffer) +- Look into [this PR](https://github.com/unikraft/unikraft/pull/1464), which adds a generic console interface. + +## Acknowledgement + +I would like to thank all the great Unikraft folk for being a great community! diff --git a/public/images/uefi-gop-after-scrolling.png b/public/images/uefi-gop-after-scrolling.png new file mode 100644 index 0000000000000000000000000000000000000000..ea69227ecf698e8b96d46eed417bacfdffebe54f GIT binary patch literal 80527 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 literal 0 HcmV?d00001 diff --git a/public/images/uefi-gop-scaled-text-1.png b/public/images/uefi-gop-scaled-text-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4fec835f038ed19704e2085d5fbd42f5f979f1 GIT binary patch literal 2209 zcmaKscT|&E8pc1D5m>4U(p1o4K%|D=J4gvlia>zSLBL>u0Kr5QNGPL%h*AV2$iRRI zh*T-T4Tw@CYA_J`M^FNxha!V)CZ3t~?ChT1`^SBs`=0Z=@4e@~_sMc`vJvEy;sXFc z(9YJ%6#xz)IXaVIMS<;voRA6aWAQg#aLq zENQ=B#DT|M9NevigoHBiH+HtS+&sPOp4EH9{i~|0LnEV9wR9*HimtI~)D>jnRZKug zXeu7>>gnYH^SOb;b#`@W8yYVyGH5iKnzrtT4bVzo4Lx)Q^=_ zRjVt@rq<^XF>&Ehh{?%`%$v8|y?yTG=U=$!xv{=xVs-vW?bAgD1EQlhJv{~U4}iK{ z_%uJyU@Q>3iKS(aV-pf-wDE_8M<6&mJ3BK6g6g{Z&l?*(ef+9xYLF;YTw>ytxHx-f zm&T@M-@u?(eSK?dt9^a1+dJAXBV#bh*Mq{s(=sw{<=jD`(QPkYghgJa)8~xLEwv1c zK2oX01j770y|t~4xy&S#mMtuN?jm-Lj8Oj3Lo&0raq;l9u(g|-n(XQAU0+-6ALx&W zz5)*pW-cxMT3v;Ri5(jod;50iyn~~yqqA>7V0u;-8iUo;H%!6dt?eC>Q`796Txx1- zLoY?t*4Ix@O>!Qc&1Ng}sFrcmp&+P@)kE%%%?8eb2W97I&BNf~<3Flb@($w;0EbKM ztjyif<0~b5*GH@*GGZdNMa%fSd|@dnsX;1L?loeQ~-_W~2cSz+1X8U4k3zbN}~b87uL?2$(U08)|N-^E|*9~lx%>W_p@OhHo{j6K`HiOp0)Wq1kfWwGxLDb@xbWf)ay5>Mr^+Yg#+N0lVX8)Ai zhJegW{DNQY;ki`|b(L`J+U;#h-mXqCxI*5YV!vdhVfrctWUhK;+DKnh7Mm6tH`G+x zF(&#r)U6w%OsjCF>O1qZZf^Y00SY;jHcMj!&m^DO;U>Q#(aB^U9$5E4Z*27@m)f$Z zTDF4?$!4M;;=GU^q2CS9D(bxBi~@rWCcBW3-Hk}HlcGbi9IJ!fF}=Q%c>3r zQ~WIbvux348NK};`>#fei5teT&IRKW1-Z2Fr=KCyV2nT=61HrTmz zHm$p-71AcM<;>LRF!(aM`^Gq>OEm0si6n10H>oHE`G=I3`)WE{a&MjgTSqv+zF_(D z8Xf88F!UvIZ)t?l4P=5SDPBsv{Pd*2D=8%KcmvL&#nPgKgn zVDkpdv-xwWI86>u<<`zNvZ!vk$~(GCkyw08BOVi@I^5QjC_TvaSjt|yBMY`Kr%8oF zNbPWJ?QTsSiMh$ucARjp%E!$%WLc`?2CB`Kg+VRb16n?$#iUpcG=CYEtY^h9=&vre`S?`+!^fP83N*Azp7xm>hPx zUw$*YF@)Hn`t~EGZ(!`$w5(>Q0Y0hCUXO}|k}AH!8q#;8^MicQ1lAJri5rHB!OH}S7wOgr-) zDduI*Em*oQxY6BLLg|joa+B~L)su{Wbd=0}h z4-PSK;_Of6t7-Perdj;&c}EWrj@zapOl?$D+t+h`eJZ(U+(AVx;rLYLgm67e1{1oFQbZJj@gu*8_Rzq!1fwUbqyML_EBjdDBu literal 0 HcmV?d00001 diff --git a/public/images/uefi-gop-scaled-text-2.png b/public/images/uefi-gop-scaled-text-2.png new file mode 100644 index 0000000000000000000000000000000000000000..496c45bc23717b00862d135f4f22eefb77ef247b GIT binary patch literal 3686 zcmc&$dpMNa8lP{>VbCVqN!et`-n1)XCk&dQNbapbUse$TVk_gm|?-uHXgyS{f_ za(A`=O5qy?2n6z#!y((l5C{~6KmZ(EM#{+9yX8w8?Vv-4T_6yG9t1*4gFu#~6lnqi zi7|perZ5nQMJ@!g8CyW{u#yV<-JOrvDJdzXUm%Hu3qN{!*VNT|`v+9sxf6UQ%+SP? z$z+=CLx)9T;|K|ulfmaNTsZ7?%+tr0l$O>^rS7%dH#IrY*Vnguui5L@udk4=9dvSe z`Lct@wPOX;PI%f11D^^Y0`2KqZXI*=%9!TcQgdgjl$x%kASvfJfn&SIOInqIwP zIJvvm-oJnR#EI^n?()h?{xlD5cQ7If7ZMin_U*vMjLS#7eQ#uEdmQzeo1H<~9=uz9 zZ*pS7$kcprknIzIadP)~KRP-wG2TLJxmEJZx!AbAzW&0Z;^AQqhconUc-Yts`RjuR zUcSfgR8?W4qj7O@kvN>AoBM-@^?rdTp0&5n%<$XW>69i)I5sMQn0(??NNRfeW%9M? z`1r=hk58Qm9~pUPWplv9!m7KcC%>p@babSlv60K;7TqctA0MN(P~W^^K51*UwzGHl z^xA*Ofz5u~_VnrO4FCCy=b>jK{eyzIQAy*fk??MI<;9z*3aZGD-Xh%7cV~&8BPCv(I)PCoCMQ zkC^^jPi106lsYM`|$GU$#IX==zN zif+-hhT=GLGe#(kZ%r58bI0Eh9OpI~E0I)fR8L zyc#{Hg^{i@Y$XySRhMr3g=`9{;5nIll z0QKFhXro%mZ=<+1XwQ$j){M<4zg7H9z&VC;lmS4#3|-^a&;p4N99^W(J$o*GmiBkI(p0Ih{PuyC47r*2QqhN9urd{+e?>QJ1*Ki8$6=B- zKz}m%0uTF1=^%|JKERFmg-8_Vg;UZ9Wi?yN{{A5Xb6cDq^5Tc3`2B1K0y^ zWa`MXe1-vr#3{FJm{;2-`>5HUrL?~%@v8Tx?~tikWp3G-C{ zsnus%kx4X`n1Z6I1FG0} z6Z^3)=VA<0=>Q0jFOrz(KNuz+%+ly*Kbj_d1H>(Uy=Z{x$cCH87m^NC=yFJMw&0!O z^yxJ}73{19knWme#TmwO^Y2k=R~op)efh(QLvV3TMN-O0F=5JjdMx7rn8KCD8ODo7 z0cJWJFa~O9%9*@9o_saw#?juLHd8rX;=X801R$rwIR-1(1kkr}?!nE~01dQJv2a0L zo^0BDNietr@Z~p@jbF#1pi0N|F;LU3t?yE#TTJj0AYq!zfm&SdZ9In0P5R9&4vZD3 z)Gb;7^qFgPk-aMB4T*hz!>&jmpEz%bXwkIUR3Xb=s+-N~VyJ~pW zjzb6_#4A?&_6)In2MeG5 zO`f$h#fP&v*H!C;-Ry2y^Im3O=S$hf@T{8g9O347#+0JAZJ7F-IXV~_Sb;L2q0LEz zvmn6ukIvxZp|UwWL*kg`@1__1pnO@tvSzu+31t87;Sf%~Q9}vXt=PMl6Fl5iRBZXG zar4PJ-ornAN0z-SnC-P_1L~0rNCvh1RFaDp67cnBr?;i!%Qf+i! zEV;OJeTv*vq%s1=YaA>u!^3k))Spe10oA&O%rS2& z)`i$|K-FmDMUu{y|0@h^z{xdoVG4fz8q|C#^~*Z;pO`Gt0E*IO zKX6?EIPlFE@NowpNcu9LS*`Y@VAqWRfE&{{8^fb?tTqr8XA!D?!RuoxKtpwf!WNe8 z=fbEruh(T3+k!m$m(Q!`JxRy&dbx~Q^$e2NIx970{r!4#DH^dto6qDGmzYTb}USAd0jL035o`?JdEBExz8`8N86VTbK9nh%rS-W%IMN{0m z>9ZR?DTpzhfW|*o*lUIzBZ6_!ff3j*HGB4aGLr3>tu56+9PC_eYxZN# F{{xxA^O^tv literal 0 HcmV?d00001 From 637d9a9a97967986746cdba038e7ac9813bcef10 Mon Sep 17 00:00:00 2001 From: Maria Pana Date: Tue, 9 Jul 2024 21:36:48 +0300 Subject: [PATCH 04/15] blog: Add second GSoC blog post about Multiboot2 Add the second GSoC blog post about Multiboot2 showcasing the progress made during the second set of 3 weeks. Signed-off-by: Maria Pana --- content/blog/2024-07-10-gsoc-multiboot2.mdx | 128 ++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 content/blog/2024-07-10-gsoc-multiboot2.mdx diff --git a/content/blog/2024-07-10-gsoc-multiboot2.mdx b/content/blog/2024-07-10-gsoc-multiboot2.mdx new file mode 100644 index 00000000..4284064f --- /dev/null +++ b/content/blog/2024-07-10-gsoc-multiboot2.mdx @@ -0,0 +1,128 @@ +--- +title: "Multiboot2 Support in Unikraft" +description: | + In my previous blog post, I focused on the first steps of the project: understanding the Multiboot2 protocol and preparing the development environment. Over the following three weeks, I progressed to implementing the necessary changes/additions and then testing the code. +publishedDate: 2024-07-10 +tags: +- gsoc +- gsoc24 +- multiboot2 +- booting +authors: +- Maria Pana +--- + + + +In my [previous blog post](https://unikraft.org/blog/2024-06-17-gsoc-multiboot2), I outlined a general strategy for software enhancement, focusing on the first steps of the project: understanding the Multiboot2 protocol and preparing the development environment. +Naturally, over the following three weeks, I progressed to the next stages: implementing the necessary changes/additions and then testing the code. + +## Structuring for Seamless Integration + +In order to have Multiboot2 integrated in Unikraft, I mirrored the existing file organization established for Multiboot and extended it to accommodate the new protocol. +Three core files handle the protocol itself, while the rest of the codebase is updated around them to ensure proper integration and functionality. +Let's take a closer look: + +### `multiboot.S` + +This assembly file plays a pivotal role in preparing a standardized operating environment. +It verifies the system is booted through a compliant Multiboot/Multiboot2 bootloader and manages essential memory relocations. +In this context, the only modifications required were replacing `multiboot.h` and `MULTIBOOT_BOOTLOADER_MAGIC` with their Multiboot2 counterparts, featured depending on the chosen configurations. + +### `multiboot2.py` + +The Python script generates and adds the Multiboot2 and updated ELF headers to the original ELF file. +This ensures that the bootloader information is strategically positioned at the start, facilitating correct system initialization. +Since the Multiboot protocol is limited to 32-bit systems, the `multiboot.py` script also required transforming 64-bit ELFs into 32-bit ones. +This is no longer the case when it comes to Multiboot2, only needing to incorporate the Multiboot2 and updated ELF headers into the file, without any other alterations. + +### `multiboot2.c` + +This C program is responsible for processing boot information from a Multiboot2-compliant bootloader. +It meticulously manages memory regions, integrates boot parameters, and prepares the system for kernel execution by consolidating memory configurations and allocating essential resources. + +Alongside these core files, I made adjustments to adjacent files to seamlessly link everything together and ensure successful booting under Multiboot2 (e.g. duplicating the `mkukimg` script's menuentry to use `multiboot2` instead of `multiboot` etc.). + +## Testing the Waters: Progress and Challenges + +My initial focus was to lay the groundwork by creating the `multiboot.S` and `multiboot2.py` files and testing them with the simple `helloworld` application. +This allowed me to verify that the Multiboot2 header was inserted correctly and the system could boot without major hiccups. + +Of course, debugging became my constant companion during this process. +Tools like `hexdump` and attaching `gdb` to my custom GRUB build proved invaluable. + +I encountered an initial hurdle regarding the ELF file. +After playing around with GRUB error messages and making a "comparative study" of the binaries with Multiboot, Multiboot2, or no additional header, I realized the ELF was lacking the Multiboot2 header altogether. +Some detective work later, I traced the issue to an unlinked `multiboot2.py` script. + +## Multiboot2 Header: A Deep Dive + +So far, I really emphasized the need of the Multiboot2 header. +But what is its role? + +The Multiboot2 header is a structured data block embedded within the bootable system image. +Its purpose is to facilitate the transition of control and information from the bootloader to the kernel during the boot process. +This header acts as a standardized communication channel, ensuring the kernel can access essential details about the system's hardware, memory layout, and other boot-related parameters. + +### Format and Contents + +The Multiboot2 header follows a specific format, starting with a fixed-size header followed by a series of variable-length tags. + +The fixed-size header includes: + +- The magic number `0xE85250D6` indicating a Multiboot2-compliant image +- The target architecture (e.g. `i386`, `x86_64`) +- The header length, including all tags +- The checksum of the header, used for error detection + +I talked a little about the tags in my previous blog post, but to recap, they provide detailed information about the system's memory layout, boot command line, and other essential parameters. +Commonly, each tag has a type, size and payload. +There is a multitude of tags to choose from, depending on the specific requirements of the system, adding to the flexibility of Multiboot2. + +In the context of this project, it may be valuable to note that simply adding the Multiboot2 header to the ELF file is not sufficient. +On top of that, both `multiboot.py` and `multiboot2.py` scripts add an extra ELF header with updated offsets, "sandwiching" the Multiboot2 header between it and the original ELF. +To better visualize this, we can refer to the following diagram: + +```text + ┌────────────────────┐ + ┌───────│ Updated EHDR |─────────────┐ + | ├────────────────────┤ | + └──────>| Updated PHDR | | + ├────────────────────┤ | + | MB2HDR | | + ├────────────────────┤ | + ┌───────| Original EHDR |────────┐ | + | ├────────────────────┤ | | + └──────>| Original PHDR | | | + ├────────────────────┤ | | + | Original SHDR |<───────┘ | + ├────────────────────┤ | + | ... | | + ├────────────────────┤ | + | Updated SHDR |<────────────┘ + └────────────────────┘ +``` + +This ensures that GRUB identifies the overall file as an ELF and avoids any potential complications along the way. + +### Interaction between Bootloader and Kernel + +The bootloader locates the Multiboot2 header within the ELF file. +After verifying the magic number and architecture compatibility, it parses the header and tags. +Next, the information requested by the tags is placed into the kernel memory and the bootloader passes control to the kernel. + +The kernel, in turn, accesses the Multiboot2 header using the information provided by the bootloader. +It iterates through the tags to extract the necessary data, such as memory regions, boot command line, and other parameters. +This information is used to initialize its own data structures, set up memory management, and configure the system for execution. + +## Next Steps + +With the Multiboot2 header issue resolved, the ELF file is now generated correctly. +However, the system still encounters a roadblock, getting stuck in what appears to be an infinite loop. +More debugging using `gdb` for me it is! + +After I pinpoint and fix the problem, I will move on to: + +- Refactoring `multiboot2.py` to handle tag inclusion more generically +- Implementing the `multiboot2.c` file +- Testing the new modifications once again From 2536f3ac40ff01023c808b888947fb0e5093a326 Mon Sep 17 00:00:00 2001 From: Mihnea Firoiu Date: Wed, 10 Jul 2024 02:49:29 +0300 Subject: [PATCH 05/15] Add second blog post for Linux x86 boot protocol Signed-off-by: Mihnea Firoiu --- .../2024-07-10-unikraft-gsoc-lxboot_x86.mdx | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 content/blog/2024-07-10-unikraft-gsoc-lxboot_x86.mdx diff --git a/content/blog/2024-07-10-unikraft-gsoc-lxboot_x86.mdx b/content/blog/2024-07-10-unikraft-gsoc-lxboot_x86.mdx new file mode 100644 index 00000000..e5395b66 --- /dev/null +++ b/content/blog/2024-07-10-unikraft-gsoc-lxboot_x86.mdx @@ -0,0 +1,86 @@ +--- +title: "GSoC'24: Linux x86 Boot Protocol Support" +description: | + The Linux boot protocol plays an important role in the initialization of the Linux operating system, emphasizing the importance of system optimization and scalability. +publishedDate: 2024-07-10 +image: /images/unikraft-gsoc24.png +tags: +- gsoc +- gsoc24 +- booting +authors: +- Mihnea Firoiu +--- + +As I wrote in the previous blog post, my first objective is to make Unikraft boot on QEMU using the Linux x86 boot protocol. +Here I will present my progress so far and different challenges I faced while working towards my goal. + +## Where does QEMU handle the lxboot header? + +By using the `git grep` command, I found that `QEMU 9.0.1` handles the Linux x86 boot protocol in the [x86.c](https://github.com/qemu/qemu/blob/stable-9.0/hw/i386/x86.c) file. +Everything happens in the `x86_load_linux` function. + +### Fields used by QEMU + +These are as follows: + +* 0x202: HEADER +* 0x206: VERSION +* 0x211: LOADFLAGS +* 0x236: XLOADFLAGS +* 0x22c: INITRD_ADDR_MAX +* 0x228: CMD_LINE_PTR +* 0x1fa: VID_MODE +* 0x210: TYPE_OF_LOADER +* 0x224: HEAP_END_PTR +* 0x1f1: SETUP_SECTS +* 0x250: SETUP_DATA +* 0x218: RAMDISK_IMAGE +* 0x21c: RAMDISK_SIZE + +As you can see, only 13 out of 39 fields are used. +Out of these, 6 are read by QEMU: + +* 0x202: HEADER +* 0x206: VERSION +* 0x211: LOADFLAGS +* 0x236: XLOADFLAGS +* 0x22c: INITRD_ADDR_MAX +* 0x1f1: SETUP_SECTS + +And 7 are written by QEMU: + +* 0x228: CMD_LINE_PTR +* 0x1fa: VID_MODE +* 0x210: TYPE_OF_LOADER +* 0x224: HEAP_END_PTR +* 0x250: SETUP_DATA +* 0x218: RAMDISK_IMAGE +* 0x21c: RAMDISK_SIZE + +## Debugging and testing + +The application I am using to test the `mklinux_x86.py` file is [app-helloworld](https://github.com/unikraft/app-helloworld/tree/stable). +By using multiple `printf` and `exit` calls inside the `x86_load_linux` function, I was able to determine the way QEMU uses the header. +Another useful tool was `hexdump`,that was used to look at how my script builds the header. + +## Challenges + +For starters, I could not figure out why the header created by the script did not align to what QEMU expected. +The problem was that the header, as presented in the documentation, starts at offset `0x1f1`, not `0x0`. +To fix it I had to add 0x1f1 zeros. + +Another issue was with integrating it in Unikraft. +Eventually I figured it out, with help from my mentors. + +## Integration with Unikraft + +Although debugging could be done only by running the `mklinux_x86.py` script and looking at the header, I wanted to test by integrating everything in Unikraft. +For doing this I had to modify the following files: [Linker.uk](https://github.com/unikraft/unikraft/blob/staging/plat/kvm/Linker.uk), [Config.uk](https://github.com/unikraft/unikraft/blob/staging/plat/kvm/Config.uk) and [Makefile.rules](https://github.com/unikraft/unikraft/blob/staging/plat/common/Makefile.rules). + +## Next steps + +At the moment, when I try to run, it loops indefinitely. +I have to debug and find out what does not work. + +Additionally I am going to look into SeaBIOS/qboot/GRUB2 to see how the jumping to the kernel happens and I will write the needed 16-bit and 32-bit assembly stubs. From 3c94d08fa083901a3820537658b84e772502d2fc Mon Sep 17 00:00:00 2001 From: Yang Hu Date: Wed, 17 Jul 2024 08:05:46 +0800 Subject: [PATCH 06/15] blog: Add GSoC'24 post on testing mimalloc memory allocator Signed-off-by: Yang Hu --- ...nikraft-gsoc-port-mimalloc-to-unikraft.mdx | 9 +- ...nikraft-gsoc-test-mimalloc-on-unikraft.mdx | 146 ++++++++++++++++++ 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 content/blog/2024-07-12-unikraft-gsoc-test-mimalloc-on-unikraft.mdx diff --git a/content/blog/2024-06-16-unikraft-gsoc-port-mimalloc-to-unikraft.mdx b/content/blog/2024-06-16-unikraft-gsoc-port-mimalloc-to-unikraft.mdx index b5e6f92a..09cf4e59 100644 --- a/content/blog/2024-06-16-unikraft-gsoc-port-mimalloc-to-unikraft.mdx +++ b/content/blog/2024-06-16-unikraft-gsoc-port-mimalloc-to-unikraft.mdx @@ -1,5 +1,5 @@ --- -title: "GSoC'24: Porting the mimalloc memory allocator to Unikraft" +title: "GSoC'24: Porting the mimalloc Memory Allocator to Unikraft" description: | Different applications have different memory usage patterns and perform better when using dedicated memory allocators. Right now, the buddy allocator is the only @@ -13,6 +13,7 @@ tags: - gsoc - gsoc24 - allocators +- synchronization --- ## Project Overview @@ -77,3 +78,9 @@ My future work includes: Special thanks to Răzvan Vîrtan and Radu Nichita, my two amazing mentors, for their support along the way. I would also like to thank Razvan Deaconescu, Hugo Lefeuvre, Ștefan Jumarea, Marco Schlumpp, Sergiu Moga, and the entire Unikraft community for all the work, discussions, and guidance which made this project possible. + +## About Me + +I'm [Yang Hu](https://linkedin.com/yanghuu531), a first year graduate student at the University of Toronto. +I am enthusiastic about operating systems and building infrastructure software in general. +In my free time, I really love traveling and swimming. diff --git a/content/blog/2024-07-12-unikraft-gsoc-test-mimalloc-on-unikraft.mdx b/content/blog/2024-07-12-unikraft-gsoc-test-mimalloc-on-unikraft.mdx new file mode 100644 index 00000000..1ebc845a --- /dev/null +++ b/content/blog/2024-07-12-unikraft-gsoc-test-mimalloc-on-unikraft.mdx @@ -0,0 +1,146 @@ +--- +title: "GSoC'24: Testing the mimalloc Memory Allocator on Unikraft" +description: | + Different applications have different memory usage patterns and perform better + when using dedicated memory allocators. Right now, the buddy allocator is the only + available memory allocator used in Unikraft, so this GSoC project aims to + port more memory allocators to it, starting with mimalloc. +publishedDate: 2024-07-12 +image: /images/unikraft-gsoc24.png +authors: +- Yang Hu +tags: +- gsoc +- gsoc24 +- allocators +- synchronization +--- + +## Project Overview + +### Memory allocation in Unikraft + +Memory allocators have a significant impact on application performance. +[Research](https://dl.acm.org/doi/10.1145/378795.378821) have shown that programs can run as much as 60% faster just by switching to an appropriate memory allocator. +Unikraft currently supports only one general-purpose memory allocator, the buddy allocator. +This project aims to port [mimalloc](https://github.com/microsoft/mimalloc) (pronounced "me-malloc"), a high-performance general-purpose memory allocator developed by Microsoft, to Unikraft. +This is the first step in a series of efforts to provide Unikraft users with more memory allocators to choose from to optimize the performance of their applications. + +### Objectives + +[Hugo Lefeuvre](https://github.com/hlef) has made an effort to port mimalloc to Unikraft back in 2020 (see [this repo](https://github.com/unikraft/lib-mimalloc)). +However, as Unikraft has evolved significantly over the years, more work is needed to adapt the `lib-mimalloc` port to the latest Unikraft core. + +The steps of porting the memory allocators are as follows: + +1. Adapt the existing port, which uses `lib-newlib` and `lib-pthread-embedded` as the C library to use `lib-musl` instead +1. Patch the existing port of mimalloc (v1.6.3) to adapt to the latest Unikraft's memory allocation interface +1. Patch the latest mimalloc (v2.1.7) to the latest Unikraft version (v0.17.0) + +## Current Progress + +Last month, I successfully ported the mimalloc memory allocator to Unikraft, marked by a successful compilation of mimalloc `v1.6.3` against the latest Unikraft core (v0.17.0) with `lib-musl`. +Following that, this month I am focused on stress-testing the `mimalloc` memory allocator to validate its usability and correctness. + +### Benchmark + +After porting was completed, I tested the allocator by running a few `malloc()` and `free()` calls in a single threaded `main()` function. + +That having no problem, I ported `cache-scratch`, a multi-threaded memory allocation benchmark, to Unikraft. +This benchmarkthat exercises a heap's cache-locality and tests for [passive false sharing](https://psy-lob-saw.blogspot.com/2014/06/notes-on-false-sharing.html). +It creates a number of worker threads that allocate a given-sized object, repeatedly write on it, then free it. +An allocator that allows multiple threads to re-use the same small object (possibly all in one cache-line) will scale poorly, while an allocator like mimalloc, which gives each thread a private and page-aligned heap, will exhibit near-linear performance scaling. + +### Porting `cache-scratch` + +It is fairly intuitive to port the C program itself to Unikraft as the Musl library already provides most of what we need, including the `pthread` interface. +It would be ideal if we could separate the helper functions from the main logic and build the benchmark as a library (as we do need to test the memory allocator against more benchmarks in the future), because then we could just build an all-in-one image and run a large number of tests with different benchmarks and different parameters using an automated script. +However, I haven't figured out a good way to do it as [Unikraft's build system](https://unikraft.org/docs/internals/build-system#makefileuk) is quite complex. +So for now, the benchmark is ported as [a single `main.c` file](https://gist.github.com/huyang531/28a31fc2d9f348fafb5b9d8e6c9493d5) that will run as an application. + +### Testing + +I ran the `cache-scratch` benchmark with `-nthreads 4 -iterations 1000 -objSize 8 -repititions 100000`. +That is, we will create four worker threads, each iterating 1000 times the following operations: + +1. Allocate an 8-byte object +1. Repeatedly scratch (write then read) the bytes in the object, one byte at a time, for 100,000 times + +When the main thread waits for the worker threads by calling `pthread_join()`, a general protection fault would occur: + +```console +[ 19.545757] dbg: {r:0x1f5634,f:0x11d40} [libmimalloc] allocating 24 bytes from mimalloc +[ 19.560961] dbg: {r:0x1f5634,f:0x11d40} [libmimalloc] allocating 24 bytes from mimalloc +[ 19.576167] CRIT: {r:0x107d37,f:0x289f10} [libkvmplat] Unhandled Trap 13 (general protection), error code=0x0 +[ 19.593306] CRIT: {r:0x106e82,f:0x289ef0} [libkvmplat] RIP: 00000000001c2842 CS: 0008 +[ 19.609267] CRIT: {r:0x106ed7,f:0x289ef0} [libkvmplat] RSP: 0000000000011d70 SS: 0010 EFLAGS: 00010246 +[ 19.626078] CRIT: {r:0x106f23,f:0x289ef0} [libkvmplat] RAX: fffe796000000000 RBX: 0000000410450018 RCX: 0000000000000000 +[ 19.643706] CRIT: {r:0x106f6f,f:0x289ef0} [libkvmplat] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 +[ 19.661342] CRIT: {r:0x106fbb,f:0x289ef0} [libkvmplat] RBP: 0000000000011da0 R08: 00000000ffffffff R09: 0000000000000000 +[ 19.678988] CRIT: {r:0x107007,f:0x289ef0} [libkvmplat] R10: 0000000000133c42 R11: 000000000000002d R12: 0000000000011df0 +[ 19.696691] CRIT: {r:0x107053,f:0x289ef0} [libkvmplat] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 +[ 19.714323] CRIT: {r:0x107d8f,f:0x289f20} [libkvmplat] Crashing +``` + +### Debugging + +A big portion of my work involves [debugging the unikernel](https://unikraft.org/guides/debugging). +For instance, I used `addr2line` to reveal the above error: + +```console +addr2line -e workdir/build/helloworld-pg_qemu-x86_64.dbg 00000000001c2842 +/home/huyang/code/gsoc/apps/helloworld-pg/workdir/build/libmusl/origin/musl-1.2.3//src/thread/pthread_join.c:16 +``` + +Then I used GDB to probe deeper and confirm the error: + +```console +(gdb) n +16 while ((state = t->detach_state) && r != ETIMEDOUT && r != EINVAL) { +(gdb) p t +$1 = (pthread_t) 0xfffe796000000000 +(gdb) p t->detach_state +Cannot access memory at address 0xfffe796000000038 +``` + +This indicates that `t` is a corrupted pointer, and more investigation is needed to find out how memory was tampered. + +### Other work + +While testing the allocator, I noticed that sometimes the boot process gets stuck at this test: +`posix_futex_testsuite->test_cmp_requeue_two_waiters_no_requeue`. +Backtracing the call stack reviews that it happens because once one of the Waiter threads blocks at the `futex()` call, other threads (including the `init` thread, the other Waiter, and the Requeuer thread) will never be given a chance to run. +Experiments show that it only happens when the QEMU virtual machine's memory size is smaller than a threshold (in my case, it is 427M), which is interesting because it isn't straightforward how the VM's memory size could impact the behaviour of the `futex()` system call. + +I also added tips about turning off compiler optimization for debugging [here](https://github.com/unikraft/docs/pull/442). + +## Next steps + +First, I will continue working on the `cache-scratch` benchmark: + +1. Debug `cache-scratch`: Figure out what went wrong in the multi-threaded test +1. Run `cache-scratch` with different sets of arguments to validate the memory allocator under different conditions + +After that, I will test mimalloc with other more complicated benchmarks, which may include: + +- `threadtest`: tests general scalability of the allocator; +Each thread repeatedly allocates a number of number of objects, does a fixed amount of computation, and then deletes its objects. +- `linux-scalability`: a basic scalability test from Linux libc malloc testing, similar to `threadtest` except that there is no extra 'work' between allocations and frees so contention may be higher. +- `cache-thrash`: tests for active false sharing +- `larson`: simulates a server by having each thread allocate and deallocate objects and then transfer some objects to other threads to be freed +- `phong` - a benchmark that randomly selects allocation sizes, and randomly chooses an allocated item to free + +Once fully tested, I will continue on with the work items outlined in [my previous post](https://unikraft.org/blog/2024-06-16-unikraft-gsoc-port-mimalloc-to-unikraft#next-steps). + +Meanwhlie, I will also try to debug the `test_cmp_requeue_two_waiters_no_requeue` to the best of my ability. + +## Acknowledgements + +Special thanks to Răzvan Vîrtan and Radu Nichita, my two amazing mentors, for their support along the way. +I would also like to thank Răzvan Deaconescu, Hugo Lefeuvre, Ștefan Jumarea, Marco Schlumpp, Sergiu Moga, and the entire Unikraft community for all the work, discussions, and guidance which made this project possible. + +## About Me + +I'm [Yang Hu](https://linkedin.com/yanghuu531), a first year graduate student at the University of Toronto. +I am enthusiastic about operating systems and building infrastructure software in general. +In my free time, I really enjoy traveling and swimming. From 2c16ba1ed9e327137087f5037e42be24abac9ecd Mon Sep 17 00:00:00 2001 From: Thassilo Schulze Date: Fri, 31 May 2024 12:59:23 +0200 Subject: [PATCH 07/15] fix: landing page Nginx catalog link Signed-off-by: Thassilo Schulze --- src/components/landing/catalog-strip.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/landing/catalog-strip.tsx b/src/components/landing/catalog-strip.tsx index 9d832b4d..29f9a505 100644 --- a/src/components/landing/catalog-strip.tsx +++ b/src/components/landing/catalog-strip.tsx @@ -235,7 +235,7 @@ export function CatalogStrip(props: BoxProps) { */} From 70e3bcc6be3e6a1ab1e54a494bf98acf8be52d9e Mon Sep 17 00:00:00 2001 From: Luca Terracciano Date: Sat, 30 Mar 2024 11:03:32 +0100 Subject: [PATCH 08/15] guides: Fix typos in baby-steps and catalog-behind-the-scenes Signed-off-by: Luca Terracciano --- content/guides/baby-steps.mdx | 10 +++++----- content/guides/catalog-behind-the-scenes.mdx | 18 +++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/content/guides/baby-steps.mdx b/content/guides/baby-steps.mdx index 703012ae..f18117f8 100644 --- a/content/guides/baby-steps.mdx +++ b/content/guides/baby-steps.mdx @@ -5,12 +5,12 @@ description: | --- It does so in the context of a vibrant community consisting of highly skilled software engineers, researchers, teachers, students and hobbyists. -Periodic meetings, hackathons and a consistent presence in open source events are central to the well functioning of the community. +Periodic meetings, hackathons and a consistent presence in open-source events are central to the well functioning of the community. -We use a guidelines for development and maintenance to ensure the creation of high quality code. +We use guidelines for development and maintenance to ensure the creation of high-quality code. Public releases are planned to happen once every two months. -In general, we aim for a public release to happen at the last Monday of each odd month (January, March, May, etc.) +In general, we aim for a public release to happen on the last Monday of each odd month (January, March, May, etc.) -We welcome contributors and users on Discord and on GitHub. -If you are looking for a fun technical project in the area of operating systems, virtualization, come aboard on Discord. +We welcome contributors and users on Discord and GitHub. +If you are looking for a fun technical project in the area of operating systems, and virtualization, come aboard on Discord. diff --git a/content/guides/catalog-behind-the-scenes.mdx b/content/guides/catalog-behind-the-scenes.mdx index 37b85ee0..f18a0742 100644 --- a/content/guides/catalog-behind-the-scenes.mdx +++ b/content/guides/catalog-behind-the-scenes.mdx @@ -5,7 +5,7 @@ description: | It shows what is happening behind the scenes and how you can get more control on the build and run phases. --- -The [guide on using the application catalog](/guides/using-the-app-catalog) provides the user-friendly information on using the Unikraft application registry and the [`catalog` repository](https://github.com/unikraft/catalog). +The [guide on using the application catalog](/guides/using-the-app-catalog) provides user-friendly information on using the Unikraft application registry and the [`catalog` repository](https://github.com/unikraft/catalog). It presents some hints into what's happening behind the scenes, but it aims to keep the user away for this. This guide takes a deep dive into the internals of configuring, building and running Unikernel applications from the catalog. It is aimed for those more technically inclined who would be interested in understanding what's happening behind the scenes and maybe [contribute to the application catalog](/docs/contributing/adding-to-the-app-catalog). @@ -38,7 +38,7 @@ The `Kraftfile` defines the: - root filesystem used to build the (embedded) initrd The root filesystem is generated from a `Dockerfile` specification, as configured in the `Kraftfile`. -The `Dockerfile` specification collects the required files (binary executable, depending libraries, configuration files, data files): +The `Dockerfile` specification collects the required files (binary executable, depending libraries, configuration files, and data files): ```dockerfile FROM --platform=linux/x86_64 nginx:1.25.3-bookworm AS build @@ -141,13 +141,13 @@ Query it using: curl http://localhost:8080 ``` -If you want use a bridge interface, first create the bridge interface as `root` (prefix with `sudo` if required): +If you want to use a bridge interface, first create the bridge interface as `root` (prefix with `sudo` if required): ```bash kraft net create -n 172.44.0.1/24 virbr0 ``` -An the run manually with `qemu-system-x86_64` as `root` (prefix with `sudo` if required): +And then run manually with `qemu-system-x86_64` as `root` (prefix with `sudo` if required): ```bash qemu-system-x86_64 \ @@ -171,7 +171,7 @@ To close the running QEMU instance, use `Ctrl+a x` in the QEMU console. ## HTTP Go Server For the [`http-go1.21` bincompat example](https://github.com/unikraft/catalog/tree/main/examples/http-go1.21), there is no build phase, only a run phase. -The example it's using a prebuilt kernel image. +The example is using a prebuilt kernel image. The prebuilt [`base` kernel image](https://github.com/unikraft/catalog/tree/main/library/base) is pulled from the registry, from `unikraft.org/base`. This happens during the run phase. @@ -197,7 +197,7 @@ The `Kraftfile` defines: - the available run targets: currently only x86_64-based builds are available, and only KVM-based builds, using QEMU or Firecracker The root filesystem is generated from a `Dockerfile` specification, as configured in the `Kraftfile`. -The `Dockerfile` specification collects the required files (binary executable, depending libraries, configuration files, data files): +The `Dockerfile` specification collects the required files (binary executable, depending libraries, configuration files, and data files): ```dockerfile FROM golang:1.21.3-bookworm AS build @@ -243,7 +243,7 @@ kraft run -W -p 8080:8080 . 1. It pulls the kernel package from the registry, from `unikraft.org/base:latest`. 1. It generates the root filesystem, via BuildKit from the `Dockerfile` specification. - The generation of the root filesystem implies the building the Go source code files into a binary executable (`ELF`). + The generation of the root filesystem implies the building of the Go source code files into a binary executable (`ELF`). The executable, together with the depending libraries is then extracted into the root filesystem. 1. It packs the root filesystem in an initial ramdisk (initrd). 1. It runs the kernel attaching the initrd and using the command line in the specification: `/http_server`. @@ -316,13 +316,13 @@ Query it using: curl http://localhost:8080 ``` -If you want use a bridge interface, first create the bridge interface as `root` (prefix with `sudo` if required): +If you want to use a bridge interface, first create the bridge interface as `root` (prefix with `sudo` if required): ```bash kraft net create -n 172.44.0.1/24 virbr0 ``` -An the run manually with `qemu-system-x86_64` as `root` (prefix with `sudo` if required): +And then run manually with `qemu-system-x86_64` as `root` (prefix with `sudo` if required): ```bash qemu-system-x86_64 \ From e941c151868f0f9b6b8d9017576577cde4180763 Mon Sep 17 00:00:00 2001 From: Luca Terracciano Date: Sat, 30 Mar 2024 11:03:57 +0100 Subject: [PATCH 09/15] docs/internals: Fix typos in writing-tests.mdx Signed-off-by: Luca Terracciano --- content/docs/internals/writing-tests.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/internals/writing-tests.mdx b/content/docs/internals/writing-tests.mdx index c93ee61d..d439b174 100644 --- a/content/docs/internals/writing-tests.mdx +++ b/content/docs/internals/writing-tests.mdx @@ -46,7 +46,7 @@ Generally, the following pattern is used for test suites: `$LIBNAME_$TESTSUITENAME_testsuite` -An the following for test cases: +And the following for test cases: `$LIBNAME_test_$TESTCASENAME` From f08e3df17caf831fd0708868b748adf4bc7541c7 Mon Sep 17 00:00:00 2001 From: Luca Terracciano Date: Sat, 30 Mar 2024 11:04:18 +0100 Subject: [PATCH 10/15] docs/contributing: Fix typos in adding-to-the-app-catalog Signed-off-by: Luca Terracciano --- content/docs/contributing/adding-to-the-app-catalog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/contributing/adding-to-the-app-catalog.mdx b/content/docs/contributing/adding-to-the-app-catalog.mdx index a8b37c59..42ea03e5 100644 --- a/content/docs/contributing/adding-to-the-app-catalog.mdx +++ b/content/docs/contributing/adding-to-the-app-catalog.mdx @@ -17,7 +17,7 @@ Adding a new application requires the creation of: Or the source code files may be scripts (in scripted / interpreted programming languages) that implement the application. - [optional] Configuration and data files used by the application. - A `Dockerfile` to generate the filesystem for the application. - The filesystem consists of the application binary executable (`ELF`) or scripts, depending libraries, configuration files, data files. + The filesystem consists of the application binary executable (`ELF`) or scripts, depending libraries, configuration files, and data files. These files may either be pulled from an existing Docker image, or they may be build / copied from (source code) files provided by the user. - A `Kraftfile` that details the build and run specification of the application. - A `README.md` files that documents the steps required to build, run and test the application. From 26984cdb545b6b8736f54c05b41ab1013d87ec95 Mon Sep 17 00:00:00 2001 From: Luca Terracciano Date: Sat, 30 Mar 2024 11:04:43 +0100 Subject: [PATCH 11/15] docs/cli: Fix typos in install.mdx Signed-off-by: Luca Terracciano --- content/docs/cli/install.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/cli/install.mdx b/content/docs/cli/install.mdx index 8ca4906f..f6de8029 100644 --- a/content/docs/cli/install.mdx +++ b/content/docs/cli/install.mdx @@ -20,7 +20,7 @@ Simply run the following command to get started: curl --proto '=https' --tlsv1.2 -sSf https://get.kraftkit.sh | sh ``` -The above script will identify your host and guide you through an the +The above script will identify your host and guide you through the installation process, including suggestions for how to receive updates. The installer will try to use your native package manager. From 73ee65e0b4d46c5df1c43ea5e7481a32644b02a5 Mon Sep 17 00:00:00 2001 From: Luca Terracciano Date: Sat, 30 Mar 2024 11:05:04 +0100 Subject: [PATCH 12/15] community: Fix typos in about.mdx Signed-off-by: Luca Terracciano --- content/community/about.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/community/about.mdx b/content/community/about.mdx index 5661c079..4c8751a7 100644 --- a/content/community/about.mdx +++ b/content/community/about.mdx @@ -11,7 +11,7 @@ software engineers, researchers, teachers, students and hobbyists. Periodic meetings, hackathons and a consistent presence in open source events are central to the well functioning of the community. -We use a guidelines for development and maintenance to ensure the creation of +We use guidelines for development and maintenance to ensure the creation of high quality code. Public releases are planned to happen once every two months. In general, we aim From 746cf167092a18b351aa118f2296f3ee3828ba44 Mon Sep 17 00:00:00 2001 From: Alexander Jung Date: Thu, 25 Jul 2024 19:31:10 +0200 Subject: [PATCH 13/15] refactor: Update Unikraft Cloud banner Signed-off-by: Alexander Jung --- content/docs/cli/running.mdx | 2 +- content/docs/getting-started/index.mdx | 2 +- i18n/ui.json | 2 +- pages/blog/index.tsx | 4 +- pages/index.tsx | 4 +- ...oud-strip.tsx => unikraft-cloud-strip.tsx} | 14 +++---- src/components/logos/company-kraftcloud.svg | 29 -------------- .../logos/company-unikraft-cloud.svg | 40 +++++++++++++++++++ src/components/logos/index.ts | 2 +- .../mdx-components/mdx-components.tsx | 4 +- ...d-banner.tsx => unikraft-cloud-banner.tsx} | 14 +++---- ...raftcloud-ad.tsx => unikraft-cloud-ad.tsx} | 12 +++--- 12 files changed, 70 insertions(+), 59 deletions(-) rename src/components/landing/{kraftcloud-strip.tsx => unikraft-cloud-strip.tsx} (82%) delete mode 100644 src/components/logos/company-kraftcloud.svg create mode 100644 src/components/logos/company-unikraft-cloud.svg rename src/components/mdx-components/{kraftcloud-banner.tsx => unikraft-cloud-banner.tsx} (79%) rename src/components/{kraftcloud-ad.tsx => unikraft-cloud-ad.tsx} (81%) diff --git a/content/docs/cli/running.mdx b/content/docs/cli/running.mdx index 2cb9690c..81d2f53d 100644 --- a/content/docs/cli/running.mdx +++ b/content/docs/cli/running.mdx @@ -10,7 +10,7 @@ At present, `kraft` only supports running instances that target the KVM hypervis We plan on adding support for additional hypervisors including Xen, VMware and Hyper-V. For more information the progress of these hypervisors, you can [track the relevant GitHub issue](#). - + There are multiple ways to instantiate a unikernel with `kraft`. The subcommand `kraft run` has been designed to be context-aware and can be used in different ways to launch unikernels depending on what is provided to it. diff --git a/content/docs/getting-started/index.mdx b/content/docs/getting-started/index.mdx index 22a57d50..ba4bc1fc 100644 --- a/content/docs/getting-started/index.mdx +++ b/content/docs/getting-started/index.mdx @@ -49,7 +49,7 @@ We've put together a number of guides in case you'd like to know more about Unik * [Using the Application Catalog](/guides/using-the-app-catalog) * [Behind the Scenes with the Application Catalog](/guides/catalog-behind-the-scenes) - + ## Contribute diff --git a/i18n/ui.json b/i18n/ui.json index b3232a3f..25957472 100644 --- a/i18n/ui.json +++ b/i18n/ui.json @@ -179,7 +179,7 @@ "description": "Feel free to ask questions, report issues, and meet new people.", "join-discord": "Join us on Discord!" }, - "kraftcloud-strip": { + "unikraft-cloud-strip": { "heading": "Get the most out of your application and Unikraft", "description": "The only cloud platform scaling to zero, with 'only on' pricing, and cold-starting in 20ms.", "learn-more": "Learn more" diff --git a/pages/blog/index.tsx b/pages/blog/index.tsx index 12864197..1b40b9a1 100644 --- a/pages/blog/index.tsx +++ b/pages/blog/index.tsx @@ -33,7 +33,7 @@ import { relativeTimeFromDates } from 'utils/to-relative-time'; import { IconType } from 'react-icons/lib' import { ReactElement } from 'react' import { DiscordCard } from 'components/discord-card' -import { KraftCloudAd } from 'components/kraftcloud-ad' +import { UnikraftCloudAd } from 'components/unikraft-cloud-ad' const BlogTags = (props: any) => { const { marginTop = 0, tags } = props @@ -320,7 +320,7 @@ function Blogs() { - + diff --git a/pages/index.tsx b/pages/index.tsx index ae1b5cec..7a35df58 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Footer } from 'components/footer' import LandingHero from 'components/landing-hero' -import { KraftCloudStrip } from 'components/landing/kraftcloud-strip' +import { UnikraftCloudStrip } from 'components/landing/unikraft-cloud-strip' import { BlueprintStrip } from 'components/landing/blueprint-strip' import { KraftKitStrip } from 'components/landing/kraftkit-strip' import { CatalogStrip } from 'components/landing/catalog-strip' @@ -20,7 +20,7 @@ const HomePage = () => { />

- + diff --git a/src/components/landing/kraftcloud-strip.tsx b/src/components/landing/unikraft-cloud-strip.tsx similarity index 82% rename from src/components/landing/kraftcloud-strip.tsx rename to src/components/landing/unikraft-cloud-strip.tsx index 10882377..864318a9 100644 --- a/src/components/landing/kraftcloud-strip.tsx +++ b/src/components/landing/unikraft-cloud-strip.tsx @@ -6,11 +6,11 @@ import { BoxProps, chakra, } from '@chakra-ui/react'; -import { CompanyKraftCloud } from 'components/logos' +import { CompanyUnikraftCloud } from 'components/logos' import Container from 'components/container' import { t } from 'utils/i18n' -export function KraftCloudStrip(props: BoxProps) { +export function UnikraftCloudStrip(props: BoxProps) { return ( - + - {t('component.kraftcloud-strip.heading')} + {t('component.unikraft-cloud-strip.heading')} - {t('component.kraftcloud-strip.description')} + {t('component.unikraft-cloud-strip.description')} @@ -60,7 +60,7 @@ export function KraftCloudStrip(props: BoxProps) { justifyContent='center' display='inline-flex' alignItems='center' - href='https://kraft.cloud' + href='https://unikraft.cloud' rel='noopener' target='_blank' fontWeight='bold' @@ -74,7 +74,7 @@ export function KraftCloudStrip(props: BoxProps) { transition='all 0.1s ease-in-out' _hover={{ textDecoration: 'none', translateY: '-2px', shadow: 'lg' }} > - {t('component.kraftcloud-strip.learn-more')} + {t('component.unikraft-cloud-strip.learn-more')} diff --git a/src/components/logos/company-kraftcloud.svg b/src/components/logos/company-kraftcloud.svg deleted file mode 100644 index 04d23d43..00000000 --- a/src/components/logos/company-kraftcloud.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/components/logos/company-unikraft-cloud.svg b/src/components/logos/company-unikraft-cloud.svg new file mode 100644 index 00000000..cbcbec4b --- /dev/null +++ b/src/components/logos/company-unikraft-cloud.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/logos/index.ts b/src/components/logos/index.ts index 78ddda3c..200bb73c 100644 --- a/src/components/logos/index.ts +++ b/src/components/logos/index.ts @@ -11,7 +11,7 @@ export { default as CompanyNEC } from './company-nec.svg'; export { default as CompanyOpensynergy } from './company-opensynergy.svg'; export { default as CompanyOvhcloud } from './company-ovhcloud.svg'; export { default as CompanyOvhcloudSm } from './company-ovhcloud-sm.svg'; -export { default as CompanyKraftCloud } from './company-kraftcloud.svg'; +export { default as CompanyUnikraftCloud } from './company-unikraft-cloud.svg'; export { default as LinuxFoundation } from './linux-foundation.svg'; export { default as PoweredByUnikraftInverse } from './powered-by-unikraft-inverse.svg'; export { default as UnicoreProject } from './unicore-project.svg'; diff --git a/src/components/mdx-components/mdx-components.tsx b/src/components/mdx-components/mdx-components.tsx index 815c22ce..44f0d5e7 100644 --- a/src/components/mdx-components/mdx-components.tsx +++ b/src/components/mdx-components/mdx-components.tsx @@ -11,7 +11,7 @@ import CodeBlock from './codeblock/codeblock' import ComponentLinks from './component-links' import { VideoPlayer } from './video-player' import AsciinemaPlayer from 'components/asciinema-player' -import { KraftCloudBanner } from './kraftcloud-banner' +import { UnikraftCloudBanner } from './unikraft-cloud-banner' const { Accordion, @@ -180,7 +180,7 @@ export const MDXComponents = { LanguageLinks, VideoPlayer, AspectRatio, - KraftCloudBanner, + UnikraftCloudBanner, JoinCommunityCards, FaqList: ({children, ...props}) => { return ( diff --git a/src/components/mdx-components/kraftcloud-banner.tsx b/src/components/mdx-components/unikraft-cloud-banner.tsx similarity index 79% rename from src/components/mdx-components/kraftcloud-banner.tsx rename to src/components/mdx-components/unikraft-cloud-banner.tsx index bc2e88e1..28ef8786 100644 --- a/src/components/mdx-components/kraftcloud-banner.tsx +++ b/src/components/mdx-components/unikraft-cloud-banner.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { Box, Heading, Flex, chakra } from '@chakra-ui/react'; -import { CompanyKraftCloud } from 'components/logos'; +import { CompanyUnikraftCloud } from 'components/logos'; import { t } from 'utils/i18n'; -export const KraftCloudBanner = ({ title, url, children, ...rest }: { +export const UnikraftCloudBanner = ({ title, url, children, ...rest }: { title: { string } url: { string } children: React.ReactNode @@ -29,7 +29,7 @@ export const KraftCloudBanner = ({ title, url, children, ...rest }: { alignItems='start' > - + - {t('component.kraftcloud-strip.learn-more')} + {t('component.unikraft-cloud-strip.learn-more')} - {title || t('component.kraftcloud-strip.heading')} + {title || t('component.unikraft-cloud-strip.heading')} - {children || t('component.kraftcloud-strip.description')} + {children || t('component.unikraft-cloud-strip.description')} ) diff --git a/src/components/kraftcloud-ad.tsx b/src/components/unikraft-cloud-ad.tsx similarity index 81% rename from src/components/kraftcloud-ad.tsx rename to src/components/unikraft-cloud-ad.tsx index b64f43a9..a8846f71 100644 --- a/src/components/kraftcloud-ad.tsx +++ b/src/components/unikraft-cloud-ad.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { Box, VStack, Heading, Flex, chakra } from '@chakra-ui/react'; -import { CompanyKraftCloud } from 'components/logos'; +import { CompanyUnikraftCloud } from 'components/logos'; import { t } from 'utils/i18n'; -export const KraftCloudAd = () => { +export const UnikraftCloudAd = () => { return ( { w={'100%'} > - + - {t('component.kraftcloud-strip.heading')} + {t('component.unikraft-cloud-strip.heading')} - {t('component.kraftcloud-strip.description')} + {t('component.unikraft-cloud-strip.description')} { transition='all 0.1s ease-in-out' _hover={{ textDecoration: 'none', translateY: '-2px', shadow: 'lg' }} > - {t('component.kraftcloud-strip.learn-more')} + {t('component.unikraft-cloud-strip.learn-more')} ) From 803e4a1bc025439869d8c021631269094fda1d70 Mon Sep 17 00:00:00 2001 From: Alexander Jung Date: Thu, 25 Jul 2024 19:48:30 +0200 Subject: [PATCH 14/15] fix(package.json): Pin @docsearch/react to prevent deprecation Signed-off-by: Alexander Jung --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 43353dd8..472be0a1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@chakra-ui/utils": "2.0.14", "@codesandbox/sandpack-react": "^1.2.2", "@codesandbox/sandpack-themes": "^1.0.0", - "@docsearch/react": "^3.0.0", + "@docsearch/react": "3.6.0", "@docusaurus/utils": "2.3.0", "@emotion/react": "^11.10.0", "@emotion/styled": "^11.9.3", From 7aadb340304f2a9cb4c5af1f754dd5c58ca4a20f Mon Sep 17 00:00:00 2001 From: Maria Pana Date: Thu, 1 Aug 2024 19:15:08 +0300 Subject: [PATCH 15/15] blog: Add the third GSoC blog post about Multiboot2 Add the third GSoC blog post about Multiboot2 showcasing the progress made during the third set of 3 weeks. Signed-off-by: Maria Pana --- content/blog/2024-08-01-gsoc-multiboot2.mdx | 97 +++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 content/blog/2024-08-01-gsoc-multiboot2.mdx diff --git a/content/blog/2024-08-01-gsoc-multiboot2.mdx b/content/blog/2024-08-01-gsoc-multiboot2.mdx new file mode 100644 index 00000000..c567c8a7 --- /dev/null +++ b/content/blog/2024-08-01-gsoc-multiboot2.mdx @@ -0,0 +1,97 @@ +--- +title: "Multiboot2 Support in Unikraft" +description: | + In this blog post, I go over the debugging process and the progress made in the implementation of Multiboot2 support these past three weeks of GSoC. +publishedDate: 2024-08-01 +image: /images/unikraft-gsoc24.png +tags: +- gsoc +- gsoc24 +- multiboot2 +- booting +authors: +- Maria Pana +--- + +Recalling my [previous blog post](https://unikraft.org/blog/2024-07-10-gsoc-multiboot2): + +> With the Multiboot2 header issue resolved, the ELF file is now generated correctly. + +Boy, was I wrong! +The past three weeks have been a rollercoaster of debugging, testing, and more debugging. +That being said, considerable progress has been made, which will be the focus of this update post. + +## The Debugging Chronicles + +In reviewing the issues with the infinite loop, I realized that the root cause was the omission of the end tag in the Multiboot2 header. +Multiboot2 headers require a specific ending structure to signal the completion of the header sequence. +Without this tag, the bootloader, GRUB in this case, continues to search for it indefinitely, leading to the infinite loop. +Now that the issue was resolved, a new contender emerged: the "out of memory" error. +Let the games begin! + +### The "Out of Memory" Error + +The "out of memory" error was a puzzling one. +The first instinct was to increase the memory size, but no matter how much memory was allocated, the error persisted. +This meant that either something was null or the area where the memory was being allocated was already populated due to possible fragmentation. + +Since the error was occuring in the `grub_relocator_alloc_chunk_align` function, I decided to find its caller to reconstitute the flow and logic leading here. +There were several difficulties with debugging this. + +Firstly, I was connected to a 64-bit `gdb` server, but the error was occurring in 32-bit mode so the registers were all messed up. +To make life a bit easier, I ended up using `qemu-system-i386` instead of `qemu-system-x86_64`. +Sure, I couldn't boot Unikraft like this, but I could at least debug the issue at hand. + +Additionally, I had no symbols. +Therefore, I had to load them manually using `add-symbol-file` in `gdb` for each module I was interested in. + +It is important to mention what I mean by "module". +GRUB has an interesting way of organizing its modules and object files. +This might be misleading, since the extensions are `.mod` and `.module`. +In short, `.mod` files are the final binary that will be loaded at boot time, while `.module`s are intermediate unstripped object files that contains symbol and debug information. +For the purpose of debugging, I needed the `.module` files. + +Obviously, the first module I looked into was `relocator.module`. +I then needed to determine the base address where I had added my breakpoint. +The plan was to: +- print the address of the function using `__builtin_return_address(0)` +- object dump the module to find the offset of the function +- get the base address by substracting the offset from the address + +Pretty straightforward, right? +Normally, yes. +But here... +Well, not quite. +After performing this process with the printed address, `gdb` was showing code from `malloc_in_range` instead of `grub_relocator_alloc_chunk_align`. +Additionally, it did not match the assembly (which was an infinite loop with a dummy value). +This was peculiar to say the least. +So, without much hope of anything changing, I tried the address of the line I was currently on and, lo and behold, it worked! + +I could finally backtrace and see the flow of the code, which also solved the mystery of why the previous attempt failed in the first place. +The address printed by `__builtin_return_address(0)` was that of a wrapper function which called `grub_relocator_alloc_chunk_align`. +`grub_relocator_alloc_chunk_align_safe` is defined in `/include/grub/relocator.h`. +Therefore, the printed address was correct, since I was in fact in the `_safe` counterpart. +And normally, had it not been because of the definition in a header file, the address would have matched. +But after the preprocessor replaced the call with the definition including `grub_relocator_alloc_chunk_align`, the address no longer matched. + +The backtrace also revealed the culprit for the "out of memory" error: the `grub_relocator32_boot` function had been called earlier with a null relocator. +To see when the relocator changed to null, I set a watchpoint, which quickly indicated the obstacle and allowed for an easy fix. + +Drumroll, please... +Ladies and gentlemen, we successfully booted into Unikraft! 🎉 + +## Monkey see, Monkey do + +Now that GRUB collected the necessary information in the form of the `mbi`, it is time to pass it to Unikraft. +This is done by calling the `multiboot2_entry` function, which is defined in `multiboot2.c`. + +The `multiboot2_entry` function is responsible for processing the Multiboot2 information and setting up the system for the kernel. +This involves parsing the tags and setting up the memory regions, boot command line, and other essential parameters. + +The focus now shifts to implementing the `multiboot2.c` file and testing the new modifications. +Considering Unikraft's ecosystem, the function handles three tags: `MULTIBOOT_TAG_TYPE_CMDLINE`, `MULTIBOOT_TAG_TYPE_MODULE` (mainly for `initrd`), and `MULTIBOOT_TAG_TYPE_MMAP`. + +## Next Steps + +Now being able to boot into Unikraft, I aim to refine how each scenario for the tags is implemented in order to have a functional `helloworld` application. +Until then, stay tuned for the next update!