[Linux kernel] Communicatie tussen modules

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 13-06 23:19
Ik ben net begonnen met het schrijven van een kernel module voor 2 simpele stukje hardware.
Nu maken deze apparaatjes gebruik van dezelfde interface, dus dacht ik slim te zijn en de drivers op te delen in 3 stukken: 1 voor de interface en 2 voor de afzonderlijke stukjes hardware.

Ik heb het nu dus opgedeeld in 3 devices:
/dev/interf
/dev/app1
/dev/app2

schrijven of lezen van/naar /dev/interf zorgt dus dat de interface al vanaf de userspace benaderd kan worden.
schrijven en lezen naar app1 en app2 zorgt dus dat de apparaten vanuit de userspace benaderd kunnen worden.

Nu heb ik de drivers in principe af, maar loop ik tegen een probleem aan: de app1 en app2 drivers moeten kunnen schrijven naar de interface, maar open(), ioctl, write() e.d. zijn natuurlijk niet beschikbaar in kernel-space.

Nu kan ik natuurlijk wel de functies van /dev/interf mee-compilen met app1 en app2, maar dat doe ik liever niet: /dev/interf claimt namelijk een stukje geheugen met request_mem_region(..) en ik weet niet of meerdere drivers dat tegelijk kunnen doen met hetzelfde stukje geheugen (het zijn memory-mapped I/O registers)

Weet iemand een alternatief, beter manier of een manier waarop het wel moet?

Acties:
  • 0 Henk 'm!

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 13-06 23:19
Het enige alternatief waar ik aan kon denken was de drivers voor beide apparaten in 1 module stoppen, maar erg mooi vind ik het niet. Bovendien weet ik niet precies hoe de module dan moet weten naar/van welk apparaat geschreven of gelezen wordt.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zou je voortaan je startpost willen aanvullen i.p.v. een reply te plaatsen?
topickick binnen 24 uur

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Drivers kunnen van elkaars exports gebruik maken ( naast de exports van de kernel ), dus als je in een driver een EXPORT_SYMBOL doet kan dat symbool door andere drivers gebruikt worden. Zie ook hier: http://lwn.net/images/pdf/LDD3/ch02.pdf , check "The Kernel Symbol Table"

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Je kan zoiets proberen:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// interf.h
void functieX(void);

// interf.c
void functieX(void) { /* */ }
EXPORT_SYMBOL(functieX);

// app1.c
#include "interf.h"

void functieY(void)
{
  functieX();
}


De kernel zorgt namelijk voor een vorm van dynamische linking. Alle exported symbols komen in een tabel terecht.
Wanneer dan een module ingeladen wordt, probeert de kernel alle unresolved symbols in de module op te zoeken adhv die tabel en voegt ie alle exported symbols van je module toe.

Vergeet ook niet om de reference counts van je interface module te verhogen (try_module_get() en find_module())

ASSUME makes an ASS out of U and ME