首页
学习
活动
专区
工具
TVP
发布

Linux内核如何私闯进程地址空间并修改进程内存

进程地址空间的隔离 是现代操作系统的一个显著特征。这也是区别于 “古代”操作系统 的显著特征。 进程地址空间隔离意味着进程P1无法以随意的方式访问进程P2的内存,除非这块内存被声明是共享的。...类似Dos这样的操作系统就是这样的,内存地址空间并没有隔离。进程可以随意访问其它进程的内存。...对于操作系统而言,这就是内核可以做的事,内核可以访问任意进程的地址空间。 当然了,内核并不会无故私闯民宅,就像警察不会随意闯入别人家里一样。 但是,你可以让内核故意这么做,做点无赖的事情。...显然,test进程如果自己不改它,那就没辙...但是可以让内核强制改啊,让内核私闯民宅就是了。...---- 虚拟地址空间是每进程的,而物理地址空间则是所有进程共享的。换句话说,物理地址是全局的。

2.9K20

Linux内核进程管理

进程状态转化图 进程级联 Linux进程之间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。...内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写人的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。...因为一般子进程都会马上调用exec()函数,这样可以避免写时拷贝的额外开销,如果父进程首先执行的话,有可能会开始向地址空间写人。 线程在Linux中的实现 Linux实现线程的机制非常独特。...这种任务可以通过内核线程(kernel thread)完成一独立运行在内核空间的标准进程内核线程和普通的进程间的区别在于内核线程没有独立的地址空间(实际上它的mm指针被设置为NULL)。...它们只在内核空间运行,从来不切换到用户空间内核进程和普通进程一样,可以被调度,也可以被抢占。 Linux确实会把一些任务交给内核线程去做,像pdflush和ksofirqd这 些任务就是明显的例子。

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核进程调度

文章目录 前言 I/O消耗型与处理器消耗性 进程优先级 时间片 进程抢占 前言 调度程序没有太复杂的原理。最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。...但是只要系统中进程的数目比处理器的个数多,就注定会有一些进程不能一 直执行。这些进程在等待运行。在一 组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。...Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。调度程序总是选择时间片未用尽面且优先级最高的进程运行。用户和系统都可以通过设置进程的优先级来影响系统的调度。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

2.8K20

Linux内核进程原理

Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...进程拥有两种特殊的形式:没有用户虚拟地址空间进程内核线程(守护进程便属于内核线程),共享用户虚拟地址空间进程叫用户线程,共享同一个用户虚拟地址空间的所有用户线程称为一个线程组。...图片 Linux内核提供了一组宏值来表示进程的状态: TASK_RUNNING(可运行状态或就绪状态);Linux并没有严格区分运行态或就绪态,统一为TASK_RUNNING...限期进程是指必须在一定时间内要完成的进程。其余的非限期进程的实时进程也是需要在一定时间内完成,但不是那么急需。 Linux不支持硬实时处理,至少在主流的内核中不支持。...,与普通用户进程区别在于内核线程没有独立的进程地址空间

1.9K10

Linux进程地址空间

文章目录 一、前言 二、什么是进程地址空间 三、进程地址空间如何进行管理 四、为什么会存在进程地址空间 五、进程地址空间区域的严格划分 一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间...那么 OS 如何对进程地址空间进行管理呢?在学习了 【Linux】计算机的软硬件体系结构 后,对于这个问题,相信大家已经能够轻松拿捏了 – 管理的本质是对数据进行管理,管理的方法是先描述,再组织。...所以和管理进程一样,操作系统会使用一种内核数据结构来对地址空间进行管理,Linux中用于 管理地址空间内核数据结构叫做 mm_struct,操作系统会为每个进程创建一个 mm_struct 对象,然后通过管理结构体对象来间接管理进程地址空间...Linux 中 mm_struct 源码如下: 可以看到,进程地址空间其实也是进程属性的一种,我们可以通过进程的 task_struct 来找到/管理进程对应的地址空间。...,在32位操作系统下,这部分空间占总空间的3/4,即3G;剩下的1G属于内核空间

3.8K00

linux之用户空间内核空间

linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。...Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。...而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。...于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。...对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。 内核空间和用户空间之间如何进行通讯?

