]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Diploma thesis text.
authorRostislav Lisovy <lisovy@gmail.com>
Tue, 5 Apr 2011 20:59:51 +0000 (22:59 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Tue, 5 Apr 2011 20:59:51 +0000 (22:59 +0200)
doc/diploma_thesis/text/dip_text.tex
doc/diploma_thesis/text/lisovy_dip.tex

index c8a41c7558d165ec9ef9a1195272ddad720e97d2..96183e8057cf995fd2a3462690b8f3a93379a833 100644 (file)
@@ -2,11 +2,9 @@
 \chapter{Motivace, cíl}
 Zadání této práce vzešlo z akademického prostředí a reaguje na nedostatek studijních materiálů v českém jazyce pro začátečníky, popisujících vývoj ovladačů (v tomto případě PCI zařízení) pro operační systém GNU/Linux.
 
-Text obsahuje pouze nezbytné množství teorie, která je podložená četnými příklady pro snadnější pochopení čtenářem.
+Text popisuje základní aspekty práce s PCI zařízeními v jádře Linux a uvádí dva konkrétní způsoby implementace ovladače zařízení PCI. Text obsahuje pouze nezbytné množství teorie, která je podložená četnými příklady pro snadnější pochopení čtenářem. Pro čtenáře neznalého psaní programů těsně svázaných s hardwarem se snažím názorně vysvětlit základní principy a úskalí tohoto druhu programování. V případě dalšího zájmu o problematiku může čtenář sáhnout po knize \cite{devicedriver}.
 
-Pro čtenáře neznalého psaní programů těsně svázaných s hardwarem se snažím názorně vysvětlit základní principy a úskalí tohoto druhu programování.
-
-V případě dalšího zájmu o problematiku může čtenář sáhnout po 
+Kromě samotného popisu vývoje PCI ovladačů je cílem práce částečně implementovat funkce karty Humusoft MF624 do emulačního programu Qemu tak, aby si případný zájemce mohl vše vyzkoušet, aniž by fyzicky vlastnil hardware.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Hardware}
 \section{Komunikace s hardwarem}
@@ -53,7 +51,13 @@ Hlavní rozdíly mezi chováním paměťové buňky a registru zařízení jsou:
 }
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{PCI sběrnice}\label{pcich}
-Přesný popis PCI sběrnice je mimo rozsah a zaměření této práce. Pokusím se však zmínit a názorně vysvětlit principy využívané touto sběrnicí, které je nutné alespoň částečně znát při implementaci ovladačů PCI zařízení.
+%Přesný popis PCI sběrnice je mimo rozsah a zaměření této práce. Pokusím se však zmínit a názorně vysvětlit principy využívané touto sběrnicí, které je nutné alespoň částečně znát při implementaci ovladačů PCI zařízení.
+
+PCI (\textit{Peripheral Component Interconnect}) je standard paralelní sběrnice využívaný v počítačích různých architektur. Šířka paralelně přenášených dat je 32 nebo v modernější, méně často používané verzi, 64 bitů. Sběrnice je orientována na přenost zpráv oproti přímé komunikaci mezi zařízeními\footnote{Příklad: FIXME}
+
+Komunikace mezi zařízeními připojenými na sběrnici a procesorem zajišťuje tzv. \textit{PCI most} (PCI bridge). Propojení více nezávislých sběrnic v jednom počítači jsou zajištěny také PCI mosty.
+
+\subsection{Historie}
 
 \begin{figure}[h!]
        \begin{center}
@@ -68,7 +72,9 @@ Přesný popis PCI sběrnice je mimo rozsah a zaměření této práce. Pokusím
        \end{center}
 \end{figure}
 
