我正在检查linux内核的所有系统调用,我看到两个函数将获取目录的内容:
asmlinkage long sys_getdents(unsigned int fd,
struct linux_dirent __user *dirent,
unsigned int count);
asmlinkage long sys_getdents64(unsigned int fd,
struct linux_dirent64 __user *dirent,
unsigned int count);
那么为什么同时存在linux_dirent64
和linux_dirent
结构呢?我的意思是,一个结构应该足够了
答案 0 :(得分:2)
32位版本支持在64位只是一个神话时编译回来的代码,如飞行汽车或响应政客。
答案 1 :(得分:1)
好的,这不仅仅是因为需要向后兼容性。还有一个原因。 即使内核在64位模式下运行,Linux内核也支持在用户空间上运行的32位进程。这称为32位兼容模式。因此,对于以32位模式运行的进程,一切看起来都像32位系统。他们仍然会调用32位旧式的系统调用等。但是在内核中保留了每个64位系统调用的32位当量,最终在需要转换为64后调用64位系统调用。这称为64位兼容模式,系统调用是compat系统调用。所有这些马戏团的原因是使用户空间进程能够透明地运行内核模式。 (没有用户空间流程供应商喜欢将他们的软件移植到64位,因为他们可能具有任何业务优先级)
答案 2 :(得分:0)
历史上,文件大小,偏移量,inode数等等都是" unsigned long"在UNIX API中,32位平台上有32位,因此适用于2GB(签名时)文件大小。那时候的热情,甚至还不足以制作DVD影像或现在很多电影。
要处理大于此数据的文件,大多数系统调用(以及传递给它们的结构)和处理这些文件的结构都必须更改,并且通常这个版本得到了#34; 64"后缀。
getdents就是其中之一 - getdents使用的结构为" unsigned long"对于目录偏移量和inode号,而getdents64使用s64和u64(64位类型)。
类似的系统调用是stat / stat64,statfs / statfs64,sendfile / sendfile64等。
在64位系统上,这些系统调用中的一些较旧的系统调用不存在,因为它们通常与基本版本相同。有些具有64位对应物,因为即使是64位系统也可能存在向后兼容性问题(例如,具有32位的inode号)。