Frage zum linking von Kernel Modulen...

  • Ersteller Ersteller das.chaos
  • Erstellt am Erstellt am
D

das.chaos

Guest
Hi, frohes neues Jahr.

Wie sei es moeglich mehrere dynamisch ladbare Kernel Module miteinander zu verknuepfen?

Ausgangssituation:

a. KMOD, welches diverse Datenstroeme verarbeitet.

b. KMOD welches eine verkettete Liste (realisiert mittels queue.h) beinhaltet. Dieses besitzt eine in einer .h-Datei definierte Schnittstellenspezifikation (Fkt.Deklarationen von Fkt., die auf diese Verkettete Liste zugreifen, extern insert(), extern get(), extern set(), etc.pp.), welche auch in a. eingebunden sei. Das erstgenannte KMOD a. musz auf diese Verkettet Liste zugreifen.

c. SysCallKMOD, welches zugang zu KMOD b. hat, damit ich innerhalb dem UserSpace zugang zu b. faende.

Nun das Problem beschraenkt sich auf die zu den Modulen a. und c. definierten MakeFiles: Wie kann ich bspw. Modul a. mit Modul b. verlinken, damit Kmod a. auf die fkt. von b. zugreifen kann?
 
Hi!

Momentan ist es FreeBSD 8.0.

Isoliert betrachtet funktionieren die bereits erwaehnten Module. Aber wenn ich bspw. (die mit extern deklarierten) Funktionen aus Modul b. testweise in die Module a. und c. durch #include "extProtoTable.h" zuordne...

BeispielCode von KMOD b. als "extProtoTable.c", welches als Diestleister fuer KMOD a. und KMOD c. als Datensenke/-quelle agieren sollte:
Code:
/* 
 * protoTable : allowedTlProtocols... 
 */
#define TRUE 1
#define FALSE 0

#define SUCCESS 0

#define KMOD_IDENT "ExtProtoTable"

/* 
 * SystmIncludes
 */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>

#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>

#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/conf.h>
#include <sys/sysproto.h>

#include <sys/queue.h>

/* 
 * ListHead
 */
SLIST_HEAD(protoHead, protoElement_s) protoTable; 

/* 
 * ListElement
 */
struct protoElement_s
{ 				
	uint16_t proto;
							
	SLIST_ENTRY(protoElement_s) protoChain;			
};

#include "extProtoTable.h"

/* 
 * FuncDefinitions : LinkedList : protoTable
 */
void insertProto(uint16_t *proto)
{
	struct protoElement_s *newListNode = (struct protoElement_s *)malloc(sizeof(struct protoElement_s), M_TEMP, M_ZERO);
	
	newListNode->proto = *proto;

	SLIST_INSERT_HEAD(&protoTable, newListNode, protoChain);
 
	return;
}

void removeProto(uint16_t *proto)
{
	struct protoElement_s *ptrToElement = NULL;
	SLIST_FOREACH(ptrToElement, &protoTable, protoChain)
	
	if (ptrToElement->proto == *proto)
	{
		SLIST_REMOVE(&protoTable, ptrToElement, protoElement_s, protoChain);
		free(ptrToElement, M_TEMP);	
	}
			
	return;
}

int findProto(uint16_t *proto)
{ 
	struct protoElement_s *ptrToElement = NULL;
	SLIST_FOREACH(ptrToElement, &protoTable, protoChain)
	
	if (ptrToElement->proto == *proto)
	{
		return(TRUE);
	}
			
	return(FALSE);
}

void clearProtoTable(void)
{ 
	struct protoElement_s *ptrToElement = NULL;
	SLIST_FOREACH(ptrToElement, &protoTable, protoChain)
	
	SLIST_REMOVE(&protoTable, ptrToElement, protoElement_s, protoChain);
	free(ptrToElement, M_TEMP);	
	
	return;
}

void printProtoTable(void)
{ /* testweise */
	struct protoElement_s *ptrToElement = NULL;
	SLIST_FOREACH(ptrToElement, &protoTable, protoChain)
	
	(void)printf("\t > Port: [%d]\n", ptrToElement->proto);

	return;
} 


/*
 * kModCtlRoutines
 */
static int initModule(void)
{
	/* init LinkedList : protoTable
	 */
	SLIST_INIT(&protoTable);
	
	/* 
	 * set LinkedList : protoTable : defaults
	 */
	uint16_t inPut = 80;
	insertProto(&inPut);
	inPut = 53;
	insertProto(&inPut);
	inPut = 21;
	insertProto(&inPut);
		
	(void)printf(" PFIL:\tStateTable: ProtoTable: Initialized!\n");
	
	printProtoTable();

	return(SUCCESS);
}

static int deinitModule(void)
{
	/* 
	 * flush LinkedList
	 */
	clearProtoTable();		
 			
	(void)printf(" PFIL:\tStateTable: ProtoTable: Deinitialized!\n");
	
	return(SUCCESS);
}

/* 
 * ModuleHandler
 */ 
static int load(struct module *module, int cmd, void *arg)
{
	int error = SUCCESS;
	
	switch (cmd)
	{
		case MOD_LOAD:
		{
			error = initModule();
			
			break;
		}	
		case MOD_UNLOAD:
		{
			error = deinitModule();
			
			break;
		}	
		default:
		{
			error = EOPNOTSUPP;
			
			break;
		}	
	} 
	
	return(error);
}

/*
 *	moduledata_t dataStructure
 */
static moduledata_t extProtoTable_mod = {
	KMOD_IDENT,
	load,
	NULL
};

DECLARE_MODULE(extProtoTable, extProtoTable_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);

und die dazugehoerige Schnittstellenspezifikation als "extProtoTable.h"

Code:
/* 
 * FuncDeclarations : LinkedList
 */
extern void insertProto(uint16_t *proto);
extern void removeProto(uint16_t *proto);

extern int findProto(uint16_t *proto);