-PCI (\textit{Peripheral Component Interconnect}) je standard paralelní sběrnice využívaný v počítačích nejrůznějších architektur. Mezi její hlavní výhody (oproti její předchůdkyni -- sběrnicic ISA) patří dynamická konfigurace připojených zařízení: Ve většině případů probíhá komunikace mezi hostitelským systémem a připojenou (a nakonfigurovanou) PCI kartou zápisem/čtením do určité paměťové (nebo vstupně-výstupní) oblasti. U starší sběrnice ISA si každá karta pevně určila, kam se její část paměti namapuje -- v takovém případě mohl nastat problém, že více než jedna karta mapovala svoji paměť na stejnou adresu (nebo se jednolivá mapování překrývala). PCI sběrnice tomuto problému předchází takovým způsobem, že každá z karet nese informaci o tom, kolik jak velkých paměťových/I/O regionů potřebuje namapovat -- o samotné mapování se poté postará PCI most.
+
+\subsection{Dynamická konfigurace a konfigurační adresní prostor}
+Mezi její hlavní výhody (oproti její předchůdkyni -- sběrnicic ISA) patří dynamická konfigurace připojených zařízení: Ve většině případů probíhá komunikace mezi hostitelským systémem a připojenou (a nakonfigurovanou) PCI kartou zápisem/čtením do určité paměťové (nebo vstupně-výstupní) oblasti. U starší sběrnice ISA si každá karta pevně určila, kam se její část paměti namapuje -- v takovém případě mohl nastat problém, že více než jedna karta mapovala svoji paměť na stejnou adresu (nebo se jednolivá mapování překrývala). PCI sběrnice tomuto problému předchází takovým způsobem, že každá z karet nese informaci o tom, kolik jak velkých paměťových/I/O regionů potřebuje namapovat -- o samotné mapování se poté postará PCI most.
 
 Informaci o tom, kolik (a jaké) paměti karta bude potřebovat má před nakonfigurováním uloženu v tzv. \textbf{Base Address Registrech} -- BAR0--BAR5\footnote{FIXME Ve skutečnosti funguje vyčtení požadované velikosti z registru karty PCI mostem takovým způsobem, že se PCI most snaží do každého BAR registru zapsat 0xFF a poté zapsanou hodnotu přečíst -- do BAR registru je možné zapsat pouze .... bla bla}. Poté co se PCI mostu podaří tuto hodnotu přečíst a požadovanou paměť alokovat, zapíše zpět do daného registru adresu, na které se alokovaná paměť nachází. Tu si pro potřeby komunikace vyčte oprační systém.
 
@@ -94,7 +100,11 @@ Tyto registry slouží operačnímu systému k jednoznačné identifikaci zaží
 
 Výše popsané registry (a ostatní, které nejsou pro čtenáře podstatné) se nacházejí v 256bitovém tzv. \textbf{konfiguračním adresním prostoru} karty (\textit{po paměťovém a vstupně-výstupním adresním prostoru je zde třetí -- konfigurační -- adresní prostor}). Přístup do konfiguračního adresního prostoru je na architektuře IA-32 možný pomocí zapsání adresy (\textit{kam chceme v konfiguračním prostoru zapisovat}) a dat (\textit{která chceme do konfiguračního prostoru zapsat}) do dvou speciálních I/O portů, které jsou pro tuto operaci vyhrazeny.
 
+\subsection{Přerušení}
+
 
+\subsection{Budoucnost}
+V posledních letech je na poli osobních počítačů PCi sběrnice nahrazována její nástupkyní -- sběrnicí PCIe (PCI Express). Ta je narozdíl od PCI seriová a dosahuje rychlostí až XY Gbit/s. I přesto je sběrnice PCI stále využívána mnohými zařízeními -- převážně v průmyslu.
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Humusoft MF624}
 \begin{figure}[h!]
@@ -215,11 +225,27 @@ Karta MF624 obsahuje osm 14bitových A/D převodníků s pevně stanoveným rozs
 \item Nejprve se v registru ADCTRL zvolí, které A/D převodníky mají být čteny. 
 Každý z A/D převodníků je reprezentován jedním bitem. Zápisem 1 do daného bitu se nastaví, že bude daný A/D převodník aktivní -- 0 ho deaktivuje.
 \item Čtením registru ADSTART se spustí převod na zvolených A/D převod\-nících. Přečtená hodnota se dále nepoužívá.
