Linux Kernel |
Kernel Threads |
|
Kernel Threads werden mit eckigen Klammern hervorgehoben um sie von normalen Prozessen zu unterscheiden
Kernel Prio |
die priorität von prozessen wird mittels nice gesetzt [-20,19], im Linux Kernel werden Prioritäten einfacher von 0-139 dargestellt [-20,19] entspricht hierbei den prioritäten 100 - 139, der niedrigste Wert hat demnach auch die höchste Priorität
NUMA |
http://lse.sourceforge.net/numa/faq/
Verteilung des Kernels im Speicher |
|
Zeigt an das der Kernel erst ab dem 1. MB im Arbeitsspeicher beginnt der Code benötigt ungefähr 2.5 MB, der Datenabschnitt 0.9MB. Man sieht hier auch z.b die Adresse des BIOS ROM/RAMs, Video ROM/RAMs, usw.
Virtueller Adress Raum |
Nettes Thema, wurde im Kernelbuch noch nicht beschrieben, jedoch ist dort oft davon die Rede.. Da ich's nicht verstanden hab hab ich's mir mal auf irc.oftc.net/#kernelnewbies erklären lassen :-))
|
http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/admin-guide/s1-memory-virt-details.html
http://www.xml.com/ldd/chapter/book/ch13.html
PAE Physical Address Extension
(intel invention) pae makes 4 extra bits available for addressing of memory, result => 2^36 => 64GiB though still there's the limitation of 4GiB for 32 bit applications so one process _cannot_ take more than 3GiB memory on a Linux system (since the kernel takes the other GiB? for managing the process)
|
|
|
Linux Speicherverwaltung |
* Slab(Kachel) Allocator (1994, Jeff Bonwick, sun microsystems) * virtueller Speicher
Beside my mind (probably had a nice evening before) |
|
Notizen |
n elemente von from in den kernelspace kopieren:
|
API Changes Kernel 2.6.11:
|
DMA Memory content/creative extigy 2 channels
|
C Format:
|
Datei im Kernelmodus öffnen und beschreiben(dateirechte müssen beachtet werden!):
|
Linux DMA
http://www.linux-magazin.de/Service/Books/Buecher/HW-Treiber/memdma.html
Wenn alles zusammenkommt und auf einmal Sinn ergibt |
Mit einer standard Debian kann man so ca 375 Threads erstellen. Woher kommt die Limitierung aber? Ziemlich einfach, der Kernel hat eine Aufteilung von 3:1 unter Linux (BSD und Windows sind häufig 2:2) das heißt von 4 GB physikalischen RAM können maximal 3 GB von einem Prozess verwendet werden. Teilt man jetzt 3 GB / die definierte Stack größe erhält man die Limitierung der Threads auf dem System. Die Größe der Stacksize wird in der limits.conf unter /etc/security festgelegt(das ganze muss auch mittels PAM erlaubt sein), sie kann jedoch auch "OnTheFly?" mittels ulimit -s geändert werden. Bei mysql ist zum Beispiel eine Größe von 128kbyte sinnvoll(laut Doku) was wiederum eine sehr hohe Anzahl von Verbindungen erlaubt.
Diskussion die mich dazu angeregt hat:
|
Antwort
|
Quelle: linux-kernel@vger.kernel.org (mailinglist)
Linked Lists im Kernel |
|
Memory Mapped IO |
http://www.kernelnewbies.org/documents/kdoc/deviceiobook/mmio.html
http://www.oreilly.de/german/freebooks/linuxdrive2ger/memmap.html
|
Kernelmodule |
Aufbau:
Module verwenden das ELF Binärformat das mit einigen zusätzlichen Sektionen versehen ist.
__ksymtab und __ksymtab_gpl .. enthalten eine Symboltabelle mit allen Symbolen die vom Modul exportiert werden.
__kcrctab und __kcrctab_gpl enthalten Checksummen für alle GPL- exportierten Funktionen des Moduls.
in __versions befinden sich die checksummen für alle Referenzen die das modul aus externen Quellen verwendet. (diese sektionen werden nur angelegt wenn das versionskontroll feature bei der konfiguration des kerns aktiviert wurde.
__param speichert die informationen darüber, mit welchen Parametern ein Modul versorgt werden kann.
in .modinfo stehen die abhängigkeiten des jeweiligen moduls
Dummy modul
hello.c:
|
test erscheint dann in /proc/devices
Makefile
|
Doku: <linuxkernel>Documentation/kbuild/makefiles.txt und modules.txt
Locking Mechanismen |
* Atomare OperationenWährend einer Operation wird ein lock Byte gesetzt (asm befehl) verhindert das der bus während es gesetzt ist von einem anderen prozess genutzt werden kann. Atomare Operationen sind in SMP Umgebungen sicher
* SemaphoreSemaphoren wurden 1965 von E. W. Dijkstra erfunden. Führt ein Prozess eine down funktion aus wird der wert der semaphore auf 0 erniedrigt und der "kritische" code ausgeführt. sobald der kritische code beendet ist wird eine up funktion ausgeführt welche die semaphore wieder auf 1 erhöht.
will während der erste prozess sich im down segment befindet ein weiterer prozess den kritischen code betreten wird er vom kernel sozusagen schlafengelegt solange bis der erste prozess wieder die up funktion aufgerufen hat (welche den wert der semaphore wieder auf 1 erhöht und einen schlafenden prozess aus einer queue auswählt, welcher dann die down funktion weiter ausführt und die semaphore wieder auf 0 setzt)
* und Spinlocks,Spinlocks gibt es eigentlich nur auf NUMA Systemen, für Einprozessormaschinen gibt's dafür nen Wrapper.
|
debugging |
die ersten 3 zeichen werden von syslog weggeschnitten sofern das kommentar eines von folgenden tags am anfang enthält:
<0> System is not usable <1> kern alert <2> critical system <3> errors occured <4> warning <5> notice <6> information <7> debug infopr_debug() ist ein wrapper um printk, welcher nur dann übersetzt wird sobald das kernelmodul mit -DDEBUG kompiliert wird
{WARN ON}?(index==limit); -- gibt ein warning/zeilennummer und einen traceback aus an dieser stelle {BUG ON}?(foo==bar); -- das selbe wie {WARN ON}? nur der codeblock wird auch verlassenauskommentieren von code im kernel
|
license fun |
|
no description .. just funny
modinfo |
macros defined in the module
|
|
copy_to_user |
der rückgabewert ist die anzahl bytes die nicht kopiert werden konnte
interrupt service routinen |
es gibt davon nur 16 (siehe z.b xosview 0-15), Registrierung von Isrs kommt noch..
datenablage im speicher |
Daten werden meist alligned in den speicher abgelegt
z.b
|
wenn der speicher bei 0xbffffa8c anfängt würde der block für __s32 c; bei addresse 0xbfffa8e beginnen, da diese adresse aber nicht durch 4 teilbar ist werden diese 2 bytes aus performancegründen "verschenkt". Will man die daten explizit gepackt angeben muss man am ende des structs noch __attribute__ packet; einfügen
TSC |
|
VMA |
If a page needs to be aligned on a page boundary, {PAGE ALIGN}?() is used.
|
|
graphical overview: http://i30www.ira.uka.de/teaching/coursedocuments/106/03-06_Kernallokation-und-Mapping_Meinhardt.pdf
regarding linus, don't use vmalloc -> it's slow, everything's explained in that pdf so far..
|
Einfach erklärt:
{PAGE ALIGN}? Beispiel:
|
|
http://www.xtrj.org/ppc/ powerpc and linux inside..
hier nochmal linux device drivers online (already ordered that book as well)
http://www.xml.com/ldd/chapter/book/
Sequence Files/Proc filesystem |
descrpition about sequence files on lwn.net (english) also includes a discussion
https://lwn.net/Articles/22355/another description of it in the german "Linux Treiber entwickeln" Book
http://ezs.kr.hsnr.de/TreiberBuch/html/sec.proc01.html
Neues Geräte Modell (/sys/) |
Das Gerätemodell bildet ab, wie die Prozessoren eines Systems mit seinen Controller-Bausteinen und diese wiederum mit den Peripheriekarten und mit sonstiger Hardware zusammenhängen. Eine detailierte Beschreibung gibts wiedermal in den Treiberbüchern..
z.b neue Bussysteme anlegen
|
devfs |
bereits in 2.6 als depreciated gekennzeichnet, da es angeblich race conditions enthält sowie z.b auch die zugriffsregelung nicht ordentlich implementiert ist (broken by design) ansonsten siehe devfs_mk_cdev, devfs_remove und devfs_mk_symlink
Module parametrieren |
In Kernel 2.6 wurde das Makro {MODULE PARM}? durch drei neue Makros ersetzt: module_param, module_param_array und module_param_string.
Example (also includes a sysfs example):
|
|
available datatypes:
|
HZ |
|
|
so in the kernel HZ is set to 1000 which stands for 1 second, for applications it's set to 100
|
memory allocation |
SetPageReserved?() wird benutzt um Speicher zu markieren der nicht ausgelagert werden soll
RingQueue? |
here's an example of a ringqueue (usbvideo.c), the depreciated function wait_on is used in that driver as well, below the main functions which also get exported in the kernel.
|
|
RingQueue? Test im Userspace:
|
Linux DMA |
http://www.linuxjournal.com/article/1222
also isa ist limitiert auf die ersten 16 MB Ram für DMA transfers
IO |
the first parallel port starts at 0x378, the second one is 0x278 there are 12 output pins and 5 input pins (rest is grounding)
Mutexes over Semaphores |
recently many drivers got patched to use mutexes instead of semaphores, the reason behind that action - mutexes are supposed to be faster - https://lwn.net/Articles/165039/