Installieren Sie git.
$ sudo apt-get install git
Installieren Sie den ARM-Cross-Compiler.
$ sudo apt-get install gcc-arm-linux-gnueabi
Installieren Sie die Software, die zum Erstellen des Linux-Kernels erforderlich ist.
$ sudo apt-get install flex bison libncurses-dev libssl-dev
Installieren Sie QEMU for ARM.
$ sudo apt-get install qemu-system-arm
In den folgenden Elementen ist das erstellte Verzeichnis wie folgt aufgebaut.
{top_directory} ├ linux-stable │ └ arch │ └ arm │ └ boot │ ├ zImage: Kernel-Image │ └ dts Atile └ vielseitig-pb.dtb: Gerätebaum │ ├ busybox Inst ├ _install: Root-Dateisystem │ └ rootfs.img: Image des Root-Dateisystems │ ├ driver │ └ sample │ └ driver_sample.ko: Gerätetreibermodul │ └ app └ sample └ app_sample: Ausführungsbinärdatei der App ~~~
Klonen Sie den Linux-Kernel (Stable Kernel).
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Navigieren Sie zum geklonten Verzeichnis.
$ cd linux-stable
Wenden Sie die Standardeinstellungen für Arm Versatile-Boards (versatilepb) an.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- versatile_defconfig
Bauen.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Stellen Sie sicher, dass das Kernel-Image und der Gerätebaum generiert wurden.
$ ls -latr arch/arm/boot/dts/versatile-pb.dtb
$ ls -latr arch/arm/boot/zImage
Klonen Sie die BusyBox.
$ git clone git://git.busybox.net/busybox
Navigieren Sie zum geklonten Verzeichnis.
$ cd busybox
Wenden Sie die Standardeinstellungen an.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
Wir müssen einen statischen Link erstellen, um mit einer einzelnen Binärdatei arbeiten zu können. Führen Sie daher den Befehl make menuconfig aus, um die Kernelkonfiguration "Statische Binärdatei erstellen (keine gemeinsam genutzten Bibliotheken)" zu aktivieren.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
Settings --> Build static binary (no shared libs)
Bauen.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Installieren. Nach Abschluss der Installation wird im Verzeichnis _install ein Root-Dateisystem erstellt.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
Erstellen Sie ein Verzeichnis für den Gerätetreiber und wechseln Sie in dieses.
$ mkdir -p driver/sample
$ cd driver/sample
Erstellen Sie den Quellcode für den Gerätetreiber. (Der folgende Quellcode ist ein Beispielgerätetreiber, der nur geladen / entladen wird.)
$ nano driver_sample.c
#include <linux/module.h>
#include <linux/kernel.h>
static int __init sample_module_init( void )
{
printk( "driver sample load\n" );
return 0;
}
static void __exit sample_module_exit( void )
{
printk( "driver sample remove\n" );
}
module_init( sample_module_init );
module_exit( sample_module_exit );
MODULE_DESCRIPTION( "sample_module" );
MODULE_LICENSE( "GPL" );
Erstellen Sie ein Makefile.
$ nano Makefile
obj-m := driver_sample.o
all:
make -C $(shell pwd)/../../linux M=$(shell pwd) modules
clean:
make -C $(shell pwd)/../../linux M=$(shell pwd) clean
Kompilieren Sie den Gerätetreiber.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Kopieren Sie den Gerätetreiber in das Verzeichnis Busybox _install.
$ cp driver_sample.ko ../../busybox/_install/
Erstellen Sie ein Verzeichnis für Ihre App und wechseln Sie zu diesem.
$ mkdir -p app/sample
$ cd app/sample
Erstellen Sie den Quellcode für Ihre App. (Der folgende Quellcode ist eine Beispielanwendung, die nur Protokolle ausgibt.)
$ nano app_sample.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf( "app sample run\n" );
return 0;
}
Erstellen Sie ein Makefile.
$ nano Makefile
TARGET = app_sample
CC = ${CROSS_COMPILE}gcc
LD = ${CROSS_COMPILE}gcc
CSRCS = $(TARGET).c
CFLAGS = -c
LDFLAGS = -static -o $(TARGET)
OBJS = $(CSRCS:.c=.o)
LIBS =
.c.o:
$(CC) $(CFLAGS) $<
$(TARGET): $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) $(LIBS)
clean: ;
rm $(OBJS) $(TARGET)
Kompilieren Sie Ihre App.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Kopieren Sie die App in das Verzeichnis Busybox _install.
$ cp app_sample ../../busybox/_install/
Stellen Sie das Root-Dateisystem ab.
$ cd busybox/_install/
$ find .| cpio -o --format=newc > ../rootfs.img
$ cd ../../
Führen Sie QEMU aus.
$ qemu-system-arm \
-M versatilepb \
-kernel ./linux/arch/arm/boot/zImage \
-dtb ./linux/arch/arm/boot/dts/versatile-pb.dtb \
-nographic \
-append "rdinit=/bin/sh" \
-initrd ./busybox/rootfs.img
Nach Abschluss des Startvorgangs wird die Shell gestartet. Wenn Sie mit dem Befehl ls prüfen, sieht das Root-Dateisystem folgendermaßen aus:
/ # ls
app_sample dev linuxrc sbin
bin driver_sample.ko root usr
/ #
Laden Sie den Gerätetreiber.
/ # insmod driver_sample.ko
driver_sample: loading out-of-tree module taints kernel.
driver sample load
Führen Sie die App aus.
/ # ./app_sample
app sample run
Recommended Posts