syscall to userland interface
Karl Dreger
k.dreger at yahoo.de
Sat May 11 08:23:40 UTC 2013
I am feeling rather stupid at the moment, but I can't find the assembler
files that you are referring to. Do you mean that every syscall under
sys/kern/*.c has a corresponding .S file in src/lib/libc/?
The actual transition from user to kernelland and back probably takes
place via the assembler routines in sys/i386/i386. Most notably exception.s
for my i386 cpu.
What my question boils down to is this: when running fork and friends
from userland they are invoked as:
fork();, open();, read();, close(); ...
but are defined as:
sys_fork(), sys_open(), sys_read(), sys_close(), ...
in their actual c definition.
If the assembler files that you spoke about answer this discrepancy,
then the reason why the penny hasn't dropped yet is because I haven't
found them.
Karl
________________________________
Von: Alfred Perlstein <bright at mu.org>
An: Karl Dreger <k.dreger at yahoo.de>
CC: "freebsd-hackers at freebsd.org" <freebsd-hackers at freebsd.org>
Gesendet: 3:36 Samstag, 11.Mai 2013
Betreff: Re: syscall to userland interface
On 5/10/13 12:31 PM, Karl Dreger wrote:
> Hello,
> I have been taking a look at a few syscalls in /usr/src/sys/kern/ and
> always find that in their actuall c definition the function names are
> preprended by a sys_. Take for example the fork system call which
> is found in /usr/src/sys/kern/kern_fork.c
>
> int
> sys_fork(struct thread *td, struct fork_args *uap)
> ...
>
> Now when I write a program from userland, that makes use of the
> fork system call, then if call it as:
>
> fork();
>
> All the syscall are part of libc, which is usually defined in
> /usr/src/lib/libc/
>
> Since the system calls are already defined in the kernel sources, they
> no longer need to be defined in /usr/src/lib/libc/. This is the reason
> why one can only find the manpages and no c files in
> /usr/src/lib/libc/sys?
> At least this is how my thinking goes.
>
> Now, when the syscalls in the kernel sources are all defined as sys_xxx
> but are invoked as xxx and the c headers also show syscall prototypes
> without any prepended sys. How does the actual user-, kernelland
> move happen? In other words, why do I invoke fork() as fork() and
> not as sys_fork()?
>
> Or is there something that I missed?
>
>
> Clarification on that point is highly welcome.
When you build the system a whole bunch of assembler files are
automatically generated that define the functions you are looking for.
Look for .S files under the object directory.
Those assembler files have the magic to cause a system call to happen.
example: src/lib/libc/getauid.S (note, this file is GENERATED, it's not
part of src.)
-Alfred
_______________________________________________
freebsd-hackers at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
More information about the freebsd-hackers
mailing list