OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别

2024-05-27 15:48

本文主要是介绍OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程是什么
单核系统上同一时间内,只有一个进程(进程A)在跑,该进程占用了1.cpu的所有寄存器资源2.cp15协处理器的所有寄存器资源
其他的进程都在内存中,也就是说 进程 B /进程 C 等 其实就是内存中的一组数据
那么这组数据是什么
这组数据 应该是 TCB
TCB 从上到下包括什么1.pt_regs			(18*4 B) // 用于 系统调用2.8KB - 18*4 - (sizeof(thread_info)) - (sizeof(task_struct)) // 用于内核线程执行3.thread_info		(sizeof(thread_info))=528B // 用于 调度4.task_struct		(sizeof(task_struct))=1200B // 用于调度
TCB 有多大8KB/8192B每个进程的 TCB 都不一样,差别就在这里
根据 idle 进程来解析idle 进程只运行在内核空间,应该不包括 pt_regs根据之前https://blog.csdn.net/u011011827/article/details/116056620 的分析init_task 		的 地址 是 c0800000
__end_init_task 的 地址 是 c0802000 两个地址 中间 的数据 从上到下 分别是
c0801ffc :1  个地址
...
c0801fc8 :14 个地址
c0801fc4 :15 个地址 : 存储了 start_kernel 的 第一个局部变量 command_line
...
...
...: 	thread_info
c0800000 :	task_struct 

进程分类

内核进程没有这个概念
内核线程对应一个唯一的task_structmm成员 		  	为null其他资源成员 		不为null,	且不与其他进程共享只能运行在 		内核态 							// 没有用户空间 	// 0-3G是空白的 			// mm成员是 null 			// 与内核使用同一张页表
用户进程对应一个唯一的task_structmm成员 			不为null, 	且不与其他进程共享其他资源成员 		不为null, 	且不与其他进程共享可以运行在	 	内核态与用户态 					// 有用户空间 	// 0-3G 不是空白,且是唯一的 // mm 成员是 用户空间内存相关的 // 内核态时,与内核使用同一张页表.用户态时,使用mm成员对应的页表
用户线程对应一个唯一的task_structmm成员 			不为null, 	且与其他线程共享其他资源成员 		不为null, 	且与其他线程共享可以运行在 		内核态与用户态 					// 有用户空间 	// 0-3G 不是空白,且是共享的 // mm 成员是 用户空间内存相关的 // 内核态时,与内核使用同一张页表.用户态时,使用mm成员对应的页表
其他
  • 进程/线程创建
kernel_clone 的调用者 有 1.SYSCALL_DEFINE0(fork) // 系统调用sys_fork ,用户进程创建用户进程调用的函数// 拷贝 mm_struct fs files signal// 写时复制 // 依赖 MMU// 所以 没有MMU的linux不能运行fork2.kernel_thread	// 内核创建内核进程调用的函数3.SYSCALL_DEFINE0(vfork)// 拷贝 fs files signal// 不 拷贝 mm_struct// CLONE_VM (共享)(共享同一个 VM)// 因为 共享 mm ,所以 子进程运行后必须运行 exec 更换 mm 成员4.SYSCALL_DEFINE[5/6](clone // 不拷贝 mm_struct fs files signal thread// 共享 所有的资源// 两个 task_struct 的所有资源 是 一样的,是同一个的5.SYSCALL_DEFINE2(clone3// 共享/拷贝 什么由系统调用者自己定义// 人妖?
  • 线程模型
线程模型	线程实现1:1 LinuxThreads库+kernelNPTL库+kernelN:1Portable Thread (用户空间实现)N:MNGPT
  • 其他问题
	// POSIX 规定 : 同一个进程下的 线程,getpid 得到的都是 相同的// 进程A 不管是调用 clone 还是 fork 还是 vfork 都会创建一个 task_struct(进程B)// A 如果调用fork创建 B , 则 AB的TGID 不同// A 如果调用clone创建 B , 则 AB的TGID 相同// B的TGID 来自于 A// 调用 getpid 获取的 是 task_struct 的 TGID// 调用 gettid 获取的 是 task_struct 的 PID// 内核线程和内核进程是一个东西吗?// 是//内核线程具有进程的概念特点//	从功能上看它 具有独立功能的程序关于某个数据集合上的一次执行活动,是系统进行资源分配的单位.//内核线程具有线程的概念特点//	进程内的一个可调度实体.//一般 它 被 称作 内核线程//一般说 不存在 内核进程// 一个内核进程不会像(用户进程/用户线程)那样对应多个内核线程(没有这样的需求)// 一个用户进程A创建了用户线程B之后,还存在进程吗?// 一般这么说// A 为主线程// B 为线程// AB 为一个线程组// A 还是被称为 一个进程
  • 用户进程(线程) 的用户态 和内核态 有什么区别
			用户态					内核态运行模式 	usermode 				svcmode
寄存器		r13 r14 无spsr 			r13 r14 spsr
权限 		有些指令不能跑			所有指令都能跑----
用户态 切入 内核态 , 需要保存 用户态的 寄存器 到 pt_regs , 说明 用户态的 寄存器 是唯一的,需要保存
内核态 切入 用户态 , 不需要保存 内核态的 寄存器 , 说明 内核态的 寄存器 是固定值
---
用户态 与 内核态 都是 占用了 cpu , 对应的 task_struct 是同一个 , 只不过 用户态 访问不到 task_struct 
用户态 的 pc 和 内核态的 pc 是同一个 pc ,但是 pc 的地址不同一般来说,我们关注用户态进程,最大的关注点在代码,看到 pc 指向的值 就是 我写的 代码中的地址,然后就说看起来很对一般来说,我们关注进程内核态,最大的关注点也在代码,但是 pc 指向的 是 内核代码,但是内核代码 和 我的进程代码 完全是 两个概念于是,就说 内核(A)代理了 进程 在 内核态 执行,那么这里说的 内核(A) 是什么内核 是 线程的集合,那么 内核(A) 是指的其他内核线程吗?//当然不是用户进程B 切换到内核 还是 内核进程B , 因为 其对应的 task_struct 没变,不存在 被其他的线程代理 的说法可不可以这么理解从用户态切到内核态后,进程还是那个进程对于代码路径的说法, 可以认为是 pc 变了,而决定pc(内核代码路径)的是 切换时的 系统调用号内核是服务,可以认为干活的虽然不是用户代码了,但是决定权仍然在用户代码---如果 进程中的用户代码路径 被看做 是 人 的话这是的内核路径代码可以被看做是 零散的电子设备用户代码 不能深入内核,所以通过  系统调用号 将 零散的电子设备 整合成 一个 机器人 (该机器人和人有一样的 身份(task_struct))机器人 干活的时候, 是一个用户进程的内核态机器人 干完活之后, 回归 零散的电子设备,然后 人来接管 干活的收获(系统调用得到的数据)---而 内核线程是一个人,不被会 拆解用户进程(线程)的用户态 也是一个人,不会被 拆解---用户进程(线程)的用户态 运行的时候, 其实 用户进程的核心数据 (TCB) 还是在 内核,这时候这些数据是 一些 零散的电子设备, 没法被用户态访问用户态要访问这些 零散的电子设备 的话,只能通过 一种方法(系统调用) 来 生成机器人

这篇关于OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007908

相关文章

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php