首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

78310

Linux内核设计实现(进程管理、进程调度、系统调用)

1、虚拟处理器、虚拟内存:让进程感觉自己拥有所有 image.png 2、进程上限,cat /proc/sys/kernel/pid_max 3、进程的五种状态 image.png set_task_state...(task,state); 4、每个进程都有一个父进程 image.png 5、进程的创建:fork() exec() image.png 6、写时拷贝COW image.png 7、线程和进程的区别不大...image.png 8、孤儿进程,父进程先关掉,再设置一个父进程,如果没有,设置init image.png 9、2.6内核进程调度算法CFS:完全公平调度算法 10、进程分为IO消耗型和处理器消耗型...image.png image.png 13、调度相关的系统调用 image.png 14、系统调用在用户空间进程和硬件设备之间添加了一个中间层 image.png 15、中断 image.png...18、加锁 image.png 19、定时器时间管理 20、slab?? 21、虚拟文件系统:VFS 22、IO调度 23、页高速缓存和页回写

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

驱动开发:内核进程句柄互转

内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。...在Windows内核中,EProcess结构表示一个进程,而HANDLE是一个句柄。为了实现进程句柄之间的转换,我们需要使用一些内核函数。...PsGetProcessId函数接受一个EProcess结构作为参数,并返回该进程的PID。掌握这些内核函数的使用,可以方便地实现进程句柄之间的互相转换。...进程PID进程HANDLE之间的互相转换: 进程PID转化为HANDLE句柄,可通过ZwOpenProcess这个内核函数,传入PID传出进程HANDLE句柄,如果需要将HANDLE句柄转化为PID则可通过...PID转为EProcess结构,输出效果图如下所示;图片进程HANDLEEPROCESS互相转换: 将Handle转换为EProcess结构可使用内核函数ObReferenceObjectByHandle

33710

驱动开发:内核监控进程线程创建