extern void clearProtoTable(void);
extern void printProtoTable(void);     /* testweise */


... erhalte ich beim Laden von Modul a. oder c. derartig gelagerte Fehlermeldung:

> link_elf: symbol xyz undefined

wobei sich xyz auf der dem Modul b. zugeordneten .h-Datei als extern deklarierten Methoden bezieht.

Ich vermute mal, dasz ich in den Modulen a. und c. zugeordneten MakeFiles eine "Ergaenzung" bzgl. Modul b. einfuegen sollte, nur irgendwie sind mir die Ideen abhanden gekommen??? Was mache ich falsch??? *heul*


Oder anders gefragt:

Ist es moeglich (bzw. wie ist es moeglich) diese drei Module zu einem art "Metamodul" zusammenzufassen, wobei diese drei Module als Submodule in Erscheinung treten, welche miteinander interagieren (d.h. das Modul a. und Modul c. auf die innerhalb dem modul b. befindlichen verketteten Liste, als gemeinsame Datenquelle/-senke nutzen)?

Ferner, wo waere denn im Quellcode aus /usr/src/sys/... ein Codebeispiel ( bzgl. Selbstudium) zu entdecken, welches anschaulich eine aehnliche gelagerte Aufgabenstellung darstellt (also ein KMOD, welches aus mehreren Untermodulen bestuende)?
 
Zuletzt bearbeitet von einem Moderator:
Ja, so etwas ist möglich. Erst einmal fehlt dir da oben für Modul "a" die Abhängigkeit auf Modul "c". Ist diese nicht eingetragen, weiß er nicht wogegen er linken soll und beschwert sich darüber, dass das in "c" enthaltene Symbol "xyz" nicht gefunden werden kann. Das Makro lautet "MODULE_DEPEND()", der Syntax ist:
Code:
MODULE_DEPEND(name, moddepend, minvers, maxvers, prefvers)
name = Eigener Name
moddepend = Modul, auf welchem wir aufsetzen
minvers = Minimale Version des Moduls
maxvers = Maximale Version des Moduls
prefvers = Bevorzugte Version

Damit das funktioniert, benötigst du außerdem eine aktuelle linker.hits! Diese wird mit kldxref(8) erstellt. :)
 
Danke, bin begeistert! *freu*

Dann werde ich wohl gleich mal in die Tasten Klimpern :-)

Eine weitere Frage haette ich da noch: Bevor mir dieses Macro bekannt war, hatte ich etwas rumexperimentiert. Die Module "a" und "b" hatte ich wieder zu einem Modul "a+b" zusammengefasst, wobei ich die diesem zugewiesene operativen Gesamtaufgabe in eine Menge an Teilaufgaben als .c (sowie .h) zerlegt habe und mittels MakeFile anhand...

Code:
SRCS= MachDies.c MachDas.c MachJenes.c LinkedList1.c ... LinkedListN.c DasModulA.c

... zueinander zugeordnet habe. Modul "c" ist, wie bereits erwaehnt, das sogenannte SysCallKMOD, dann fasste ich den Entschluss dieses in o.g. MakeFile einzutragen. Bevor ich dieses dann tat, aenderte ich dieses Makro...

Code:
SYSCALL_MODULE(sc_setProtoAtProtoTable, &offset, &sc_setProtoAtProtoTable_sysent, load, NULL);

in

Code:
SYSCALL_MODULE(sc_setProtoAtProtoTable, &offset, &sc_setProtoAtProtoTable_sysent, NULL, NULL);

... ferner habe ich die diesem SysCallKMOD zugeordneten "load"-Methode entfernt (sowie dieses um #include "extProtoTable.h" und ein paar andere nette Sachen ergaenzt). Nachdem ich das KMOD "a+b" compiliert und geladen habe, stellte ich via "kldstat -v" fest, dasz diesem Modul jetzt das SysCallKmod als SubModul zugeordnet ist (es funktioniert).

Nun diese Frage wirkt jetzt etwas unbeholfen (da ich etwa vor ca. einem 3/4-Jahr angefangen habe mich mit C-Programmieren etwas naeher zu beschaeftigen *g*):

Was habe ich da jetzt (aus Sicht des Systems) gemacht?
 
Du hast zwei Kernelmodule gebaut :)

Unter FreeBSD ist es etwas anders als zum Beispiel unter Linux oder auch Windows, wenn man dort die Treiber als Module sieht. Dort ist immer ein Modul gleich einer Datei. Unter FreeBSD aber ist das nicht der Fall, für den Kernel ist ein Modul etwas anderes als für dich. Ich versuche es mal:

Für den Menschen ist ein Modul eine Datei mit der Endung .ko für "Kernel Object". Die Endung ist nur dazu da, damit du es von anderen Dingen unterscheiden kannst. Für das System aber ist diese Datei nichts anderes als ein ganz normales ELF-Image, wie jedes ausführbare Programm und jede beliebige Bibliothek:
Code:
yamagi@screw:pts/12 /boot/kernel: file zfs.ko                       [16:42:52]
zfs.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not stripped

Für das System aber ist dies nur ein Container, der ein oder mehrere Module enthalten kann. Zum Beispiel nehmen wir mal den Kernel selbst:
Code:
yamagi@screw:pts/12 /boot/kernel: file kernel                       [16:42:57]
kernel: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), not stripped
Code:
yamagi@screw:pts/12 /boot/kernel: kldstat | grep kernel             [16:47:49]
 1  226 0xffffffff80100000 61ce58   kernel
Der Kernel selbst ist also auch nur ein ELF-Image. Nun schauen wir uns die Ausgaben mal genau an. Der Kernel ist in gewisser Maßen ein Programm, genauso wie /bin/who zum Beispiel oder jedes andere. Die Kernelmodule entsprechen Bibliotheken, die in das Programm gelinkt werden. Wenn du eine Kernelconfig schreibst und den Kernel baust, sagst du praktisch nur, was fest in das Image eingebunden werden soll. Lädst du später ein .ko nach, wird alles darin dynamisch eingebunden. Alles weitere, die Initialisierung, der interne Aufbau, etc. ist gleich. Es macht daher für FreeBSD überhaupt keinen Unterschied, ob man nun ein Modul hat oder etwas fest in Kernel linkt.

