首页 > 其他 > 详细

Socket与系统调用深度分析

时间:2019-12-19 23:06:54      阅读:81      评论:0      收藏:0      [点我收藏+]

一、   系统调用

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态和内核态。

内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。

用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获

如上所述,一方面由于系统提供了保护机制,防止应用程序直接调用操作系统的过程,从而避免了系统的不安全性。但另一方面,应用程序又必须取得操作系统所提供的服务,否则,应用程序几乎无法作任何有价值的事情,甚至无法运行。为此,在操作系统中提供了系统调用,使应用程序可以通过系统调用的方法,接调用操作系统的相关过程,取得相应的服务。

调用流程:

那么,在应用程序内,调用一个系统调用的流程是怎样的呢?

我们以一个假设的系统调用 xyz 为例,介绍一次系统调用的所有环节。

技术分享图片

 

如上图,系统调用执行的流程如下:

1、应用程序 代码调用系统调用( xyz ),该函数是一个包装系统调用的 库函数;

2、库函数 ( xyz )负责准备向内核传递的参数,并触发 软中断 以切换到内核;

3、CPU 被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call);

4、系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用;

执行态切换

应用程序 ( application program )与 库函数 ( libc )之间, 系统调用处理函数 ( system call handler )与 系统调用服务例程 ( system call service routine )之间, 均是普通函数调用,应该不难理解。 而 库函数 与 系统调用处理函数 之间,由于涉及用户态与内核态的切换,要复杂一些。

Linux 通过 软中断 实现从 用户态 到 内核态 的切换。 用户态 与 内核态 是独立的执行流,因此在切换时,需要准备 执行栈 并保存 寄存器 。

内核实现了很多不同的系统调用(提供不同功能),而 系统调用处理函数 只有一个。 因此,用户进程必须传递一个参数用于区分,这便是 系统调用号 ( system call number )。 在 Linux 中, 系统调用号 一般通过 eax 寄存器 来传递。

总结起来, 执行态切换 过程如下:

1、应用程序 在 用户态 准备好调用参数,执行 int 指令触发 软中断 ,中断号为 0x80 ;

2、 CPU 被软中断打断后,执行对应的 中断处理函数 ,这时便已进入 内核态 ;

3、系统调用处理函数 准备 内核执行栈 ,并保存所有 寄存器 (一般用汇编语言实现);

4、系统调用处理函数 根据 系统调用号 调用对应的 C 函数—— 系统调用服务例程 ;

5、系统调用处理函数 准备 返回值 并从 内核栈 中恢复 寄存器 ;

6、系统调用处理函数 执行 ret 指令切换回 用户态 ;

 

反汇编menu目录下的init文件,共有5处int $0x80的汇编指令,其中一处如图所示:

技术分享图片

 

 

验证了内核中将系统调用作为一个特殊的中断来处理。

 

二、系统调用过程跟踪

验证 x86-64位系统下的系统调用初始化过程:start_kernel --> trap_init --> cpu_init --> syscall_init

gdb
file vmlinux
target remote:1234
b start_kernel
b trap_init
b cpu_init
b syscall_init

设置断点成功,验证了x86-64位系统下的系统调用初始化过程。

技术分享图片

 

 

三、   Socket 调用初步分析

使用gdb跟踪replyhi的执行过程。

在menu目录下执行 make rootfs 启动 memuos。

在linux-5.0.1目录下打开新的终端,执行命令,如下:

gdb
file vmlinux
target remote:1234
b __sys_socket
b __sys_bind
b __sys_listen
b __sys_shutdown

运行结果如下:

技术分享图片

 

 

可见在replyhi 执行过程中,调用了socket()、bind()、listen()等api 。

Socket与系统调用深度分析

原文:https://www.cnblogs.com/qianzhusong/p/12070342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!