[linux-kernel] malloc,sleep,gethostname都不是系统调用
malloc不是系统调用,它是glibc的库函数,它实际调用了brk,然后管理了一个内存池。
sleep和usleep都不是系统调用,它们是信号加nanosleep实现的,也是glibc的库函数。
gethostname在intel机器上,即x86_64和i386上也不是系统调用,是用系统调用uname实现的,依然是glibc的库函数。
不信的话,在x86机器上编译运行这段程序 test.c:
nm test 你会看到
gethostname@@GLIBC_X.X.X
usleep@@GLIBC_X.X.X
malloc@@GLIBC_X.X.X
strace ./test 跑一跑,你会看到uname,nanosleep有10次循环执行,brk没有10次那么多,因为它是内存池,一次就要个很多。
gethostname 在linux内核代码中确实有实现(kernel/sys.c函数sys_gethostname),但是这个调用只对MIPS和Alpha架构的机器有 效,对x86_64和i386架构的机器,内核连系统调用号都没有提供,也就没有这个系统调用了。
另外,strace跟踪程序时还会发现“restart_syscall”,这是用于signal的系统调用,是为了保证信号的可靠性。
====== 2009.12.23 分割线 ======
至于为什么MIPS和Alpha才把gethostname当system call,我发邮件问了 Alan Cox ,老兄还真是负责,回了邮件:
Because it doesn't need to be kernel supported. The MIPS/Alpha have it to
support compatibility with MIPS and OSF Unix apps.
很简洁的Hack风格,MIPS/Alpha把gethostname当system call是为了支持很多在它们上面跑的老unix程序。
sleep和usleep都不是系统调用,它们是信号加nanosleep实现的,也是glibc的库函数。
gethostname在intel机器上,即x86_64和i386上也不是系统调用,是用系统调用uname实现的,依然是glibc的库函数。
不信的话,在x86机器上编译运行这段程序 test.c:
#include
#include
int main(int argc, char* argv[])
{
char name[1024];
int i;
char* p;
for(i=0; i<10; i++)
{
gethostname(name, sizeof(name));
usleep(1);
p = malloc(100);
}
printf("hostname:%s\n", name);
}
gcc test.c -o testnm test 你会看到
gethostname@@GLIBC_X.X.X
usleep@@GLIBC_X.X.X
malloc@@GLIBC_X.X.X
strace ./test 跑一跑,你会看到uname,nanosleep有10次循环执行,brk没有10次那么多,因为它是内存池,一次就要个很多。
gethostname 在linux内核代码中确实有实现(kernel/sys.c函数sys_gethostname),但是这个调用只对MIPS和Alpha架构的机器有 效,对x86_64和i386架构的机器,内核连系统调用号都没有提供,也就没有这个系统调用了。
另外,strace跟踪程序时还会发现“restart_syscall”,这是用于signal的系统调用,是为了保证信号的可靠性。
====== 2009.12.23 分割线 ======
至于为什么MIPS和Alpha才把gethostname当system call,我发邮件问了 Alan Cox ,老兄还真是负责,回了邮件:
Because it doesn't need to be kernel supported. The MIPS/Alpha have it to
support compatibility with MIPS and OSF Unix apps.
很简洁的Hack风格,MIPS/Alpha把gethostname当system call是为了支持很多在它们上面跑的老unix程序。
相关文章
- ext2/ext3/ext4 文件系统初探 - 01 20, 2011
- linux在多核处理器上的负载均衡原理(幻灯片) - 10 22, 2010
- [kernel] 内核缓冲的锁 - 08 11, 2010
malloc的话,大于128k是用mmap来实现的。。
受教了。这部分代码是在glibc里还是在elf loader里?