您的位置:首页 > 运维架构 > Linux

Linux内核第一节

2016-02-26 15:52 351 查看

存储程序计算机工作模型

存储程序计算机——冯诺依曼体系结构

IP:寄存器,总是指向内存的代码段。IP(16位) 32位(EIP) 64位(RIP)。

内存:保存数据和指令。

CPU:CPU从IP指向的内存地址取指令执行,执行之后IP自加一,然后继续执行

for(;;){
next instruction
}


API:应用程序编程接口。程序员与计算机的接口界面。

ABI:程序与CPU接口界面(二进制编码)。

X86寄存器

通用寄存器



段寄存器
CS:代码段寄存器,存储指令。CPU取指令时根据CS+eip来确定指令的地址。

DS:数据段寄存器,存储数据段的段值。

SS:堆栈段寄存器,存储堆栈段的段值。

FS、GS、ES:附加段寄存器,存储附加数据段的内容。

常用汇编指令

movl

pushl %eax:将eax寄存器放进堆栈的栈底。

subl $4,%esp movl %eax,(%esp)

popl %eax:将栈顶的数值放入eax里面。

movl (%esp),%eax addl $4,%esp

call 0x12345:函数调用,调用0x12345这个地址。

pushl %eip(*) movl $0x12345,%eip(*)

ret:将函数调用时候保存的eip出栈,执行函数调用之后的下一条指令。

popl %eip(*)

enter:将栈置为空

pushl %ebp movl %esp,%ebp

leave:撤销函数堆栈,释放内存空间

movl %ebp,%esp popl %ebp

常用寻址方式

寄存器寻址:%+寄存器名称,与内存无关。

movl %eax,%edx      edx=eax;


立即寻址:$+16进制的数字,将数值直接放进寄存器当中,与内存无关。

movl $0X123,%edx    edx=123;


直接寻址:一个16进制数字表示一个地址。

movl 0x123,%edx     edx=*(int32_t*)0x123;


间接寻址:寄存器的值表示一个内存地址,将这个内存地址中的值放进寄存器中。

movl (%ebx),%edx    edx=*(int32_t*)ebx;


变址寻址:括号外面的数字表示寄存器地址加一个立即数。

movl 4(%ebx),%edx   edx=*(int32_t*)(ebx+4);


注意:AT&T汇编格式与Intel汇编格式略有不同,linux内核使用的是AT&T汇编格式。

汇编一个简单的C程序分析其汇编指令执行过程

由于理论知识在上学期的博客中详细写过,所以这里直接用课后作业来说明

C语言代码







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: