Hardware-Programmierung mit Linux/NASM



Ähnliche Dokumente
Ein reales Testumfeld bereitstellen - basierend auf einer Produktionsdatenbank (ohne eine neue Kopie zu erstellen)

Informatik Grundlagen, WS04, Seminar 13

Anleitung über den Umgang mit Schildern

Installation OMNIKEY 3121 USB

Programmieren I. Kapitel 15. Ein und Ausgabe

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

RO-Serie CAN-Übertragungsprotokoll

Virtuelle COM-Schnittstelle umbenennen

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

10.6 Programmier-Exits für Workitems

Auto-Provisionierung tiptel 31x0 mit Yeastar MyPBX

Netzwerksicherheit Musterlösung Übungsblatt 4: Viren

NODELOCKED LIZENZ generieren (ab ST4)

I.1 Die Parrot Assemblersprache

Professionelle Seminare im Bereich MS-Office

Zählen von Objekten einer bestimmten Klasse

Zugriff auf die Modul-EEPROMs

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Technische Dokumentation SilentStatistikTool

Thermoguard. Thermoguard CIM Custom Integration Module Version 2.70

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging

Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Der Task-Manager

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

13. Lineare DGL höherer Ordnung. Eine DGL heißt von n-ter Ordnung, wenn Ableitungen y, y, y,... bis zur n-ten Ableitung y (n) darin vorkommen.

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Einrichtung des WS_FTP95 LE

Anleitung zur Einrichtung der VR-NetWorld Card basic in der VR-NetWorld Software

Einführung in die technische Informatik

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

TortoiseGit Step by Step Step 1: git for windows herunterladen und installieren.

Dokumentation IBIS Monitor

Synchronisierung. Kommunikationstechnik, SS 08, Prof. Dr. Stefan Brunthaler 73

MC-Hx 006. Einbindung des MC-Hx Modul als MODBus TCP Slave. MB DataTec GmbH. Stand:

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

ACDSee Pro 2. ACDSee Pro 2 Tutorials: Übertragung von Fotos (+ Datenbank) auf einen anderen Computer. Über Metadaten und die Datenbank

Installationsanweisung editit

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Stepperfocuser 2.0 mit Bootloader

SMS/ MMS Multimedia Center

Datenbanken Kapitel 2

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil IV: Programmieren an Beispielen

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

1 Vom Problem zum Programm

Print2CAD 2017, 8th Generation. Netzwerkversionen

1. Zugriff auf das Lonza Netzwerk von ihrem privaten PC oder von einem Internet Café

CodeSaver. Vorwort. Seite 1 von 6

Info-Veranstaltung zur Erstellung von Zertifikaten

Objektorientierte Programmierung

Programmierung in C. Grundlagen. Stefan Kallerhoff

Bilder zum Upload verkleinern

Beispiel(unten ist der Spielfeldrand):

Inbetriebnahme des Willem Programmers PCB5-E. Die Software GQUSBprg 0.98d6 Willem Enhanced / Dual Power Programmer PCB5.

Künstliches binäres Neuron

Handbuch. Artologik EZ-Equip. Plug-in für EZbooking version 3.2. Artisan Global Software

Zusammenführen mehrerer Dokumente zu einem PDF In drei Abschnitten erstellen Sie ein Dokument aus mehreren Einzeldokumenten:

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Dokumentation zur Versendung der Statistik Daten

AutoTexte und AutoKorrektur unter Outlook verwenden

Anwendungsbeschreibung an einem Beispiel

ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg Weiterstadt

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

Einrichtung von Mozilla Thunderbird

KeePass Anleitung. 1.0Allgemeine Informationen zu Keepass. KeePass unter Windows7

Deutsches Rotes Kreuz. Kopfschmerztagebuch von:

miditech 4merge 4-fach MIDI Merger mit :

GSM Scanner Bedienungsanleitung

ajanzen.com Beispiele für den Umgang mit Feldsymbolen

Modellierung und Programmierung 1


Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Programmierkurs Java

Konfigurationsanleitung Access Control Lists (ACL) Funkwerk. Copyright Stefan Dahler Oktober 2008 Version 1.0.

Kostenloser Apple-Softclient zur Nutzung von TeSign

