Kernel Programmierung unter Linux - ?· • Sind die Sourcenübertragen werden sie mit dem Befehl tarxfz…

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

  • Referent Klaus Ruhwinkel

    Kernel Programmierung unter Linux

    Programmierung von Kernelmodulen fr den Raspberry PI

  • Das Betriebssystem

    2

    Aufbau des Betriebssystem:

    Es besteht aus den Betriebssystemkern und den sonstigen Betriebssystemkomponenten (Userland)

    Der Betriebssystemkern stellt Dienste ber z.B. Systemcalls fr smtliche Applikationen her. Dadurch ist es mglich Daten auf dem Bildschirm darzustellen, Daten in Dateien

    abzulegen etc.

    Das Userland nutzt die Dienste, um damit Systemkonfigurationen und hnliches vorzunehmen

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Kernelarten

    3

    Es gibt drei Arten von Kernel:

    1. Monolithischer Kernel, dazu zhlen die Kernel von Linux und Windows. Diese Kernel bernehmen alle Aufgaben wie Speicher- und Prozessverwaltung und sind auch fr die Kommunikation zwischen den Prozessen und zwischen den Prozessen und der Hardware zustndig.

    2. Microkernel, dazu zhlen die Kernel von QNX, Singularity von Microsoft und Symbian OS. Der Kernel verfgt nur ber grundlegenden Funktionen des Speicher- und Prozessmanagement sowie der Prozesskommunikation. Alles andere wird durch Server Clientsysteme, die im Benutzermodus laufen verwaltet.

    3. Hybridkernel, dazu zhlen die Kernel von MacOSX, Windows NT, ReactOS.Diese Kernel bilden einen Kompromiss zwischen dem monolithischen Kernel und dem Mircrokernel da.

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Kernelstrukturen

    4 Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

    Grafik entnommen: https://de.wikipedia.org/wiki/Monolithischer_Kernel

  • Komponenten des Linux-Kernel

    5 Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

    BibliothekenService

    Systemcall-Interface

    I/O-Subsystem Prozess-managementSpeicher-

    management

    GertetreiberHardware

    Userland

    Kernel

    Sonstige BS-Komponenten

    Grafik entnommen: Linux Treiber entwickeln, Quade u. Kunst

  • Systemcall-Interface

    6

    Applikationen nutzen die Dienste des Betriebssystem ber Sytemcalls.

    Technisch ist das eine Art Software-Interrupt, dieser wird in der Regel durch die eingebundenen Bibliotheken ausgefhrt.

    Der Kernel selbst fhrt nach dem Auslsen des Software-Interrupt die zugehrige Interrupt-Service-Routine aus.

    Die entsprechenden Systemcalls in Abhngigkeit der Architektur, finden sich in der Datei die wiederum die Headerdatei inkludiert.

    Es gibt 392 Systemcalls fr die Architektur ARM.

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Prozessmanagement I

    7

    Das Prozesssubsystem verwaltet die Prozesse Die Prozesse werden auch Tasks oder Threads genannt Jeder Prozess belegt drei Speicherblcke: Codesegment,

    Datensegment und Stacksegment. Teilen sich mehrere Prozesse das Code- und Datensegment

    spricht man von Threads Prozesse die ein eigenes Datensegment besitzen nennt man

    Tasks Des weiteren verwaltet das Prozesssubsystem die Zustnde

    der Prozesse. Diese knnen sein: aktiv, lauffhig(running, schlafend und ruhend.

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Prozessmanagement II

    8

    Der Kernel unterteilt den Zustand schlafend in unterbrechbare, nichtunterbrechbares und killable Schlafen.

    Weitere Zustnde findet man in der Headerdatei - #define TASK_RUNNING 0- #define TASK_INTERRUPTIBLE 1- #define TASK_UNINTERRUPTIBLE 2- #define __TASK_STOPPED 4- #define __TASK_TRACED 8- /* in tsk->exit_state */- #define EXIT_ZOMBIE 16- #define EXIT_DEAD 32- /* in tsk->state again */- #define TASK_DEAD 64- #define TASK_WAKEKILL 128

    -

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Prozessmanagement III

    9

    Rechenprozesszustnde:

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

    lauffhig/running

    aktiv/current

    TASK_WAKING

    ununterbrechbarUNINTERRUPTIBLE

    unterbrecbarINTERRUBTIBLE

    ZOMBIE

    ruhend/terminiert

    exit

    wait

    Schedulersleep

    sleep

    wakeup

    fork/clone

    Grafik entnommen: Linux Treiber entwickeln, Quade u. Kunst

  • Speichermanagement

    10

    Das Speichermanagement ermglicht die Reservierung von Speicher.

    Der Zugriff wird berwacht. Der Speicherbereich wird unterteilt in Kernelspace und

    Userspace. Der Kernel bzw. der Gertetreiber kann nicht direkt auf den

    Speicher einer Applikation zugreifen. Das Umrechnen der logischen Speicheradressen auf die

    physikalischen Adressen wird durch Funktionen im Kernel durchgefhrt. Es funktioniert nur im Zustand current einer Task

    Das Speichersubsystem bernimmt das Paging und Swapping, was den Zugriff auf den Speicher durch den Treiber erschwert.

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • IO-Management

    11

    Das IO-Management ist fr den Datenaustausch zwischen den Programmen und der Peripherie zustndig.

    Das IO-Management stellt ein: Interface zur systemkonformen Integration von Hardware

    Eine einheitliche Programmierschnittstelle

    Ordnungsstrukturen in Form von Dateien und Verzeichnissen siehe auch /dev/...

    zur Verfgung.

    Es gibt traditionell Schnittstellen fr zeichen- und blockorientierte Gerte. Und eine Vielzahl von Subsystemen die Hardware wie USB, PCI etc. ansprechen.

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Voraussetzungen Gertetreiber I

    12

    Um einen Treiber zu entwickeln bentigen man zuerst die Kernelsourcen, , beachten Sie, das dieses im Allgemeinen ein Link auf die Sourcen ist.

    Hinweis: alle weiteren Angaben zu Dateien und Verzeichnissen sind ab jetzt relativ zum Sourcepfad

    Einen bersetzten Kernel mit Modulen. Eine Entwicklungsumgebung zur bersetzung der Sourcen. In

    unserem Falle benutzen wir den Crosscompiler. Den aktuellen Kernel fr den Raspberry Pi kann man mit dem

    folgendem Befehl laden. git clone --depth=1 https://github.com/raspberrypi/linux.git

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Voraussetzungen Gertetreiber II

    13

    1. Anpassen und bersetzten eines Kernels Zum Anpassen wechselt man in das Verzeichnis in dem die

    Kernelsourcen liegen. Durch den Aufruf make menuconfig wird eine grafische

    (Ncurses) Oberflche gestartet. Dazu wir die Bibliothek libncurses5-dev bentigt.

    Durch Auswahl von Save, wirddie Konfiguration in die Datei.config gespeichert

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Voraussetzungen Gertetreiber III

    14 Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Voraussetzung Gertetreiber, Device-Tree

    15 Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

    Die Vielzahl der ARM-Prozessoren fhrte nicht nur zu einer berfrachtung der Kernelsourcen sondern auch dazu, dass das eigentliche Ziel compile once, runeverywhere nicht erreicht wurde.

    Deshalb bediente man sich der bestehenden Technik die beim Linuxkernel fr Power-PC genutzt wurde. Die Hardwarekonfiguration wurde nicht in den Kernel compiliert, sondern man stellt sie in einer Datenstruktur neben dem Kernel im Speicher zur Verfgung. Das ganze passiert whrend der Startphase durch den Bootloader. Daher muss der Device-Tree fr die Hardware auch im unserem Fall im Verzeichnis /boot liegen.

    Neben den Device-Trees gibt es noch das Pincontrol-System, das ab der Kernelversion 3.1 eingefhrt wurde. Jerder PIN bekommt einen Namen und eine Nummer PINCTRL_PIN0(0,A1). Die PINs werden anschlieend zu Gruppen zusammengefasst und konfiguriert.

  • Voraussetzungen Gertetreiber IV speziell Raspberry PI

    16

    In der Datei README finden sich weitere Mglichkeiten die Kernelkonfiguration anzupassen.

    Mit dem Befehl make ARCH=arm bcm2709_defconfig erzeugt man die Konfigurationsdatei .config speziell fr den Raspberryab Version 2

    Der Aufruf make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 erzeugt den Kernel und die Module.

    Jetzt muss noch das Sourceverzeichnis gepackt und auf den PI bertragen werden. Nutzen Sie folgenden Befehle:

    tar cfz linux_cross.tar.gz linux scp linux_cross.tar.gz pi@raspxx:/home/pi/progs CROSS_COMPILE ist eine Umgebungsvariabel aus kbuild

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Voraussetzungen Gertetreiber V speziell Raspberry PI

    17

    Sind die Sourcen bertragen werden sie mit dem Befehl tar xfzlinux_cross.tar.gz entpackt.

    Mit uname a ermittelt man die bereits installierte Kernelversion Wechseln Sie in das Verzeichnis linux und geben Sie make modules_install ein. Kopieren Sie den kompilierten Kernel mit dem Befehl cp arch/arm/boot/zImage

    /boot/linux- Bearbeiten der Datei config.txt im Verzeichnis /boot auf dem Raspberry Pi. Das

    hinzufgen bewirkt, dass der neu installierte Kernel gestartet wird. Fgen Sie die Zeile: kernel=linux zB.: linux-4.4.39-v7+ und die Zeile:device-tree= z.B.: bcm2709-rpi-2-b.dtb sudo cp arch/arm/boot/dts/*.dtb /boot/ sudo cp arch/arm/boot/dts/overlays/*.dts /boot/overlays

    Rebooten Sie das System GOOD LUCK!!! Loggen Sie sich wieder ein und berprfen Sie die Version

    Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

  • Der erste Gertetreiber I

    18 Kaus Ruhwinkel | Kernel Programmierung unter Linux 14.01.18

    module_init() und module_exit() sind Funktionendie Funktionen bekanntgeben, um den Treiber zuinitialisieren und aus dem Kernelspace zu entfernen.Sie nutzen spezielle Kernelmakros um die Rollen

Recommended

View more >