3.8K20

Linux进程地址空间

显示相同地址,却是不同的值 下面在Linux上验证 创建test.c文件 st.c  ⮀.../mytest ,执行mtest可执行程序 子进程被全局数据的修改,被不影响父进程 ,说明进程具有独立性,而进程是由内核数据结构+代码和数据组成的,独立性体现在数据上,所以通过写时拷贝的做法 使一个进程的变量被修改...A B C D称之为 进程,大富翁 称之为操作系统,10亿美金称之为 内存 大富翁需要将饼管理起来,管理的本质是 先描述,再组织 饼本质就是一个内核数据结构 mm_struct 3.代码区、数据区、...,CPU会自动根据页表将虚拟地址转化为物理地址 创建子进程,就要创建子进程的PCB,及地址空间和页表结构 子进程的相关内核数据结构的属性字段会继承父进程 大富翁 A有个儿子是E,A跟E说,我们家有10...,子进程对数据的修改,不影响父进程进程要对value修改时,在内存中重新申请一块空间,拷贝value值给新空间,重新映射指向新开辟的空间,导致不影响父进程的value值 ,最终将新开辟的空间value

2.9K10

Linux 内核进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )

文章目录 一、进程与操作系统 二、进程与程序 三、进程与线程 四、虚拟地址空间 一、进程与操作系统 ---- 操作系统与硬件的关系 : 操作系统 使用 硬件 提供的资源 , 如 CPU , 内存 , 磁盘...数据 的组合在一起的文件 , 在操作系统中运行起来之后 , 才叫做 进程 ; 进程 是 运行的 程序 ; 三、进程与线程 ---- 进程 与 线程 : 线程 是 运行的基本单位 , 进程 是 线程 的容器...; 四、虚拟地址空间 ---- 进程 与 内存管理 : 进程 是 内存管理 的基本单元 , 每个进程都是 独立的内存管理单元 ; 在 Linux 内核中 , 进程 又被称为 任务 ; 虚拟地址空间概念...: 每个 进程 作为 独立的内存管理单元 , 其内存单元 称为 虚拟地址空间 , 进程 的 虚拟地址空间 分为 用户虚拟地址空间 ( 每个进程独立拥有 ) 内核虚拟地址空间 ( 所有进程共享 ) 操作系统...中 运行的 所有进程 共享 内核虚拟地址空间 , 每个 进程 都 拥有 独立的 用户虚拟地址空间 ;

77910

Linux内核15-内核如何创建进程

