Linux-0.11 kernel目录进程管理system_call.s详解

news/2024/4/18 18:51:52

Linux-0.11 kernel目录进程管理system_call.s详解

模块简介

本节主要介绍了在Linux-0.11中关于系统调用的相关实现。Linux-0.11使用int 0x80中断以及eax寄存器中存储的功能号去调用内核中所提供的功能,在系统调用发生的过程中伴随着用户态向内核态的主动切换。

需要注意的时,用户通常并不是直接使用系统调用的中断,而是libc中所提供的接口函数实现。

过程分析

system_call

当0x80号中断发生的时候,CPU除了切入内核态之外,还会自动完成下列几件事:

1.找到当前进程的内核栈, 通过tss中的esp0 ss0定位

2.在内核栈中依次压入用户态的寄存器SS、ESP、EFLAGS、CS、EIP

当内核从系统调用中返回的时候,需要调用"iret"指令来返回用户态,显然iret代表的是内核栈中一系列的寄存器SS、ESP、EFLAGS、CS、EIP弹出操作。

在system_call中会将DS、ES、FS、EDX、ECX、EBX入栈。

在调用sys_call函数时,会将系统调用号传给eax, 因此首先判断eax是否超过了最大的系统调用号。

cmpl $nr_system_calls-1,%eax
ja bad_sys_call

接下来将一些寄存器压栈

push %ds
push %es
push %fs
pushl %edx
pushl %ecx		# push %ebx,%ecx,%edx as parameters
pushl %ebx		# to the system call

将es和ds指向了内核的数据段, 将fs指向了用户的数据段。
0x10 = |0 0 0 0 0 0 0 0 0 0 0 1 0| 0 | 0 0|

段选择子 = 2
TI = 0
RPL = 0

0x17 = |0 0 0 0 0 0 0 0 0 0 0 1 0| 1 | 1 1|

段选择子 = 2
TI = 1
RPL = 3

movl $0x10,%edx		# set up ds,es to kernel space
mov %dx,%ds
mov %dx,%es
movl $0x17,%edx		# fs points to local data space
mov %dx,%fs

下面根据系统调用号去找到对应的调用函数。

call *sys_call_table(,%eax,4)

在AT&T的标准中,_array(,%eax,4)所代表的地址是[_sys_call_table + %eax * 4],即功能号所对应的内核系统调用函数的地址。

sys_call_table在sys.h中定义

fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid, sys_iam, sys_whoami };

找到系统调用号之后,call命令就将转到相应的地址执行。

当系统调用执行完毕之后,下面判断进程的状态:

	movl current,%eaxcmpl $0,state(%eax)		# statejne reschedulecmpl $0,counter(%eax)		# counterje reschedule

如果进程状态是ok的,也就意味着程序可以继续运行而不必被挂起, 那么就开始执行ret_from_sys_call。

ret_from_sys_call

当系统调用执行完毕之后,会执行ret_from_sys_call的代码,从而返回用户态。

在系统调用返回之前,这里还要做的一件事情就是处理进程收到的信号。寄存器中存储的是当前运行的进程current的pcb的地址。这里可以回顾一下pcb的结构,signal的偏移量是16,而blocked的偏移量是33*16。

struct task_struct {
/* these are hardcoded - don't touch */long state;	/* -1 unrunnable, 0 runnable, >0 stopped */long counter;long priority;long signal;struct sigaction sigaction[32];long blocked;	/*....*/

因此这里定义了两个常量singal=16,blocked=33*16,通过这样的操作将signal的内容存到ebx寄存器中,将blocked的内容存到ecx寄存器中。然后将blocked信号取反和进程收到的信号做与运算(!block & signal),就可以得到进程收到的有效的信号。

