20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
计算机是如何工作的
个人理解:计算机就是通过和用户进行交互,执行用户的指令,这些指令存放在内存中,通过寄存器存储,堆栈变化,来一步步顺序执行。
一、存储程序计算机工作模型
1.冯诺依曼体系结构—存储程序计算机
硬件角度(主板):通过cpu中IP寄存器指向一个代码段运行某些指令;
寄存区,指向内存的某一块区域(代码段)
IP:16位cpu上
EIP:32位cpu上
RIP:64位cpu上
程序员角度:将cpu抽象为一个for循环,只是执行下一条指令,从内存中取到下一条指令的内容
内存保存指令和数据,cpu负责解释和执行。通过总线连接
API:程序员于计算机的接口界面
ABI:程序于cpu的接口界面,二进制。
EIP:自加1,自动加到下一条指令(一条指令);可以本被CALL、RET、JMP、条件JMP指令修改。
二、X86汇编基础
1.X86cpu寄存器
32位:(低16位作为16位寄存器AX,BX,CX,DX,BP,SI,DI,SP)。
通用寄存器:EAX(累加器),EBX(基地址寄存器),ECX(计数寄存器),EDX(数据寄存器),EBP(堆栈基指针),ESI(变址寄存器),EDI(变址寄存器),ESP(堆栈顶指针)。
段寄存器:CS(代码段寄存器),DS(数据段寄存器),ES(附加段寄存器),SS(堆栈段寄存器),FS(附加段寄存器),GS(附加段寄存器)。
CPU在实际取指令的时候根据CS:EIP来准确定位一个指令。
标志寄存区,标识当前的一些状态。
64位寄存器:开头带有R的寄存器
2.汇编指令 b,w,l,q分别代表8位,16位,32位,64位
寄存器模式,以%开头的寄存器标识符。
立即数是以$开头的数字
直接寻址是直接访问一个指定的内存地址的数据
间接寻址是将寄存器的值作为一个内存地址来访问内存
变址寻址是在间接寻址之时改变寄存器的数值
Mov指令:寄存器寻址movl %eax, %edx:把eax寄存器的内容放到edx寄存器中
立即寻址movl $0x123,%edx:把0x123直接放到edx寄存器中
直接寻址movl 0x123,%edx:把内存地址0x123所指向的数据放到edx寄存器中
间接寻址movl (%ebx),%edx:把ebx寄存器存储的值作为内存地址,取出数据放到edx寄存器中
变址寻址movl 4(%ebx),%edx:把ebx寄存器存储的值加4作为内存地址,取出数据放到edx寄存器中
Linux内核使用的是AT&T汇编格式
Push指令:压栈pushl %eax
将栈顶指针减4,然后将eax寄存器中的值放在esp所指向的内存中。
Pop指令:出栈popl %eax
将栈顶指针所指向的内存中存放的数据放在eax寄存器中,然后将栈顶指针加4。
Call指令:call 0x12345
把当前的eip压栈,然后把0x12345这个立即数放到eip寄存器中
Ret指令:ret
将call指令中保存的eip值还原给eip,ret之后执行call之前的eip,即call之前的下一条指令
*号表示伪指令,不能被程序员直接使用,eip寄存器不能被直接修改,只能通过特殊指令间接修改。
参考资料:
//在64位环境下编译成32位的汇编
gcc -S -o ccode32.s ccode.c -m32
//链接时会缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
//编译链接成32位的可执行文件
gcc -o ccode32 ccode.c -m32
三、会变一个简单的C程序分析其汇编指令执行过程
Ebp栈底指针,esp栈顶指针,eax存储函数返回值,返回给上一级函数
四、通过汇编一个简单的C程序,分析汇编代码理解计算机是如何



如上代码堆栈变化情况:






















20135316王剑桥Linux内核学习笔记的更多相关文章
- 20135316王剑桥Linux内核学习笔记第四周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...
- 20135316王剑桥Linux内核学习笔记第三周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...
- 20135316王剑桥Linux内核学习记笔记第七周
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.可执行程序是怎么得来的? 编译 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Linux内核学习笔记之seq_file接口创建可读写proc文件
转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代 ...
- Linux内核学习笔记
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档 [力荐] 5. ...
- Linux内核学习笔记——内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
随机推荐
- Java读取json文件并对json数据进行读取、添加、删除与修改操作
转载:http://blog.csdn.net/qing_yun/article/details/46865863#t0 1.介绍 开发过程中经常会遇到json数据的处理,而单独对json数据进行 ...
- ES6中变量解构的用途—遍历Map结构
- BZOJ4269:再见Xor(线性基)
Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...
- zabbix 客户端添加自定义参数
0.zabbix客户端配置文件 server和serveractive都需要配置 1.配置自定义参数脚本文件 zabbix_agent.conf中UserParameter字段,可以配置多行 User ...
- 常用lua代码块
1.读取请求体中参数 local request_method = ngx.var.request_method local args --获取参数的值 if "GET" == r ...
- STlinkSWD模式连线方式
若使用SWD模式,则只需要连接4根线,7,9,20,1即SWDIO,SWDCLK,GND,VCC.VCC为3.3V
- Javascript异步编程之setTimeout与setInterval详解分析(一)
Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...
- handsontable合并项mergeCells应用及扩展
由于我这个项目主要是配置多表头信息,主要使用了handsontabel合并项功能. 但是,在该功能使用过程中发现了一些问题和一些自己根据需要做的一些扩展 $("#topFieldDiv&qu ...
- php中addslashes(),htmlspecialchars()
参考转自http://czf2008700.blog.163.com/blog/static/2397283200937103250194/ addslashes -- 使用反斜线引用字符串 stri ...
- 微信OAuth2.0网页授权接口
微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本号.主要实现了oauth网页受权,以及部分其它接口. 用法 为什么用OAuth2.0受权? 通过OAuth2 ...