zoukankan      html  css  js  c++  java
  • 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程序,分析汇编代码理解计算机是如何

    如上代码堆栈变化情况:





















  • 相关阅读:
    python转换emoji字符串
    python位运算符详细介绍
    python制作动态排序图
    docker安装mysql
    yum安装centos-7版nginx
    pysimplegui模块实现倒计时UI框
    pysimplegui模块实现进度条
    python枚举的应用enum
    第0-0课
    SV -- Array 数组
  • 原文地址:https://www.cnblogs.com/20135316wjq/p/5222424.html
Copyright © 2011-2022 走看看