LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1073|回复: 7

问:系统调用的原理,一个C函数怎么就把系统功能提供给了用户程序呢?

[复制链接]
发表于 2005-1-7 13:51:20 | 显示全部楼层 |阅读模式
最近学习操作系统,了解到操作系统很大一部分可以说是由其提供的系统调用组成。

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

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

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

谢谢各位老大!
发表于 2005-1-8 14:01:15 | 显示全部楼层
通过c的库调用api .linux下通常是glibc,库的实现中使用了一些汇编代码来实现对api的调用,代码大概是
movl $eax ,0xxx
int 80

把0xxxj换成实现的系统调用号, 有兴趣可以看一下相关的代码
 楼主| 发表于 2005-1-8 16:10:08 | 显示全部楼层
多谢,现在对系统调用原理稍微有点了解了。

这样说来,如果我的机器新编译了内核,而glibc还是用原来的版本,新内核中增加的系统调用可能无法正确使用?

另外,比如打开文件的系统调用,glibc是调用的操作系统的功能,可是操作系统却又是用c语言写的。二者之间“鸡生蛋,还是蛋生鸡?”
发表于 2005-1-9 01:22:23 | 显示全部楼层
在操作系统中是不会调用c的函数库的。
如果要与硬件打交道就会用汇编来写的
 楼主| 发表于 2005-1-9 21:10:58 | 显示全部楼层
呵呵,我想也是,多谢了。

另外我想如果系统调用是像Windows那样用导出库比如User32.dll 那样来实现,在User32.dll里面再加入int **h
之类的陷入操作系统那样的动态链接库的话,我想用户程序的编制就不用绑定到gcc上面了。

我不太熟悉,是不是linux上面的C/C++编译器实现只可以选择gcc呢?不像Windows下面那样竞争激烈,百花齐放。我相信只有竞争才能促进进步。

以上一点浅见,有不对的地方,还望指出。
发表于 2005-1-10 00:09:37 | 显示全部楼层
Post by freesky64
我不太熟悉,是不是linux上面的C/C++编译器实现只可以选择gcc呢?不像Windows下面那样竞争激烈,百花齐放。我相信只有竞争才能促进进步。

我想这一点在Windows系统上各家的编译器都不开源的情况下是成立的。
但在开源的系统上,任何人的想法都可以在gcc的邮件列表上提出,你可以去看看那个邮件列表上对gcc的新特性的增加的讨论是多么激烈。这才是真正的“只有竞争才能促进进步”。大家现用的gcc稳定版也就是他们讨论的最后结果。只是参与讨论的人似乎都是国外的高人,我们国内的高人参与特别少。所以也就造成国内这种对gcc的偏见。实际我本人一直认为gcc项目本身才是真正的百花齐放。
发表于 2005-1-10 11:34:07 | 显示全部楼层
实际并不是只能用gcc的编译器,其它的编译器也可以用,比如intel的.
因为一切都是开放的.大家都能实现.
你甚至可以写自己的系统调用库.
 楼主| 发表于 2005-1-12 11:20:31 | 显示全部楼层
谢谢大家,基本明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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