当前位置:  技术问答>linux和unix

问:系统调用的原理,一个C函数的系统调用是怎样进入到系统的?

    来源: 互联网  发布时间:2015-08-31

    本文导语:  最近学习操作系统,了解到操作系统很大一部分可以说是由其提供的系统调用组成。 以前学微机原理时只知道Dos下系统调用int 21h等中断进入到系统的代码,这样系统通过中断向用户程序开放了功能调用。 而到了现...

最近学习操作系统,了解到操作系统很大一部分可以说是由其提供的系统调用组成。

以前学微机原理时只知道Dos下系统调用int 21h等中断进入到系统的代码,这样系统通过中断向用户程序开放了功能调用。

而到了现代这个时代,不管是Linux还是Windows,系统调用好像都是通过一系列的C库函数提供的。依据我对C语言的理解,编写好的程序总要链接成一个可执行文件。最近我又了解到Linux内核编译后,所有提供系统调用功能的函数应该都是链接到一个内核映像文件里,然后由引导器加载然后执行的。然后由引导器加载然后执行的。

那么,通过 C 函数来调用的系统功能,是如何进入到系统的?我的程序显然不是和内核链接在一起的。好像这也不像通常那样的动态链接呀?动态链接又是怎么实现的?

谢谢各位老大!

|
内核模块是和内核代码连接到一起运行的,并且和内核代码有一样的CPU运行级别所以可以不通过系统调用就直接访问内核空间的内容。如果用户空间要访问这部分代码同样要通过系统调用这个门来进行。

用C/C++等语言编程的时候你虽然没有直接用到int 80h来进行系统调用但是你调用的一些函数编译以后也是编程int 80h,只是你直接看不到而已。

动态连接是一个用户空间的概念,不同的系统有自己不同的可执行文件格式,Linux使用的是elf格式的可执行文件,动态连接只是把多个符合格式的文件在需要的时候加载到用户空间内存,然后把那段地址空间映射到需要调用它的进程空间中。这样用到动态库的进程就可以顺利的访问了。


PS:DOS操作系统提供的21h中断其实不是现在意义上的系统调用,而只是一个函数的入口表而已,因为DOS并没有用户空间的概念,它是一个运行的实模式下的系统。

|
这个应该随着c标准库的不同而不同的吧。下面以getuid()在glibc中的实现为例:
在glibc中定义了__getuid(),然后给__getuid()去了一个别名叫getuid()。__getuid()会调用INTERNAL_SYSCALL (getuid32, err, 0)这个宏,这个宏的主要是一段汇编代码:
define INTERNAL_SYSCALL(name, err, nr, args...) 
  ({       
    unsigned int resultvar;       
    asm volatile (       
    LOADARGS_##nr       
    "movl %1, %%eaxnt"       
    "int $0x80nt"       
    RESTOREARGS_##nr       
    : "=a" (resultvar)       
    : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc");       
    (int) resultvar; })
不过这段我也看得不是很懂,大概的意思就是用movl把__NR_getuid32这个值(对于上面的getuid来说)移到eax寄存器中,然后执行int $0x80陷入到系统调用中,再具体的过程就应该要看一下linux的系统调用的实现。
这段代码具体是做了什么还是请哪位大牛说一下

|
用户态的进程通过系统调用进入核心态,就是通过80h中断

    
 
 

您可能感兴趣的文章:

  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • Linux添加系统调用时如何调用C语言库函数
  • 截获系统调用的模块中,如何获得发生系统调用eip
  • linux中为什么系统调用比普通函数调用更费时间?
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • MINIX3 系统如何添加系统调用
  • 关于minix文件系统中dup的系统调用问题
  • 在LINUX中使用C调用系统命令,怎么取得系统命令的输出?
  • 在linux kernel 里添加了系统调用,如何在用户程序中调用添加的系统调用呢?急
  • 系统调用对应的内核函数在什么地方
  • 增加系统调用
  • 急急 solaris 系统被自己的进程调用太多堵死了,其它系统进程也运行不了,有没有什么好的办法啊?在线等!!!!
  • 望指点:系统调用与函数库关系
  • 如何用系统调用实现每秒钟显示一次系统时钟,可以用getitimer,setitimer,alarm?
  • 我自己写了一个一个程序,文件名叫test。。怎么能够像调用系统命令那样子去调用我这个命令呢。在任何地方输入test就能执行这个程序。
  • settimeofday系统调用只是修改了系统时间?!没写进硬件?重启后时间还是1970怎么办??感谢路过的大神指点
  • 关于Linux系统调用的问题!
  • C库函数和linux系统调用区别
  • 添加系统调用后,调用时总是返回-1,为什么?
  • 操作系统的系统函数
  • 如果忘了某个系统调用函数,比如只记得函数名的几个关键字,如何查?
  • 初学Unix,问:标准级函数,如fopen,fclose;系统级函数open,close,两者什么关系?(在一篇讲文件操作的文章中看到的)
  • 在unix系统中用什么函数可以判别操作系统类型和版本号??
  • Unix系统函数和C语言标准函数库有重叠的部分吗?
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • Oracle 系统变量函数介绍
  • 如何链接系统库函数?!
  • 数据库 iis7站长之家
  • 如何用man查看系统函数的帮助?
  • 系统调用和库函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mount命令(linux操作系统)挂载卸载文件系统(cifs,光驱,nfs等)方法介绍
  • 问一个系统配置的问题:win2k系统能不能于SCO UNIX系统共存?
  • win7/Windows7系统下载地址搜集整理
  • unix下用java.util.Date取系统时间比直接在系统下用date命令查看系统时间早整整一个小时
  • Ubuntu查看系统信息命令介绍
  • windows 系统是否是多用户操作系统,如何理解“多用户操作系统”的“多用户”?
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • 我现在想做一个权限管理系统,想让权限系统的利用性更强,我应该怎样设计权限系统呢.
  • 怎样重装win7系统?win7重装系统步骤详细图文介绍
  • 谁知道哪里有用java开发的管理信息系统软件(如:图书馆管理系统,人事部管理系统)的代码?
  • windows server2008上PowerBuilder程序系统错误解决方法
  • 原来已安装好ubuntu,因系统崩溃,重装WINXP系统,如何再次登录ubuntu系统?
  • Ubuntu系统安装及升级命令
  • Linux(Oracle系统在上面)系统无缘无故死机 , 可能是由于应用程序引起 , 可是由于重新启动查不到相关信息 , 不知道在哪里有记录系统CPU Lo
  • 安装运行微软win7/Windows7系统要求及官方下载地址
  • UNIX系统下,进程写文件,写了很大量的文件,但是进程被KILL -9杀掉,系统可以保证写缓冲上的文件写到系统吗?
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • LINUX系统怎么记录飞鱼星VE982G系统日志
  • Linux内存文件系统(ramdisk)的三种实现方式
  • pipe是什么样的文件系统?是独立的文件系统吗?
  • linux内存文件系统ramfs实现原理
  • 我的系统硬盘有一个block坏了,系统不能正常启动,请问如何能启动设备?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3