kernel linker: Overriding a driver shipped with kernel via module?

Ian Lepore ian at FreeBSD.org
Wed Nov 19 01:16:28 UTC 2014


On Tue, 2014-11-18 at 16:36 -0800, John-Mark Gurney wrote:
> Slawa Olhovchenkov wrote this message on Wed, Nov 19, 2014 at 04:27 +0400:
> > On Tue, Nov 18, 2014 at 04:15:10PM -0800, John-Mark Gurney wrote:
> > 
> > > Slawa Olhovchenkov wrote this message on Tue, Nov 18, 2014 at 16:45 +0400:
> > > > On Mon, Nov 17, 2014 at 03:15:29PM -0800, Xin Li wrote:
> > > > 
> > > > > Right now one can declare version for a module by doing something like:
> > > > > 
> > > > > MODULE_VERSION(module_name, module_version);
> > > > > 
> > > > > Sometimes, it may be desirable for a vendor to release a new driver
> > > > > that overrides the driver shipped with the kernel itself.  However, it
> > > > > seems that the MODULE_VERSION facility would just refuse the module
> > > > > when preloaded with kernel.
> > > > > 
> > > > > Looking at some other vendor drivers, they are using a slightly
> > > > > different module name to overcome this limitation.  Is that the only
> > > > > way to do it?
> > > > 
> > > > I think now time to move to modulated kernel and load all drivers
> > > > currently present in GENERIC as modules (via loader.conf).
> > > 
> > > This becomes slightly more difficult for storage drivers which must
> > > be loaded at boot time so the you can mount root from it...  But yes,
> > > we are interested in methods to make it easier/more automatic for
> > > modules to be loaded to support the hardware that is present in a
> > > system...
> > 
> > When loader can load kernel -- loader can load driver module, this is
> > not Linux (but yes, loader need plugable and stackable framework for
> > access FS -- currenly booting from ZFS over gstripe not allowed).
> 
> That isn't the only issue.. another issue is identifing the correct
> kernel module(s) to load at boot... iirc, you cannot unload a kernel
> module loaded at boot time...
> 

You can do a kldunload on a module that was loaded by loader(8) and it
will be unlinked from the kernel in terms of symbol resolution, but the
memory cannot be freed.  You can then load and unload the same module
again as much as you want, it just won't re-occupy the original address,
and the original memory is lost forever (but considering the size of
most modules, that's not such a big deal).

-- Ian




More information about the freebsd-arch mailing list