20135316王剑桥Linux内核学习笔记

时间:2023-02-19 13:33:00

王剑桥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内核学习笔记

如上代码堆栈变化情况:
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记
20135316王剑桥Linux内核学习笔记

20135316王剑桥Linux内核学习笔记的更多相关文章

  1. 20135316王剑桥Linux内核学习笔记第四周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...

  2. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

  3. 20135316王剑桥Linux内核学习记笔记第七周

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.可执行程序是怎么得来的? 编译 ...

  4. Linux内核学习笔记-2&period;进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  5. Linux内核学习笔记-1&period;简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  7. Linux内核学习笔记之seq&lowbar;file接口创建可读写proc文件

    转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代 ...

  8. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  9. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

随机推荐

  1. 随笔分类 - &lbrack;C&num;6&rsqb; 新增特性

    C#6.0中引入的基本特性总结 [C#6] 7-索引初始化器 摘要: 0. 目录 C#6 新增特性目录 1. 老版本的代码 早C#3中引入的集合初始化器,可是让我们用上面的语法来在声明一个字典或者集合 ...

  2. TCP 与 UDP

    TCP Transmission Control Protocol,传输控制协议,传输层通信协议. 采用“带重传的肯定确认”(Positive Acknowledge with Retransmiss ...

  3. MVC小系列(四)【向RouteData里扔数据】

    向RouteData里扔数据 当Url做路由之后,QueryString里当然是不可能再存你的信息了,而信息包括控制器,action,参数都会存储在RouteData里,而一般这里的信息都是通过前一个 ...

  4. samentic 在IE9 不支持 transition 的解决方案

    本文原文链接为:http://www.cnblogs.com/jying/p/6377696.html  ,转载请注明出处. 在使用samentic过程中遇到 IE9 下报如下错误: 查阅了好多资料终 ...

  5. 利用工具爬取网站所有的html和js文件

    例图: 该工具下载地址为:http://www.tenmax.com/teleport/ultra/download.htm

  6. net core体系-web应用程序-4net core2&period;0大白话带你入门-6asp&period;net core配置文件

    asp.net core配置文件   读取配置文件 asp.net core使用appsettings.json代替传统.net framework的web.config中的<appSettin ...

  7. redis的事务不是原子性

    Reference: https://blog.csdn.net/u011692780/article/details/81213010 一.事务的四大特性 关系型数据库的事务具有四个特性: 1. 原 ...

  8. Centos7 安装系统服务、开机自启动

    Centos7 安装系统服务 1 编写可执行程序 * 这里可以是任意编程语言(C.C++.Java.PHP.Python.Perl ...)编写的程序: 当前假设此程序的执行目录为: /myservi ...

  9. C语言的第一天

    代码根本C语言(我不知道这句话,严不严谨) 2019年4月30日(day01) 软件Code::blocks #include <stdio.h> //导入标准的io库 #include ...

  10. 嵌入式开发之gb281818

    http://www.cnblogs.com/snake-hand/p/3157176.html http://blog.csdn.net/voipmaker/article/category/140 ...