当前位置: 技术问答>linux和unix
问:系统调用的原理,一个C函数怎么就把系统功能提供给了用户程序呢?
来源: 互联网 发布时间:2015-09-02
本文导语: 最近学习操作系统,了解到操作系统很大一部分可以说是由其提供的系统调用组成。 以前学微机原理时只知道Dos下系统调用int 21h等中断进入到系统的代码,这样系统通过中断向用户程序开放了功能调用。 而到了现...
最近学习操作系统,了解到操作系统很大一部分可以说是由其提供的系统调用组成。
以前学微机原理时只知道Dos下系统调用int 21h等中断进入到系统的代码,这样系统通过中断向用户程序开放了功能调用。
而到了现代这个时代,不管是Linux还是Windows,系统调用好像都是通过一系列的C库函数提供的。依据我对C语言的理解,编写好的程序总要链接成一个可执行文件。最近我又了解到Linux内核编译后,所有提供系统调用功能的函数应该都是链接到一个内核映像文件里,然后由引导器加载然后执行的。然后由引导器加载然后执行的。
那么,通过 C 函数来调用的系统功能,是如何进入到系统的?我的程序显然不是和内核链接在一起的。好像这也不像通常那样的动态链接呀?动态链接又是怎么实现的?
谢谢各位老大!
以前学微机原理时只知道Dos下系统调用int 21h等中断进入到系统的代码,这样系统通过中断向用户程序开放了功能调用。
而到了现代这个时代,不管是Linux还是Windows,系统调用好像都是通过一系列的C库函数提供的。依据我对C语言的理解,编写好的程序总要链接成一个可执行文件。最近我又了解到Linux内核编译后,所有提供系统调用功能的函数应该都是链接到一个内核映像文件里,然后由引导器加载然后执行的。然后由引导器加载然后执行的。
那么,通过 C 函数来调用的系统功能,是如何进入到系统的?我的程序显然不是和内核链接在一起的。好像这也不像通常那样的动态链接呀?动态链接又是怎么实现的?
谢谢各位老大!
|
Real mode and protected mode is quite different.
Linux also exported the syscalls.
Have a look at unistd.h, all syscall numbers(__NR_xxx) are listed in it.
you can use the defined Macros(syscall0,...) to call syscall directly, without the need of glibc.
You can think Glibc is equivalent to MFC ;)
Linux also exported the syscalls.
Have a look at unistd.h, all syscall numbers(__NR_xxx) are listed in it.
you can use the defined Macros(syscall0,...) to call syscall directly, without the need of glibc.
You can think Glibc is equivalent to MFC ;)
|
不是已经回答过一次了嘛!怎么又问一次,你很多分没地方用?
|
说到底就是一个远程指针。用它就可以访问系统调用模块。系统有个总接口,也就是有一张入口表。你要调用的系统调用模块此时不一定在内存中。没关系,系统的内存调度会把它装进来。
|
实际过程其实跟DOS是一样的,应用程序首先会把函数调用信息(函数名、参数)保存到一个地方,然后产生一个软中断以进入内核,内核在把这些数据取出来,然后查找一个表,找到该系统调用对应的函数入口,用参数调用之
|
呵呵,UP
|
一两句话还真说不明白。