码迷,mamicode.com
首页 > 系统相关 > 详细

2017-2018-1 20179219 《Linux内核原理与分析》第三周作业

时间:2017-10-15 17:24:50      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:转移   ati   进程   read   而且   入栈   交换   获得   笔记   

一、课程笔记

 

gcc -g xxx    生成包含debug的可执行程序
objdump -s xxx    获得刚刚生成的可执行程序的反汇编文件

三个法宝:存储程序计算机、程序调用堆栈、中断

%1    表示下面的输出和输入的部分,第一个表示为%0,第二个表示为%1,第三个表示为%2

call:将当前cs:eip的值压入栈顶,cs:eip指向被调用函数的入口地址
{程序调用过程:  step1.执行call时,cs:eip原来的值指向call的下一条指令,该值被保存到栈顶,然后cs:eip的值指向xxx的入口地址
          step2.进入xxx后,第一条指令pushl %ebp;第二条指令 movl %esp,%ebp;函数体中的常规操作可能会压栈、出栈
          step3.退出xxx,movl %ebp,%esp;popl %ebp;ret}


c语言内嵌汇编常用的修饰符:
"a” 将输入变量放入eax中 "b" 将输入变量放入ebx中 "c" 将输入变量放入ecx中 "d" 将输入变量放入edx中 "s" 将输入变量放入esi中 "D" 将输入变量放入edi中 "q" 将输入变量放入eax ebx ecx edx中的一个 "r" 将输入变量放入通用寄存器,也就是eax ebx ecx edx esi edi 中的一个 "A" 放入eax和edx。把eax和edx合成一个64位的寄存器 "m" 内存变量 "o" 操作数为内存变量,但是其寻址方式是偏移量类型 "V" 操作数为内存变量,但是其寻址方式不是偏移量类型 "." 操作数为内存变量,但是其寻址方式为自动增量 "p" 操作数为一个合法的内存地址(指针) "g" 将输入变量放入eax ebx ecx edx 中的一个或是作为内存变量 "X" 操作数可以是任何类型 "I" 0-31之间的立即数(用于32位移位指令) "J" 0-63之间的立即数(用于64位移位指令) "N" 0-255之间的立即数(用于out指令) "i" 立即数 "n" 立即数,有些系统不支持数字以外的立即数,这些系统应该使用"a" "=" 操作系统在指令中只是写的(输出操作数) "+" 操作系统在指令中是读写类型的(输入输出操作数) "f" 浮点数 "t" 第一个浮点寄存器 "u" 第二个浮点寄存器 "G" 标准80387 "%" 该操作数可以和下一个操作数交换位置 "#" 部分注释,从该字符到其后的逗号之间所有字母被忽略 "*" 如果选用寄存器,则其后的字母被忽略 eg. start process 0 by task[0] asm volatile( "movl %1,%%esp\n\t" //set task_[pid].thread.sp to esp "pushl %1\n\t" //push ebp "pushl %0\n\t" //push task_[pid].thread.ip "ret\n\t" //pop task_[pai].thread.ip to eip "popl %%ebp \n\t" : :"c"(task_[pid].thread.ip,"d"(task[pid].thread.sp)) ) 进程上下文切换: asm volatile( "pushl %%ebp\n\t" //save ebp "movl %%esp,%0\n\t" //save esp "movl %2,%%esp\n\t" //restore esp "movl $1f,%1\n\t" //save eip $1f指的是接下来的标号1:的位置 起到将进程再一次调用时的入口存到EIP中,即进程再一次运行会在此处继续。 这里的$1f书上解释为24行1:的地址,很让人费解。其实这是这只是at&t一种语法: 局部标号可以用数字,而且可以重复。在以这些标号为目的的转移指令上,标号要带上后缀,b表示向前,f表示向后。 "pushl %3\n\t" "ret\n\t" //restore eip "1:\t" //next process start here "popl %%ebp\n\t" :"=m"(prev->thread.sp),"=m"(prev->thread.ip) :"m"(next->thread.sp),"m"(next->thread.ip) );

 

二、实验

技术分享

 

技术分享

技术分享

 

技术分享

技术分享

发现错误:下图第6行注释内容应为/*val3=%eax*/

技术分享

 

2017-2018-1 20179219 《Linux内核原理与分析》第三周作业

标签:转移   ati   进程   read   而且   入栈   交换   获得   笔记   

原文地址:http://www.cnblogs.com/ghost00011011/p/7672453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!