-\item V případě, že se provedl převod na všech zvolených A/D převodnících, je EOLC bit GPIOC registru nastaven na 0 (jinak je v 1).
+\item V případě, že se provedl převod na všech zvolených A/D převodnících, je EOLC bit (17. bit) GPIOC registru nastaven na 0 (jinak je v 1).
 \item Výslednou hodnotu je možné přečíst z registru ADDATA typu FIFO nebo mnohem jednodušší je čtení z jeho zrcadlených hodnot v registrech ADDATA0--ADDATA7 (v manuálu jsou označeny pouze jako \textit{BADR1 + 0x02} až \textit{BADR1 + 0x0E}).
 \end{itemize}
 
-Hodnota vyčtená z A/D převodníků je ve formátu dvojkového doplňku.
+Hodnota vyčtená z A/D převodníků je ve formátu dvojkového doplňku -- příklad konkrétních hodnot je v tabulce \ref{tab_adval}.
+
+
+\begin{table}[h!]
+       \begin{center}
+       \begin{tabular}{|c|c|}
+       \hline \textbf{Digitální hodnota} & \textbf{Analogová hodnota} \\ 
+       \hline 0x3FFF & -0.0012 V \\ 
+       \hline 0x2000 & -10.0000 V \\ 
+       \hline 0x1FFF &  9.9988 V \\ 
+       \hline 0x0000 &  0.0000 V \\ 
+       \hline 
+       \end{tabular} 
+       \caption{Kódování vstupních hodnot A/D převodníku}
+       \label{tab_adval}
+       \end{center}
+\end{table}
 
 \subsection{D/A převodníky}
 Karta MF624 obsahuje také osm 14bitových D/A převodníků s rozsahem $\pm$10 V.
@@ -227,19 +253,33 @@ Karta MF624 obsahuje také osm 14bitových D/A převodníků s rozsahem $\pm$10
 Nastavení výstupních hodnot D/A převodníků může probíhat následujícícm způsobem:
 
 \begin{itemize}
-\item Hodnota v aditivním kódu (tabulka 23 v originálním manuálu) se zapíše do jednoho z osmi registrů DA0--DA7 odpovídajícího D/A převodníku, který chceme nastavovat
-\item Bit DACEN registru GPIOC je potřeba nastavit na 0, jinak jsou výstupy D/A převodníků připojeny na \textit{zem}.
-\item Bit LDAC registru GPIOC je potřeba nastavit na 0, aby byl spuštěn samotný převod D/A převodníků.
+\item Hodnota v aditivním kódu (tabulka \ref{tab_daval}) se zapíše do jednoho z osmi registrů DA0--DA7 odpovídajícího D/A převodníku, který má být nastaven.
+\item Bit DACEN (26. bit) registru GPIOC je potřeba nastavit na 0, jinak jsou výstupy D/A převodníků připojeny na \textit{zem}.
+\item Bit LDAC (23. bit) registru GPIOC je potřeba nastavit na 0, aby byl spuštěn samotný převod D/A převodníků (jinak zůstane zapsaná hodnota pouze v registru, výstupní hodnota D/A převodníku zůstane nezměněna).
 \end{itemize}
 
 