	movl signal(%eax),%ebxmovl blocked(%eax),%ecxnotl %ecxandl %ebx,%ecxbsfl %ecx,%ecxje 3fbtrl %ecx,%ebxmovl %ebx,signal(%eax)incl %ecxpushl %ecxcall do_signal

在信号处理完毕之后,就是将sys_call压入栈中的寄存器出栈,最后调用iret返回用户态执行的位置。

3:	popl %eaxpopl %ebxpopl %ecxpopl %edxpop %fspop %espop %dsiret

sys_fork

在sys_fork中将调用copy_process完成最后的进程fork的过程,下面是sys_fork的编码,其是一段汇编代码,这是少数用汇编写的sys_开头的函数,大多数sys_开头的内核方法都是c语言编写的。

sys_fork:call find_empty_processtestl %eax,%eaxjs 1fpush %gspushl %esipushl %edipushl %ebppushl %eaxcall copy_processaddl $20,%esp
1:	ret

sys_fork首先调用find_empty_process去进程task_struct数组中寻找一个空位,如果寻找不到就直接返回。如果寻找到了,就将一些寄存器压栈,进而调用copy_process方法。在调用sys_fork方法时,内核栈的状态如下所示:

在这里插入图片描述


http://www.ppmy.cn/news/101278.html

相关文章

提高客户转介绍率的7个方法,让你的客户成为你的推广大使!

都知道“客户转介绍”,是一种非常有效的商业推广方式。通过客户的口碑传播,我们能够吸引更多潜在客户,并建立起长久稳固的合作关系。 可以说,这种开拓客户的方法:耗时少、成功率高、成本低、客户较优质,称…

java线程同步CoutDownLatch、CylicBarrier、Semsphore

CountDownLatch CountDownLatch是Java并发包(java.util.concurrent)中的一种同步工具,它允许一个或多个线程等待其他线程完成任务后再执行。CountDownLatch通常用于在多线程环境下协调任务的执行顺序。 CountDownLatch的基本用法如下: 创建一个CountD…

C++高级语法

文章目录 C高级语法面向对象 -- 类/结构体抽象-具体类型 标准I/O流I/O流I/O缓存区 文件操作头文件的重复包含问题深拷贝和浅拷贝,写时复制面向对象的三大特性面向对象是什么 C高级语法 面向对象 – 类/结构体 C使用class定义一个类,使用struct定义一个…

studio one6免费版下载及配置要求 附精调效果包

提到编曲软件,就不得不说这款水果编曲软件。它对新手和老手都比较友好,是一款较为经典的编曲软件。 这款软件提供了强大而全面的音符、音效编辑器,可以在其中插入各种乐器声音,如果内置乐器无法满足编曲需求,还可以外…

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程

1、客户端API操作 1.1 IDEA 环境搭建 前提&#xff1a;保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程&#xff1a;Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …

vue插槽使用总结

什么是插槽解决什么问题插槽的分类默认插槽具名插槽作用域插槽 什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。…

【Netty】一行简单的writeAndFlush都做了哪些事(十八)

文章目录 前言一、源码分析1.1 ctx.writeAndFlush 的逻辑1.2 writeAndFlush 源码1.3 ChannelOutBoundBuff 类1.4 addMessage 方法1.5 addFlush 方法1.6 AbstractNioByteChannel 类 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设…

Linux——http协议1

目录 URL http协议 http请求 http响应 细节优化 makefile HttpServer.hpp HttpServer.cc Util.hpp

Hack The Box - 关卡Dancing

SMB(全称是Server Message Block)是一个协议名&#xff0c;可用于在计算机间共享文件、打印机、串口等&#xff0c;电脑上的网上邻居就是靠它实现的。 SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议&#xff0c;客户端应用程序可以在各种网络环境下读、写服务器上的…

软考A计划-试题模拟含答案解析-卷八

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

若依源码解析:代码生成ruoyi-generator

文章目录 摘要代码生成器的使用数据库连接配置数据库表设计代码生成器配置修改mybatis别名配置&#xff0c;增加对com.cyl包名的识别修改mybatis的mapper扫描包路径 代码生成代码输出模板配置 代码生成器原理模板引擎&#xff1a;Velocity使用Velocity模板引擎的一般流程模板语…

Java设计模式-解释器模式

简介 设计模式是软件开发中重要的概念之一&#xff0c;它们为我们提供了可重用、灵活和可扩展的解决方案。在Java领域中&#xff0c;解释器模式是一种强大的设计模式&#xff0c;它能够将复杂的问题拆分成简单的表达式&#xff0c;并提供一种灵活的方式来解释和执行这些表达式…

律师使用ChatGPT 进行法律文献检索提交了错误信息;李开复表示,威力强大的大模型将彻底变革人工智能

&#x1f680; 一名律师使用ChatGPT 进行法律文献检索提交了错误信息 近日&#xff0c;一名律师在法庭案件中使用聊天机器人 ChatGPT 进行法律文献检索&#xff0c;结果提交了错误信息&#xff0c; 揭示了人工智能在法律领域的潜在风险&#xff0c;包括误传错误信息。 该事件…

数字化时代,企业面临哪些共同的挑战?

在这种全新的社会、商业环境下&#xff0c;各行各业的企业都开始寻求探索新的商业模式&#xff0c;通过转型适应当前时代的转变&#xff0c;促进业务健康持续的发展。所以数字化成为了企业进行转型的工具&#xff0c;也成为了众多领域内企业对未来的共识。 一、管理挑战 ●经…

Logisim 头歌 偶校验编码设计图解及代码(计算机组成原理)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 急的同学请直接点击目录跳到下方解答处&#xff01;&#xff01; 目录 图解&#xff1a; 代码题解&#xff08;免费&#xff09;&#xff1a; 实…

做外贸算运费的时候需不需要多算一些

看到一个网友在一篇文章下留言说&#xff1a;客户算运费的时候需不需要多算一些 听公司老员工说给客户算运费要多加20% 这样合适吗 我个人感觉有点离谱。 那我们就这个话题&#xff0c;谈一谈运费是否要多加一些呢&#xff1f;为什么要多加一些&#xff1f; 首先&#xff0c;要…

swagger页面 doc.html出不来,swagger-ui/index.html能出来

swagger页面 doc.html出不来&#xff0c;swagger-ui/index.html能出来。前前后后折腾了很久&#xff0c;jar包冲突&#xff0c;jar包版本&#xff0c;添加路径啥的都弄了&#xff0c;就是出不来。 后来全局搜索“doc.html”页面发现能出来的项目能搜到这个页面&#xff1a; 定…

springboot+vue+java旅行旅游景点酒店预订出行订票系统eaog5

线上旅行信息管理系统要求实现以下功能&#xff1a; a.景点管理&#xff0c;展示景点的基础信息&#xff0c;介绍等信息。 b.酒店管理,展示酒店的基础信息&#xff0c;介绍等信息。 c.评价管理&#xff0c;可以查看景点或酒店的相关评价信息&#xff0c;客户消费完&#xff0c;…

实时频谱-3.1实时频谱分析仪测量

RSA 测量类型 泰克RSA 可以在频域、时域、调制域和统计域中工作。 频域测量 基本频域测量是实时 RF 数字荧光显示(DPX)频谱显示测量、频谱显示测量和频谱图显示测量功能。 DPX 频谱 DPX 频谱测量对 RSA 发现其它分析仪漏掉的难检信号的能力至关重要。在所有泰克 RSA 中&am…

《面向对象程序设计》实践任务书

《面向对象程序设计》实践任务书 一、基本要求 &#xff08;1&#xff09;要求利用面向对象的方法以及c编程语言来完成系统的设计&#xff1b; &#xff08;2&#xff09;要求在设计的过程中&#xff0c;建立清晰的类层次&#xff1b; &#xff08;3&#xff09;自行设计文件保…