Um es noch deutlicher zu machen, einmal "device crypto" im Kernel:
Code:
ffffffff8046bbb0 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___net_inet_ipsec_crypto_support
ffffffff805a02e0 l     O .data	0000000000000050 sysctl___net_inet_ipsec_crypto_support
ffffffff80397d10 l     F .text	0000000000000030 crypto_checkdriver
ffffffff8060e0b0 l     O .bss	0000000000000008 crypto_drivers
ffffffff8060e0a8 l     O .bss	0000000000000004 crypto_drivers_num
ffffffff80397db0 l     F .text	00000000000000c9 crypto_tstat
ffffffff8060e180 l     O .bss	0000000000000100 cryptostats
ffffffff8060e0a4 l     O .bss	0000000000000004 crypto_timing
ffffffff8060e140 l     O .bss	0000000000000020 crypto_ret_q_mtx
ffffffff80398030 l     F .text	0000000000000134 crypto_terminate
ffffffff8060e0c0 l     O .bss	0000000000000020 crypto_drivers_mtx
ffffffff80398170 l     F .text	0000000000000089 crypto_finis
ffffffff80398420 l     F .text	0000000000000107 crypto_destroy
ffffffff8060e170 l     O .bss	0000000000000008 cryptoproc
ffffffff8060e178 l     O .bss	0000000000000008 cryptoretproc
ffffffff8060e168 l     O .bss	0000000000000008 cryptodesc_zone
ffffffff8060e160 l     O .bss	0000000000000008 cryptop_zone
ffffffff8060e100 l     O .bss	0000000000000020 crypto_q_mtx
ffffffff80399620 l     F .text	000000000000033a crypto_proc
ffffffff80399d40 l     F .text	0000000000000237 crypto_ret_proc
ffffffff803987e0 l     F .text	000000000000001b crypto_remove
ffffffff803989b0 l     F .text	00000000000002bd crypto_kinvoke
ffffffff80398da0 l     F .text	0000000000000100 crypto_invoke
ffffffff8046c780 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_crypto_on_zlib
ffffffff805a1720 l     O .data	0000000000000018 _mod_metadata_md_crypto_on_zlib
ffffffff8046c788 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_crypto_version
ffffffff805a1740 l     O .data	0000000000000018 _mod_metadata_crypto_version
ffffffff8046bcb8 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___debug_crypto_timing
ffffffff805a1760 l     O .data	0000000000000050 sysctl___debug_crypto_timing
ffffffff8046bcc0 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_crypto_stats
ffffffff805a17c0 l     O .data	0000000000000050 sysctl___kern_crypto_stats
ffffffff8046bcc8 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_cryptodevallowsoft
ffffffff805a1860 l     O .data	0000000000000050 sysctl___kern_cryptodevallowsoft
ffffffff8046bcd0 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_userasymcrypto
ffffffff805a18c0 l     O .data	0000000000000050 sysctl___kern_userasymcrypto
ffffffff805a1910 l     O .data	000000000000000c _crypto_depend_on_zlib
ffffffff805a191c l     O .data	0000000000000004 _crypto_version
ffffffff8046c790 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_on_crypto
ffffffff805a19a0 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_on_crypto
ffffffff8046c798 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_cryptosoft_version
ffffffff805a19c0 l     O .data	0000000000000018 _mod_metadata_cryptosoft_version
ffffffff804694c8 l     O set_sysinit_set	0000000000000008 __set_sysinit_set_sym_cryptosoft_nexusmodule_sys_init
ffffffff805a19e0 l     O .data	0000000000000018 cryptosoft_nexusmodule_sys_init
ffffffff8046c7a0 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_nexus
ffffffff805a1a00 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_nexus
ffffffff8046c7a8 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_nexus_on_kernel
ffffffff805a1a20 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_nexus_on_kernel
ffffffff805a1a38 l     O .data	000000000000000c _cryptosoft_depend_on_crypto
ffffffff805a1a44 l     O .data	0000000000000004 _cryptosoft_version
ffffffff805a1a50 l     O .data	0000000000000018 cryptosoft_nexus_mod
ffffffff805a1a68 l     O .data	000000000000000c _cryptosoft_nexus_depend_on_kernel
ffffffff805a1a80 l     O .data	0000000000000030 cryptosoft_nexus_driver_mod
ffffffff80399b20 g     F .text	0000000000000139 crypto_dispatch
ffffffff805a1990 g     O .data	0000000000000010 cryptodev_kprocess_desc
ffffffff8059feb4 g     O .data	0000000000000004 crypto_support
ffffffff80399960 g     F .text	00000000000000d5 crypto_getfeat
ffffffff80397e80 g     F .text	00000000000001a7 crypto_done
ffffffff80397d90 g     F .text	0000000000000017 crypto_getcaps
ffffffff80397cc0 g     F .text	0000000000000041 crypto_copyback
ffffffff80399290 g     F .text	000000000000011d crypto_find_driver
ffffffff805a1980 g     O .data	0000000000000010 cryptodev_kprocess_method_default
ffffffff805a1960 g     O .data	0000000000000010 cryptodev_process_method_default
ffffffff80398ef0 g     F .text	0000000000000095 crypto_unregister_all
ffffffff80399f80 g     F .text	000000000000007d crypto_getreq
ffffffff80398800 g     F .text	00000000000001a5 crypto_kdone
ffffffff803993b0 g     F .text	0000000000000262 crypto_get_driverid
ffffffff805a1930 g     O .data	0000000000000010 cryptodev_newsession_desc
ffffffff80397d70 g     F .text	0000000000000018 crypto_find_device_byhid
ffffffff805a1970 g     O .data	0000000000000010 cryptodev_process_desc
ffffffff80398f90 g     F .text	00000000000000e0 crypto_unregister
ffffffff80399190 g     F .text	00000000000000f8 crypto_kregister
ffffffff805a1950 g     O .data	0000000000000010 cryptodev_freesession_desc
ffffffff80398c70 g     F .text	0000000000000129 crypto_freesession
ffffffff80397c70 g     F .text	0000000000000041 crypto_copydata
ffffffff80399070 g     F .text	0000000000000120 crypto_register
ffffffff80399a40 g     F .text	00000000000000d3 crypto_kdispatch
ffffffff805a1920 g     O .data	0000000000000010 cryptodev_newsession_method_default
ffffffff80399c60 g     F .text	00000000000000db crypto_unblock
ffffffff805a16e0 g     O .data	0000000000000004 crypto_userasymcrypto
ffffffff80397af0 g     F .text	0000000000000040 crypto_apply
ffffffff80398ea0 g     F .text	0000000000000050 crypto_freereq
ffffffff80398200 g     F .text	0000000000000219 crypto_newsession
ffffffff8060e0a0 g     O .bss	0000000000000004 crypto_devallowsoft
ffffffff805a1940 g     O .data	0000000000000010 cryptodev_freesession_method_default
ffffffff80398530 g     F .text	0000000000000256 crypto_modevent
und als Modul:
Code:
crypto.ko:     file format elf64-x86-64
crypto.ko
0000000000000000 l     F .text	0000000000000030 crypto_checkdriver
0000000000000010 l     O .bss	0000000000000008 crypto_drivers
0000000000000008 l     O .bss	0000000000000004 crypto_drivers_num
0000000000000020 l     O .bss	0000000000000020 crypto_drivers_mtx
0000000000000140 l     F .text	00000000000000c9 crypto_tstat
00000000000000e0 l     O .bss	0000000000000100 cryptostats
0000000000000004 l     O .bss	0000000000000004 crypto_timing
00000000000000a0 l     O .bss	0000000000000020 crypto_ret_q_mtx
0000000000000060 l     O .bss	0000000000000020 crypto_q_mtx
00000000000003f0 l     F .text	00000000000000ad crypto_terminate
00000000000004a0 l     F .text	000000000000004f crypto_finis
00000000000004f0 l     F .text	00000000000001d9 crypto_ret_proc
00000000000000d8 l     O .bss	0000000000000008 cryptoretproc
00000000000008b0 l     F .text	00000000000000bd crypto_destroy
00000000000000d0 l     O .bss	0000000000000008 cryptoproc
00000000000000c8 l     O .bss	0000000000000008 cryptodesc_zone
00000000000000c0 l     O .bss	0000000000000008 cryptop_zone
0000000000001340 l     F .text	00000000000002fc crypto_proc
0000000000000d40 l     F .text	000000000000001b crypto_remove
0000000000000e80 l     F .text	000000000000022b crypto_kinvoke
0000000000001240 l     F .text	0000000000000100 crypto_invoke
0000000000000000 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_crypto_on_zlib
0000000000000040 l     O .data	0000000000000018 _mod_metadata_md_crypto_on_zlib
0000000000000008 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_crypto_version
0000000000000060 l     O .data	0000000000000018 _mod_metadata_crypto_version
0000000000000000 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___debug_crypto_timing
0000000000000080 l     O .data	0000000000000050 sysctl___debug_crypto_timing
0000000000000008 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_crypto_stats
00000000000000e0 l     O .data	0000000000000050 sysctl___kern_crypto_stats
0000000000000010 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_cryptodevallowsoft
0000000000000180 l     O .data	0000000000000050 sysctl___kern_cryptodevallowsoft
0000000000000018 l     O set_sysctl_set	0000000000000008 __set_sysctl_set_sym_sysctl___kern_userasymcrypto
00000000000001e0 l     O .data	0000000000000050 sysctl___kern_userasymcrypto
0000000000000230 l     O .data	000000000000000c _crypto_depend_on_zlib
000000000000023c l     O .data	0000000000000004 _crypto_version
0000000000000010 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_on_crypto
00000000000002c0 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_on_crypto
0000000000000018 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_cryptosoft_version
00000000000002e0 l     O .data	0000000000000018 _mod_metadata_cryptosoft_version
0000000000000008 l     O set_sysinit_set	0000000000000008 __set_sysinit_set_sym_cryptosoft_nexusmodule_sys_init
0000000000000300 l     O .data	0000000000000018 cryptosoft_nexusmodule_sys_init
0000000000000020 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_nexus
0000000000000320 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_nexus
0000000000000028 l     O set_modmetadata_set	0000000000000008 __set_modmetadata_set_sym__mod_metadata_md_cryptosoft_nexus_on_kernel
0000000000000340 l     O .data	0000000000000018 _mod_metadata_md_cryptosoft_nexus_on_kernel
0000000000000358 l     O .data	000000000000000c _cryptosoft_depend_on_crypto
0000000000000364 l     O .data	0000000000000004 _cryptosoft_version
0000000000000370 l     O .data	0000000000000018 cryptosoft_nexus_mod
0000000000000388 l     O .data	000000000000000c _cryptosoft_nexus_depend_on_kernel
00000000000003a0 l     O .data	0000000000000030 cryptosoft_nexus_driver_mod
0000000000001640 l     F .text	00000000000000e7 crypto_dispatch
00000000000002b0 l     O .data	0000000000000010 cryptodev_kprocess_desc
00000000000000a0 l     F .text	000000000000009d crypto_getfeat
0000000000000210 l     F .text	000000000000014c crypto_done
0000000000000080 l     F .text	0000000000000017 crypto_getcaps
0000000000001f60 l     F .text	0000000000000041 crypto_copyback
0000000000001930 l     F .text	00000000000000ec crypto_find_driver
00000000000002a0 l     O .data	0000000000000010 cryptodev_kprocess_method_default
0000000000000280 l     O .data	0000000000000010 cryptodev_process_method_default
0000000000000c20 l     F .text	0000000000000063 crypto_unregister_all
0000000000001c20 l     F .text	000000000000007d crypto_getreq
0000000000000d60 l     F .text	0000000000000115 crypto_kdone
0000000000001a20 l     F .text	00000000000001f1 crypto_get_driverid
0000000000000250 l     O .data	0000000000000010 cryptodev_newsession_desc
0000000000000060 l     F .text	0000000000000018 crypto_find_device_byhid
0000000000000290 l     O .data	0000000000000010 cryptodev_process_desc
0000000000000c90 l     F .text	00000000000000ad crypto_unregister
0000000000001870 l     F .text	00000000000000b8 crypto_kregister
0000000000000270 l     O .data	0000000000000010 cryptodev_freesession_desc
0000000000001150 l     F .text	00000000000000ef crypto_freesession
0000000000001f10 l     F .text	0000000000000041 crypto_copydata
0000000000001780 l     F .text	00000000000000e5 crypto_register
00000000000010b0 l     F .text	000000000000009f crypto_kdispatch
0000000000000240 l     O .data	0000000000000010 cryptodev_newsession_method_default
0000000000000360 l     F .text	000000000000008e crypto_unblock
0000000000000000 l     O .data	0000000000000004 crypto_userasymcrypto
0000000000001d90 l     F .text	0000000000000040 crypto_apply
0000000000001730 l     F .text	0000000000000050 crypto_freereq
00000000000006d0 l     F .text	00000000000001d8 crypto_newsession
0000000000000000 l     O .bss	0000000000000004 crypto_devallowsoft
0000000000000260 l     O .data	0000000000000010 cryptodev_freesession_method_default
0000000000000970 l     F .text	0000000000000258 crypto_modevent
00000000000000d5 R_X86_64_PC32     crypto_devallowsoft+0xfffffffffffffffc
0000000000000826 R_X86_64_PC32     cryptodev_newsession_desc+0xfffffffffffffffc
0000000000000845 R_X86_64_32S      cryptodev_newsession_desc
0000000000000859 R_X86_64_32S      cryptodev_newsession_desc
0000000000000ebd R_X86_64_PC32     crypto_devallowsoft+0xfffffffffffffffc
0000000000000f98 R_X86_64_PC32     crypto_kdone+0xfffffffffffffffc
0000000000000fc8 R_X86_64_PC32     crypto_devallowsoft+0xfffffffffffffffc
000000000000102a R_X86_64_PC32     cryptodev_kprocess_desc+0xfffffffffffffffc
0000000000001039 R_X86_64_32S      cryptodev_kprocess_desc
000000000000104d R_X86_64_32S      cryptodev_kprocess_desc
00000000000011cb R_X86_64_PC32     cryptodev_freesession_desc+0xfffffffffffffffc
00000000000011da R_X86_64_32S      cryptodev_freesession_desc
00000000000011ee R_X86_64_32S      cryptodev_freesession_desc
0000000000001274 R_X86_64_PC32     cryptodev_process_desc+0xfffffffffffffffc
0000000000001282 R_X86_64_32S      cryptodev_process_desc
0000000000001296 R_X86_64_32S      cryptodev_process_desc
00000000000012dd R_X86_64_PC32     crypto_freesession+0xfffffffffffffffc
0000000000001317 R_X86_64_PC32     crypto_newsession+0xfffffffffffffffc
0000000000001335 R_X86_64_PC32     crypto_done+0xfffffffffffffffc
0000000000001c8b R_X86_64_PC32     crypto_freereq+0xfffffffffffffffc
0000000000002216 R_X86_64_PC32     crypto_done+0xfffffffffffffffc
000000000000231f R_X86_64_PC32     crypto_copydata+0xfffffffffffffffc
0000000000002391 R_X86_64_PC32     crypto_copyback+0xfffffffffffffffc
00000000000024f7 R_X86_64_PC32     crypto_apply+0xfffffffffffffffc
0000000000002595 R_X86_64_PC32     crypto_copyback+0xfffffffffffffffc
000000000000288d R_X86_64_PC32     crypto_copydata+0xfffffffffffffffc
0000000000003115 R_X86_64_PC32     crypto_copyback+0xfffffffffffffffc
00000000000037db R_X86_64_PC32     crypto_unregister_all+0xfffffffffffffffc
00000000000038f1 R_X86_64_PC32     crypto_get_driverid+0xfffffffffffffffc
0000000000003928 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
000000000000393c R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003950 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003964 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003978 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
000000000000398c R_X86_64_PC32     crypto_register+0xfffffffffffffffc
00000000000039a0 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
00000000000039b4 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
00000000000039c8 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
00000000000039dc R_X86_64_PC32     crypto_register+0xfffffffffffffffc
00000000000039f0 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a04 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a18 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a2c R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a40 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a54 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a68 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a7c R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003a90 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000003aa4 R_X86_64_PC32     crypto_register+0xfffffffffffffffc
0000000000000198 R_X86_64_64       crypto_devallowsoft
00000000000001f8 R_X86_64_64       crypto_userasymcrypto
0000000000000240 R_X86_64_64       cryptodev_newsession_desc
0000000000000258 R_X86_64_64       cryptodev_newsession_method_default
0000000000000260 R_X86_64_64       cryptodev_freesession_desc
0000000000000278 R_X86_64_64       cryptodev_freesession_method_default
0000000000000280 R_X86_64_64       cryptodev_process_desc
0000000000000298 R_X86_64_64       cryptodev_process_method_default
00000000000002a0 R_X86_64_64       cryptodev_kprocess_desc
00000000000002b8 R_X86_64_64       cryptodev_kprocess_method_default
00000000000003a0 R_X86_64_64       crypto_modevent
0000000000000460 R_X86_64_64       cryptodev_newsession_desc
0000000000000470 R_X86_64_64       cryptodev_freesession_desc
0000000000000480 R_X86_64_64       cryptodev_process_desc
Die Gemeinsamkeiten sind kein Zufall.

