Embedded Linux From Scratch in 45 Minutes (On RISC-V)
Embedded Linux From Scratch in 45 Minutes (On RISC-V)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 1/1
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 2/1
Michael Opdenacker
https://elixir.bootlin.com
▶ Co-author of Bootlin’s freely available embedded Linux Identifier
search
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 3/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
Introduction
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 4/1
What I like in embedded Linux
▶ Linux is perfect for operating devices with a fixed set of features. Unlike on the
desktop, Linux is almost in every existing system.
▶ Embedded Linux makes Linux easy to learn: just a few programs and libraries are
sufficient. You can understand the usefulness of each file in your filesystem.
▶ The Linux kernel is standalone: no complex dependencies against external
software. The code is in C!
▶ Linux works with just a few MB of RAM and storage
▶ There’s a new version of Linux every 2-3 months.
▶ Relatively small development community. You end up meeting lots of familiar
faces at technical conferences (like the Embedded Linux Conference).
▶ Lots of opportunities (and funding available) for becoming a contributor (Linux
kernel, bootloader, build systems...).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 5/1
Reviving an old presentation
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 6/1
Things that changed since 2005
In the Linux kernel:
▶ Linux 2.6.x →5.x
▶ tar →git
In the embedded environment ▶ Linux is now everywhere, no need to
▶ The Maker movement convince customers to use it. It’s even
▶ Cheap development boards easier and easier to convince then to
500+ EUR →50-100 EUR fund contributions to the official
▶ The rise of Open Hardware version.
(Arduino, Beaglebone Black...) ▶ devtmpfs: automatically creates device
▶ RISC-V: a new open-source hardware files
instruction set architecture ▶ ARM and other architectures: devices
described by the Device Tree instead
of C code
And many more!
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 7/1
RISC-V: a new open-source Instruction Set Architecture (ISA)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 8/1
How to use RISC-V with Linux?
Hardware is now getting available
▶ Icicle kit: with Microchip’s PolarFire SoC and an FPGA with
254 K gates. Sold at 499 USD at CrowdSupply:
https://frama.link/dK1oanrd
▶ Boards with the Kendryte K210 SoC. Sipeed MAix BiT only
costs 13 USD at Seed Studio:
https://frama.link/QhBdPjsm. Supported by Linux 5.8
but limited, but its MMU is not supported by Linux. PolarFire SoC Icicle kit from Microchip
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 9/1
Things to build today
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 10/1
Embedded Linux - host and target
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 11/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
Cross-compiling toolchain
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 12/1
What’s a cross-compiling toolchain?
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 13/1
Why generate your own cross-compiling toolchain?
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 14/1
Choosing the C library
Application
▶ Provides the well-known standard C API to ease POSIX-compatible
n
tio
nc lls
application development
fu
ca
BusyBox
Linux
memory
et al.
manager
Linux-specific
Application
supporting RISC-V 64. Not supported by Buildroot on
this platform though.
▶ musl: great for embedded use too, more recent Source: Wikipedia
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 15/1
Generating a RISC-V musl toolchain with Buildroot
output/images/riscv64-buildroot-linux-musl_sdk-
buildroot.tar.gz
▶ Extract the archive in a suitable directory, and in the
extracted directory, run: ./relocate-sdk.sh
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 16/1
Testing the toolchain
▶ Create a new riscv64-env.sh file you can source to set environment variables
for your project:
export PATH=$HOME/toolchain/riscv64-buildroot-linux-musl_sdk-buildroot/bin:$PATH
▶ Run source riscv64-env.sh, take a hello.c file and test your new compiler:
We are compiling statically so far to avoid having to deal with shared libraries.
▶ Test your executable with QEMU in user mode:
$ qemu-riscv64 hello
Hello world!
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 17/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
Hardware emulator
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 18/1
Getting QEMU 5.0
I like to work with recent versions, but QEMU 4.x is probably good enough too!
▶ On Ubuntu 20.10:
sudo apt install qemu-system-misc
▶ On Ubuntu 20.04:
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 19/1
Finding which machines are emulated by QEMU
$ qemu-system-riscv64 -M ?
Supported machines are:
none empty machine
sifive_e RISC-V Board compatible with SiFive E SDK
sifive_u RISC-V Board compatible with SiFive U SDK
spike RISC-V Spike Board (default)
spike_v1.10 RISC-V Spike Board (Privileged ISA v1.10)
spike_v1.9.1 RISC-V Spike Board (Privileged ISA v1.9.1)
virt RISC-V VirtIO board
We are going to use the virt one, emulating VirtIO peripherals (more efficient than
emulating real hardware).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 20/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 21/1
RISC-V privilege modes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 22/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
Linux kernel
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 23/1
Kernel building overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 24/1
Environment for kernel cross-compiling
export CROSS_COMPILE=riscv64-linux-
export ARCH=riscv
▶ CROSS_COMPILE is the cross-compiler prefix, as our cross-compiler is
riscv64-linux-gcc.
▶ ARCH is the name of the subdirectory in arch/ corresponding to the target
architecture.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 25/1
Kernel configuration
make menuconfig
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 26/1
Compiling the kernel
make
To compile faster, run multiple jobs in parallel:
make -j 8
To recompile faster (7x according to some benchmarks), run multiple jobs in parallel:
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 27/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
Firmware
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 28/1
OpenSBI: Open Supervisor Binary Interface
▶ Run the above command every time you update your kernel
▶ This generates the build/platform/generic/firmware/fw_payload.elf file
which is a binary that QEMU can boot. QEMU cannot directly boot the binary
kernel, unlike on ARM.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 29/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 30/1
Booting the kernel with QEMU
qemu-system-riscv64 \
-nographic \
-machine virt \
-m 128M \
-kernel opensbi/build/platform/generic/firmware/fw_payload.elf \
-append "console=ttyS0" \
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 31/1
Embedded Linux from scratch in 45 minutes (on RISC-V)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 32/1
BusyBox - Most commands in one binary - about 10 years ago
[, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, beep, blkid, brctl, bunzip2, bzcat, bzip2,
cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio,
crond, crontab, cryptpw, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname,
dmesg, dnsd, dnsdomainname, dos2unix, dpkg, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid,
expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, flash_lock, flash_unlock,
fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, gunzip, gzip, hd,
hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd,
init, inotifyd, insmod, install, ionice, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode,
kill, killall, killall5, klogd, last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login,
logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, lzop, lzopcat, makemime, man, md5sum, mdev, mesg,
microcom, mkdir, mkdosfs, mkfifo, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modprobe, more, mount,
mountpoint, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, passwd, patch, pgrep, pidof, ping,
ping6, pipe_progress, pivot_root, pkill, popmaildir, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readlink,
readprofile, realpath, reformime, renice, reset, resize, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-
parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes,
setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, softlimit, sort, split, start-
stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac,
tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, tty,
ttysize, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unzip, uptime,
usleep, uudecode, uuencode, vconfig, vi, vlock, volname, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat,
zcip
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 33/1
BusyBox - Most commands in one binary - In 2019
[, [[, acpid, add-shell, addgroup, adduser, adjtimex, ar, arch, arp, arping, awk, base64, basename, bbconfig, bc, beep,
blkdiscard, blkid, blockdev, bootchartd, brctl, bunzip2, busybox, bzcat, bzip2, cal, cat, chat, chattr, chcon, chgrp,
chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy, cp, cpio, crond, crontab, cryptpw,
cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, diff, dirname, dmesg, dnsd, dnsdomainname,
dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-
wake, expand, expr, factor, fakeidentd, fallocate, false, fatattr, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole,
fgrep, find, findfs, flash_eraseall, flash_lock, flash_unlock, flashcp, flock, fold, free, freeramdisk, fsck, fsck.minix,
fsfreeze, fstrim, fsync, ftpd, ftpget, ftpput, fuser, getenforce, getopt, getsebool, getty, grep, groups, gunzip, gzip,
halt, hd, hdparm, head, hexdump, hexedit, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave,
ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, ipneigh, iproute,
iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less, link, linux32, linux64, linuxrc, ln, load_policy,
loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsscsi,
lsusb, lzcat, lzma, lzop, lzopcat, makedevs, makemime, man, matchpathcon, md5sum, mdev, mesg, microcom, minips, mkdir,
mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.reiser, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo,
modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netcat, netstat, nice, nl,
nmeter, nohup, nologin, nproc, nsenter, nslookup, ntpd, nuke, od, openvt, partprobe, passwd, paste, patch, pgrep, pidof,
ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, printenv, printf, ps, pscan, pstree, pwd, pwdx,
raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime, remove-shell, renice, reset,
resize, restorecon, resume, rev, rfkill, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-init, run-
parts, runcon, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, selinuxenabled, sendmail, seq, sestatus, setarch,
setconsole, setenforce, setfattr, setfiles, setfont, setkeycodes, setlogcons, setpriv, setsebool, setserial, setsid,
setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shred, shuf, slattach, sleep, smemcap, softlimit, sort,
split, ssl_client, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svc, svlogd, svok, swapoff, swapon,
switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time,
timeout, top, touch, tr, traceroute, traceroute6, true, truncate, ts, tty, ttysize, tunctl, tune2fs, ubiattach, ubidetach,
ubimkvol, ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, uevent, umount, uname, uncompress,
unexpand, uniq, unit, unix2dos, unlink, unlzma, unlzop, unxz, unzip, uptime, users, usleep, uudecode, uuencode, vconfig,
vi, vlock, volname, w, wall, watch, watchdog, wc, wget, which, who, whoami, whois, xargs, xxd, xz, xzcat, yes, zcat, zcip
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 34/1
BusyBox - Dowloading
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 35/1
BusyBox - Configuring
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 36/1
BusyBox - Installing and compiling
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 37/1
Creating a root filesystem image
mkfs.ext2 rootfs.img
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 38/1
Populating the root filesystem
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 39/1
Booting Linux with the root filesystem
[ 0.630560] EXT4-fs (vda): mounting ext2 file system using the ext4 subsystem
[ 0.659433] EXT4-fs (vda): mounted filesystem without journal. Opts: (null)
[ 0.663114] VFS: Mounted root (ext2 filesystem) readonly on device 254:0.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 40/1
Completing and configuring the root filesystem (1)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 41/1
Completing and configuring the root filesystem (1)
#!/bin/sh
mount -t proc nodev /proc
mount -t sysfs nodev /sys
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 42/1
Common mistakes
▶ Don’t forget to make the rcS script executable. Linux won’t allow to execute it
otherwise.
▶ Do not forget #!/bin/sh at the beginning of shell scripts! Without the leading
#! characters, the Linux kernel has no way to know it is a shell script and will try
to execute it as a binary file!
▶ Don’t forget to specify the execution of a shell in /etc/inittab or at the end of
/etc/init.d/rcS. Otherwise, execution will just stop without letting you type
new commands!
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 43/1
Add support for networking (1)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 44/1
Add support for networking (2)
ifconfig -a
ifconfig eth0 192.168.2.100
▶ On the host machine:
ifconfig -a
ifconfig tap2 192.168.2.1
ping 192.168.2.100
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 45/1
Simple CGI script
#!/bin/sh
echo "Content-type: text/html"
echo
echo "<html>"
echo "<meta http-equiv=\"refresh\" content=\"1\">"
echo "<header></header><body>"
echo "<h1>Uptime information</h1>"
echo "Your embedded device has been running for:<pre><font color=Blue>"
echo `uptime`
echo "</font></pre>"
echo "</body></html>"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 46/1
Start a web server
/usr/sbin/httpd -h /www
▶ On the host machine, open in your browser:
http://192.168.2.100/cgi-bin/uptime
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 47/1
Next steps
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 48/1
What to remember
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 49/1
Going further
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 50/1
Questions? Suggestions? Comments?
Michael Opdenacker
[email protected]
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 51/1