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

news2024/12/23 5:50:37

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,%eax
	cmpl $0,state(%eax)		# state
	jne reschedule
	cmpl $0,counter(%eax)		# counter
	je 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),%ebx
	movl blocked(%eax),%ecx
	notl %ecx
	andl %ebx,%ecx
	bsfl %ecx,%ecx
	je 3f
	btrl %ecx,%ebx
	movl %ebx,signal(%eax)
	incl %ecx
	pushl %ecx
	call do_signal

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

3:	popl %eax
	popl %ebx
	popl %ecx
	popl %edx
	pop %fs
	pop %es
	pop %ds
	iret

sys_fork

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

sys_fork:
	call find_empty_process
	testl %eax,%eax
	js 1f
	push %gs
	pushl %esi
	pushl %edi
	pushl %ebp
	pushl %eax
	call copy_process
	addl $20,%esp
1:	ret

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

App开发需要了解的基本开发技术

近年来,随着智能手机的普及和互联网的高速发展,移动端 APP应用开发越来越受到人们的欢迎。现在,应用程序开发已成为一项热门职业,并成为许多人寻求高薪职业的首选。然而,要成功地在移动端 APP中应用程序,开…

分享几封好用的外贸人催单模版

给外贸人说在前面: 虽然说是催单模版,但是请带入你们公司产品,你们客户具体情况来套入,不能一模一样,再好的模版,再好的话术,大家一起用,就成了毫无价值的废料。 请灵活运用&#…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个alibaba应用注册一个应用程序键(App Key) 。 3)下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

Linux一学就会——线程互斥

Linux一学就会——线程互斥 Linux线程的互斥 进程线程间的互斥相关背景概念 临界资源:多线程执行流共享的资源就叫做临界资源 临界区:每个线程内部,访问临界自娱的代码,就叫做临界区 互斥:任何时刻,互斥…

Python3数据分析与挖掘建模(3)探索性数据分析

1. 概述 探索性数据分析(Exploratory Data Analysis,EDA)是一种数据分析的方法,用于探索和理解数据集的特征、关系和分布等。EDA旨在揭示数据中的模式、异常值、缺失值等信息,并为后续的分析和建模提供基础。以下是关…

20-01 走进微服务与Spring Cloud

Java架构师系列导航目录 认识SpringCloud——外带全家桶 Alibaba组件库 Nacos 中心化动态配置 持久化规则服务发现(DNS RPC)权重路由无缝SC K8s Sentinel(流控组件) 突发流量、削峰填谷、流量整形实时熔断实时监控大盘 S…

汽车和地铁的无人驾驶了解

01汽车无人驾驶技术 汽车相对地铁列车,控制设备的安装空间较为有限,不同车辆的个体差异较大,其无人驾驶技术的实现方案需要更简约,主流的方案通常是通过多种车载传感器(如摄像头、激光雷达、毫米波雷达、北斗/GPS、惯性…

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

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

聚观早报|知乎发布搜索聚合开始内测;苹果7月关闭我的照片流服务

今日要闻:知乎发布“搜索聚合”即日开启内测;iOS版ChatGPT下载量突破50万次;苹果7月关闭“我的照片”流服务;首款国产介入手术机器人亮相;马斯克回应多年前嘲笑比亚迪 知乎发布“搜索聚合”即日开启内测 5 月 28 日消…

ChatGTP全景图 | 背景+技术篇

引言:人类以为的丰功伟绩,不过是开端的开端……我们在未来100年取得的技术进步,将远超我们从控制火种到发明车轮以来所取得的一切成就。——By Sam Altman 说明:ChatGPT发布后,我第一时间体验了它的对话、翻译、编程、…

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

Linux-0.11 kernel目录进程管理asm.s详解 模块简介 该模块和CPU异常处理相关,在代码结构上asm.s和traps.c强相关。 CPU探测到异常时,主要分为两种处理方式,一种是有错误码,另一种是没有错误码,对应的方法就是error_c…

Logisim 头歌 16位海明编码电路设计 图解及代码(计算机组成原理)

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

SpringCloudConfigServer配置刷新优化方案

前一文章《SpringCloudConfigServer配置中心使用与刷新详解》 介绍了Spring Cloud原生配置中心的部署方案,以及配置变更时的刷新方案。 通过该文可以看到: 第一种方案无法同时刷新单个服务的所有实例第二种方案依赖于消息中间件(RabbitMQ或k…

自动驾驶汽车的安全技术特点

“安全第一”是自动驾驶的核心理念和价值观。 自动驾驶车辆的整体系统安全设计是一项复杂的系统工程, 涉及车载自动驾驶系统的核心算法策略设计、 硬件和软件冗余安全设计、远程云代驾技术、 全流程测试验证技术等, 并遵循功能安全(ISO 2626…

《数据库应用系统实践》------ 酒店客房管理系统

系列文章 《数据库应用系统实践》------ 酒店客房管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&…

品种小组2期—凯利公式在RFI策略中的运用

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,今天我们来聊一聊松鼠2期V2版本的阶段内容——凯利公式在RFI择时框架上的运用。 松鼠品种小组2期第1版策略、讲解视频已完结,该期小组我们分享了全新“普适性、自适应”择…

0基础学习VR全景平台篇第32章:场景功能-嵌入视频

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 一、本功能将用在哪里? 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四种不同类型内容; 本次主要带来视频类型的介绍,通过嵌入视频功能,…

python+django+vue关爱无主狗流浪狗动物领养公益网站

很多的家庭都开始有养个小宠物的习惯,平时可以排解寂寥。随着近些年来大家养宠物的数量逐日剧增,人类对自己行为的规范与责任感渐渐的缺失,从而造成社会上的流浪动物也越来越多。流浪狗的伤人的事件则更多的出现在了报纸,电视,网络上。国家社…

git 项目演练:007

接下来进行项目演练,这是一个项目提交到git一个完整过程 1. 创建一个项目, 如下,我创建了一个“测试项目” 2. 将项目添加到git管理仓库,打开Git Bash, cd到“测试项目”中 3. 使用git init 命令将项目添加&#xff0c…

python基于pygame库实现弹幕效果(多行显示,速度不同,颜色不同,循环显示)

一、实现目标 使用python实现类似弹幕的显示效果,弹幕文本存储在txt文件中,弹幕多行显示,弹幕颜色不同有区别,弹幕的速度不一,弹幕要循环显示。 弹幕文本数据:danmu.txt 永远的神 哥哥,好帅啊 啊啊啊啊 太好看啦 666 爱了爱了 啦啦啦啦啦啦 牛逼!牛逼!牛逼! 厉害啊…