So, nachdem das nun geklärt, kommen wir zu deinem Modul. Du hast also aus Sicht des Kernel zwei Module gebaut, die aber in einer Datei zusammengefasst. Dadurch brauchst du gewisse Dinge, die sich auf die Dateien beziehen, nur einmal oder gar nicht. So werden zum Beispiel die Abhängigkeiten der Symbole in dem Fall automatisch korrekt aufgelöst, da du nur beide Module laden kannst oder gar keines. :)

Übrigens machen viele Module es so. Sie klatschen einfach alles, was eh nur sie selbst benötigen, in eine Datei. Nur Dinge, die auch von anderen benötigt werden, bekommen eigene Dateien:
Code:
#yamagi@screw:pts/12 /boot/kernel:kldstat -v                                         [17:04:05]
Id Refs Address            Size     Name
 1  226 0xffffffff80100000 61ce58   kernel (/boot/kernel/kernel)
	Contains modules:
		Id Name
		193 msgget
		206 freebsd7_shmctl
		205 shmat
		204 shmctl
		203 shmdt
		202 shmget
		192 msgsnd
		191 msgrcv
		200 __semctl
		199 semget
		198 semop
		188 freebsd7_msgctl
		196 semsys
		195 freebsd7___semctl
		189 msgsys
		194 msgctl
		209 loop
		184 elf64
		185 shell
		240 elf32
		212 mld
		211 igmp
		190 sysvmsg
		207 sem
		197 sysvsem
		201 sysvshm
		176 devfs
		151 acpi/acpi_isab
		186 cpu/cpufreq
		175 watchdog
		157 cpu/acpi_perf
		174 pci/vgapci
		173 pci/pcib
		172 pcib/pci
		146 acpi/acpi_button
		156 pci/acpi_pcib
		155 acpi/acpi_pcib
		150 acpi/acpi_hpet
		148 acpi/cpu
		144 nexus/acpi
		239 isa/vga
		171 pci/isab
		238 isa/sc
		237 isa/atrtc
		236 acpi/atrtc
		235 scrndr-vga
		234 scterm-scteken
		170 pci/ignore_pci
		233 isa/atkbdc
		232 acpi/atkbdc
		231 atkbdc/atkbd
		169 pci/hostb
		230 legacy/pcib
		229 isa/pcibus_pnp
		228 isa/atdma
		227 acpi/atdma
		226 legacy/isa
		183 isa/orm
		225 isa/attimer
		224 acpi/attimer
		168 pci/fixup_pci
		182 isab/isa
		181 eisab/isa
		223 root/nexus
		222 nexus/ram
		221 isa/sysresource
		167 pci/eisab
		166 null
		213 nexus/cryptosoft
		145 acpi/acpi_acad
		154 acpi/acpi_pci_link
		165 eisa/mainboard
		164 eisab/eisa
		220 nexus/legacy
		219 legacy/cpu
		163 legacy/eisa
		218 pci/ioapic
		217 nexus/apic
		162 acpi/acpi_timer
		216 acpi/fpupnp
		161 cpu/acpi_throttle
		160 acpi/acpi_tz
		147 acpi/acpi_cmbat
		153 pcib/acpi_pci
		159 acpi/acpi_smbat
		158 acpi/acpi_sysresource
		149 acpi/acpi_ec
		152 acpi/acpi_lid
		215 root/nexus_acpi
		187 rootbus
		178 g_disk
		214 g_class
		180 g_part
		179 g_vfs
		210 zlib
		177 g_dev
		208 ether
 2    2 0xffffffff8071d000 c630     cd9660.ko (/boot/kernel/cd9660.ko)
	Contains modules:
		Id Name
		 1 cd9660
 3    2 0xffffffff8072a000 15548    msdosfs.ko (/boot/kernel/msdosfs.ko)
	Contains modules:
		Id Name
		 2 msdosfs
 4    2 0xffffffff80740000 2d7f0    nfsclient.ko (/boot/kernel/nfsclient.ko)
	Contains modules:
		Id Name
		 5 nfs
		 4 nfslock
 5    4 0xffffffff8076e000 20458    krpc.ko (/boot/kernel/krpc.ko)
	Contains modules:
		Id Name
		 3 krpc
 6    1 0xffffffff8078f000 26bf8    nfsserver.ko (/boot/kernel/nfsserver.ko)
	Contains modules:
		Id Name
		 7 nfsserver
 7    2 0xffffffff807b6000 10b0     nfssvc.ko (/boot/kernel/nfssvc.ko)
	Contains modules:
		Id Name
		 6 nfssvc
 8    1 0xffffffff807b8000 8290     procfs.ko (/boot/kernel/procfs.ko)
	Contains modules:
		Id Name
		 9 procfs
 9    2 0xffffffff807c1000 94e0     pseudofs.ko (/boot/kernel/pseudofs.ko)
	Contains modules:
		Id Name
		 8 pseudofs