* 直到子进程释放自己的内存空间,也就是,保证子进程先行于父进程 */ if (clone_flags & CLONE_VFORK) { if...:创建旧进程的副本,比如进程描述符和子进程运行需要的其它内核数据结构。...esp寄存器加载thread.esp的值(也就是获取了子进程内核态栈的地址),eip寄存器加载ret_from_fork()函数的返回地址(子进程执行的下一条指令)。...总结 这个函数看似很复杂,其实就是根据用户态传递过来的控制参数,实现进程的4要素:执行代码、私有堆栈空间进程控制块(task_struct)和独立的内存空间。当然了,线程只是拷贝父进程的即可。...创建完进程的4要素之后,把新进程的最开始执行的指令设置到eip寄存器即可。然后就是等待内核调度。当轮到新进程使用CPU的时候,就从eip寄存器开始执行。

2K10

Linux进程地址空间

Linux中,特殊情况,我们将这种地址也成为逻辑地址。 2.感性的理解虚拟地址空间 从前有一个大富翁,他有10亿美元的资产。...当然对于Linux而言,虚拟地址、线性地址、逻辑地址都是一样的。 三、怎么办 操作系统要为每一个进程分配地址空间,那么操作系统是否要管理这些地址空间呢?当然是要管理的。...而地址空间也是需要用内核数据结构mm_struct进行管理,OS会为每一个进程创建一个mm_struct(结构体)对象,进行管理。该结构体对象保存在它所对应进程的PCB中。...3-4G是内核空间。 总结 以上就是今天要讲的内容,本文介绍了进程地址空间的相关概念。...本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

16420

Linux系统-进程地址空间

Linux进程地址空间 零、前言 一、程序内存空间 二、进程地址空间 1、引入及概念 2、进程地址空间 3、相关问题 零、前言 本章主要讲解学习进程地址空间的知识 一、程序内存空间 在学习C/C...++中我们知道了程序内存的空间开辟以及内存分区的基本概念 示图: 各分区作用: 内核空间:用户代码无法读写 命令行参数环境变量:储存命令行参数环境变量 栈区:存放运行函数而分配的局部变量...,说明该地址绝对不是物理地址,因为是物理地址根本不会有这种事发生 2、进程地址空间 概念: 在Linux地址下,这种地址叫做 虚拟地址,我们在用C/C++语言所看到的地址,全部都是虚拟地址!...,同时也相应的分配了对应的mm_struct进程地址空间(PCB中储存了该进程对应的进程地址空间的地址),也就是每个进程都认为自己独占内存资源 对于进程来说,进程控制块以及进程地址空间以及相应的资源...CPU上,系统在内核进程创建PCB记录进程属性,分配进程空间地址,由页表构建虚拟地址与物理地址的映射关系,程序查找或者修改数据会通过PCB找到对应的进程地址空间,再由进程地址空间上的虚拟地址由页表找到物理空间上分配的数据

3.8K30

linux缺页异常处理--内核空间

尽管每个进程独立拥有3GB的可访问地址空间,但是这些资源都是内核开出的空头支票,也就是说进程手握着和自己相关的一个个虚拟内存区域(vma),但是这些虚拟内存区域并不会在创建的时候就和物理页框挂钩,由于程序的局部性原理...,程序在一定时间内所访问的内存往往是有限的,因此内核只会在进程确确实实需要访问物理内存时才会将相应的虚拟内存区域与物理内存进行关联(为相应的地址分配页表项,并将页表项映射到物理内存),也就是说这种缺页异常是正常的...,而第一种缺页异常是不正常的,内核要采取各种可行的手段将这种异常带来的破坏减到最小。...缺页异常的处理函数为do_page_fault(),该函数是和体系结构相关的一个函数,缺页异常的来源可分为两种,一种是内核空间(访问了线性地址空间的第4个GB),一种是用户空间(访问了线性地址空间的0~...3GB),以X86架构为例,先来看内核空间异常的处理。

1.9K20

Linux内核编程--进程组和守护进程

会话和进程进程组:进程组是多个进程的集合, 接收同一个终端的各类信号信息。进程调用setpgid(pid, pgid)可以加入一个现有的进程组或者创建一个新的进程组。...进程组长(头部进程):每个进程组都有一个进程组ID, 每个进程组都有一个组长(头部进程), 在大部分系统中, 进程组ID一般就是头部进程ID。获得一个进程所在的进程组ID用getpgid(pid)。...子进程继承了父进程进程组ID,不过它有自己的进程ID,这就保证了子进程不是一个进程组的头部进程 Step.3 调用setsid( ),给守护进程创建一个新的进程组和会话,使当前进程成为新进程组的头部进程...1); fprintf(fp, "%d", i); i++; } fclose(fp); return (0); } 运行结果: 常用的Linux...查询被进程ID对应的进程打开的文件:lsof -p 1000 查看进程内存情况:pmap PID 样例: 参考阅读: 《UNIX环境高级编程第3版》 《Linux C++ 通信架构实战》 《UNIX

2.9K20

Linux 内核空间与用户空间实现与分析

针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间。...对于 Linux 来说,通过区分内核空间和用户空间的设计,隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。...举个例子,比如我们经常接触的概念 “堆栈”,其实进程内核态和用户态各有一个堆栈。运行在用户空间进程使用的是用户空间中的堆栈,而运行在内核空间时,进程使用的是内核空间中的堆栈。...所以说,Linux 中每个进程有两个栈,分别用于用户态和内核态。 下图简明的描述了用户态与内核态之间的转换: ?...整体结构 接下来我们从内核空间和用户空间的角度看一看整个 Linux 系统的结构。它大体可以分为三个部分,从下往上依次为:硬件 -> 内核空间 -> 用户空间。如下图所示(此图来自互联网): ?

3K30