Sichern auf den zentralen TSM-Servern unter Windows. Sichern auf den zentralen TSM-Servern unter Windows

Version smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):

Installationshinweise für OpenOffice Portable auf einem Wechseldatenträger Stand: 27. März 2003 LS Stuttgart, Kaufmännische ZPG

S7-Hantierungsbausteine für R355, R6000 und R2700

3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode?

MPI-Programmierung unter Windows mit MPICH2. Installieren von MPICH2, Übersetzen, Ausführen und Debuggen von MPI-Programmen. Christian Terboven

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Übung - Arbeiten mit CLI-Befehlen in Windows

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Den Fehler session error bei der Kalenderanmeldung beheben:

INHALT. Troubleshooting Netzwerkinstallation

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

How to install freesshd

Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen

Installationsanleitung für das KKL bzw. AGV4000 Interface

PDF-Dateien erstellen mit edocprinter PDF Pro

Transkript:

Hardware-Programmierung mit Linux/NASM Daniel Grün 12. Februar 2007 Zusammenfassung Direkte Ansteuerung der Parallel-Schnittstelle mittels NASM unter Linux nur unter Einsatz von reinen Assembler-Routinen und Linux System Calls, aufgezeigt am Beispiel der Ansteuerung eines Druckers 1 Theorie 1.1 Zielsetzung Es soll ein Drucker am Parallelport unter Linux mit möglichst einfachen Mitteln angesprochen werden. Insbesondere soll dabei kein vorgefertigter Treiber zum Einsatz kommen, sondern der Drucker direkt über Portzugriffe gesteuert werden. Das Programm ist in NASM geschrieben und soll möglichst ohne Befehle der C- Bibliothek auskommen. Alle nötigen Funktionen sind daher direkt in Assembler zu implementieren. 1.2 Hardwareprogrammierung mit DOS/Assembler Unter einem Betriebssystem wie DOS ist der Zugriff auf Hardwareinstanzen z.b. mit Assembler ohne Beschränkungen möglich: mov ax, A ; byte to write mov dx,0x378 ; destination out dx,al ; write al to dx mov dx,0x37a ; source port in al,dx ; read to al Dieser Beispielcode schreibt unter DOS ohne Weiteres ein A auf Register 0x378 und liest das Register 0x37a nach al ein. Insbesondere ist es auch möglich, BIOS-Interrupts direkt zu verwenden: mov ah,0 mov al, A ; character: A mov dx,1 ; send to LPT2 int 0x17 ; BIOS LPT interrupt Somit ist es hier nicht weiter schwierig, den Drucker entweder über BIOS- Befehle oder direkte Port-Ansteuerung anzusprechen. 1

1.3 Portprogrammierung mit Linux/NASM Der Linux-Kernel erlaubt im Normalfall die unter DOS gegebenen Möglichkeiten des direkten Port-Zugriffs und der BIOS-Interrupts nicht. Dies ist unvermeidlich, da Linux als Mehrbenutzer- und Multitasking-System andere Sicherheitsansprüche als DOS stellt (Dateirechte, Sicherheit gegen unbefugten Zugriff bzw. Cracking). Während der Zugriff auf alle Interrupts außer dem Kernel-Interrupt 0x80 unter Linux unmöglich bleibt, kann der Portzugriff freigeschaltet werden. Hierzu gibt es unter C zwei Möglichkeiten: die Befehle ioperm und iopl, wobei der erstere zur Freischaltung einiger Ports, der zweite zur globalen Freischaltung aller dient. Diese Befehle beruhen auf System-Calls des Linux-Kernels, die auch von Assembler aus angewandt werden können, wie weiter unten Beschrieben ist. Einem vom Benutzer root gestarteten Prozess kann so der direkte Portzugriff wie unter DOS ermglicht werden. Im Folgenden kann dann mit in und out wie unter DOS auf die freigeschalteten Ports (hier 0x378 bis 0x37a) zugegriffen werden. 2 Realisierung Das Programm zum Ausdrucken einer Textdatei ist folgenden Schritten realisiert: 1. Portzugriff freischalten 2. Textdatei öffnen 3. Zeichen lesen und drucken 4. Programmende 2.1 Portzugriff freischalten Die Freischaltung der Ports für die eine parallele Schnittstelle bei 0x378 funktioniert z.b. mit ioperm wie folgt. Die nötigen Parameter werden dabei in die Register geladen und dann der System-Call 101 (sys ioperm) ausgeführt: mov eax, 101 ; sys_ioperm mov ebx, 0x378 ; from port mov ecx, 3 ; number of subsequent ports mov edx, 1 ; turn permission on int 0x80 ; kernel Im Folgenden kann dann mit in und out wie unter DOS auf die freigeschalteten Ports (hier 0x378 bis 0x37a) zugegriffen werden. 2.2 Textdatei öffnen Dem Programm wird als einziger Parameter (bei Programmstart der Reihenfolge nach im Stack gespeichert) der Name der Textdatei übergegeben, die gedruckt werden soll. Die folgende Routine mit System Call sys open und Fehlerüberprüfung liest den Dateinamen und öffnet die Datei im Read-Only-Modus. 2

