2 ms·
On GNU/Linux there's also the (badly designed) memfd_create() syscall which allows you to create an anonymous inode even if / is entirely read-only and you don'
by cyphar 10y ago
On GNU/Linux there's also the (badly designed) memfd_create() syscall which allows you to create an anonymous inode even if / is entirely read-only and you don't have mounting permission. While you could do it with a user+mount namespace and sending the fd over a UNIX socket, sometimes making a syscall is a better idea. :P
- JoshTriplett 10y agoWhat don't you like about the design of memfd_create?
- cyphar 10y agoThe fact that the first argument (the "name") is only used as a debugging interface so that the /proc/self/fd/... "symlinks" have the name you set. I don't agree that this is useful for any real debugging, and constructing your syscalls so that they "make debugging easier" is not something that I really understand the motivations behind -- your ABI should be consistent and logical, not based on what you think a good debugging interface should be.
- JoshTriplett 10y agoAh, fair enough; I agree completely. It should only have taken a flags argument.
- geocar 10y agomemfd_create() does not create an inode. It only creates a file descriptor. With a file descriptor you can create multiple mappings to the same physical address -- something otherwise impossible on UNIX or Linux (although mach allows you to vm_remap[1] which is often sufficient). [1]: http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_remap.html http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_remap...
- JoshTriplett 10y ago> memfd_create() does not create an inode. It only creates a file descriptor. It creates both; memfd_create (and timerfd_create, signalfd, eventfd, userfaultfd, epoll, and others) use a kernel subsystem called "anon_inode" to create an in-memory inode to back the file descriptor.
- JoshTriplett 10y ago(Minor correction: memfd_create creates an in-memory inode without using anon_inode, while the various other syscalls use anon_inode.)
- cyphar 10y agoIt creates a full inode using shmem[1], which eventually goes to ramfs[2]. It's a real inode in every sense of the word. [1]: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.2#L2949 http://lxr.free-electrons.com/source/mm/shmem.c?v=4.2#L2949 [2]: http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.2#L53 http://lxr.free-electrons.com/source/fs/ramfs/inode.c?v=4.2#...
- geocar 10y agoI have been indelicate: What Linux calls an "struct inode" is not what UNIX traditionally called an inode[1], and I meant the latter without perhaps enough specificity. [1]: https://en.wikipedia.org/wiki/Inode https://en.wikipedia.org/wiki/Inode