Linux内核源代码的学习过程转换完成细节
想执行都要经过的地方
--->放入就绪队列---->被调度---->运行switch_to
__switch_to了,这是个函数。这个函数的返回地址就区分了被调度的进程是新创建的进程还是已经运行过的进程了。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWdhbmxlbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
unsigned long esi,edi; /
asm volatile("pushfl/n/t" /
"pushl %%ebp/n/t" /
"movl %%esp,%0/n/t" /* save ESP */ /
"movl %5,%%esp/n/t" /* restore ESP */ / //注意这里已经切换到了新的内核栈,故原来的栈中的局部变量所有失效。因而想得到其值就必须想办法保存它们,为了效率。这里将prev保存在寄存器中, 以便善后使用
"movl $1f,%1/n/t" /* save EIP */ / //这里。仅仅要是以前在这里被切换出去的进程都会将标号1作为再回来时的eip
"pushl %6/n/t" /* restore EIP */ / //将新进程的eip压入栈中,由于以下是个jmp,并且jmp到的函数最后有一个return。那么依照return的语义,就能够从栈取出eip加载 eip寄存器了,实际上这个对__switch_to的jmp调用就是一个手动的call调用(须要注意的是,这里return的是下一个进程的eip保存的是本进程的eip留给下次被切换进来的时候像如今这样使用)。非常巧妙
"jmp __switch_to/n" / //__switch_to是个FASTCALL的函数。eax/ebx寄存器传參数
"1:/t" / //标号1的指令,非常easy。可是就是这个简单成全了总体架构的简单 这里为什么不用call
"popl %%ebp/n/t" /
"popfl" /
:"=m" (prev->thread.esp),"=m" (prev->thread.eip), /
"=a" (last),"=S" (esi),"=D" (edi) /
:"m" (next->thread.esp),"m" (next->thread.eip), /
"2" (prev), "d" (next)); /
} while (0)
__switch_to/n"的时候,它的返回地址将不会是标号1:而应该是eip,即在copy_thread中设置的eip中的值:ret_from_fork
ENTRY(ret_from_fork)
pushl %eax
call schedule_tail
GET_THREAD_INFO(%ebp)
popl %eax
jmp syscall_exit
syscall_exit:
...
work_resched:
call schedule
...
当他从ret_from_fork退出时。会从堆栈中弹出原来保存的eip,而ip指向kernel_thread_helper,
至此kernel_thread_helper被调用。他就行执行我们的指定的函数了do_exit().
从内核空间返回到用户空间。
离出来放到一个地方,然后无论是已经有的进程还是新创建的进程都从这个固定的分离出来标号1的地址处取指令不就能够了吗?内核的设计者不可能还没有我聪明,那样的话会浪费取指令的时间和空间的,
ENTRY(ret_from_fork)
pushl %eax //注意刚从switch_to调用的__switch_to中ret回来。正好ret到了ret_from_fork(注意switch_to中jmp 指令前的push),而那个函数返回的就是prev,将其放到了eax中,故这里schedule_tail的參数就是prev,也就是切换出去的进程。
call schedule_tail
GET_THREAD_INFO(%ebp)
popl %eax
jmp syscall_exit
上 面看到ret_from_fork调用的schedule_tail參数是切换出去的进程,而后者立即调用finish_task_switch,这样就 和schedule中的switch_to之后的逻辑对上了,并且參数也没有什么问题,
schedule的局部变量在prev的内核栈中,在切换到新的内核栈后(schedule函数用到了两个内核栈),prev失效。因此才要保存(这里能够理解为从prev传递到兴许可见的地方)的。
Linux内核源代码的学习过程转换完成细节的更多相关文章
- Linux内核源代码分析方法
Linux内核源代码分析方法 一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...
- Linux内核源代码获取教程
Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...
- 在windows下解压缩Linux内核源代码出现重复文件原因
在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂 原因一.因为在Lin ...
- Linux内核源代码情景分析系列
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统 5.1 概述 构成一个操作系统最重要的就 ...
- Linux内核源代码
说明:只供学习交流 一,目录结构 Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具有可读性. 二,目录结构 arch目录 arch是archite ...
- Linux内核源代码目录树结构
Linux内核源代码目录树结构. arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内 ...
- 《深入分析Linux内核源代码》读书、私藏笔记大放送
秉承着"不懂操作系统原理的程序员不是合格的程序员"的至理名言,鄙人又是买陈莉君老师的“Linux教学视频”,又是研读其力作<深入分析Linux内核源代码>,先将总结笔记 ...
- Ubuntu:编译Linux内核源代码和内核模块
1. 目的 内核模块需要运行在Linux 3.8.13内核中,因此需要为此内核重新编译内核模块源代码. 2. 步骤 1.在Ubuntu 14.04 64位(内核3.13.0-24-generic)上, ...
- linux内核源代码、配置与编译
内核源代码下载:www.kernel.org Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性. linux内核代码最好不要在windows ...
随机推荐
- address_space 从哪里来
address_space 从哪里来 这两天想弄清楚linux的内存分配,忽然看到了address_space,就想弄明白. 整个内核就见到 address_space(1)和address_spac ...
- 回文(manacher)
裸manacher 我竟然写跪了………… 一个地方(偶数)没写清楚…… 我OOXOXOXOXXOXO #include<cstdio> #include<cstdlib> #i ...
- Swift - 使用表格组件(UITableView)实现单列表
1,样例说明: (1)列表内容从Controls.plist文件中读取,类型为Array. (2)点击列表项会弹出消息框显示该项信息. (3)按住列表项向左滑动,会出现删除按钮.点击删除即可删除该项. ...
- hdu1075What Are You Talking About (字典树)
Problem Description Ignatius is so lucky that he met a Martian yesterday. But he didn't know the lan ...
- 《c陷阱与缺陷》笔记--移位运算
#include <stdio.h> int main(void){ int a = 2; a >> 32; a >> -1; a << 32; a & ...
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} Comp ...
- 搜索:POJ2251&POJ1426&POJ3087&POJ2488
图的遍历也称为搜索,就是从图中某个顶点出发,沿着一些边遍历图中所有的顶点,且每个顶点仅被访问一次,遍历可采取两种不同的方式:深度优先搜索(DFS)和广度优先搜索(BFS). 1.DFS算法思想` 从顶 ...
- 15个最好的HTML5前端响应式框架(2014)
文中的多个框架基于SASS创建,SCSS是一种比LESS更简洁的样式表编程语言,它能够编绎成CSS,可复用CSS代码,声明变量,甚至是函数,类Ruby/Python的语法.參见: LESS vs SA ...
- 正确理解HTML,XHTML页面的头部doctype定义
摘自http://www.west263.com/info/html/wangyezhizuo/css/20080225/42390.html 当我们制作页面的时候,总会在它的源代码头部看到一串声明, ...
- 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
真实世界里的钢铁侠--特斯拉汽车公司和SpaceX公司总裁马斯克(31岁).当我们得意于「站在山上踢几块石头下去」或是「站在风口上的猪」的成功理论的时候,我们真的成功了吗?我们到底创造了什么?改变了什 ...