Hey 👋
It’s me again, still writing about Rust before actually going beyond the hello world part of the documentation, but I will let you know why.
I am currently going through Chris Simmonds’ terrific book “Mastering Embedded Linux Programming“, and while reading through the chapter covering the kernel configuration and compilation , I stumbled upon a nice youtube video from the linux foundation covering the same topic but using the Rust fork as the codebase.
So, since I have an interest in Rust too, I said why not combining both ? Which was actually a good choice because both the video and the book covered each other gaps.
While watching the video, I took a note of most of the commands in a github gist which I think should be pretty useful for my future self and and other people too. I thought also of taking the notes here because why not ..
#
# Instructions for the video https://www.youtube.com/watch?v=tPs1uRqOnlk excluding setting up the env ( e.g. installing Rust and llvm)
#
#
# Kernel
#
$ git clone --depth=1 https://github.com/Rust-for-Linux/linux.git
$ cd linux/
$ make allnoconfig qemu-busybox-min.config
$ make allnoconfig qemu-busybox-min.config rust.config
$ make LLVM=1 rustavailable # should say Rust is available if you have all dependencies
$ make LLVM=1 -j4
#
# Busybox
#
$ cd busybox
$ git clone --depth=1 https://github.com/mirror/busybox.git
$ make defconfig
$ make menuconfig # then from settings select use static libraries
# make -j4
$ cd ./_install/
$ find . | cpio -H newc -o | gzip > ../ramdisk.img
#
# running qemu
#
$ cd linux/
$ qemu-system-x86_64 -nographic -kernel vmlinux # should panic
$ qemu-system-x86_64 -nographic -kernel vmlinux -initrd ../busybox/ramdisk.img # should start
#
# adding proc filesystem to enable ps
#
$ cd busybox/_install/
$ vim etc/init.d/rcS
# then add this content inside
# mkdir -p /proc
# mount -t proc none /proc
$ find . | cpio -H newc -o | gzip > ../ramdisk.img
$ qemu-system-x86_64 -nographic -kernel vmlinux -initrd ../busybox/ramdisk.img # ps should work
#
# enabling a rust sample kernel module
#
$ make LLVM=1 menuconfig
# then select the samples from kernel hacking --> samples --> rust samples
#
# enable networking
#
$ cd busybox/_install/
$ vim etc/init.d/rcS
# then add this content inside to enable loopback interface
# ifconfig lo up
# udhcpc -i eth0
$ mkdir -p usr/share/udhcpc
$ cp ../examples/udhcp/simple.script usr/share/udhcpc/default.script
$ qemu-system-x86_64 -nographic -kernel vmlinux -initrd ../busybox/ramdisk.img -nic user,model=rtl8139
$ qemu-system-x86_64 -nographic -kernel vmlinux -initrd ../busybox/ramdisk.img -nic user,model=rtl8139,hostfwd=tcp::5556-:8080