📄 25.html
字号:
<html>
<head>
<title>include/asm/system.h</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/99.html'>include</a>/<a href='../files/100.html'>asm</a>/system.h</h2>
<i><font color='green'>/* [<][>][^][v][top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2><a href='../J/25.html' title='Multiple included from 18 places.'>INCLUDED FROM</a></h2>
<hr>
<pre>
<a name='L1'><i><font color='green'>//// 切换到用户模式运行。</font></i>
<a name='L2'><i><font color='green'>// 该函数利用iret 指令实现从内核模式切换到用户模式(初始任务0)。</font></i>
<a name='L3'><font color='darkred'>#define</font> <a href='../S/52.html#L182' title='Refered from 182 in init/main.c.'>move_to_user_mode</a>() \
<a name='L4'><b>__asm__</b> ( "movl %%esp,%%eax\n\t" \ <i><font color='green'>// 保存堆栈指针esp 到eax 寄存器中。</font></i>
<a name='L5'>"pushl $0x17\n\t" \ <i><font color='green'>// 首先将堆栈段选择符(SS)入栈。</font></i>
<a name='L6'> "pushl %%eax\n\t" \ <i><font color='green'>// 然后将保存的堆栈指针值(esp)入栈。</font></i>
<a name='L7'> "pushfl\n\t" \ <i><font color='green'>// 将标志寄存器(eflags)内容入栈。</font></i>
<a name='L8'> "pushl $0x0f\n\t" \ <i><font color='green'>// 将内核代码段选择符(cs)入栈。</font></i>
<a name='L9'> "pushl $1f\n\t" \ <i><font color='green'>// 将下面标号1 的偏移地址(eip)入栈。</font></i>
<a name='L10'> "iret\n" \ <i><font color='green'>// 执行中断返回指令,则会跳转到下面标号1 处。</font></i>
<a name='L11'> "1:\tmovl $0x17,%%eax\n\t" \ <i><font color='green'>// 此时开始执行任务0,</font></i>
<a name='L12'> "movw %%ax,%%ds\n\t" \ <i><font color='green'>// 初始化段寄存器指向本局部表的数据段。</font></i>
<a name='L13'>"movw %%ax,%%es\n\t" "movw %%ax,%%fs\n\t" "movw %%ax,%%gs":::"ax")
<a name='L14'><font color='darkred'>#define</font> <a href='../R/617.html' title='Multiple refered from 25 places.'>sti</a>() <b>__asm__</b> ( "sti"::) <i><font color='green'>// 开中断嵌入汇编宏函数。</font></i>
<a name='L15'><font color='darkred'>#define</font> <a href='../R/402.html' title='Multiple refered from 23 places.'>cli</a>() <b>__asm__</b> ( "cli"::) <i><font color='green'>// 关中断。</font></i>
<a name='L16'><font color='darkred'>#define</font> <a href='../S/56.html#L300' title='Refered from 300 in kernel/blk_drv/hd.c.'>nop</a>() <b>__asm__</b> ( "nop"::) <i><font color='green'>// 空操作。</font></i>
<a name='L17'><font color='darkred'>#define</font> iret() <b>__asm__</b> ( "iret"::) <i><font color='green'>// 中断返回。</font></i>
<a name='L18'><i><font color='green'>//// 设置门描述符宏函数。</font></i>
<a name='L19'><i><font color='green'>// 参数:gate_addr -描述符地址;type -描述符中类型域值;dpl -描述符特权层值;addr -偏移地址。</font></i>
<a name='L20'><i><font color='green'>// %0 - (由dpl,type 组合成的类型标志字);%1 - (描述符低4 字节地址);</font></i>
<a name='L21'><i><font color='green'>// %2 - (描述符高4 字节地址);%3 - edx(程序偏移地址addr);%4 - eax(高字中含有段选择符)。</font></i>
<a name='L22'><font color='darkred'>#define</font> <a href='../R/375.html' title='Multiple refered from 3 places.'>_set_gate</a>(gate_addr,type,dpl,addr) \
<a name='L23'><b>__asm__</b> ( "movw %%dx,%%ax\n\t" \ <i><font color='green'>// 将偏移地址低字与选择符组合成描述符低4 字节(eax)。</font></i>
<a name='L24'> "movw %0,%%dx\n\t" \ <i><font color='green'>// 将类型标志字与偏移高字组合成描述符高4 字节(edx)。</font></i>
<a name='L25'> "movl %%eax,%1\n\t" \ <i><font color='green'>// 分别设置门描述符的低4 字节和高4 字节。</font></i>
<a name='L26'>"movl %%edx,%2":
<a name='L27'>:"i" ((<b>short</b>) (0x8000 + (dpl << 13) + (type << 8))),
<a name='L28'> "o" (*((<b>char</b> *) (gate_addr))),
<a name='L29'> "o" (*(4 + (<b>char</b> *) (gate_addr))), "d" ((<b>char</b> *) (addr)), "a" (0x00080000))
<a name='L30'><i><font color='green'>//// 设置中断门函数。</font></i>
<a name='L31'><i><font color='green'>// 参数:n - 中断号;addr - 中断程序偏移地址。</font></i>
<a name='L32'><i><font color='green'>// &idt[n]对应中断号在中断描述符表中的偏移值;中断描述符的类型是14,特权级是0。</font></i>
<a name='L33'><font color='darkred'>#define</font> <a href='../R/596.html' title='Multiple refered from 4 places.'>set_intr_gate</a>(n,addr) \
<a name='L34'><a href='../S/25.html#L22' title='Defined at 22 in include/asm/system.h.'>_set_gate</a>(&idt[n],14,0,addr)
<a name='L35'><i><font color='green'>//// 设置陷阱门函数。</font></i>
<a name='L36'><i><font color='green'>// 参数:n - 中断号;addr - 中断程序偏移地址。</font></i>
<a name='L37'><i><font color='green'>// &idt[n]对应中断号在中断描述符表中的偏移值;中断描述符的类型是15,特权级是0。</font></i>
<a name='L38'><font color='darkred'>#define</font> <a href='../R/603.html' title='Multiple refered from 19 places.'>set_trap_gate</a>(n,addr) \
<a name='L39'><a href='../S/25.html#L22' title='Defined at 22 in include/asm/system.h.'>_set_gate</a>(&idt[n],15,0,addr)
<a name='L40'><i><font color='green'>//// 设置系统调用门函数。</font></i>
<a name='L41'><i><font color='green'>// 参数:n - 中断号;addr - 中断程序偏移地址。</font></i>
<a name='L42'><i><font color='green'>// &idt[n]对应中断号在中断描述符表中的偏移值;中断描述符的类型是15,特权级是3。</font></i>
<a name='L43'><font color='darkred'>#define</font> <a href='../R/600.html' title='Multiple refered from 4 places.'>set_system_gate</a>(n,addr) \
<a name='L44'><a href='../S/25.html#L22' title='Defined at 22 in include/asm/system.h.'>_set_gate</a>(&idt[n],15,3,addr)
<a name='L45'><i><font color='green'>//// 设置段描述符函数。</font></i>
<a name='L46'><i><font color='green'>// 参数:gate_addr -描述符地址;type -描述符中类型域值;dpl -描述符特权层值;</font></i>
<a name='L47'><i><font color='green'>// base - 段的基地址;limit - 段限长。(参见段描述符的格式)</font></i>
<a name='L48'><font color='darkred'>#define</font> _set_seg_desc(gate_addr,type,dpl,base,limit) <font color='red'>{</font>\
<a name='L49'>*(gate_addr) = ((base) & 0xff000000) | \ <i><font color='green'>// 描述符低4 字节。</font></i>
<a name='L50'> (((base) & 0x00ff0000) >> 16) |
<a name='L51'> ((limit) & 0xf0000) | ((dpl) << 13) | (0x00408000) | ((type) << 8);
<a name='L52'>*((gate_addr) + 1) = (((base) & 0x0000ffff) << 16) | \ <i><font color='green'>// 描述符高4 字节。</font></i>
<a name='L53'> ((limit) & 0x0ffff);
<a name='L54'><font color='red'>}</font>
<a name='L55'>
<a name='L56'><i><font color='green'>//// 在全局表中设置任务状态段/局部表描述符。</font></i>
<a name='L57'><i><font color='green'>// 参数:n - 在全局表中描述符项n 所对应的地址;addr - 状态段/局部表所在内存的基地址。</font></i>
<a name='L58'><i><font color='green'>// type - 描述符中的标志类型字节。</font></i>
<a name='L59'><i><font color='green'>// %0 - eax(地址addr);%1 - (描述符项n 的地址);%2 - (描述符项n 的地址偏移2 处);</font></i>
<a name='L60'><i><font color='green'>// %3 - (描述符项n 的地址偏移4 处);%4 - (描述符项n 的地址偏移5 处);</font></i>
<a name='L61'><i><font color='green'>// %5 - (描述符项n 的地址偏移6 处);%6 - (描述符项n 的地址偏移7 处);</font></i>
<a name='L62'><font color='darkred'>#define</font> <a href='../R/377.html' title='Multiple refered from 2 places.'>_set_tssldt_desc</a>(n,addr,type) \
<a name='L63'><b>__asm__</b> ( "movw $104,%1\n\t" \ <i><font color='green'>// 将TSS 长度放入描述符长度域(第0-1 字节)。</font></i>
<a name='L64'>"movw %%ax,%2\n\t" \ <i><font color='green'>// 将基地址的低字放入描述符第2-3 字节。</font></i>
<a name='L65'> "rorl $16,%%eax\n\t" \ <i><font color='green'>// 将基地址高字移入ax 中。</font></i>
<a name='L66'> "movb %%al,%3\n\t" \ <i><font color='green'>// 将基地址高字中低字节移入描述符第4 字节。</font></i>
<a name='L67'> "movb $" type ",%4\n\t" \ <i><font color='green'>// 将标志类型字节移入描述符的第5 字节。</font></i>
<a name='L68'> "movb $0x00,%5\n\t" \ <i><font color='green'>// 描述符的第6 字节置0。</font></i>
<a name='L69'> "movb %%ah,%6\n\t" \ <i><font color='green'>// 将基地址高字中高字节移入描述符第7 字节。</font></i>
<a name='L70'> "rorl $16,%%eax" \ <i><font color='green'>// eax 清零。</font></i>
<a name='L71'> ::"a" (addr), "m" (*(n)), "m" (*(n + 2)), "m" (*(n + 4)),
<a name='L72'> "m" (*(n + 5)), "m" (*(n + 6)), "m" (*(n + 7)))
<a name='L73'><i><font color='green'>//// 在全局表中设置任务状态段描述符。</font></i>
<a name='L74'><i><font color='green'>// n - 是该描述符的指针;addr - 是描述符中的基地址值。任务状态段描述符的类型是0x89。</font></i>
<a name='L75'><font color='darkred'>#define</font> <a href='../R/604.html' title='Multiple refered from 2 places.'>set_tss_desc</a>(n,addr) <a href='../S/25.html#L62' title='Defined at 62 in include/asm/system.h.'>_set_tssldt_desc</a>(((<b>char</b> *) (n)),addr, "0x89")
<a name='L76'><i><font color='green'>//// 在全局表中设置局部表描述符。</font></i>
<a name='L77'><i><font color='green'>// n - 是该描述符的指针;addr - 是描述符中的基地址值。局部表描述符的类型是0x82。</font></i>
<a name='L78'><font color='darkred'>#define</font> <a href='../R/597.html' title='Multiple refered from 2 places.'>set_ldt_desc</a>(n,addr) <a href='../S/25.html#L62' title='Defined at 62 in include/asm/system.h.'>_set_tssldt_desc</a>(((<b>char</b> *) (n)),addr, "0x82")
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>][^][v]<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 + -