+\begin{table}[h!]
+       \begin{center}
+       \begin{tabular}{|c|c|}
+       \hline \textbf{Digitální hodnota} & \textbf{Analogová hodnota} \\ 
+       \hline 0x3FFF &  9.9988 V \\ 
+       \hline 0x2000 &  0.0000 V \\ 
+       \hline 0x1FFF & -0.0012 V \\ 
+       \hline 0x0000 & -10.0000 V \\ 
+       \hline 
+       \end{tabular} 
+       \caption{Kódování vstupních hodnot A/D převodníku}
+       \label{tab_daval}
+       \end{center}
+\end{table}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Implementace ovladačů}
 \section{Operační systém GNU/Linux}
 Jako cílový operační systém, na kterém bude vysvětlena implementace základních ovladačů, byl zvolen GNU/Linux\footnote{Operační systém sestávající z GNU nástrojů a jádra Linux je označován jako GNU/Linux.}. Hlavním důvodem je jeho otevřenost (a z toho plynoucí velké množství kvalitní dokumentace), rozšířenost (hlavně mezi vestavěnými zařízeními) a vysoká kvalita. Distribucí použitou při vývoji byl  Debian GNU/Linux (verze jádra Linux 2.6.35) -- popsané postupy by však měly fungovat i pro jiné distribuce.
 
-\subsection{Principy psaní jaderných modulů}
+\subsection{Základní jaderný modul}
 Jádro operačního systému GNU/Linux je monolitické -- to znamená, že po zkompilování a slinkvání je tvořeno jedním kusem kódu. Tento druh jádra je léty prověřen a mezi výhody patří jeho snadná implementace. Aby běžící jádro nemuselo obsahovat veškeré dostupné ovladače zařízení (nebo abychom v případě potřeby přidat do jádra ovladač pro nový hardware nemuseli celé jádro znovu kompilovat), existuje mechanismus načítání jaderných modulů za běhu, tzv. LKM -- Loadable Kernel Module. V praxi to vypadá tak, že jsou v běžícím jádře zakompilovány pouze nejnutnější ovladače, všechny ostatní si může systém nebo uživatel za běhu do jádra načíst -- v případě, že již nejsou potřeba, je možné je z jádra uvolnit.
 
 Jak se takový jaderný modul může vypadat, je nejlepší si ukázat na příkladu:
@@ -338,6 +378,16 @@ V logu je opět nachází text vypisovaný modulem při uvolňování z jádra.
 
 
 \ibox{V případě, že se chystáme do jádra zavést modul, jehož jsme autoři a nejsme si jisti jeho funkčností, doporučuji si veškerou důležitou práci uložit a před zavedením/uvolněním modulu do/z jádra spustit program \texttt{sync}, který uloží obsah diskových bufferů na disky.}
+
+\subsection{Na co si dávat pozor}
+Při psaní základního modulu pro jádro Linux nejsou patrné větší rozdíly oproti psaní programů pro uživatelský prostor. I přesto, že tyto rozdíly nejsou vidět, stále tady jsou. Mezi ty nejdůležitější, kterých si má být programátor vědom, patří:
+
+\begin{description}
+\item[Žádná ochrana paměti]~\\Libovolný jaderný modul má přístup k veškeré paměti počítače. V případě, že se chybně pokusí zapsat do paměti, do které by zapisovat neměl, není zde žádný mechanismus, který by mu v tom zabránil nebo ho na to alespoň upozornil.
+\item[Uvolňování paměti]~\\Stejně jako pro programy psané v uživatelském prostoru platí, že nepotřebná dynamicky alokovaná paměť by měla být dealokována. V případě neuvolňování paměti programem v uživatelském prostoru je zde stále operační systém, který po skončení programu veškerou paměť uvolní. Nic takového však v jádře operačního systému nefunguje -- po uvolnění modulu z jádra není nikdo, kdo by se postaral o naalokovanou paměť. FIXME
+\item[Přímý přístup k hardwaru]~\\Základní jaderný modul psaný například nezkušeným studentem má zcela stejné možnosti přístupu k hardware jako subsystémy jádra, které se starají o správnou funkci jednotlivých ovladačů. V lepším případě může špatný ovladač způsobit pád systému, v horším např. zničení dat na disku nebo dokonce zničení hardware\footnote{FIXME příklad s e1000e síťovkou}.
+\end{description}
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Ovladače PCI zařízení}
 %Než začneme implementovat skutečný ovladač pro kartu MF624 je potřeba si vysvětlit základní funkce pro práci s PCI zařízeními a vstupně-výstupním a paměťovým adresním prostorem.