监控进程的启动退出可以使用 PsSetCreateProcessNotifyRoutineEx 来创建回调,当新进程产生时,回调函数会被率先执行,然后执行我们自己的MyCreateProcessNotifyEx...= NULL){strcpy(ProcName, PsGetProcessImageFileName(Process));DbgPrint("父进程ID: %ld --->父进程名: %s --->进程名...: %s---->进程路径:%wZ", CreateInfo->ParentProcessId,GetProcessNameByProcessId(CreateInfo->ParentProcessId...Process),CreateInfo->ImageFileName);}else{strcpy(ProcName, PsGetProcessImageFileName(Process));DbgPrint("进程...图片而检测线程操作检测进程差不多,检测线程需要调用PsSetCreateThreadNotifyRoutine 创建回调函数,然后就可以检测线程的创建了,具体代码如下:#include <ntddk.h

86030

驱动开发:内核进程句柄互转

内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。...在Windows内核中,EProcess结构表示一个进程,而HANDLE是一个句柄。 为了实现进程句柄之间的转换,我们需要使用一些内核函数。...PsGetProcessId函数接受一个EProcess结构作为参数,并返回该进程的PID。 掌握这些内核函数的使用,可以方便地实现进程句柄之间的互相转换。...进程PID进程HANDLE之间的互相转换: 进程PID转化为HANDLE句柄,可通过ZwOpenProcess这个内核函数,传入PID传出进程HANDLE句柄,如果需要将HANDLE句柄转化为PID则可通过...PID转为EProcess结构,输出效果图如下所示; 进程HANDLEEPROCESS互相转换: 将Handle转换为EProcess结构可使用内核函数ObReferenceObjectByHandle

19730

【Linux 内核进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

由 Linux 内核 启动的线程 , 被称为 " 内核线程 " ; " 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程..." 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ; " 内核线程 " 也称为 " 守护进程 " ; 二、内核线程、普通进程、用户线程 ---- 在 【Linux 内核...】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库 Linux 内核进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程...用户线程 ; 三、内核线程、普通进程区别 ---- " 内核线程 " " 普通进程 " 区别是 , 内核进程 没有 " 独立的进程地址空间 " ; 在 task_struct 进程描述符 结构体中的...进程 来说 , active_mm 字段 mm 字段 指向同一个 " 内存描述符 " ; 但对于 " 内核线程 " 来说 , mm 字段 指向 空指针 , active_mm 字段 指向 从进程借用的

3.7K20

【Linux 内核进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库 Linux 内核进程相关概念 | Linux 查看进程命令及输出字段解析 )

文章目录 一、进程特殊形式 ( 内核线程 | 用户线程 ) 二、C 标准库 Linux 内核进程相关概念 三、Linux 查看进程命令及输出字段解析 一、进程特殊形式 ( 内核线程 | 用户线程 )...---- 普通的进程 , 包含 内核虚拟地址空间 和 用户虚拟地址空间 , 其中 内核虚拟地址空间 所有进程共享 , 用户虚拟地址空间 由进程独立拥有 ; 除了 普通进程 外 , 进程 还有 2...种 特殊形式 : 内核级线程 : 只有 内核虚拟地址空间 , 没有 用户虚拟地址空间 的进程 , 称为 内核线程 ; 用户级线程 : 共享 用户虚拟地址空间 的进程 , 称为 用户线程 ; 线程 : 用户线程...又称为 线程 ; 线程组 : 共享 相同 用户虚拟地址空间 的线程 , 组成了一个 线程组 , 二、C 标准库 Linux 内核进程相关概念 ---- C 语言中 标准库 提供的 进程 , Linux...内核 中的 进程 这两个概念是不同的 ; C 标准库 中的 包含多个线程 的进程 , 在 Linux 内核中 称为 " 线程组 " ; C 标准库 中的 只有一个线程 的进程 , 在 Linux 内核

8.4K20

【Linux内核进程管理

文章目录 简介 执行线程 两种虚拟机制 进程描述符任务队列 PID 进程状态转化图 进程级联 进程创建过程 写时拷贝 fork() 线程在Linux中的实现 clone参数标志 内核线程 进程终结 删除进程描述符...孤儿进程孤儿院 简介 进程是Unix操作系统最基本的抽象之一。...进程描述符任务队列 内核进程存放在叫做任务队列(task list)的双向循环链表中。...为了老版本的Unix和Linux兼容、PID的最大值默认设置为32767 (short int短整型的最大值)。内核把每个进程的PID存放在它们各自的进程描述符中。...这个最大值很重要,它实际上就是系统中允许同时存在的进程的最大数目。尽管32767对于一般的桌面系统足够用了,但是大型服务器可能需要更多进程

1.8K30

Linux内核分析应用3-进程管理

本系列是对 陈莉君 老师 Linux 内核分析应用[1] 的学习记录。...; 运行着的程序就是一个进程. ---- 3.2 Linux进程创建 对于进程,线程,内核线程,内核使用唯一的数据结构task_struct来分别表示,也使用相同的调度算法对其进行调度....所有的系统调用进入内核只有一个入口,但进入以后就分道扬镳,各有各的服务历程;而分手是暂时的,最终还是会归到一处,do_fork就是它们的聚合点...."主战场"是就绪队列,核心是调度算法,实质是进程的切换 O(1)调度: 将单链表变为多链表来实现,从O(n)降低到了O(1) 机制策略分离 完全公平调度---CFS, 没有了时间片的概念,而是分配...更多可参阅第三版第七章 参考资料 [1] Linux 内核分析应用: https://next.xuetangx.com/course/XIYOU08091001441/1516763

16150

【Linux内核进程调度

文章目录 前言 I/O消耗型处理器消耗性 进程优先级 时间片 进程抢占 前言 调度程序没有太复杂的原理。最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。...但是只要系统中进程的数目比处理器的个数多,就注定会有一些进程不能一 直执行。这些进程在等待运行。在一 组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。...I/O消耗型处理器消耗性 进程可以被分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或是等待I/O请求。...当一个进程的时间片耗尽时,就认为进程到期了。没有时间片的进程不会再投入运行,除非等到其他所有的进程都耗尽了它们的时间片(也就是说它们]的剩余时间片为0)。在那个时候,所有进程的时间片会被重新计算。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

2.8K20

Linux内核进程原理

在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...内核线程是直接由内核本身启动的线程,内核线程实际上是将内核函数委托给独立的进程系统中其他进程“并行执行”(实际上也并行于内核自身的执行)。...内核线程经常称之为守护进程。...它们用于: 1.周期性地将修改的内存页页来源块设备同步(例如使用mmap的文件映射) 2.如果内存页很少使用,则写入交换区 3.管理延时动作 4....实现文件系统的事务日志 内核线程是独立运行在内核空间的进程普通用户进程区别在于内核线程没有独立的进程地址空间。

1.9K10

驱动开发:内核监控进程线程回调

