Subject: Re: foo_init()s in main() [was: CVS commit: src/sys]
To: None <tech-kern@NetBSD.org>
From: Terry Moore <tmm@mcci.com>
List: tech-kern
Date: 11/22/2005 17:30:16
I worked with an embedded operating system some years ago that did 
exactly this.

There was a "module configuration" file which listed 
prerequisites.  Modules could be requested by name or by "tag", and 
modules could claim to satisfy a requirement (allowing things to be 
stubbed out).

Then each module that wanted initialization services had a macro that 
specified an init function (by name).  The name got mangled in a 
recognizable way and put into the symbol table.  The build process 
would link twice, once to get the symbols (ld -r or equiv), scan to 
find the magic symbols, and use the module topological sort to build 
an init vector.

This seemed better than implicit initialization, because there are 
subtle problems with cycles in the initialization graph, which are 
more readily resolved by an engineer than by a machine.

Anyway, the result was a system without a main() function, which made 
updates and modular additions really easy.  LKM-like things were 
faked by calling the INIT-entry point (of course the things you 
depended on had to be in the kernel, and it was your job to make sure 
of that; this was in the late 80s).

So I can recommend this approach, for whatever it's worth.

--Terry

At 05:20 PM 11/22/2005 -0500, Steven M. Bellovin wrote:
>In message <20051122215324.GB24186@netbsd.org>, Bill Studenmund writes:
> >
> >
> >
> >How do you think we should encode dependencies? I agree that the FreeBSD
> >way is uncentralized. However someone who studies the whole system can
> >tune it so that things get loaded in the right order (just pick the right
> >set of "FIRST", "SECOND", and so on). How would we do that w/o the master
> >list of values?
> >
>Thinking out loud -- something like rc.d uses?
>
>                 --Steven M. Bellovin, http://www.cs.columbia.edu/~smb