10    1 0xffffffff807cb000 196a0    geom_eli.ko (/boot/kernel/geom_eli.ko)
	Contains modules:
		Id Name
		10 g_eli
11    1 0xffffffff807e5000 8778     geom_label.ko (/boot/kernel/geom_label.ko)
	Contains modules:
		Id Name
		11 g_label
12    2 0xffffffff807ee000 41358    linux.ko (/boot/kernel/linux.ko)
	Contains modules:
		Id Name
		12 linuxelf
13    1 0xffffffff80830000 70a0     if_tap.ko (/boot/kernel/if_tap.ko)
	Contains modules:
		Id Name
		13 if_tap
14    1 0xffffffff80838000 71a8     if_tun.ko (/boot/kernel/if_tun.ko)
	Contains modules:
		Id Name
		14 if_tun
15    2 0xffffffff80840000 3d3f0    miibus.ko (/boot/kernel/miibus.ko)
	Contains modules:
		Id Name
		43 miibus/xmphy
		42 miibus/ukphy
		41 miibus/truephy
		40 miibus/tlphy
		39 miibus/tdkphy
		38 miibus/ruephy
		37 miibus/rlphy
		36 miibus/rgephy
		35 miibus/qsphy
		34 miibus/pnaphy
		33 miibus/nsphyter
		32 miibus/nsphy
		31 miibus/nsgphy
		30 miibus/mlphy
		29 miibus/lxtphy
		28 miibus/jmphy
		27 miibus/ip1000phy
		26 miibus/inphy
		25 miibus/icsphy
		24 miibus/gentbi
		23 miibus/xlphy
		22 miibus/e1000phy
		21 miibus/ciphy
		20 miibus/brgphy
		19 miibus/bmtphy
		18 miibus/axphy
		17 miibus/atphy
		16 miibus/amphy
		15 miibus/acphy
