OS X BSD System Calls Reference
dyjakan.sigsegv.pl
dyjakan.sigsegv.pl
This makes me wonder, what would this look like for plan9? Just FS-related syscalls, and that's it? Curious...
I guess that i'm then wondering, to what extent are the profusion of api calls on bsd/linux (by comparison) due to which of the following: a) legacy of evolving richer apis while supporting older ones b) poorer factoring of abstractions c) different special casing for various performance or security related primitives?
NeXTSTEP became the basis for OS X. It meets the Single UNIX Specification [2].
[1] https://en.wikipedia.org/wiki/OS_X#History
[2] https://en.wikipedia.org/wiki/Single_UNIX_Specification#OS_X
Both Android and OSX are listed under https://en.wikipedia.org/wiki/POSIX#Mostly_POSIX-compliant
What I would like to know is, is there any fundamental difference in how the two have derived from their predecessors, ie. Android kernel from the Linux kernel and OSX's XNU kernel from the NexTSTEP/BSD kernels, specifically in terms of compatibility concerns.
(Edit reply to below: Yes but my understanding is that the Android kernel changed fundamental system calls, such as those used for memory allocation, forcing everything userland to be rewritten. Is the 'two systems' of XNU you describe not, therefore, similar in its effect on compatibility?)
The OSX kernel has two, due to it's bolt-on nature. Mach message passing and BSD system calls. As far as I am aware, the BSD system calls is an emulation layer, and is not entirely complete.
As a user, you don't care; the quirks of both systems are papered over by libc, which does the appropriate syscall dance to create a posix compliant system. (For an example of a Linux quirk, 'exit()' on Linux doesn't actually exit the process, it only exits the current thread).
They could have started from some other kernel. They didn't happen to do that. I don't think it means much.
BTW, Singh's writings regarding OS-X are exceptionally well researched, detailed, and thorough. I highly recommend them for anyone interested in OS-X/XNU internals.
HTH
1 - http://www.kernelthread.com/publications/appleoshistory/7.ht...
2 - http://www.osxbook.com/book/bonus/ancient/whatismacosx/arch_...
Several xnu syscalls are actually paired with a userspace wrapper function that does some extra stuff. Existing syscalls may even become wrapped in a subsequent release if needed.
I believe this article[1] definitively answers this as being the case.
> Whereas Linux keeps a hard compatibility guarantee.
Not being a troll here... Why would anyone care unless they are writing a libc replacement? Before anyone objects regarding compatibility with programs written for older versions of OS-X, there have been compatibility libraries distributed for every version I can recall. To wit, I run the Pages app from iWork '09 regularly.
1 - https://developer.apple.com/library/mac/qa/qa1118/_index.htm...
Statically compiling the libc is common with proprietary Linux software, if I remember correctly.
Thanks for clarifying this point for me.
- So that you can feel safe upgrading your kernel without upgrading your whole userspace. (Linus harps on this one a lot.)
- So that there can be multiple competing libc's. Linux is used in a lot of diverse environments, and the tradeoffs made by glibc (in terms of bloat, license, etc.) are not necessarily the best for everyone. Android does not use glibc, for example.
- So that you can isolate apps from each other using containers (hermetic chroot environments), where different containers may have entirely different libc. Docker (and my own Sandstorm.io) relies very heavily on Linux's syscall ABI compatibility promises.
- Because the syscall ABI is frankly a much clearer boundary than the libc ABI, and arguably easier to keep backwards-compatible. An app literally _can't_ break this boundary and access the private interfaces beneath (assuming a secure implementation, lol).
Linux doesn't have any single fixed libc, the system call interface is the public API. Indeed there are many different libc's used in different linux applications - glibc on many desktop distros, bionic libc on android, uclibc, musl and others on various embedded/specialized setups.
(I have learned a lot by just going to that page and randomly clicking on things.)
If you want to learn the syscall ABI on Linux you need to look at <asm/unistd.h>. Seems like this file has gone through some refactorings since the last time I looked, but here's an older version: http://lxr.free-electrons.com/source/include/asm-generic/uni... [edit: ia32 here http://lxr.free-electrons.com/source/arch/x86/include/asm/un...] -- the constants in the __NR_* macros define the table that this article is attempting to build. [Basically, the interrupt handler for a syscall needs to know where to jump based on that index.]
The C library specifies the index into this table when making a syscall. You don't want a situation where the C library and the kernel are mismatched and disagree about what the syscalls are.
The safe way to remove a syscall is to change it to return ENOSYS. All the syscalls that come after it in the table therefore retain the same index.