Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: rump is complete



On Mon Mar 21 2011 at 12:47:24 -0700, Sanjay Lal wrote:
> I was curious about running NetBSD kernel code in user land run on kernels 
> other than NetBSD?  For instance, running the NetBSD networking stack in 
> userland on Linux etc?  What would be required to get such a system going?

This is probably a FAQ, but I can't remember answering it except in
private, so one more go is useful.  If anyone investigates further,
some notes on the wiki might be in order (the same can be said about
how to use NetBSD-current kernel drivers on a release).

The short version is that it runs just fine, but there's always a ...

1) building

   Back in 2007 when I originally ran our FFS on Linux, I built the code
   with some concoctions of build.sh, nbmake USETOOLS=no and copypasted
   command lines.  It's not very difficult, but takes some tinkering.

   Since then, Arnaud Ysmal's most excellent fs-utils required rump
   support in pkgsrc.  The package makes compilation trivial, but it
   tends to go out-of-date.  In fact, currently it's really out-of-date,
   and at least I don't really know how to update it.

   So, what I think would be required is something like bootstrap-rump.sh,
   which would be included in the source tree and would compile the
   kernel and rumpuser with the right compiler flags.  The same script
   could be used to install -current rump onto a release.

2) host resource access

   Networking is not very exciting unless you can also access a network.
   On NetBSD, there's a few different way to do this:

   a) virt(4), which accesses the host network via a tap-like device
      from /dev/tap using read/write

   b) shmif(4), which uses a memory-mapped file as an ethernet bus.  as an
      implication, communication is limited to other networking stacks
      running on the same host (unless one of them routes traffic to the
      outside world)

   c) "sockin", which actually skips the networking stack and just emulates
      the inet protocol family on top of kernel sockets.  it's most useful
      when networking is _not_ the thing you're interested in virtualizing
      (think about e.g. the nfs client)

   You're probably interested in "a".  Adjusting virt(4) to talk to a
   Linux tap interface (or equivalent) is most likely not very difficult.

3) application interface

   This is where the gloves come off.  In a normal scenario the userland
   and kernel are in agreement about the ABI.  If you try to run kernel
   code on a foreign platform, the kernel code will have its own idea
   of the ABI and the userland will have its own idea.  I first noticed
   this when running FFS on Linux and trying to pass an off_t pointer
   in the hypercall interface ...

   You need userland applications at least to configure the networking
   stack.  This includes ioctl and r/w on the routing socket.  The problem
   is that there is no "NetBSD" namespace, so e.g. the name "struct
   msghdr" may have a collision between Linux and NetBSD, PF_INET may
   have a different value, etc.

   Part of the issue is that we cannot process our headers automatically
   to create a "NetBSD" namespace.  Incidentally, the "xmlif" project
   proposed on this list yesterday would solve part of the issue.  Even if
   you cannot autogenerate types properly, you can still do reasonable
   hacks with e.g. sed.  See src/sys/rump/include/makerumpdefs.sh (which
   is mostly written for file systems, but can be augmented).

   Finally, you must translate the types.  This is not difficult, but
   slightly boring.

   Depending on what your application is, you might not have to do much
   in this department.  E.g. a router runs pretty much without a userland,
   so you'd just have to implement the types necessary for configuration.
   If you want totally transparent application use, there's some more
   work involved with making librumphijack target the right syscall names.

4) hypercall interface

   The rumpuser hypercall interface should be clean of ABI assumptions
   (apart from the bits necessary to implement "sockin").  However,
   since I haven't really tested it on non-NetBSD in years, there might
   be a few snafus lurking around.


In total, I'd estimate getting the NetBSD TCP/IP stack working on Linux
to be a day or two of work, and full application support would require
some more days to get all the translation code written.  Apart from that,
it's good to reserve some time for "unforeseen issues".

  - antti

-- 
älä karot toivorikkauttas, kyl rätei ja lumpui piisaa


Home | Main Index | Thread Index | Old Index