16    1 0xffffffff8087e000 76350    if_ath.ko (/boot/kernel/if_ath.ko)
	Contains modules:
		Id Name
		46 pci/ath
17    4 0xffffffff808f5000 58810    wlan.ko (/boot/kernel/wlan.ko)
	Contains modules:
		Id Name
		45 wlan_sta
		44 wlan
18    1 0xffffffff8094e000 f4c0     if_nfe.ko (/boot/kernel/if_nfe.ko)
	Contains modules:
		Id Name
		48 pci/nfe
		47 nfe/miibus
19    4 0xffffffff8095e000 756b0    sound.ko (/boot/kernel/sound.ko)
	Contains modules:
		Id Name
		49 sound
		50 midi
20    1 0xffffffff809d4000 a138     snd_envy24ht.ko (/boot/kernel/snd_envy24ht.ko)
	Contains modules:
		Id Name
		51 pci/snd_envy24ht
21    2 0xffffffff809df000 1be8     snd_spicds.ko (/boot/kernel/snd_spicds.ko)
	Contains modules:
		Id Name
22    1 0xffffffff809e1000 7780     snd_ich.ko (/boot/kernel/snd_ich.ko)
	Contains modules:
		Id Name
		52 pci/snd_ich
23    6 0xffffffff809e9000 405d8    usb.ko (/boot/kernel/usb.ko)
	Contains modules:
		Id Name
		60 usbus/uhub
		59 uhub/uhub
		58 uhub/usb_linux
		57 ohci/usbus
		56 uhci/usbus
		55 ehci/usbus
		54 at91_udp/usbus
		53 uss820/usbus
