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位系统:页 ...
随机推荐
- Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...
- sql server 数据库作业备份存储过程
DECLARE @fileName nvarchar(100) SET @fileName='D:\HFS\DataBase' + REPLACE(REPLACE(REPLACE(REPLACE(CO ...
- [POI2007]MEG-Megalopolis
传送门:嘟嘟嘟 第一反应是树链剖分,但是太长懒得写,然后就想出了一个很不错的做法. 想一下,如果我们改一条边,那么影响的只有他的子树,只要先搞一个dfs序,为什么搞出这个呢?因为有一个性质:一个节点的 ...
- apache出现You don’t have permission to access / on this server问题的解决
今天在部署一个系统时,在apache中新开了一个VirtualHost,然后设置了DocumentRoot,等访问时却提示“You don’t have permission to access / ...
- eclipse导出可执行jar包步骤
按步骤图文说明 第一步:选择要导出的工程,右键[export] 第二步:双击Java文件夹下的[Runnable Jar File] 第三步:该步骤分4步走 3.1 从下拉框选择该jar的入口文件,即 ...
- 非阻塞 sleep
在OpenResty里面选择使用库的时候,有一个基本的原则:尽量使用ngx Lua的库函数,尽量不用Lua的库函数,因为Lua的库都是同步阻塞的. 再来一个例子来说明阻塞API的调用对nginx并发性 ...
- WorldWind源码剖析系列:配置载入器类ConfigurationLoader
配置载入器类ConfigurationLoader主要从指定的路径中加载保存星球相关参数的xml文件,从中读取数据来构造星球对象及其所关联的可渲染子对象列表并返回.该类的类图如下所示. 该类所包含的主 ...
- Node基础知识点--学习笔记(一)
一:建立http服务器: 在D盘建立一个文件夹node,放入app.js,代码如下: var http = require('http'); http.createServer(function(re ...
- sphinx搜索 笔记
架构图: 安装sphinx,见文章http://my.oschina.net/ptk/blog/495435 sphinx关键的配置文件.在里面写查询的sql. 两个关键命令:indexer生成查询索 ...
- Scala--集合
一.主要的集合特质 Seq有先后顺序的序列,如数组列表.IndexedSeq通过下标快速的访问元素.不可变:Vector, Range, List 可变:ArrayBuffer, LinkedList ...