What code loads kernel modules at boot?

Ian Lepore ian at freebsd.org
Thu Apr 18 03:51:13 UTC 2019


On Wed, 2019-04-17 at 21:44 -0600, Warner Losh wrote:
> On Wed, Apr 17, 2019 at 9:07 PM Ian Lepore <ian at freebsd.org> wrote:
> 
> > On Wed, 2019-04-17 at 20:52 -0400, Lee D wrote:
> > > A couple of years ago I wrote a FreeBSD bootloader for Zynq
> > > (Arm32).
> > > It's been working well, but now I need to add the ability to load
> > > kernel modules at boot.  This is for 11.0.1 (updating to 12 soon,
> > > hopefully).
> > > 
> > > Can anyone point me to the code that actually loads a kernel
> > > module
> > > for arm?  I got lost reading the source in /src/sys/boot/common,
> > > and
> > > can't quite figure out what routine is actually called.
> > > 
> > > I assume I need to parse the sections out of the .ko file and
> > > place
> > > them carefully in memory, like I do with the kernel image.
> > > 
> > > Also, if you're feeling loquacious, where do I put the darn thing
> > > and
> > > how do I tell the kernel how to find it (part of the MODINFO
> > > stuff I
> > > assume)?
> > > 
> > > This is all in the context of loading custom real time clock and
> > > I2C
> > > drivers so they are available at boot time.
> > > 
> > > Thanks,
> > > 
> > > 
> > 
> > The bulk of the module-loading code (the arch-independent part of
> > it)
> > is in src/stand/common/module.c.  There is also
> > archsw.arch_loadaddr,
> > which figures out where to put the modules (handling arch-specific
> > things like alignment requirements).
> > 
> 
> That code gets called from the command line commands, as well as
> indirectly
> in the .conf file parsing each of the interpretive languages have.
> 
> 
> > For some reason, I thought Zynq used u-boot.  That would allow
> > using
> > either ubldr or the arm uefi loader (depending on how old the u-
> > boot
> > is); those are just flavors of loader(8) that would get you module
> > handling and all the other loader goodness.
> > 
> 
> Yea, if the loader that he's written loads /boot/loader, he doesn't need to
> do anything. if it loads the kernel and modules, he'll need to do what the
> code in src/stand/common/module does in terms of laying out memory and
> passing the proper meta-data to the kernel.
> 
> 

It would have to do more than just load /boot/loader (or ubldr)... it
would have to provide some sort of bios-like services for loader to do
I/O.  I almost mentioned that in my original post... if you've got a
loader that can do disk I/O, it wouldn't be too hard to make it provide
the same API services that u-boot does, then ubldr would work.  What
you need to implement for the api isn't much more than some simple disk
read/write stuff, console read/write, and env var support (which could
be mostly stubbed out).

-- Ian



More information about the freebsd-hackers mailing list