当前位置: 技术问答>linux和unix
系统调用的实现库在哪?
来源: 互联网 发布时间:2016-05-22
本文导语: 一般库函数的实现都放在/usr/lib中,系统调用的实现放在哪呢? 当我们在调用一个函数时,OS是如何确定我们调用的是库函数还是系统调用呢? OS是如何把系统调用代码链接到我们的程序中,是静态还是动态链接? 所...
一般库函数的实现都放在/usr/lib中,系统调用的实现放在哪呢?
当我们在调用一个函数时,OS是如何确定我们调用的是库函数还是系统调用呢?
OS是如何把系统调用代码链接到我们的程序中,是静态还是动态链接?
所谓的系统调用是运行在内核态是什么意思,什么是内核态?
当我们在调用一个函数时,OS是如何确定我们调用的是库函数还是系统调用呢?
OS是如何把系统调用代码链接到我们的程序中,是静态还是动态链接?
所谓的系统调用是运行在内核态是什么意思,什么是内核态?
|
[root][~/asm]# cat test.s
.section .data
str:
.asciz "Hello, world!n"
.section .text
.globl _start
_start:
pushl $str
call printf " 这里是调用库函数printf输出字符串
movl $1, %eax " 这里是系统调用,$1代表exit()这个系统调用
movl $0, %ebx " 这里是设置exit()系统调用的返回值,正常返回,值设为0
int $0x80
[root][~/asm]# as -o test.o test.s // 编译
[root][~/asm]# ld -dynamic-linker /lib/ld-linux.so.2 -lc -o test test.o //链接,需要连接C库,有printf
[root][~/asm]# ./test // 运行程序
Hello, world!
[root][~/asm]# echo $? // 查看程序的返回值,确实为0
0
|
呵呵,和windows 不一样 windows系统调用 以动态链接库的方式提供
Linux是 用户态 trap 进内核态 然后由内核查看 寄存器的值(比如 %eax) 得知是调用哪个系统调用函数。
你可以写一个简单小代码 然后调用 execve (这个linux 系统调用,其他execpl等等都是被C库包装过了),然后编译 objdump -d a.out 看看汇编代码
|
系统调用是操作系统提供给用户的编程接口,分布在内核
的实现中,并不是在一两个文件中实现的
系统调用名一般和库函数名都是不同的,但是也可以根据
#include判断
Linux OS 的运行状态一般分内核态和用户态
具体的google之
的实现中,并不是在一两个文件中实现的
系统调用名一般和库函数名都是不同的,但是也可以根据
#include判断
Linux OS 的运行状态一般分内核态和用户态
具体的google之
|
系统调用和调用函数的机制完全不同,不是链接的概念
|
基本就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,
|
这个问题,建议你看看 《linux内核设计与实现》
有很详细的介绍。
有很详细的介绍。
|
当我们在调用一个函数时,OS是如何确定我们调用的是库函数还是系统调用呢?
估计不看内核肯定理解不到.
估计不看内核肯定理解不到.