Linux内核第一节
存储程序计算机工作模型
存储程序计算机——冯诺依曼体系结构
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语言代码




Linux内核第一节的更多相关文章
- 嵌入式C语言自我修养 04:Linux 内核第一宏:container_of
4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型 ...
- linux内核第一宏 container_of
内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析 ...
- linux内核第一二章总结
1 Linux内核简介 1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.TCP/IP等新的特性. 2.Unix的特点: Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目 ...
- Linux内核第二节
作者:武西垚 深入理解函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 esp,堆栈指针,指 ...
- 『Linux』第一节: 部署虚拟环境
一. 准备工具 1. VMware Workstation Pro下载 1.1 VMware Workstation Pro 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA V ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核
HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核
HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...
- 《Linux内核分析》 第一节 计算机是如何工作的
第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- 《Linux内核分析》第一周学习报告
第一周:计算机是如何工作的 姓名:王玮怡 学号:20135116 第一节 存储程序计算机工作模型(冯诺依曼体系结构) IP指向的内存地址,取指令执行,完成后,IP值自加一,取下一条指令再执行. AP ...
随机推荐
- [python]pip 版本9.0.1升级到10.0.1故障解决办法
问题背景: 在做android自动化时使用到第三方库uiautomator时,提示要安装,但安装该uiautomator库时提示当前的pip版本偏低,需要安装10.0.1版本方可.但在升级到升级到该版 ...
- nginx 服务器在上传文件出现413代码的解决方法
打开nginx主配置文件nginx.conf 找到http{}段,添加client_max_body_size 20m;
- 打开Excel时提示“向程序发送命令时出现问题”
Excel界面中点击“文件”,选择“选项”,在弹出的“Excel选项”对话框中依次点击“高级”-“常规”,然后取消勾选”忽略使用动态数据交换(DDE)的其他应用程序”:
- git pull与本地修改冲突
1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 . $ git stash list 可以看到保存的信息: git stash暂 ...
- 【js】实现继承的6种方法
1.原型链 基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法. 让原型对象(B.prototype)等于另一个类型的实例(new A()), 即B.prototype = new A( ...
- linux下apache中httpd.conf的ServerAdmin 是设置的什么?
<VirtualHost 127.0.0.1:80> ServerAdmin ******@****.com DocumentRoot /home/aaa/sss ServerName s ...
- windows 环境下如何使用virtualenv python环境管理工具
1.安装工具 pip install virtualenv 2.新建项目文件夹并在文件夹内安装环境并命名为my_env,加入 virtualenv C:\Users\yxx\wp\my_env 3.激 ...
- leetcode55—Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- js基础知识入门总结
1.第一个js程序 一个项目包括三部分:前端(html.css.js).数据库.后端技术 引入方式:页面中直接写,script标签引入 js事件绑定: <input type="but ...
- statefulSet + headless service 学习记录 service :selector --> template :label
1.statefulset.yaml apiVersion: apps/v1kind: StatefulSetmetadata: name: webspec: serviceName: &q ...