#####################################
作者:张卓
原创作品转载请注明出处:《Linux操作系统分析》MOOC课程 http://www.xuetangx.com/courses/course-v1:ustcX+USTC001+_/about
#####################################
1. 前言
上一篇我们详细地分析一段x86汇编程序的执行过程,知道了计算机是如何工作的,总结来说就是三个关键点:存储程序计算机、函数调用堆栈、和中断机制。
现在我们要简单分析一下操作系统是如何工作的,这里我将重点分析中断机制和进程上下文切换。
2. C代码中嵌入汇编代码
在分析操作系统中断机制和进程上下文之前,我们先了解一下C内嵌汇编,因为在操作系统进行进程上下文切换的时候,就是用内嵌汇编代码实现的。了解它,有助于我们深入理解代码执行流程。
2.1 内嵌汇编语法
__asm__(
汇编语句模块:
输出部分:
输入部分:
破坏描述部分);
即格式为asm("statements": output_regs: input_regs: clobbered_regs)
同时 “asm” 也可以由 “__asm__” 来代替,“asm” 是 “__asm__” 的别名。在 “asm” 后面有时也会加上 “__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile” 是它的别名,在这里值得注意的是无论 “__asm__” 还是 “__volatile__” 中的每个下划线都不是一个单独的下划线,而是两个短的下划线拼成的。在后面括号里面的便是汇编指令。
2.2 C中内嵌汇编代码示例
#include<stdio.h>
int main()
{
/* val1+val2=val3 */
unsigned int val1 = 1;
unsigned int val2 = 2;
unsigned int val3 = 0;
printf("val1:%d,val2:%d,val3:%d\n",val1,val2,val3);
asm volatile(
"movl $0, %%eax\n\t" /* clear %eax to 0 */
"addl %1,%%eax\n\t" /* %eax += val1 */
"addl %2 %%eax\n\t" /* %eax += val2 */
"movl %%eax,%0\n\t" /* val2 =%eax*/
:"=m"(val3) /* output=m mean only write output memory variable*/
:"c"(val1),"d"(val2) /* input c