[linux-kernel] malloc,sleep,gethostname都不是系统调用

malloc不是系统调用,它是glibc的库函数,它实际调用了brk,然后管理了一个内存池。

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 test
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程序。

相关文章

分类

2 Comments

bobo said:

malloc的话,大于128k是用mmap来实现的。。

DongHao Author Profile Page said:

受教了。这部分代码是在glibc里还是在elf loader里?

留言:

关于文章

This page contains a single entry by DongHao published on 12 21, 2009 6:46 PM.

《窃听风云》 was the previous entry in this blog.

我的奥林匹克 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.