博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别
阅读量:4284 次
发布时间:2019-05-27

本文共 3583 字,大约阅读时间需要 11 分钟。

进程是什么单核系统上同一时间内,只有一个进程(进程A)在跑,该进程占用了	1.cpu的所有寄存器资源	2.cp15协处理器的所有寄存器资源其他的进程都在内存中,也就是说 进程 B /进程 C 等 其实就是内存中的一组数据那么这组数据是什么这组数据 应该是 TCBTCB 从上到下包括什么	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_infoc0800000 :	task_struct

进程分类

内核进程	没有这个概念内核线程	对应一个唯一的task_struct	mm成员 		  	为null	其他资源成员 		不为null,	且不与其他进程共享	只能运行在 		内核态 									// 没有用户空间 	// 0-3G是空白的 			// mm成员是 null 			// 与内核使用同一张页表用户进程	对应一个唯一的task_struct	mm成员 			不为null, 	且不与其他进程共享	其他资源成员 		不为null, 	且不与其他进程共享	可以运行在	 	内核态与用户态 							// 有用户空间 	// 0-3G 不是空白,且是唯一的 // mm 成员是 用户空间内存相关的 // 内核态时,与内核使用同一张页表.用户态时,使用mm成员对应的页表用户线程	对应一个唯一的task_struct	mm成员 			不为null, 	且与其他线程共享	其他资源成员 		不为null, 	且与其他线程共享	可以运行在 		内核态与用户态 							// 有用户空间 	// 0-3G 不是空白,且是共享的 // mm 成员是 用户空间内存相关的 // 内核态时,与内核使用同一张页表.用户态时,使用mm成员对应的页表

其他

  • 进程/线程创建
kernel_clone 的调用者 有 	1.SYSCALL_DEFINE0(fork) 		// 系统调用sys_fork ,用户进程创建用户进程调用的函数		// 拷贝 mm_struct fs files signal		// 写时复制 // 依赖 MMU		// 所以 没有MMU的linux不能运行fork	2.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库+kernel		NPTL库+kernel	N:1		Portable Thread (用户空间实现)	N:M		NGPT
  • 其他问题
// 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) 还是在 内核,这时候			这些数据是 一些 零散的电子设备, 没法被用户态访问			用户态要访问这些 零散的电子设备 的话,只能通过 一种方法(系统调用) 来 生成机器人
你可能感兴趣的文章
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>
Linux内核分析-1/反汇编(堆栈)
查看>>
Linux内核分析-2/时间片轮转多道程序
查看>>
Linux内核分析-4/5/系统调用
查看>>
c/c++常见关键字
查看>>
C++内存地址分配和内存区划分简介
查看>>
C++数值交换
查看>>
指针数组、数组指针、函数指针、指针函数
查看>>
float,double在内存中的存储方式
查看>>
int main(int argc,char* argv[])详解
查看>>
C++打印地址
查看>>
ARM处理器比较:A8/A9
查看>>
ARM处理器工作模式
查看>>
ARM处理器寄存器
查看>>
汇编语言学习
查看>>