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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to