find_task_by_pid und compilieren

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

find_task_by_pid und compilieren

Beitrag von Chimerer » 20.12.2003 23:57:44

Bin gerade dabei ein bischen mit dem Kernel rumzuspielen, genauer gesagt mit den Tasks.

Code: Alles auswählen

#include <linux/sched.h>

int main (void)
{
	struct task_struct * task;
	
	task = find_task_by_pid(16233);
	return 0;
}	
Der Code an sich ist afaik richtig. Nur wie bekomme ich das Teil compiliert?

Torsten
Beiträge: 384
Registriert: 24.09.2002 22:51:07
Kontaktdaten:

Beitrag von Torsten » 21.12.2003 01:25:00

Moinsen,

bist Du Dir sicher, dass man das so als userprocess oder selbst im userspace laufen lassen kann? Ich denke beinahe nicht. Denn immerhin wird damit, solange ich gerade nicht total falsch liege, ein Zugriff auf die PID Hashtabelle vorgenommen. Das findet wohl eher Verwendung in Modulen. Lasse mich selbst aber auch gerne belehren.

Grüße

Torsten

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 21.12.2003 16:13:53

Torsten hat geschrieben:Moinsen,

bist Du Dir sicher, dass man das so als userprocess oder selbst im userspace laufen lassen kann? Ich denke beinahe nicht. Denn immerhin wird damit, solange ich gerade nicht total falsch liege, ein Zugriff auf die PID Hashtabelle vorgenommen. Das findet wohl eher Verwendung in Modulen. Lasse mich selbst aber auch gerne belehren.

Grüße

Torsten
Stimmt daran hatte ich nicht gedacht, bin ja aber auch noch blutiger Kernelnewbie. ;) Der Code-Schnipsel müsste dennoch compilierbar sein, die Frage ist nur mit welchen gcc-Flags...?

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 21.12.2003 17:04:31

Hab das ganze jetzt zum Modul gemacht und mit folgender Makefile compiliert:
WARN := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC := gcc
OBJS := ${patsubst %.c, %.o, ${wildcard *.c}}

all: ${OBJS}

.PHONY: clean

clean: rm -rf *.o
Können eigentlich nur Module auf den Kernel-space zugreifen, oder gibt es auch andere Möglichkeiten?

Torsten
Beiträge: 384
Registriert: 24.09.2002 22:51:07
Kontaktdaten:

Beitrag von Torsten » 21.12.2003 18:02:47

Moinsen,

mal ein Beispiel aus einem meiner Makefiles

Code: Alles auswählen

CC=gcc
CFLAGS := -I/usr/src/linux/include -O2 -Wall -DCONFIG_KERNELD -DMODULE -D__KERNEL__ -DLINUX

all:	treiber.o

treiber.o: treiber.c /usr/include/linux/version.h
	$(CC) $(CFLAGS) -c treiber.c

ins:
	insmod treiber.o

rm:	
	rmmod treiber

sytem calls stellen im Prinzip einen Zugriff auf Systemebene dar. Einen kennen wir wohl alle: fork().

Jedoch sind das alles keine direkten Zugriffe. Das wäre auch schlimm. Denn genau diese Trennung ist der Schutz zwischen userspace und Hardware.
So kann man wohl sagen, dass lediglich Treiber direkten Zugriff auf Kernfunktionen haben.

Einfach gesagt ist der Kernel ja "nur" die Schnittstelle zwischen Hardware und Software.
Und noch einfacher gesagt, entspricht der userspace lediglich dem Programm, welches auf einen Treiber zugreifen will. Der kernelspace dabei ist der Bereich, der vom Treiber angesprochen wird.

Das alles sollte man aber nicht verallgemeinern.
Es gibt ja nicht nur Linux. Andere Systeme, die beispielsweise die Philosophie des Microkernels anstreben, sind da noch etwas drastischer. Dort haben nicht mal Treiber direkten Zugriff auf Kernfunktionen. Jene laufen dort im userspace.
Und wieder anders ist Windows. Dort laufen teilweise Anwendungsprogramme im kernelspace. Beispielsweise der MS Webserver IIS.

Mal ein Link zur Info. Das ist aus dem Buch "Linux Device Drivers, 2nd Edition".
http://www.oreilly.de/german/freebooks/ ... x1670.html

Grüße

Torsten

Antworten