mov eax,5 ; sys_open pop ebx ; argc pop ebx ; argv[0]: program name pop ebx ; should be the argument: filename mov ecx,0 ; mode = O_RDONLY -- we hope it exists int 0x80 ; kernel test eax,eax ; check returned file descriptor jns cont2 ; continue if positive (not signed) error_exit ; this jumps to an error exit cont2: push eax ; save fd Im Stack befindet sich nun der file descriptor, ein Integerwert, über den mittels read aus der Datei gelesen werden kann. 2.3 Zeichen lesen und drucken Jedes Zeichen wird nun einzeln gelesen und gedruckt, bis die Datei vollständig verarbeitet ist. 2.3.1 Zeichen lesen Zum Lesen eines Zeichens wird der System Call sys read eingesetzt: mov eax,3 ; sys_read pop ebx ; file descriptor from stack mov ecx,buffer ; memory address to read to mov edx,1 ; number of bytes to read 2.3.2 Zeichen drucken Um ein Zeichen an den Drucker zu senden, muss eine Reihe von Befehlen ausgeführt werden. Bei einfachen Nadeldruckern ist das folgende Protokoll erfolgreich: zu druckendes Byte an Datenport senden (per out-befehl, siehe Listing) Statusbyte lesen (per in-befehl) Strobe-Bit des Statusbytes auf high setzen und an Status-Port zurückschreiben Strobe-Bit des Statusbytes wieder auf low setzen und an Status-Port zurückschreiben Acknowledge-Bit des Statusbytes abwarten 3

Die Schreib- und Lesevorgänge funktionieren wie weiter oben beschrieben (siehe auch Listing). Zum Setzen und Überprüfen des Strobe- und Acknowledge- Bits des Statusbytes werden binäre Operatoren eingesetzt. So setzt ein or mit 0x01 das erste Bit (Strobe) high, ein and mit 0xfe das selbe Bit low. Ein and mit 0x40 liefert setzt genau dann das zero -Flag, wenn das sechste Bit (Acknowledge) low ist, der Drucker den Empfang des Zeichens also bestätigt hat. 2.3.3 Wartezeiten Auch wenn man das Acknowledge-Bit abwartet, geht die Ausgabe der Zeichen oft zu schnell. Der Portbaustein braucht eine gewisse Zeit zur Verarbeitung der Signale. Die nötige Verzögerung kann mittels des System Calls sys nanosleep erzeugt werden, der den jeweiligen Prozess für eine gewissen Zeitdauer anhält. Als Parameter wird eine Datenstruktur verlangt, die sich wie folgt zusammensetzt: struc timespec second: resd 1 nanosec: resd 1 endstruc Es wird eine konstante Instanz dieser Datenstruktur eingeführt, die die gewünschte Wartezeit enthält (hier 500000ns, siehe Listing). Man übergibt die Datenstruktur an den System Call wie folgt: mov eax,162 mov ebx,temp1 mov ecx,0 int 80h ; sys_nanosleep ; load time structure. ; no safety net in case of signals ; sys_nanosleep Da nanosleep durch Signale unterbrochen werden kann, ist es möglich, eine zweite Datenstruktur in ecx anzugeben, die in diesem Fall die noch nicht vergangene Wartezeit speichert. Hier soll darauf verzichtet werden. 2.3.4 Textausgabe Um den Programmablauf besser nachvollziehen zu können, werden einige Meldungen sowie der gedruckte Text auch auf dem Bildschirm ausgegeben. Hierzu wird der System Call sys write auf file descriptor 1 (entspricht stdout) eingesetzt: mov ebx,1 ; stdout mov ecx,tgreeting ; string at memory address tgreeting mov edx,37 ; length of the string Die selbstgeschriebene Funktion putc schreibt ein Zeichen, indem sie den Stack Pointer als Speicheradresse nutzt. 4

