Dear NetBSD users,

The NetBSD core group has discussed the questions presented to us
about the situation with modules and modular kernels.

We understand that there are problems with modularization on all
the platforms, specially on amd64, and we have seen a lot of
breakage due to them in the past years.  As core we believe that
ultimately the ability to build modular kernels is the way to go
and that by reverting a lot of the modularization on head we limit
its testing making it harder to become mainstream.  On the other
hand, we should always provide a safe way for people to build and
release kernels.

On the positive side:

- Modules can speed up kernel development because they eliminate
   many reboots by simply loading and unloading the module during
   each development cycle.

- Modules can conserve kernel memory in memory shortage
   situations.

- Modules can be used to add/remove/replace functionality on the
   fly.

On the negative side:

- Many of our modules are half baked (don't work correctly as
   modules, don't specify the right dependencies, or cannot be
   unloaded).

- Our module separation is not good (try compiling a kernel with
   only COMPAT_30 and all the rest of the compat code as modules;
   for now all that works is the all or nothing approach).

- Modules don't work on all platforms. Some platforms don't have a
   need for them because their hardware is fixed, but modules could
   still be used for software features (compat code, emulations).

- We don't have an easy way to group a kernel and its associated
   modules together, so that it's possible to have multiple
   bootable kernels, and multiple associated sets of modules, even
   if the kernels all share the same version number.

- We don't have a stable kernel ABI so that modules are reusable
   across different kernel versions.

- We don't have a way to tell from the kernel config file whether a
   feature can be used in a module form or not. (Perhaps comments or
   additional config(1) syntax could be used for this.)

Accordingly, we propose the following policy for the immediate
future.  We expect that it will be appropriate to re-evaluate this
policy as the state of modular support changes later.

- All ports using modules should provide all three of MODULAR,
   MONOLITHIC, and GENERIC kernels.

- At the portmaster's discretion, "options MODULAR" may be made the
   default by adding it to the port's "std.<machine>" configuration
   file.  (A kernel without the "MODULAR" option cannot load any
   modules, not even through the modload(8) command.)

- A port's MONOLITHIC kernel should include features that
   traditionally would have been present in a non-modular GENERIC
   kernel, and it may or may not include "options MODULAR", at the
   portmaster's discretion.

- A port's MODULAR kernel may lack many built-in features, expecting
   them to be loaded from modules at run time.  However, all features
   that are necessary for the standard MODULAR kernel to boot and
   work reasonably must be built-in.  This includes:

        * common file systems, including all file systems that can
          be the root file system, and also including nullfs and tmpfs;
        * disk devices that can contain the root file system;
        * common network devices;
        * exec support for the native ELF format, and for scripts
          (not necessarily for a.out, ECOFF, or compat formats);
        * core dump support.

   Users or developers may of course comment out relevant lines
   if they want to load these items as modules.

- The GENERIC kernel should be based on either MODULAR or
   MONOLITHIC, using an "include" directive.  The GENERIC kernel
   should include "options MODULAR", even if it it based on a
   MONOLITHIC kernel that does not include "options MODULAR.

- A port may not set GENERIC = MODULAR if it lacks an easy way to
   group a kernel and its associated modules together.  Because
   no existing ports have this feature, no existing ports may set
   GENERIC = MODULAR.

Alan Barrett
On behalf of the NetBSD core group

Reply via email to