Linux su FPGA Xilinx Paolo Palana University of Rome Tor Vergata System Programming Research Group palana@sprg.uniroma2.it Corso interdottorato su sistemi embedded Paolo Palana (SPRG) Linux su FPGA Xilinx 1 / 37
Outline 1 Scopo della lezione 2 MicroBlaze Linux Cosa serve Requisiti minimi Hardware 3 Dalla teoria alla pratica Come utilizzare il Device Tree Generator Come ottenere ed installare la Toolchain Come ottenre e configurare il kernel Compilare il kernel initramfs Paolo Palana (SPRG) Linux su FPGA Xilinx 2 / 37
Scopo della lezione Scopo della lezione Lo scopo di questa lezione è quello di illustrare come generare una piattaforma basata su FPGA che sia in grado di eseguire Linux Paolo Palana (SPRG) Linux su FPGA Xilinx 3 / 37
MicroBlaze Linux Quale processore? Per eseguire un sistema operativo è necessario un processore Un FPGA, senza adeguata programmazione non lo è in realtà un FPGA senza una adeguata programmazione non è niente I maggiori vendor di FPGA mettono a disposizione delle Intellectual Property (IP) che consentono di programmare, in maniera semplice, un FPGA in maniera tale che sia in grado di comportarsi come un processore La Xilinx mette a disposizione Microblaze Paolo Palana (SPRG) Linux su FPGA Xilinx 4 / 37
MicroBlaze Linux Microblaze Caratteristiche salienti Architettura RISC a 32 bit 32 registri general pourpose Fino a qualche tempo fa non era presente una Memory Management Unit (MMU) Paolo Palana (SPRG) Linux su FPGA Xilinx 5 / 37
MicroBlaze Linux Quale Linux? La frase... in grado di eseguire Linux è molto generica: Esistono decine e decine di incarnazioni di Linux (anche se strettamente parlando Linux è solo ed esclusivamente il kernel) che comunemente chiamiamo distribuzioni Tipicamente ogni distribuzione ha le sue caratteristiche Nella scorsa edizione è stato illustrato come installare Petalinux. In questa edizione si vedrà come installare e configurare MicroBlaze Linux (http://xilinx.wikidot.com/microblaze-linux) Paolo Palana (SPRG) Linux su FPGA Xilinx 6 / 37
MicroBlaze Linux Cosa serve Cosa serve... Per ottenere una immagine di Linux che sia in grado di essere eseguita su MicroBlaze servono i seguenti tre strumenti software: il device tree generator la toolchain il kernel Paolo Palana (SPRG) Linux su FPGA Xilinx 7 / 37
MicroBlaze Linux Cosa serve Il Device Tree Generator È un tool fornito dalla Xilinx per l EDK Si integra in XPS ampliando le normali funzionalità di auto-generazione del board support package (bsp) Lo scopo del Device Tree Generator è quello di creare un Device Tree File (xilinx.dts) contenente le informazioni relative al progetto per cui viene generato. Come ottenere maggiorni informazioni e dove scaricare il Device Tree Generator http://xilinx.wikidot.com/device-tree-generator Paolo Palana (SPRG) Linux su FPGA Xilinx 8 / 37
MicroBlaze Linux Cosa serve Cos è il Device Tree? È una struttura dati costituita da: Nodi organizzati ad albero Ogni nodo ha esattamente un nodo padre Ogni nodo ha delle proprietà e i loro relativi valori Paolo Palana (SPRG) Linux su FPGA Xilinx 9 / 37
MicroBlaze Linux Cosa serve Qual è la particolarià del Device Tree? Descrive la struttura hardware del nostro sistema da un punto di vista: Strutturale: CPU Memoria Periferiche Della configurazione: Parametri del kernel Nomi dei device Paolo Palana (SPRG) Linux su FPGA Xilinx 10 / 37
MicroBlaze Linux Cosa serve Un esempio di nodo in un Device Tree File...... microblaze_0: cpu@0 { clock-frequency = <125000000>;... d-cache-baseaddr = <0x90000000>; d-cache-highaddr = <0x9fffffff>; d-cache-line-size = <0x10>;... device_type = "cpu";...... } Paolo Palana (SPRG) Linux su FPGA Xilinx 11 / 37
MicroBlaze Linux Cosa serve Cos è una Toolchain In generale per Toolchain si intende un insieme di tool di programmazione che vengono utilizzati per generare altri programmi. Componenti tipici di una Toolchain sono: compilatore assemblatore linker Essendo fortemente dipendente dall architettura vi è una Toolchain per ogni differente architettura. GNU Toolchain per Microblaze http://xilinx.wikidot.com/mb-gnu-tools Paolo Palana (SPRG) Linux su FPGA Xilinx 12 / 37
MicroBlaze Linux Cosa serve Come ottenere il kernel di MicroBlaze Linux? L architettura MicroBlaze è stata accettata all interno della mainline del kernel di Linux a partire dalla versione 2.6.31. Dove reperire informazioni riguardo al kernel per Microblaze http://xilinx.wikidot.com/microblaze-linux MicroBlaze Linux non supporta sistemi senza MMU Paolo Palana (SPRG) Linux su FPGA Xilinx 13 / 37
MicroBlaze Linux Requisiti minimi Hardware Requisiti minimi Affinchè sia possibile eseguire un sistema Linux la piattaforma hardware che bisogna creare deve includere: 1 CPU (Xilinx fornisce Microblaze) 2 MMU in virtual mode e due memory protection zones 3 Timer 4 Controller delle interruzioni 5 Supporto per la porta seriale (console) Paolo Palana (SPRG) Linux su FPGA Xilinx 14 / 37
Come utilizzare il Device Tree Generator Usare il Device Tree Generator (1/4) È Possibile reperire il Device Tree Generator direttamente dal repository git della Xilinx (git://git.xilinx.com/device-tree.git) Come scaricare il Device Tree Generator git clone git://git.xilinx.com/device-tree.git Per utilizare il Device Tree Generator è necessario copiare la cartella bsp nella top directory del progetto per il quale si intende usare tale tool Usare il Device Tree Generator cp -r bsp <path to project>/ Se il progetto in questione è già aperto in XPS è necessario chiudere e riaprire il programma per rendere visibili le modifiche. Paolo Palana (SPRG) Linux su FPGA Xilinx 15 / 37
Come utilizzare il Device Tree Generator Usare il Device Tree Generator (2/4) Per capire se il Device Tree Generator è già in uso per un progetto: Aprire xps Cliccare sul menu Software >Software Platform Settings Apparirà quindi una schermata come quella riportata nella slide seguente Paolo Palana (SPRG) Linux su FPGA Xilinx 16 / 37
Come utilizzare il Device Tree Generator Usare il Device Tree Generator (3/4) Paolo Palana (SPRG) Linux su FPGA Xilinx 17 / 37
Come utilizzare il Device Tree Generator Usare il Device Tree Generator (4/4) Per rendere effettivo l utilizzo del Device Tree Generator Cliccare su device-tree quindi sul tasto Ok Per generare il Device Tree File Cliccare sul menu Software >Generate Libraries and BSP Alla fine del processo di generazione verrà creato un file xilinx.dts in <root_project>/microblaze_0/libsrc/device-tree_v0_00_x/ Paolo Palana (SPRG) Linux su FPGA Xilinx 18 / 37
Come ottenere ed installare la Toolchain Ottenere e configuarare la Toolchain per MicroBlaze Xilinx fornisce una versione pre-compilata della Toolchain di Microblaze e reperibile sempre presso il reporitory git della Xilinx (git://git.xilinx.com/xldk/microblaze_v1.0.git) Come scaricare la Toolchain git clone git://git.xilinx.com/xldk/microblaze_v1.0.git Paolo Palana (SPRG) Linux su FPGA Xilinx 19 / 37
Come installare la Toolchain Come ottenere ed installare la Toolchain Decomprimere il file scaricato tar jxpf mb_gnu_tools_bin.tar.bz Impostare correttamente le variabili di ambiente export PATH=<tool path>/microblaze-unknown-linux-gnu/bin:$path export CROSS_COMPILE=mb-linux- Paolo Palana (SPRG) Linux su FPGA Xilinx 20 / 37
Come ottenere il kernel Come ottenre e configurare il kernel Il kernel è scaricabile dal repository git della Xilinx (git://git.xilinx.com/linux-2.6-xlnx.git) Scaricare il kernel git clone git://git.xilinx.com/linux-2.6-xlnx.git Paolo Palana (SPRG) Linux su FPGA Xilinx 21 / 37
Come configurare il kernel Come ottenre e configurare il kernel La confiurazione del kernel avviene in maniera del tutto analoga a quanto avviene con altre piattaforme Avvio dell interfaccia di configurazione del kernel make ARCH=microblaze menuconfig Inoltre insieme al kernel viene fornito un file di configurazione di default Utilizzare il file di configurazione di default make ARCH=microblaze xilinx_mmu_defconfig Paolo Palana (SPRG) Linux su FPGA Xilinx 22 / 37
Come ottenre e configurare il kernel Alcune note sulla configurazione del kernel Alcuni parametri di configurazione del kernel devono contenere valori che corrispondono alla configurazione hardware del processore (ad esempio barrel shifter, moltiplicatori hardware) Questo perchè devono essere passate al compilatore le giuste opzioni per generare il giusto codice Questi parametri possono essere configurati selezionando Platform options dal menu principale di configurazione Paolo Palana (SPRG) Linux su FPGA Xilinx 23 / 37
Compilare il kernel Compilare il kernel Una volta ultimata la configurazione è necessario compilare il kernel Comando per compilare il kernel make ARCH=microblaze simpleimage.<dts file name> Si noti che <dts file name> è il nome del file generato dal Device Tree Generator, ma senza l estensione. Paolo Palana (SPRG) Linux su FPGA Xilinx 24 / 37
Compilare il kernel Alcune note sul processo di compilazione Il processo di compilazione cerca all interno della directory arch/microblaze/boot/dts il file.dts specificato e lo usa per configurare il codice Di conseguenza il file xilinx.dts generato precedemente deve essere copiato in arch/microblaze/boot/dts Il risultato del processo di compilazione è un file elf che può essere trocato nella directory arch/microblaze/boot il cui nome è simpleimage.<dts file name> Paolo Palana (SPRG) Linux su FPGA Xilinx 25 / 37
initramfs E le applicazioni? Fino a questo momento abbiamo solo visto come configurare, compilare e testare il kernel, ma: Alla fine del suo dovere il kernel lancia il processo init (init è il padre di tutti i processi) che non è parte del kernel Se non è presente il processo di avvio non va a buon fine e si ottiene un kernel panic Inoltre avere un sistema perfettamene funzionante ma senza alcuna applicazione utile con cui utilizzarlo è decisamente poco utile Quindi a questo punto la questione è: È possibile unire al kernel anche un ambiente user space?. Paolo Palana (SPRG) Linux su FPGA Xilinx 26 / 37
Ramfs e rootfs Dalla teoria alla pratica initramfs Il kernel Linux per MicroBlaze fa uso di un initramfs Cos è il ramfs? Ramfs è un semplice filesystem che esporta il meccanismo di caching proprio di Linux come un un filesystem interamente in ram. Cos è il rootfs? rootfs altro non è che un ramfs che non può essere smontato Paolo Palana (SPRG) Linux su FPGA Xilinx 27 / 37
initramfs initramfs l initramfs è un file in formato cpio (eventualmente compresso) che viene decompresso in fase di boot. Dopo la decompressione Il kernel controlla se nel rootfs è presente un file init Se si lo esegue (con pid 1). Init è responsabile per il resto dello startup del sistema Se no il processo di boot fallisce Paolo Palana (SPRG) Linux su FPGA Xilinx 28 / 37
initramfs Cosa contiene un initramfs (1/3) La Xilinx fornisce anche due initramfs pronti (vengono scaricati insieme al kernel) initramfs_minimal.cpio.gz: ramdisk senza il supporto alle librerie condivise initramfs_complete.cpio.gz: ramdisk con il supporto alle librerie condivise Nel seguito analizzeremo e modificheremo il file initramfs_minimal.cpio.gz Paolo Palana (SPRG) Linux su FPGA Xilinx 29 / 37
initramfs Cosa contiene un initramfs (2/3) Il fatto che il file termini con estensione.gz è chiaro indice del fatto che il file è stato compresso con gzip, quindi come prima cosa bisogna decomprirlo Decomprimere initramfs_minimal.cpio.gz gunzip initramfs_minimal.cpio.gz Il risultato della decompressione è un file initramfs_minimal.cpio Paolo Palana (SPRG) Linux su FPGA Xilinx 30 / 37
initramfs Cosa contiene un initramfs (3/3) Un file.cpio è un file costituito da un insieme di file e directory racchiusi in un singolo archivio. Quindi per vederer cosa è contenuto all interno di tali file è necessario aprire tale archivio Estrarre il contenuto del file initramfs_minimal.cpio cpio -iv < initramfs_minimal.cpio Contenuto del file initramfs_minimal.cpio bin dev etc init mnt proc sbin sys tmp var Come si può notare all interno dell archivio initramfs_minimal.cpio è presente una struttura di directory tipica di un filesystem Linux. Paolo Palana (SPRG) Linux su FPGA Xilinx 31 / 37
initramfs Note sul contenuto del file initramfs_minimal.cpio Contiene il file init Nella directory bin sono presenti i file eseguibili Nella directory /etc/init.d è presente un file rcs che contiene una serie di comandi che vengono eseguiti durante la fase di avvio del sistema operativo Paolo Palana (SPRG) Linux su FPGA Xilinx 32 / 37
initramfs Modificare il contenuto del file initramfs_minimal.cpio (1/2) Una volta estratto il contenuto dell archivio initramfs_minimal.cpio questo sarà normalmente utilizzabile, di conseguenza per apportare una qualsiasi modifica, come ad esempio aggiungere o rimuovere file eseguibili, sarà sufficiente copiare o rimuovere un file nella cartella desiderata. Una volta effettuate le modifiche è necessario ricreare l archivio cpio e quindi ricomprimerlo. Paolo Palana (SPRG) Linux su FPGA Xilinx 33 / 37
initramfs Modificare il contenuto del file initramfs_minimal.cpio (1/2) Ricreare l archivio cpio find. cpio -H newc -o >../initramfs.cpio Comprimere il file cpio creato gzip initramfs.cpio Paolo Palana (SPRG) Linux su FPGA Xilinx 34 / 37
initramfs Note sulla compressione di un initramfs e sull uso (1/2) Nel precedente esempio l archivio pcio è stato compresso utilizzando gzip come compressore. Tuttavia durante la configurazione del kernel è possibile configurare altri schemi in compressione, in particolare si posso utilizzare: gzip bzip2 LZMA LZO Sempre durante la fase di compressione sarà inoltre necessario specificare il nome dell initramfs da utilizzare (vedi slide seguente). Paolo Palana (SPRG) Linux su FPGA Xilinx 35 / 37
initramfs Note sulla compressione di un initramfs e sull uso (2/2) Paolo Palana (SPRG) Linux su FPGA Xilinx 36 / 37
initramfs Testare il kernel e le applicazioni Per testare l immagine del kernel senza dover configurare una memoria flash è possibile usare il tool xdm Scaricare l immagine del kernel sull FPGA xdm> connect mb mdm xdm> dow arch/microblaze/boot/simpleimage.<dts file name> xdm> run A questo punto se siamo (molto) fortunati il kernel dovrebbe avviarsi e mostrare l output su console seriale Paolo Palana (SPRG) Linux su FPGA Xilinx 37 / 37