在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程线程可以使用微软提供给我们的两个新函数来实现...图片通常情况下:PsSetCreateProcessNotifyRoutineEx 用于监控进程PsSetCreateThreadNotifyRoutine 用于监控线程监控进程的启动退出可以使用 PsSetCreateProcessNotifyRoutineEx...// 参数1: 新进程的EProcess// 参数2: 新进程PID// 参数3: 新进程详细信息 (仅在创建进程时有效)VOID MyLySharkCreateProcessNotifyEx(PEPROCESS...图片说完了PsSetCreateProcessNotifyRoutineEx回调的使用方式,LyShark将继续带大家看看线程监控如何实现,监控线程创建监控进程差不多,检测线程需要调用PsSetCreateThreadNotifyRoutine...status)){DbgPrint("创建线程回调错误");}Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}运行后则可监控到系统总所有线程的创建退出

37710

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

_do_fork()函数 不论是clone()、fork()还是vfork(),它们最核心的部分还是调用_do_fork()(一个体系无关的函数),完成创建进程的工作。...:创建旧进程的副本,比如进程描述符和子进程运行需要的其它内核数据结构。...分配一个新的task_struct结构,进程完全相同,只是stack不同 p = dup_task_struct(current, node); // 4....esp寄存器加载thread.esp的值(也就是获取了子进程内核态栈的地址),eip寄存器加载ret_from_fork()函数的返回地址(子进程执行的下一条指令)。...创建完进程的4要素之后,把新进程的最开始执行的指令设置到eip寄存器即可。然后就是等待内核调度。当轮到新进程使用CPU的时候,就从eip寄存器开始执行。

2K10

驱动开发:内核实现进程汇编反汇编

在笔者上一篇文章《驱动开发:内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分...,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用capstone引擎实现这个功能。...\\ReadWriteSymbolName" typedef struct { DWORD pid; // 进程PID UINT64 address; // 读写地址 DWORD...\n"); getchar(); CloseHandle(handle); return 0; } 通过驱动加载工具加载WinDDK.sys然后在运行本程序,你会看到正确的输出结果,可打开反内核工具验证是否改写成功...打开反内核工具,并切换到观察是否写入了一条mov eax,1的指令集机器码,如下图已经完美写入。

24610

4.4 Windows驱动开发:内核监控进程线程创建

PsSetCreateProcessNotifyRoutineEx 用于在系统启动后向内核注册一个回调函数,以监视新进程的创建和退出,其函数原型如下: NTSTATUS PsSetCreateProcessNotifyRoutineEx...参数Remove是一个布尔值,用于指定是否从内核中删除之前注册的回调函数。如果要删除之前注册的回调函数,则将此参数设置为TRUE。如果要注册一个新的回调函数,则将此参数设置为FALSE。...参数ProcessId是新进程的PID(进程ID)。参数CreateInfo是一个指向一个PS_CREATE_NOTIFY_INFO结构的指针,该结构包含了有关新进程的详细信息。...对于进程的创建退出,则可通过MyCreateProcessNotifyEx自定义函数的PPS_CREATE_NOTIFY_INFO字段进行判断,如果PPS_CREATE_NOTIFY_INFO不等于NULL...进程检测类似,如果要检测线程创建则只需要通过PsSetCreateThreadNotifyRoutine创建线程回调即可,PsSetCreateThreadNotifyRoutine 函数的原型如下:

31320

3.6 Windows驱动开发:内核进程汇编反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分...,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用capstone引擎实现这个功能。...使用 DeviceIoControl() 函数从指定进程读取机器码,将结果存储到 data 结构体的 data 字段中。..."); getchar(); CloseHandle(handle); return 0;}通过驱动加载工具加载WinDDK.sys然后在运行本程序,你会看到正确的输出结果,可打开反内核工具验证是否改写成功...打开反内核工具,并切换到观察是否写入了一条mov eax,1的指令集机器码,如下图已经完美写入。

25050

4.1 Windows驱动开发:内核进程句柄互转

内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。...在Windows内核中,EProcess结构表示一个进程,而HANDLE是一个句柄。为了实现进程句柄之间的转换,我们需要使用一些内核函数。...PsGetProcessId函数接受一个EProcess结构作为参数,并返回该进程的PID。掌握这些内核函数的使用,可以方便地实现进程句柄之间的互相转换。...4.1.1 进程PID进程HANDLE转换进程PID转化为HANDLE句柄,可通过ZwOpenProcess这个内核函数,传入PID传出进程HANDLE句柄,如果需要将HANDLE句柄转化为PID则可通过...PID转为EProcess结构,输出效果图如下所示;4.1.3 进程HANDLEEPROCESS转换将Handle转换为EProcess结构可使用内核函数ObReferenceObjectByHandle

23030
领券