Skip to content


Bootable Linux image for BeagleBone black from sratch, "from scracth" here means building the toolchain that builds the bootloader, kernel, device tree. Also create rootfs by hand and build busybox to have some basic features enabled.


Toolchain types ( gnueabi / gnueabihf )
- GNU Extended Application Binary Interface / --||-- hardware floating point support
- gnueabi relies on software floating-point library
- gnueabihf uses floating point registers instead of integer registers
- in function calls, the hardware floating point support makes calling with float and double type parameters faster
Build toolchain
git clone
git checkout crosstool-ng-1.25.0
./configure --prefix=${PWD}
make install
bin/ct-ng arm-cortex_a8-linux-gnueabi
bin/ct-ng build
Setup toolchain
# Setup toolchain env
export CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
export ARCH=arm
Toolchain usage
# Toolchain install location

# List default configurations
bin/ct-ng list-samples

# View default configuration
bin/ct-ng show-arm-cortex_a8-linux-gnueabi

# View default configuration
bin/ct-ng show-arm-cortex_a8-linux-gnueabi

# Disable read-only toolchain ( CT_PREFIX_DIR_RO )
# Enable hardware floating points ( CT_ARCH_FLOAT_HW )
# Target options -> Use specific FPU -> 'neon'
bin/ct-ng menuconfig

# Get toolchain info
arm-cortex_a8-linux-gnueabi-gcc --version
arm-cortex_a8-linux-gnueabi-gcc -v

# Toolchain compiling
arm-cortex_a8-linux-gnueabi-gcc test.c -o test_bin

# Override toolchain compiler settings
arm-cortex_a8-linux-gnueabi-gcc -mcpu=cortex-a5 test.c -o test_bin

# Read linked libraries
arm-cortex_a8-linux-gnueabi-readelf -a test_bin | grep "Shared library"

# Get location of shared library runtime linker
arm-cortex_a8-linux-gnueabi-readelf -a test_bin | grep "program interpreter"

# Print toolchain sysroot
arm-cortex_a8-linux-gnueabi-gcc -print-sysroot


Boot process
1. ROM code
2. Secondary Program Loader ( SPL ) running in SRAM Initializes DRAM
3. SPL loads u-boot ( Tertiary Program Loader (TPL) ) in and jumps in there
4. Loads kernel into DRAM
5. Kernel loads root file system
6. Init program is executed with PID 1
Build u-boot
git clone git://
cd u-boot
git checkout v2021.01
export CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
export ARCH=arm
make am335x_evm_defconfig
Flash u-boot to target device
format sdcard to have a 64MB boot section and a 1GB rootfs
copy MLO and u-boot.img to the /media/user/boot/ folder
umount the boot mount point
Boot linux image
fatload mmc 0:1 0x80200000 zImage
fatload mmc 0:1 0x80f00000 am335x-boneblack.dtb
fatload mmc 0:1 0x80f00000 nova.dtb
setenv bootargs console=ttyO0,115200n8
bootz 0x80200000 - 0x80f00000


Open terminal
gtkterm -p /dev/ttyUSB0 -s 115200


Setup kernel
## Get kernel sources

# Create a kernel config based on defaults
make ARCH=arm multi_v7_defconfig

# Modify kernel config
make ARCH=arm menuconfig
( config will be saved to .config file, use ls -a to view it on disk )
Build kernel
# Build kernel
sudo apt-get install libssl-dev
make -j 8 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi- zImage

# Build kernel with verbose logging
sudo apt-get install libssl-dev
make -j 8 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi- V=1 zImage

# Build kernel modules separately
make -j 8 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi- modules

# Install kernel modules
make -j8 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
  INSTALL_MOD_PATH=$HOME/rootfs modules_install

Device tree

## Build device tree ( based on the multi_v7_defconfig )
make ARCH=arm dtbs

##### Copy kernel and device tree to the boot media
cp arch/arm/boot/zImage arch/arm/boot/dts/am335x-boneblack.dtb /media/ton/boot/


Create rootfs

mkdir ~/rootfs
cd ~/rootfs
mkdir bin dev etc home lib proc sbin sys tmp usr var
mkdir usr/bin usr/lib usr/sbin
mkdir -p var/log
sudo chown -R root:root *

Build busybox

git clone git://
cd busybox
git checkout 1_36_0
make distclean
make defconfig
( Optional, do changes here ) make menuconfig
nano .config -> change 'CONFIG_PREFIX' to: /home/ton/rootfs
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabi- install

Create a ramdisk image

cd ~/rootfs
find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio
cd ..
gzip initramfs.cpio
mkimage -A arm -O linux -T ramdisk -d initramfs.cpio.gz uRamdisk
attach SD card to host machine
cp uRamdisk /media/ton/boot


Boot from SD card

Hold down the button near the SD card slot, power on the device, hold the button down for 5 seconds and release
Optionally press reset button

Image size

uboot> bootz 0x80200000 0x81000000 0x80f00000
## Loading init Ramdisk from Legacy Image at 81000000 ...
   Image Name:   
   Created:      2023-04-26  15:29:33 UTC
   Image Type:   ARM Linux RAMDisk Image (gzip compressed)
   Data Size:    1612931 Bytes = 1.5 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 80f00000

Image files

debian@beaglebone:~$ ls -laih /media/boot/
total 24M
  1 drwx------ 2 debian debian  16K Apr 23 20:21 .
 18 drwxr-xr-x 3 root   root   4.0K Apr 23 20:20 ..
183 -rw-r--r-- 1 debian debian  57K Apr 26  2023 am335x-boneblack.dtb # Device tree
180 -rw-r--r-- 1 debian debian 106K Apr 25  2023 MLO                  # Secondary program loader ( SPL )
184 -rw-r--r-- 1 debian debian 128K Jan  1  1980 uboot.env            # Uboot environment variables
181 -rw-r--r-- 1 debian debian 872K Apr 25  2023 u-boot.img           # Uboot binary + header
186 -rw-r--r-- 1 debian debian  14M Apr 26  2023 uRamdisk             # Root file system in ramdisk format
182 -rw-r--r-- 1 debian debian 8.7M Apr 26  2023 zImage               # Compressed kernel image