79.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 249 行 · 第 1/2 页

HTML
249
字号
<html>
<head>
<title>kernel/traps.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>/traps.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L63'>[^]</a><a href='#L181'>[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='#L63' title='Defined at 63.'>die</a>
<li><a href='#L87' title='Defined at 87.'>do_double_fault</a>
<li><a href='#L92' title='Defined at 92.'>do_general_protection</a>
<li><a href='#L97' title='Defined at 97.'>do_divide_error</a>
<li><a href='#L102' title='Defined at 102.'>do_int3</a>
<li><a href='#L119' title='Defined at 119.'>do_nmi</a>
<li><a href='#L124' title='Defined at 124.'>do_debug</a>
<li><a href='#L129' title='Defined at 129.'>do_overflow</a>
<li><a href='#L134' title='Defined at 134.'>do_bounds</a>
<li><a href='#L139' title='Defined at 139.'>do_invalid_op</a>
<li><a href='#L144' title='Defined at 144.'>do_device_not_available</a>
<li><a href='#L149' title='Defined at 149.'>do_coprocessor_segment_overrun</a>
<li><a href='#L154' title='Defined at 154.'>do_invalid_TSS</a>
<li><a href='#L159' title='Defined at 159.'>do_segment_not_present</a>
<li><a href='#L164' title='Defined at 164.'>do_stack_segment</a>
<li><a href='#L169' title='Defined at 169.'>do_coprocessor_error</a>
<li><a href='#L176' title='Defined at 176.'>do_reserved</a>
<li><a href='#L181' title='Defined at 181.'>trap_init</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'> *  linux/kernel/traps.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'> * 'Traps.c' handles hardware traps and faults after we have saved some</font></i>
<a name='L9'><i><font color='green'> * state in 'asm.s'. Currently mostly a debugging-aid, will be extended</font></i>
<a name='L10'><i><font color='green'> * to mainly kill the offending process (probably by giving it a signal,</font></i>
<a name='L11'><i><font color='green'> * but possibly by killing it outright if necessary).</font></i>
<a name='L12'><i><font color='green'> */</font></i>
<a name='L13'><font color='darkred'>#include</font> &lt;<a href='42.html'>string.h</a>&gt;
<a name='L14'>
<a name='L15'><font color='darkred'>#include</font> &lt;<a href='33.html'>linux/head.h</a>&gt;
<a name='L16'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;
<a name='L17'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;
<a name='L18'><font color='darkred'>#include</font> &lt;<a href='25.html'>asm/system.h</a>&gt;
<a name='L19'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;
<a name='L20'><font color='darkred'>#include</font> &lt;<a href='22.html'>asm/io.h</a>&gt;
<a name='L21'>
<a name='L22'><font color='darkred'>#define</font> <a href='../S/79.html#L82' title='Refered from 82 in kernel/traps.c.'>get_seg_byte</a>(seg,addr) (<font color='red'>{</font> \
<a name='L23'><b>register</b> <b>char</b> __res; \
<a name='L24'><b>__asm__</b>("push %%fs;mov %%ax,%%fs;movb %%fs:%2,%%al;pop %%fs" \
<a name='L25'>        :"=a" (__res):"0" (seg),"m" (*(addr))); \
<a name='L26'>__res;<font color='red'>}</font>)
<a name='L27'>
<a name='L28'><font color='darkred'>#define</font> <a href='../S/79.html#L76' title='Refered from 76 in kernel/traps.c.'>get_seg_long</a>(seg,addr) (<font color='red'>{</font> \
<a name='L29'><b>register</b> <b>unsigned</b> <b>long</b> __res; \
<a name='L30'><b>__asm__</b>("push %%fs;mov %%ax,%%fs;movl %%fs:%2,%%eax;pop %%fs" \
<a name='L31'>        :"=a" (__res):"0" (seg),"m" (*(addr))); \
<a name='L32'>__res;<font color='red'>}</font>)
<a name='L33'>
<a name='L34'><font color='darkred'>#define</font> <a href='../S/79.html#L71' title='Refered from 71 in kernel/traps.c.'>_fs</a>() (<font color='red'>{</font> \
<a name='L35'><b>register</b> <b>unsigned</b> <b>short</b> __res; \
<a name='L36'><b>__asm__</b>("mov %%fs,%%ax":"=a" (__res):); \
<a name='L37'>__res;<font color='red'>}</font>)
<a name='L38'>
<a name='L39'><b>int</b> <a href='../S/67.html#L139' title='Defined at 139 in kernel/exit.c.'>do_exit</a>(<b>long</b> code);
<a name='L40'>
<a name='L41'><b>void</b> page_exception(<b>void</b>);
<a name='L42'>
<a name='L43'><b>void</b> divide_error(<b>void</b>);
<a name='L44'><b>void</b> debug(<b>void</b>);
<a name='L45'><b>void</b> nmi(<b>void</b>);
<a name='L46'><b>void</b> int3(<b>void</b>);
<a name='L47'><b>void</b> overflow(<b>void</b>);
<a name='L48'><b>void</b> bounds(<b>void</b>);
<a name='L49'><b>void</b> invalid_op(<b>void</b>);
<a name='L50'><b>void</b> device_not_available(<b>void</b>);
<a name='L51'><b>void</b> double_fault(<b>void</b>);
<a name='L52'><b>void</b> coprocessor_segment_overrun(<b>void</b>);
<a name='L53'><b>void</b> invalid_TSS(<b>void</b>);
<a name='L54'><b>void</b> segment_not_present(<b>void</b>);
<a name='L55'><b>void</b> stack_segment(<b>void</b>);
<a name='L56'><b>void</b> general_protection(<b>void</b>);
<a name='L57'><b>void</b> page_fault(<b>void</b>);
<a name='L58'><b>void</b> coprocessor_error(<b>void</b>);
<a name='L59'><b>void</b> reserved(<b>void</b>);
<a name='L60'><b>void</b> parallel_interrupt(<b>void</b>);
<a name='L61'><b>void</b> irq13(<b>void</b>);
<a name='L62'>
<a name='L63'><b>static</b> <b>void</b> <a href='../R/433.html' title='Multiple refered from 45 places.'>die</a>(<b>char</b> * str,<b>long</b> esp_ptr,<b>long</b> nr)
<a name='L64'><font color='red'>{</font>
<a name='L65'>        <b>long</b> * esp = (<b>long</b> *) esp_ptr;
<a name='L66'>        <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L67'>
<a name='L68'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("%s: %04x\n\r",<a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>,nr&amp;0xffff);
<a name='L69'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("EIP:\t%04x:%p\nEFLAGS:\t%p\nESP:\t%04x:%p\n",
<a name='L70'>                esp[1],esp[0],esp[2],esp[4],esp[3]);
<a name='L71'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("fs: %04x\n",<a href='../S/79.html#L34' title='Defined at 34 in kernel/traps.c.'>_fs</a>());
<a name='L72'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("base: %p, limit: %p\n",<a href='../S/36.html#L343' title='Defined at 343 in include/linux/sched.h.'>get_base</a>(current-&gt;ldt[1]),<a href='../S/36.html#L346' title='Defined at 346 in include/linux/sched.h.'>get_limit</a>(0x17));
<a name='L73'>        <b>if</b> (esp[4] == 0x17) <font color='red'>{</font>
<a name='L74'>                <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("Stack: ");
<a name='L75'>                <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>=0;<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>&lt;4;<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L76'>                        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("%p ",<a href='../S/79.html#L28' title='Defined at 28 in kernel/traps.c.'>get_seg_long</a>(0x17,<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>+(<b>long</b> *)esp[3]));
<a name='L77'>                <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("\n");
<a name='L78'>        <font color='red'>}</font>
<a name='L79'>        <a href='../S/36.html#L267' title='Defined at 267 in include/linux/sched.h.'>str</a>(<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>);
<a name='L80'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("Pid: %d, process nr: %d\n\r",current-&gt;pid,0xffff &amp; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>);
<a name='L81'>        <b>for</b>(<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>=0;<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>&lt;10;<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L82'>                <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("%02x ",0xff &amp; <a href='../S/79.html#L22' title='Defined at 22 in kernel/traps.c.'>get_seg_byte</a>(esp[1],(<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>+(<b>char</b> *)esp[0])));
<a name='L83'>        <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a>("\n\r");
<a name='L84'>        <a href='../S/67.html#L139' title='Defined at 139 in kernel/exit.c.'>do_exit</a>(11);            <i><font color='green'>/* play segment exception */</font></i>
<a name='L85'><font color='red'>}</font>
<a name='L86'>
<a name='L87'><b>void</b> do_double_fault(<b>long</b> esp, <b>long</b> error_code)
<a name='L88'><font color='red'>{</font>
<a name='L89'>        <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a>("double fault",esp,error_code);
<a name='L90'><font color='red'>}</font>
<a name='L91'>

⌨️ 快捷键说明

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