24    1 0xffffffff80a2a000 8d48     ukbd.ko (/boot/kernel/ukbd.ko)
	Contains modules:
		Id Name
		61 uhub/ukbd
25    1 0xffffffff80a33000 5010     ums.ko (/boot/kernel/ums.ko)
	Contains modules:
		Id Name
		62 uhub/ums
26    1 0xffffffff80a39000 100e0    umass.ko (/boot/kernel/umass.ko)
	Contains modules:
		Id Name
		78 uhub/umass
27    3 0xffffffff80a4a000 75378    cam.ko (/boot/kernel/cam.ko)
	Contains modules:
		Id Name
		63 cam
		67 da
		77 ada
		76 aprobe
		66 ch
		75 probe
		74 targ
		64 xpt
		65 cd
		73 targbh
		72 sg
		71 ses
		70 sa
		69 pt
		68 pass
28    2 0xffffffff80ac0000 12c98    agp.ko (/boot/kernel/agp.ko)
	Contains modules:
		Id Name
		81 hostb/agp_via
		80 vgapci/agp_i810
		79 hostb/agp_amd64
29    1 0xffffffff80ad3000 f3c8     random.ko (/boot/kernel/random.ko)
	Contains modules:
		Id Name
		82 random
30    1 0xffffffff80ae3000 27e0     amdtemp.ko (/boot/kernel/amdtemp.ko)
	Contains modules:
		Id Name
		83 hostb/amdtemp
31    1 0xffffffff80ae6000 2868     geom_part_bsd.ko (/boot/kernel/geom_part_bsd.ko)
	Contains modules:
		Id Name
		84 g_part_bsd
32    1 0xffffffff80ae9000 27f8     geom_part_mbr.ko (/boot/kernel/geom_part_mbr.ko)
	Contains modules:
		Id Name
		85 g_part_mbr
33    1 0xffffffff80aec000 4fd8     geom_part_gpt.ko (/boot/kernel/geom_part_gpt.ko)
	Contains modules:
		Id Name
		86 g_part_gpt
34    6 0xffffffff80af1000 15428    ata.ko (/boot/kernel/ata.ko)
	Contains modules:
		Id Name
		87 ata
35    3 0xffffffff80b07000 a5f0     atapci.ko (/boot/kernel/atapci.ko)
	Contains modules:
		Id Name
		89 pci/atapci
		88 atapci/ata
36    1 0xffffffff80b12000 4070     atadisk.ko (/boot/kernel/atadisk.ko)
	Contains modules:
		Id Name
		90 ata/ad
37    2 0xffffffff80b17000 60f8     ataahci.ko (/boot/kernel/ataahci.ko)
	Contains modules:
		Id Name
		91 pci/ata_ahci
38    1 0xffffffff80b1e000 4200     atanvidia.ko (/boot/kernel/atanvidia.ko)
	Contains modules:
		Id Name
		92 pci/ata_nvidia
39    3 0xffffffff80b23000 3c68     mem.ko (/boot/kernel/mem.ko)
	Contains modules:
		Id Name
		93 mem
40    2 0xffffffff80b27000 ef0      io.ko (/boot/kernel/io.ko)
	Contains modules:
		Id Name
		94 io