Linux进程理解与学习Ⅳ-进程地址空间

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux...】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux进程理解与学习Ⅱ-进程状态 【Linux进程理解与学习Ⅲ-环境变量 ---- 前言...在Linux中我们称之为虚拟地址/线性地址。 OS则是将虚拟地址转化为物理地址(如何转化后面会讲到) 如何理解进程地址空间? 首先我们要知道,什么是进程地址空间?...实际上进程地址空间就是操作系统喂给进程的一块“饼”,OS会跟每个进程说,你们有4G的内存空间(栈区、堆区、静态区...)可以使用,但实际上,只有当进程需要用的时候,OS才会分配空间进程。...接下来谈一谈OS如何管理我们所说的进程地址空间(即我们所说的栈区、堆区等)? 答:先描述,再组织。实际上我们所说的进程地址空间本质上是一个内核数据结构,struct_mmstruct{}。

1.1K20

Linux内核调度分析(进程调度)

本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。...用户抢占 内核即将返回用户空间的时候,如果标志位被设置,会导致被调用,此时就发生了用户抢占。...简单来说有以下两种情况会发生用户抢占: 从系统调用返回用户空间 从中断处理程序返回用户空间 内核抢占 Linux和其他大部分的Unix变体操作系统不同的是,它支持完整的内核抢占。...从中断返回内核空间的时候,会检查和的值,如果被标记,并且为0,就意味着有一个更需要调度的进程需要被调度,而且当前情况是安全的,可以进行抢占,那么此时调度程序就会被调用。...下面罗列可能的内核抢占情况: 中断处理正在执行,且返回内核空间之前 内核代码再一次具有可抢占性时 内核中的任务显式地调用 内核中的任务被阻塞

14.7K113

Linux内核编程--进程通信信号

这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...SIGCHLD, Linux中当子进程结束时,子进程并未被完全销毁,因为父进程还要用它的信息。...这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。 c) 软件异常将产生信号。 当检测到某种软件条件已发生(如:定时器alarm),并将其通知有关进程时,产生信号。...Linux中可能有不同的行为。

2.8K20

聊聊Linux内核进程调度下篇

进程优先级 Linux内核进程优先级一般分为动态优先级和静态优先级,动态优先级是内核根据进程的nice值、IO密集行为或者计算密集行为以及等待时间等因素,设置给普通的进程;静态优先级是用户态应用设置给实时进程...任何普通进程的nice值在-20~19之间,0是默认,较高的nice值表示较低的进程优先级;实时进程的优先级范围是在0~99 从内核的优先级角度,所有的进程都处于0~139,其中的0~99是分配实时进程...实际调度器 调度器通用元素 CFS(完全公平)调度器 Linux内核中所有动态优先级的进程都是有CFS调度器处理,通常Linux内核中大部分都是非实时进程,所以CFS进程调度器也是最繁忙的调度器。...在计算进程优先级的时候,CFS不仅依赖于进程的nice值,同时还要考虑进程的负载,内核中维护了进程的负载权重数组(prio_to_weight),每个nice值对应一个负载权重;对于进程来说,nice值减一...内核中支持实时进程,它们是由实时调度器来进行调度。

1.1K20

Linux内核13-进程切换

1 进程切换 进程切换,又称为任务切换、上下文切换、或者任务调度。本文就研究Linux内核进程切换。我们首先理解几个概念。...1.1 硬件上下文 我们知道每个进程都有自己的地址空间,但是所有的进程却共享CPU寄存器。所以,在恢复进程执行之前,内核必须保证该进程在挂起时的寄存器值重新加载到CPU的寄存器中。...硬件上下文是进程执行上下文的一个子集,进程执行上下文包含进程执行所需要的所有信息。在Linux中,进程的硬件上下文一部分存储在进程描述符中,而其它部分存储在内核态的栈中。...但是,优化硬件上下文的切换是不可能的,因为都是由CPU完成的,而Linux是使用软件代替硬件上下文切换的,所以有优化的空间,以便提高执行时间。 进程切换只能发生在内核态。...在Linux的设计中,每个CPU就只有一个TSS,所以,Busy位总是设为1。换句话说,Linux中Type域一般为11。

1.8K20
领券