3 Programmlisting Der folgende kommentierte Programmtext kann mittels NASM (hier Version 0.98) auf Linux-Systemen kompiliert werden. ; print.asm: ; prints a file given as command line parameter to lpt1 ; using only system s and direct port access ; (c) Daniel Gruen, 2006 ; License: GNU General Public License (GPL) Version 2 ; No Warranty whatsoever! section.text global _start lp1_port equ 0x378 ; my lp port, change this accordingly struc timespec ; model for "nanosleep" structure. second: resd 1 nanosec: resd 1 endstruc _start: mov ebx,1 ; stdout mov ecx,tgreeting mov edx,37 ; length int 0x80 ; step 0: get port permissions mov eax, 101 ; sys_ioperm mov ebx, lp1_port ; from mov ecx, 3 ; num mov edx, 1 ; turn on inc eax ; is return value 0 = ok? jnz cont1 ; go on unless eax was -1 error_exit cont1: ; read & print characters ; step 1: open file mov eax,5 ; sys_open pop ebx ; argc pop ebx ; argv[0] pop ebx ; argv [1] should be the argument: filename mov ecx,0 ; O_RDONLY -- we hope it exists 5

test eax,eax ; check returned value jns cont2 ; go on if not signed (=if positive) error_exit cont2: push eax ; save fd rploop: mov ebx,1 ; stdout mov ecx,tinit mov edx,41 ; length ; step 2: read char mov eax,3 ; sys_read pop ebx ; file descriptor (fd) mov ecx,buffer ; address to read to mov edx,1 ; should be type size_t... push ebx ; save fd push eax ; save number of read bytes mov ax,[buffer] putc ; step 3: print char ; step 3a: send char on data port mov ax,[buffer] mov dx,lp1_port out dx,al ; step 3b: read status byte mov dx,lp1_port+2 in al,dx ; step 3c: set strobe high or al,0x01 ; step 3d: write high strobe status byte mov dx,lp1_port+2 out dx,al ; step 3e: read status byte mov dx,lp1_port+2 in al,dx 6

; step 3f: set strobe low and al,0xfe ; step 3g: write low strobe status byte mov dx,lp1_port+2 out dx,al ; step 3h: wait for ack signal mov ebx,100 lack: mov dx,lp1_port+2 mov in and jz dx,lp1_port+2 al,dx al,0x40 pend mov eax,162 mov ebx,temp1 mov ecx,0 int 80h ; sys_nanosleep ; time strucure ; no safetz net in case of signals ; kernel push mov pop ebx eax, w putc ebx dec ebx jnz lack ; acknowledge waiting loop ; step 4: repeat if neccessary pend: mov eax,162 mov ebx,temp1 mov ecx,0 int 80h ; sys_nanosleep ; time strucure ; no safety net in case of signals ; kernel pop dec jz mov eax eax rploop ax,10 putc ; step 5: close file pop ebx ; fd 7

mov eax,1 ; sys_exit mov ebx,0 int 0x80 error_exit: mov ebx,1 ; stdout mov ecx,terror mov edx,28 ; length mov eax,1 ; outta here (sys_exit) mov ebx,1 ; return code: error int 0x80 ; kernel_ ret putc: push eax ; puts char in eax mov ebx,1 ; file descriptor -> stdout mov ecx,esp ; stack pointer -> data address mov edx,1 ; length 1 pop eax ; restore eax ret section.data tgreeting: db This program will your printer., 10, 0 tinit: db Finished initialization. Now printing..., 10, 0 terror: db An error occured. Exiting..., 10, 0 timeout_count: db 9 ; cycles to wait till timeout strobe_wait: db 200 buffer: times 4 db 0 temp1 istruc timespec at second, dd 0 at nanosec, dd 500000 iend 8