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

📄 70.html

📁 linux 0.11中文版 有注释
💻 HTML
字号:
<html>
<head>
<title>kernel/math/math_emulate.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/104.html'>kernel</a>/<a href='../files/107.html'>math</a>/math_emulate.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L25'>[^]</a><a href='#L53'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L25' title='Defined at 25.'>math_emulate</a>
<li><a href='#L53' title='Defined at 53.'>math_error</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/math/math_emulate.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><i><font color='green'>/*</font></i>
<a name='L8'><i><font color='green'>* This directory should contain the math-emulation code.</font></i>
<a name='L9'><i><font color='green'>* Currently only results in a signal.</font></i>
<a name='L10'><i><font color='green'>*/</font></i>
<a name='L11'><i><font color='green'>/*</font></i>
<a name='L12'><i><font color='green'>* 该目录里应该包含数学仿真代码。目前仅产生一个信号。</font></i>
<a name='L13'><i><font color='green'>*/</font></i>
<a name='L14'>
<a name='L15'><font color='darkred'>#include</font> &lt;<a href='39.html'>signal.h</a>&gt;             <i><font color='green'>// 信号头文件。定义信号符号常量,信号结构以及信号操作函数原型。</font></i>
<a name='L16'>
<a name='L17'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;        <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L18'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L19'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L20'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;        <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L21'>
<a name='L22'><i><font color='green'>//// 协处理器仿真函数。</font></i>
<a name='L23'><i><font color='green'>// 中断处理程序调用的C 函数,参见(kernel/math/system_call.s,169 行)。</font></i>
<a name='L24'><b>void</b>
<a name='L25'><a href='../S/77.html#L219' title='Refered from 219 in kernel/system_call.s.'>math_emulate</a> (<b>long</b> edi, <b>long</b> esi, <b>long</b> ebp, <b>long</b> sys_call_ret,
<a name='L26'>              <b>long</b> eax, <b>long</b> ebx, <b>long</b> ecx, <b>long</b> edx,
<a name='L27'>              <b>unsigned</b> <b>short</b> fs, <b>unsigned</b> <b>short</b> es, <b>unsigned</b> <b>short</b> ds,
<a name='L28'>              <b>unsigned</b> <b>long</b> eip, <b>unsigned</b> <b>short</b> cs, <b>unsigned</b> <b>long</b> eflags,
<a name='L29'>              <b>unsigned</b> <b>short</b> ss, <b>unsigned</b> <b>long</b> esp)
<a name='L30'><font color='red'>{</font>
<a name='L31'>  <b>unsigned</b> <b>char</b> first, second;
<a name='L32'>
<a name='L33'><i><font color='green'>/* 0x0007 means user code space */</font></i>
<a name='L34'><i><font color='green'>/* 0x0007 表示用户代码空间 */</font></i>
<a name='L35'><i><font color='green'>// 选择符0x000F 表示在局部描述符表中描述符索引值=1,即代码空间。如果段寄存器cs 不等于0x000F</font></i>
<a name='L36'><i><font color='green'>// 则表示cs 一定是内核代码选择符,是在内核代码空间,则出错,显示此时的cs:eip 值,并显示信息</font></i>
<a name='L37'><i><font color='green'>// “内核中需要数学仿真”,然后进入死机状态。</font></i>
<a name='L38'>  <b>if</b> (cs != 0x000F)
<a name='L39'>    <font color='red'>{</font>
<a name='L40'>      <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("math_emulate: %04x:%08x\n\r", cs, eip);
<a name='L41'>      <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("Math emulation needed in kernel");
<a name='L42'>    <font color='red'>}</font>
<a name='L43'><i><font color='green'>// 取用户数据区堆栈数据first 和second,显示这些数据,并给进程设置浮点异常信号SIGFPE。</font></i>
<a name='L44'>  first = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> ((<b>char</b> *) ((*&amp;eip)++));
<a name='L45'>  second = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> ((<b>char</b> *) ((*&amp;eip)++));
<a name='L46'>  <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("%04x:%08x %02x %02x\n\r", cs, eip - 2, first, second);
<a name='L47'>  current-&gt;signal |= 1 &lt;&lt; (<a href='../S/39.html#L21' title='Defined at 21 in include/signal.h.'>SIGFPE</a> - 1);
<a name='L48'><font color='red'>}</font>
<a name='L49'>
<a name='L50'><i><font color='green'>//// 协处理器出错处理函数。</font></i>
<a name='L51'><i><font color='green'>// 中断处理程序调用的C 函数,参见(kernel/math/system_call.s,145 行)。</font></i>
<a name='L52'><b>void</b>
<a name='L53'>math_error (<b>void</b>)
<a name='L54'><font color='red'>{</font>
<a name='L55'><i><font color='green'>// 协处理器指令。(以非等待形式)清除所有异常标志、忙标志和状态字位7。</font></i>
<a name='L56'>  <b>__asm__</b> ("fnclex");
<a name='L57'><i><font color='green'>// 如果上个任务使用过协处理器,则向上个任务发送协处理器异常信号。</font></i>
<a name='L58'>  <b>if</b> (last_task_used_math)
<a name='L59'>    last_task_used_math-&gt;signal |= 1 &lt;&lt; (<a href='../S/39.html#L21' title='Defined at 21 in include/signal.h.'>SIGFPE</a> - 1);
<a name='L60'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L25'>[^]</a><a href='#L53'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

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