@@ -519,7 +569,7 @@ Příklad, jak taková jednoduchá inicializace struktury \texttt{struct uio\_in
 Na posledním řádku je, dosud nepopsané, volání \texttt{pci\_set\_drvdata()}. To (v tomto případě) zajistí, že struktura \texttt{struct uio\_info} se stane součástí struktury reprezentující zařízení (\texttt{struct pci\_dev}) -- což umožní přístup ke struktuče \texttt{struct uio\_info} z funkcí jako je například funkce \texttt{remove()}, která jako parametr získá ukazatel na strukturu \texttt{struct pci\_dev}
 
 \subsection{Program v uživatelském prostoru}
-Poté, co je jaderná část UIO ovladače úspěšně zkompilována a zavedena do systému, je rozhraní mezi tímto modulem a uživatelským prostorem tvořeno:
+Poté, co je jaderná část UIO ovladače úspěšně zkompilována a zavedena do systému, ve kterém se nachází požadované zařízení, je rozhraní mezi tímto modulem a uživatelským prostorem tvořeno:
 \begin{itemize}
 \item souborem \texttt{/dev/uio0\footnote{Pro názornost v textu uvádím konkrétní zařízení \texttt{uio0}. V případě, že systém obsahuje více aktivních UIO ovladačů, jsou postupně číslovány od 0 výše.}}.
 \item složkou \texttt{/sys/class/uio/uio0}, která obsahuje informace o regionech, které jsou zpřístupněny skrze UIO modul v jádře.
@@ -572,6 +622,19 @@ Pro ovladače měřících karet existuje v Linuxu subsystém -- tzv. Comedi (Co
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Závěr}
 
-%\appendix
-%\chapter{Qemu a Humusoft MF624}\label{qemu}
-%Měřící karta Humusoft MF624 je hardware vhodný pro výklad implementace ovladače, je ale poměrně drahý. Pro účely výuky proto byly do emulačního software Qemu implementovány základní funkce této měřící karty -- konkrétně se jedná o A/D převodníky, D/A převodníky a digitální vstupy a výstupy. 
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\appendix
+\chapter{Qemu a Humusoft MF624}\label{qemu}
+Měřící karta Humusoft MF624 je hardware vhodný pro výklad implementace ovladače, je ale poměrně drahý. Pro účely výuky proto byly do emulačního software Qemu implementovány základní funkce této měřící karty -- konkrétně se jedná o A/D převodníky, D/A převodníky a digitální vstupy a výstupy. Takto modifikovaná verze qemu může pří implementaci základního ovladače plně nahradit původní kartu.
+
+\section{Kompilace, instalace}
+Tento \textit{virtuální} hardware se skládá ze dvou částí:
+\begin{itemize}
+\item Částečné implementace funkce karty do emulačního softwaru Qemu
+\item Grafického programu svázaného s virtuální kartou v Qemu, který má na starosti nastavování vstupních hodnot a zobrazování výstupních hodnot do/z karty.
+\end{itemize}
+
+\section{Použití}
+Komunikace mezi virtuální kartou implementovanou v Qemu a grafickým programem probíhá pomocí TCP/IP protokolu.
+
index 7b02c0dd4452f6605823b64dc734cf09645394bd..0316f37455390def45c9e2468083f3d99dc4b16c 100644 (file)
@@ -14,7 +14,7 @@
  % \newcommand{\efig}{\end{center}\end{figure}}
  % umoznuje pouzit prikaz \bfig namisto \begin{figure}\begin{center} atd.
 
-\newcommand{\ibox}[1]{ \begin{center} \fbox{\parbox{12cm}{ #1 }} \end{center}}
+\newcommand{\ibox}[1]{ \begin{center} \fbox{\parbox{14cm}{ #1 }} \end{center}}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%