The time has come for a kernel interfacing library layer
Matthew Dillon
dillon at apollo.backplane.com
Sun May 8 10:51:33 PDT 2005
:> It's easier to simply require that a pointer to errno be stored in
:> the TLS (via i386/include/tls.h).
:
:That would making using this abstraction mechanism e.g. for the linux
:emulation impossible. That's a goal I'd like to keep and hopefully we
:agree on that :)
Remember, this layer is a userland layer... the errno mapping I'm
talking about only applies to DragonFly executables. A linux
emulation or a FreeBSD emulation or other emulation would have to
operate by emulating the actual system calls. I still want to do
*that* in userland, but it basically requires doing an upcall back
into a conversion layer which then executes in userland, or alternatively
a virtualization of the system call interface (which is also possible).
:> Basically as far as libc or rtld is concerned, they simply link
:> against another library called 'libsys' (rtld gets its own, which we
:> make the one libc uses part of the crt link sequence). This library
:> will contain the system calls in a specially-named section. The
:> kernel will then remap the section as appropriate. We have the option
:> of making the section a BSS section (so it takes up no space in the
:> actual linked program), or making the section a code section with real
:> 'default' syscall entry points in it.
:
:Adding another library is problematic for code which wants to static link
:manually. Since we need a certain level of backwards compatibility anyway
:in libc, it should be placed there.
We can do that, but the problem is that if we reserve 64 bytes per system
call the ELF section is going to be fairly big (~28KB). So if the
section contains real code, that would bloat all of our static binaries
by 28KB.
I think a better way would be to have the kernel be responsible for
mapping over the section for anything it loads directly, and then MFC
that mapping code to the 1.2.x-RELEASE kernel as well. It would be
fairly non-invasive... if the kernel doesn't see the section, it would
not do the mapping. The mapping itself would be trivial... just a
direct mmap() of the file.
:One problem with making it an ELF section is the extensibility, what
:if we run out of space? E.g. a shared library could not just use a
:new syscall, when libc has run out of space in the section.
:
:Joerg
Since this is BSS space we are talking about, we can theoretically
reserve a fairly large chunk of change for the extension. e.g. like a
megabyte.
There are alternatives.
* We can separately mmap the extension. This would require relocating
the JMPs and I don't want to do that.
* We can use the linker map to place this section at the end of the BSS
area, and the kernel can just SBRK the required additional space.
That's a fairly aweful hack and I don't really want to do that either.
I'm sure there other things that I haven't thought up of yet.
Personally speaking, I don't mind reserving a megabyte or two of VA.
We are going to want to have some reserved address space anyway for
other things, such as shared memory for the userland signal critical
section. We dont eat another page directory entry until we exceed 4MB
so its basically free.
-Matt
Matthew Dillon
<dillon at xxxxxxxxxxxxx>
More information about the Kernel
mailing list