找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4088|回复: 0

库函数和系统调用

[复制链接]
发表于 2012-1-14 10:20:35 | 显示全部楼层 |阅读模式
系统调用(system call)是操作系统内核提供的函数,在内核态运行(kernel mode),属于函数中的低等下人,终身代号9527,虽然低等,但是谁也离不开他们,因为离开他们就没办法和内核打交道了,没办法和内核打交道就什么都歇菜了。。。
linux3.0.0-14的系统调用有346个,可以在源码的 linux-3.0/arch/x86/kernel/syscall_table_32.S文件中找到所有的系统调用编号,如果以汇编的方法调用这些系统函数,那么放在EAX寄存器里面的值就是想要调用的函数的号码,把前20个贴在下面了,很多貌似很熟悉的吧:)ENTRY(sys_call_table)
  1.         .long sys_restart_syscall        /* 0 - old "setup()" system call, used for restarting */
  2.         .long sys_exit
  3.         .long ptregs_fork
  4.         .long sys_read
  5.         .long sys_write
  6.         .long sys_open                /* 5 */
  7.         .long sys_close
  8.         .long sys_waitpid
  9.         .long sys_creat
  10.         .long sys_link
  11.         .long sys_unlink        /* 10 */
  12.         .long ptregs_execve
  13.         .long sys_chdir
  14.         .long sys_time
  15.         .long sys_mknod
  16.         .long sys_chmod                /* 15 */
  17.         .long sys_lchown16
  18.         .long sys_ni_syscall        /* old break syscall holder */
  19.         .long sys_stat
  20.         .long sys_lseek
  21.         .long sys_getpid        /* 20 */
复制代码
库函数是在系统调用上的一层包装,运行在用户态(user mode),打个比方吧,库函数相当于包工头,系统调用是工人,我们可以自己找工人分任务,但一般是把任务摊给包工头,包工头再去给工人分任务。
所以虽然最终所有的工作都是系统调用做的,但是我们更通常的做法是调用库函数,有以下几个原因:


  • 库函数提供了抽象,抽象是个好东西,可以让我们把更多的注意力集中在要解决问题的核心。
  • 库函数给我们提供的接口更人性化,所以调用起来更方便。
  • 调用库函数更安全,内存管理不用自己太操心。
  • 调用库函数效率更高,程序跑的更快。虽然库函数最终是调用系统函数,但是库函数会比我们用更好的方式方法调用系统函数。

我前面一篇博客算是个例子吧,可以参考看下:猛击进入
库函数不光可以在系统调用的基础上包装,也可以在其他库函数的基础上包装,提供更高级的抽象,更强大的功能。比如OGRE对OpenGL的包装,Qt对Xlib的包装,类似于从老总到秘书到部门主管到包工头再到工人的过程,当然我我们就是老总了,只要我们高兴,不光调用秘书(好邪恶啊。。。),直接调用主管,包工头,甚至自己当工人都可以,自己写个系统调用,然后重新编译内核,然后再调用自己写的系统调用,么么达。
最后介绍两个工具,strace和ltrace,strace查看我们的可执行文件调用了哪些系统调用,ltrace查看可执行文件调用了哪些库函数,喜欢逆向工程的朋友一定很喜欢。用法很简单,直接在命令后面跟可执行文件路径就好了。

作者:High_High 发表于2012-1-14 5:47:30 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-18 23:42 , Processed in 0.017078 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表