Linux内核分析06

进程的描述和进程的创建

一,进程的描述

进程控制块PCB——task_struct (进程描述符),为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。

struct task_struct数据结构很庞大,进程的标示pid。

Linux进程的状态与操作系统原理中的描述的进程状态有所不同,task_running代表就绪和运行两种状态,取决于它是否获得CPU的控制权

在这个庞大的数据结构里,所有进程链表struct list_head tasks,一个双向链表

程序创建的进程具有父子关系,在进程调度中会用到,进程描述符中会有几个域用来表示这样的关系。

Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程的内核堆栈。

二,进程的创建

fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。    

fork在父进程和子进程之间各返回一次。

fork出的子进程从哪里开始执行? fork的进程给了一个系统调用,和传统系统调用创建进程过程时不同。ret_from_fork

 

p指向的是ret_from_fork,所以是从这里开始执行的。
复制内核堆栈的时候是复制的pt_regs,即只复制了SAVE_ALL相关的那一部分,即系统调用压栈的那一部分。
pt_regs里面内容有:
Entry(ret_from_fork):
最终会跳转到syscall_exit,这之前的内核堆栈状态和syscall_call的一致,然后返回用户态,变成子进程的用户态。

 

创建新进程通过复制已有进程来实现,子进程的许多数据结构需要修改,需要一个新的内核堆栈,该内核堆栈一部分也是从父进程复制过来的,以为需要返回进程。

子进程的fork返回0,因为“childregs->ax = 0; ”。

系统调用内核处理函数:sys_fork,sys_clone,sys_vfork

复制的内核堆栈时只复制了内核堆栈最栈底的部分,例如:SAVE_ALL,int指令等。

使用gdb跟踪创建新进程的过程

各种函数:

 

进程创建的分析

  1. 复制一个PCB——task_struct
  2. 要给新进程分配一个新的内核堆栈

  3.要修改复制过来的进程数据,比如pid、进程链表等,见copy_process内部。

系统调用内核处理函数sys_fork,sys_vfrok,sys_clone,其实最终执行的都是do_fork

do_fork里有:

三,心得

在Linux内核的分析里,线程被视作一种特殊的进程,和一般的操作系统里不同,进程的创建和调度都是关键的动作。

转载于:https://www.cnblogs.com/KG35/p/5329850.html

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

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

相关文章

【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写

目录 一、说明 二、安装pyqt5以及相关工具(pyqt5、pyuic、pqrcc) 三、创建.ui文件 1、选中文件右键-external-pyqt5 打开GUI设计界面 2、创建一个界面(内含四个等大label框) 3、CTRLS保存 4、找到ui文件,右键--e…

zabbix3.0.4通过jmx监控tomcat

jdk下载页面http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm?AuthParam1462948138_871b75d4b1dd7155e8cbe4f23e5cd2cd脚本[rootNFS-WEB1 latest]# vim /e…

C#学习笔记——25个经典问题

1.静态成员和非静态成员的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 o…

PHP的学习--RSA加密解密

PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了。 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了。 密码没加密,那攻…

Swift学习

1、Swift网址 http://swiftdoc.org/ 2、 https://github.com/ipader/SwiftGuide 转载于:https://www.cnblogs.com/superbobo/p/5329876.html

【pyqt5学习】——最新版:配置external tools(designer、pyuic、pqrcc)

目录 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 点击加号定义工具名字,名字随意便于区分即可 双击每一个工具名字,配置路径(注意每一个exe的路径) designer.exe pyuic.exe py…

Linux中vi命令详解

最近vi用的多,很多技巧不知道,备注一份, vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于 对Unix及Linux系统的任何版本&…

C# 属性和字段

以下的文章是摘录的,作者已经不详了。之所以摘录,是因为这个概念很重要特别对于VFP程序员来说,这里构造属性就与vfp的方法完全不同。c#的属性融合了vfp的addproperty() 和属性的access method和assign method 。不一而足使用属性&#xff0c…

SEO优化---学会建立高转化率的网站关键词库

想要优化好一个网站,行业的分析,以及关键词的挖掘是必要的,有一定的关键词排名了,但是转化率和流量方面却很不理想这种情况大部分是只注重了有指数的关键词排名,而忽略了长尾关键词和一些没有指数但是可以带来巨大流量的关键词。 网站大部分的…

Monkey脚本编写

脚本优势:简单、快捷、不需要借助任何工具,可以做简单的性能测试 脚本缺点:只能简单实现坐标、按键等基本操作,无逻辑性 脚本格式: 脚本API: 例子: 打开浏览器,输入WWW.jikexueyuan.…

C#通过DllImport引入dll中的C++非托管类

首先从msdn了解到,DllImport是用来 将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。 从以上语句我们可以理解出三点:1.C编写的非托管dll可以通过DllImport引入到C#中;2.引入到C#中的只能是C方法(或者说函数&#xff0…

USB 设备类协议入门【转】

本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一、应用场合USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操…

lucene之Field属性的解释

Field类 数据类型 Tokenized是否分词 Indexed 是否索引 Stored 是否存储 说明 StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如…

【机器视觉】——焦距计算物体实际尺寸计算

目录 1.基本概念 2.像素尺寸(piex)转为实际尺寸(mm) 3.焦距计算

Tableview中Dynamic Prototypes动态表的使用

Tableview时IOS中应用非常广泛的控件,当需要动态的添加多条不同的数据时,需要用动态表来实现,下面给出一个小例子,适用于不确定Section的数目,并且每个Section中的行数也不同的情况,适合新手。首先&#xf…

c# - 声明事件

1 事件是属于一个特定的类的,其本质是只能在此类中调用的委托。 从面向对象的角度出发,事件是对象对某个消息的响应,因此其声明必然只能在类的级别出现,且不可用static修饰。 2 事件其实和属性差不多,是一种特殊的方法…

appium 环境搭建 java

1 安装node.js 1.1 安装node.js http://nodejs.cn/download/ 1.2、下载后直接点击exe,按照提示一步一步的安装 1.3 安装成功后,运行cmd,输入node –v,如果安装成功,会输出如下版本信息 2 eclipse android开发环境搭建 2.1 用eclip…

【数据库bug修复】——Authentication plugin ‘caching_sha2_password‘ is not supported

目录 原因 连接数据库的时候出现这个问题的解决方法 创建数据库连接池时解决方法 原因 使用客户端链接mysql数据库,如果数据库版本高于8.0,可能出现以上问题,因为8.0以前默认使用mysql_native_password身份验证机制,8.0以后使用…

javascript引用bug带来的继承

<!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>继承</title> </head> <body> <script>function A(){this.abc 12;}A.prototype.show function(){alert(this.abc);}functio…

阿里巴巴Maven仓库配置

<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror> 转载于:https://www.cnblogs.com/simpleJokerKing/p…