Installez git.
$ sudo apt-get install git
Installez le compilateur croisé ARM.
$ sudo apt-get install gcc-arm-linux-gnueabi
Installez le logiciel nécessaire pour construire le noyau Linux.
$ sudo apt-get install flex bison libncurses-dev libssl-dev
Installez QEMU pour ARM.
$ sudo apt-get install qemu-system-arm
Dans les éléments suivants, la structure du répertoire créé est la suivante.
{top_directory} ├ linux-stable │ └ arch │ └ arm │ └ boot │ ├ zImage: Image du noyau │ └ dts │ └ polyvalent-pb.dtb: arborescence des périphériques │ ├ busybox │ ├ _install: système de fichiers racine │ └ rootfs.img: Image du système de fichiers racine │ ├ driver │ └ sample │ └ driver_sample.ko: module de pilote de périphérique │ └ app └ sample └ app_sample: fichier binaire d'exécution de l'application ~~~
Clonez le noyau Linux (noyau stable).
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Accédez au répertoire cloné.
$ cd linux-stable
Appliquez les paramètres par défaut des cartes Arm Versatile (versatilepb).
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- versatile_defconfig
Construisez.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Assurez-vous que l'image du noyau et l'arborescence des périphériques sont générées.
$ ls -latr arch/arm/boot/dts/versatile-pb.dtb
$ ls -latr arch/arm/boot/zImage
Clonez la BusyBox.
$ git clone git://git.busybox.net/busybox
Accédez au répertoire cloné.
$ cd busybox
Appliquez les paramètres par défaut.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
Puisque nous devons créer un lien statique pour travailler avec un seul binaire, exécutez la commande make menuconfig pour activer la configuration du noyau "Construire un binaire statique (pas de bibliothèques partagées)".
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
Settings --> Build static binary (no shared libs)
Construisez.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Installez. Une fois l'installation terminée, un système de fichiers racine sera créé sous le répertoire _install.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
Créez un répertoire pour le pilote de périphérique et accédez-y.
$ mkdir -p driver/sample
$ cd driver/sample
Créez le code source du pilote de périphérique. (Le code source suivant est un exemple de pilote de périphérique qui se charge / décharge simplement.)
$ 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" );
Créez un 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
Compilez le pilote de périphérique.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Copiez le pilote de périphérique dans le répertoire busybox _install.
$ cp driver_sample.ko ../../busybox/_install/
Créez un répertoire pour votre application et accédez-y.
$ mkdir -p app/sample
$ cd app/sample
Créez le code source de votre application. (Le code source suivant est un exemple d'application qui génère uniquement des journaux.)
$ nano app_sample.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf( "app sample run\n" );
return 0;
}
Créez un 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)
Cross-compilez votre application.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Copiez l'application dans le répertoire busybox _install.
$ cp app_sample ../../busybox/_install/
Image du système de fichiers racine.
$ cd busybox/_install/
$ find .| cpio -o --format=newc > ../rootfs.img
$ cd ../../
Exécutez QEMU.
$ 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
Lorsque le démarrage est terminé, le shell démarre. En vérifiant avec la commande ls, le système de fichiers racine ressemble à ceci:
/ # ls
app_sample dev linuxrc sbin
bin driver_sample.ko root usr
/ #
Chargez le pilote de périphérique.
/ # insmod driver_sample.ko
driver_sample: loading out-of-tree module taints kernel.
driver sample load
Exécutez l'application.
/ # ./app_sample
app sample run
Recommended Posts