这是math模块里最后一个文件,对这个模块的学习前前后后到现在也有半年时间了,我还依稀记得是从年初那时的一个论坛帖子开始的,它记录下了我前期大量的准备工作。
学习从大的说是一件一辈子都不能忘记的事情,如果你是一个上进的人,那么请抽出适量的时间来提升自己,这点我个人还做的不是很好,因为我总是在闲得无聊的时候才想起来学点东西。
如果你是搞IT这行当的,那么技术学习是一门永远的课程,你可以选择自己喜欢的技术方向,把业余时间利用起来,时间长了,技术的敏感度就自然的提高了。
大家可能都会想,上班那么忙,偶尔有点时间也得让自己休息一下吧。当然,身体是最最重要的,可是你可以问问自己,你真的很闲的时候,却把大把的时间浪费掉了,这些时间不觉得遗憾吗。还有一点是,你还没有找到喜欢的技术方向,所以即使当时你想学点什么,可能也提不起劲来。
内核技术可能不适合大部分人,因为它很大很复杂,最关键是在工作中很难用到,学习它需要时间和精力,当然有一部分人是愿意去尝试的,可绝大部分走到中途,慢慢的心累了,对它无爱了,于是也止步了。也就是说,真正一直沿着这条路走的人是相当的少,可以说是非常的少,这样导致的结果是真正懂内核的人基本都被称作了‘大牛’、‘大神’,因为他们是稀有的!
众所周知,现代版的内核巨大无比,长年下来积累了看不完的代码,很多入门的初学者都跪拜在它的胯下,哈哈,这应该是正常的现象。在我看来,把现代内核来当做学习内核的入门的并不是真正喜欢内核的人,他们只是想求快求马上的高人一等,求一种想被瞻仰的优越感,而不是因为喜欢。真正喜欢它的,会将学习内核当做一种爱好,你可以比喻为一种休息时候的消遣,一种对思维的陶冶,不会在乎学习完后是否对自己的工作有用与否(这种想法本身就是对你喜欢的事情的一种亵渎),是否能靠它得到更高的待遇,在乎的是‘懂’后的一种慰藉。
如果你是用一种纯粹的心来喜欢内核技术,而不是利用它,那希望你在这条路上坚持下来并由此获得心灵慰藉!
code部分
I. math_error
void math_error(void) { __asm__("fnclex"); /* 清掉所有异常 */ if (last_task_used_math) /* 这个标志只在有协处理器的时候作用, 它表示最后一个使用过协处理器的进程 */ last_task_used_math->signal |= 1<<(SIGFPE-1); /* 错误发生后, 需向那个使用过协处理器但还没有保存协处理器状态的进程发送浮点错误异常信号 */ }
II. math_state_restore(kernel/sched.c)
/* * 'math_state_restore()' saves the current math information in the * old math state array, and gets the new ones from the current task */ void math_state_restore() { if (last_task_used_math == current) /* 如果之前使用协处理器的进程就是 本进程且还在用,那就返回让本进程继续使用吧 */ return; __asm__("fwait"); /* 同步一下,把之前的异常都处理完成 */ if (last_task_used_math) { /* 保存协处理器状态到之前使用过它的进程中 */ __asm__("fnsave %0"::"m" (last_task_used_math->tss.i387)); } last_task_used_math=current; /* 现在本进程就是最后一个使用协处理器的进程了 */ if (current->used_math) { /* 如果本进程之前使用过协处理器,那么把它的协处理器 状态都load到协处理器中 */ __asm__("frstor %0"::"m" (current->tss.i387)); } else { /* 如果本进程之前没有使用过协处理器,那么就初始化协处理器 */ __asm__("fninit"::); current->used_math=1; /* 并置1,它已经开始使用协处理器了 */ } }