41    1 0xffffffff80b28000 5278     atapicam.ko (/boot/kernel/atapicam.ko)
	Contains modules:
		Id Name
		95 ata/atapicam
42    1 0xffffffff80b2e000 20f78    firewire.ko (/boot/kernel/firewire.ko)
	Contains modules:
		Id Name
		97 pci/fwohci
		96 fwohci/firewire
43    1 0xffffffff80b4f000 19998    nfslockd.ko (/boot/kernel/nfslockd.ko)
	Contains modules:
		Id Name
		98 nfslockd
44    2 0xffffffff80b69000 24e0     smbus.ko (/boot/kernel/smbus.ko)
	Contains modules:
		Id Name
45    1 0xffffffff80b6c000 4c80     nfsmb.ko (/boot/kernel/nfsmb.ko)
	Contains modules:
		Id Name
		101 pci/nfsmb
		100 nfsmb/nfsmb
		99 nfsmb/smbus
46    2 0xffffffff80b71000 9970     ppbus.ko (/boot/kernel/ppbus.ko)
	Contains modules:
		Id Name
		102 ppc/ppbus
47    1 0xffffffff80b7b000 8c68     ppc.ko (/boot/kernel/ppc.ko)
	Contains modules:
		Id Name
		106 isa/ppc
		105 acpi/ppc
		104 puc/ppc
		103 pci/ppc
48    1 0xffffffff80b84000 10008    cpufreq.ko (/boot/kernel/cpufreq.ko)
	Contains modules:
		Id Name
		111 cpu/powernow
		110 cpu/p4tcc
		109 cpu/hwpstate
		108 cpu/est
		107 cpu/ichss
49    1 0xffffffff80b95000 dd70     fdc.ko (/boot/kernel/fdc.ko)
	Contains modules:
		Id Name
		115 acpi/fdc
		114 pccard/fdc
		113 isa/fdc
		112 fdc/fd
50    1 0xffffffff80ba3000 2980     cpuctl.ko (/boot/kernel/cpuctl.ko)
	Contains modules:
		Id Name
		116 cpuctl
51    1 0xffffffff80ba6000 12750    ehci.ko (/boot/kernel/ehci.ko)
	Contains modules:
		Id Name
		117 pci/ehci
52    1 0xffffffff80bb9000 e030     ohci.ko (/boot/kernel/ohci.ko)
	Contains modules:
		Id Name
		118 pci/ohci
53    1 0xffffffff80bc8000 6258     kbdmux.ko (/boot/kernel/kbdmux.ko)
	Contains modules:
		Id Name
		119 kbdmux
54    1 0xffffffff80bcf000 c9c8     if_bridge.ko (/boot/kernel/if_bridge.ko)
	Contains modules:
		Id Name
		121 if_bridge
55    2 0xffffffff80bdc000 66d8     bridgestp.ko (/boot/kernel/bridgestp.ko)
	Contains modules:
		Id Name
		120 bridgestp
56    1 0xffffffff80be3000 3840     wlan_tkip.ko (/boot/kernel/wlan_tkip.ko)
	Contains modules:
		Id Name
		122 wlan_tkip
57    1 0xffffffff80be7000 15d0     wlan_amrr.ko (/boot/kernel/wlan_amrr.ko)
	Contains modules:
		Id Name
		123 wlan_amrr
58    2 0xffffffff80be9000 22a78    drm.ko (/boot/kernel/drm.ko)
	Contains modules:
		Id Name
59    1 0xffffffff80c0c000 71608    radeon.ko (/boot/kernel/radeon.ko)
	Contains modules:
		Id Name
		124 vgapci/radeon
60    1 0xffffffff80c7e000 627d8    ufs.ko (/boot/kernel/ufs.ko)
	Contains modules:
		Id Name
		125 ufs
61    1 0xffffffff80ce1000 180c0    uart.ko (/boot/kernel/uart.ko)
	Contains modules:
		Id Name
		131 scc/uart
		130 puc/uart
		129 pci/uart
		128 pccard/uart
		127 isa/uart
		126 acpi/uart
62    3 0xffffffff80cfa000 41e88    vboxdrv.ko (/boot/modules/vboxdrv.ko)
	Contains modules:
		Id Name
		132 vboxdrv
63    1 0xffffffff80d3c000 2650     vboxnetadp.ko (/boot/modules/vboxnetadp.ko)
	Contains modules:
		Id Name
		135 vboxnetadp
64    2 0xffffffff80d3f000 6960     vboxnetflt.ko (/boot/modules/vboxnetflt.ko)
	Contains modules:
		Id Name
65    2 0xffffffff80d46000 14db8    netgraph.ko (/boot/kernel/netgraph.ko)
	Contains modules:
		Id Name
		133 netgraph
66    1 0xffffffff80d5b000 15e20    fuse.ko (/boot/modules/fuse.ko)
	Contains modules:
		Id Name
		136 fuse
67    1 0xffffffff80d71000 1020     msdosfs_iconv.ko (/boot/kernel/msdosfs_iconv.ko)
	Contains modules:
		Id Name
		140 msdosfs_iconv
68    3 0xffffffff80d73000 6c70     libiconv.ko (/boot/kernel/libiconv.ko)
	Contains modules:
		Id Name
		139 iconv_xlat16
		138 iconv_xlat
		137 iconv
69    1 0xffffffff80d7a000 1000     cd9660_iconv.ko (/boot/kernel/cd9660_iconv.ko)
	Contains modules:
		Id Name
		141 cd9660_iconv
70    1 0xffffffff80d7b000 1e88     mono.ko (/boot/modules/mono.ko)
	Contains modules:
		Id Name
		142 mono
71    1 0xffffffff80d7d000 d3cf48   nvidia.ko (/boot/modules/nvidia.ko)
	Contains modules:
		Id Name
		143 vgapci/nvidia
 
Zurück
Oben