深入理解Linux系统调用
The following article is from 码农的荒岛求生 Author 码农的荒岛求生
出品 | 码农的荒岛求生 (ID:escape-it)
在前两篇文章《为什么计算机需要操作系统》《系统调用与函数调用有什么区别》中我们了解了什么是系统调用、为什么需要系统调用、系统调用与函数调用有什么区别,那么在今天的文章中我们从理论来到现实,看看Linux中的系统调用是怎样实现的。
首先我们先来简单复习下之前讲解过的知识。
系统调用和普通的函数调用没有本质区别,普通的函数调用一般调用的是我们自己编写的函数或者其它库函数,而系统调用调用的则是内核中的函数,更学术一点的说法是这样的,所谓系统调用是指用户态程序请求操作系统提供的服务。
一提到服务,大家最先想到的一定是服务器,假设客户端是浏览器,浏览器发送http请求,服务器接收到请求后进行解析然后调用相应的hander,从本质上讲就是客户端触发了服务器端的某个函数的运行,这时我们说客户端请求了服务器端上的服务。
而系统调用与此类似,只不过用户态程序并不是通过http触发了操作系统中某个函数的运行,而是通过机器指令来触发的,因为用户态的App和操作系统运行在同一台计算机系统上,而客户端和服务器端运行在不同的计算机系统中(绝大部分情况下),因此客户端只能通过网络协议http来与服务器进行通信。
.datamsg: .ascii "Hello, world!\n" len = . - msg.text .global _start_start: movq $1, %rax movq $1, %rdi movq $msg, %rsi movq $len, %rdxsyscall movq $60, %rax xorq %rdi, %rdisyscall
$ gcc -c test.S
$ ld -o test test.o
./test
Hello, world!
SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR (after saving the address of the instruction following SYSCALL into RCX). (The WRMSR instruction ensures that the IA32_LSTAR MSR always contain a canonical address.)
wrmsrl(MSR_LSTAR, entry_SYSCALL_64);
0 common read sys_read
1 common write sys_write
2 common open sys_open
3 common close sys_close
4 common stat sys_newstat
5 common fstat sys_newfstat
6 common lstat sys_newlstat
7 common poll sys_poll
8 common lseek sys_lseek
9 common mmap sys_mmap
...
movq $1, %rax
# 写入文件描述符1
movq $1, %rdi
# 保存指向字符串的指针
movq $msg, %rsi
# 写入数据的大小
movq $len, %rdx
系统调用与函数调用有什么区别?
“C# 不停止膨胀,必将走向灭亡”
为什么计算机需要操作系统?
Linus再发飙:这就是一堆垃圾!
Office 2019/2021专业增强版,正版终身授权!
<END>
“
大家注意:因为微信最近又改了推送机制,经常有小伙伴说错过了之前的文章,比如一些送书的限时福利,错过了就是错过了。
所以建议大家加个星标,就能第一时间收到推送。👇