Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Oct 1998 08:43:11 +0800
From:      Peter Wemm <peter@netplex.com.au>
To:        "Justin T. Gibbs" <gibbs@plutotech.com>
Cc:        Doug Rabson <dfr@nlsystems.com>, "Robert V. Baron" <rvb@cs.cmu.edu>, cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/sys kernel.h 
Message-ID:  <199810110043.IAA18053@spinner.netplex.com.au>
In-Reply-To: Your message of "Sat, 10 Oct 1998 15:06:20 CST." <199810102113.PAA24678@pluto.plutotech.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
"Justin T. Gibbs" wrote:
> >This is directly addressed by the KLD system.  The terminology is that a
> >'file' (ELF or a.out) is loaded by the kernel linker.  The file contains a
> >number of 'modules', each of which is initialised and has an event handler
> >(similar to lkmdispatch).  The kernel in many ways is a file which
> >contains all the statically linked modules.
> 
> How are module dependencies represented and honored?

Not exceptionally well at present as I understand it.  There are a couple
of mechanisms in place, and some complications and problems.  This needs to
be revisited.

First of all, keep in mind that module creation is essentially free-form.  
You can bundle any number of modules into one .ko file.  Since there isn't 
necessarily going to be a 1:1 relationship between modules and files, you 
can't intuit a filename from a missing module dependency in order to 
autoload it.  For now, we have to assume that the user knows what they are 
doing.

Second, it's also enforced at the linker level.  A module load will be
rejected if it depends on symbols that are not present.  Ideally though it
should be pretty much self contained.  If you are wondering about (say) a
CAM module, SCSI device type (eg: da, cd) modules and device drivers (eg:
ahc), this can be done at .ko build time via normal shared-libarary-like
dependencies.  The hacked bsd.kmod.mk that I use can handle this to a 
degree.  It ends up looking like this:
peter> objdump --all-headers `obj`/testmod.ko | more
[..]
Dynamic Section:
  NEEDED      cam.ko
  HASH        0x94
  STRTAB      0x198
[..]
Both /boot/loader and kldload() will see the NEEDED tag and load it if 
it's not present.

You can stick in version numbers into the name.  Obviously you need to 
take care there, because there are some shoot-in-the-foot type 
possibilities if you have cam.ko loaded and the cam stuff is present 
within the kernel already.

Mike had a fairly elaborate system in place that was implemented within
/boot/loader but not in the kernel proper.  I disabled it because it 
required hard coding filename dependencies into the source code and 
because it could be done better other ways.

What is needed is that the linker and module engine should reject an
attempt to load files with module names that are already present, and we 
need some sort of module versionining moreso than file versioning.  A 
variation of Mike's scheme would be useful here and can be hooked onto the 
moduledata_t attached to the module declaration.

I could imagine some sort of registry of versions of modules provided by
the src/sys code somewhere.  If an include file had:
#define MODVER_CAM 300126	/* CAM driver */
and the scsi_da.c driver did a #include <sys/modver.h> or something and 
specified a dependency ala
....
  { "cam", MODVER_CAM },
....
somewhere in it's metadata, then the linker and module engines could check 
for prerequisites and correct versions.  It could enable a forced 
recompile of the cam related modules if there was some incompatable change 
made.  There would also presumably be some dependency on some version of 
"kernel" as well.

Of course, one could force the issue via the linker..  Somewhere in the 
cam code:
  int cam_300126 = <minor version>;
and in consumers of CAM in their init code:
extern int cam_300126;
...
  if (cam_300126 < 10)
     printf("Warning: your version of CAM is too old\n");
...

Naturally it'd be nicer to have the module engine do this rather than 
duplicating hacks like this all over the place.

Anyway, what we have now is no worse than the current LKM system, but has 
room to be made a lot better.

Cheers,
-Peter






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810110043.IAA18053>