⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻
字号:
any problems, send mails to sindybear@163.com


相关文件
	/kernel/sched.c
	/include/asm-i386/mmu_context.h
	/include/asm-i386/system.h
	/arch/i386/kernel/process.c

进程切换是一个很令人困惑的东西。要搞清进程切换,首先要明白一个进程都有一些什么东西。

一个进程最主要的两个东西就是
1。用户态下得数据和堆栈,
2。内核态下的堆栈。	
也就是说,一个进程对应两种堆栈,一个是用户态下的,用来做子函数调用,函数嵌套,函数递归等。
一个是内核态的,用作从用户态切换到内核态的时候进行保存用户态的寄存器,状态信息等。
		

其中,在内核态中,进程结构task_strcut和进程的内核堆栈在一起,共两个页面,共8k。


进程切换首先要明了的一件事情是进程切换发生在什么地方。
进程切换发生的地方只可能在当中断程序、系统调用、异常处理等内核功能完成以后返回用户空间之前
才能进行。记住一点,不论中断程序、系统调用、异常处理发生在什么时候,cpu上的任何一个时间都有
一个进程在运行,这些中断程序、系统调用、异常处理运行的时候,都是将一个正在运行的进程打断。
当一个中断即将完毕的时候,它会检察这个进程的task_struct->need_rescked,如果非0,就调用schedule
函数进行调度。

我们以时钟中断来举例,当时钟中断发生的时候,它将打断当前进程的执行。进入到内核态进行运行。
她会将正在运行的进程的时间片减小,如果当前进程的时间片已经减为0了,则说明这个进程已经运行了
很久了,需要将它调度出去,选取下一个进程进行运行了。这个时候,时钟中断程序会将使用get_current
函数从tss中将esp取出来,这里面存储的就是这个进程的内核态堆栈的指针。
因为进程结构task_strcut和进程的内核堆栈在一起,所以可以用它算出这个进程的task_struct来,然后
设置task_struct->need_resched = 1,然后返回。当中断完成的时候,要从内核态返回到用户空间的时候
就会检查这个域。当发现need_resched非0的时候,就调用schedule,完成了调度。

那么,实际的调度到底发生了什么呢。
对于不同的进程来说,其实最主要的东西就是两个,一个是cr3寄存器所指的页目录表,也就是这个进程正在
使用的内存空间。
另一个是内核堆栈地址,也就是TR所指向的TSS中的SS0和ESP0的内容。
其实和一个进程切换最为相关的结构就是SS:ESP控制寄存器组,进程切换归根结底就是堆栈的切换。而SS:ESP
寄存器组就是控制进程堆栈的唯一结构。当进程处于用户态的时候,SS:ESP指向进程的用户空间堆栈,
当进程处于内核空间的时候,SS:ESP就指向进程的内核堆栈。
当进程从用户态转到内核态的时候,CPU自动将进程的各种相关的寄存器压入到内核堆栈中,最后将现在指向
用户空间的SS:ESP也压入内核堆栈保存起来,然后从TR-->TSS中的SS0:ESP0取出内核堆栈的指针放入SS:ESP中
这就完成了用户态和内核态堆栈的转换。

从上面的一段分析我们就可以看出来,进程切换的时候,只需要将新进程的页目录表的地址填入cr3寄存器中,
这样就完成了进程内存空间的转换。
然后就将老进程的SS:ESP保存到task_struct->thread.esp中,然后,将新进程的task_struct->thread.esp
填入SS:ESP,这样,堆栈就变成了新进程的,也就是说进程切换成功了。但是别忘了一点,在TSS中还保留着
老进程的SS0:ESP0,它还要用来进行用户态和内核态堆栈的切换的,所以也要用task_struct->thread.esp
将它替换调。这样新进程从用户态到内核态进行堆栈切换的时候才不会出错。

实际的过程如下

ret_from_XXX--->need_resched??--->schedule--->context_switch--->switch_mm												   更新cr3	
							    --->switch_to--->__switch_to	
										更新TSS->ESP0

由此看来,其实TR和TSS的作用只是用于用户态和内核态的堆栈切换。







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -