Linux内核分析 02
二,操作系统是如何工作的
1、函数调用堆栈
三大法宝:存储程序计算机 函数调用堆栈 中断机制
堆栈:是C语言程序运行时必须的一个记录调用路径和参数的空间。是计算机内部现成的东西,我们直接使用。
包括函数调用框架、传递参数、保存返回地址、提供局部变量的空间等等。
堆栈相关寄存器:esp堆栈指针(栈顶)、ebp基址指针(栈底) * ebp在C语言中用作记录当前函数调用基址。
堆栈操作:push(栈顶地址减少四个字节)、pop(栈顶地址增加四个字节)(32位)
其他关键寄存器:cs:eip,总是指向下一条指令的地址。(call、ret)
//建立被调用函数的堆栈框架
pushl %ebp
movl %esp,%ebp
//被调用者函数体
//do sth
//拆除被调用者函数的堆栈框架
movl %ebp,%esp
popl %ebp
ret
call指令是将eip中下一条指令的地址保存在栈顶,设置eip指向被调用程序的代码开始处。
ret将该地址恢复到eip中
* 举例应用:首先,使用gcc -g 生成test.c的可执行文件test;然后再使用objdump -s获得test的反汇编文件。
有压栈必有出栈,有生必有死。
函数的返回值通过eax寄存器传递。
2,借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断
中断机制如何工作:CPU和内核代码共同实现保存现场和恢复现场。
mykernel的实验,诸如下图:
3,在mykernel基础上构造一个简单的操作系统内核
C语言代码中嵌入汇编代码: asm("statements" : output_regs :inout_regs :clobbered_regs); 输入、输出、破会描述、编译器优化、不允许编译器优化等等。
mysceh的具体内容
两个正在运行的进程之间做进程上下文转换
* 操作系统的两把剑:中断上下文和进程上下文的切换
时间片轮转的例子,时间片可以改小一点。
4,学习心得体会
基本了解了函数调用堆栈的过程和原理,中断机制的工作原理,以及mykernel的一些相关知识,最后学习了一下时间片轮转的实验举例。总的来说内容不多也不算少,还是需要一些时间来消化和理解的。很不错的一次自学。
Linux内核分析 02的更多相关文章
- 《Linux内核分析》实践4
<Linux内核分析> 实践四--ELF文件格式分析 20135211李行之 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格 ...
- Linux内核分析作业 NO.5
拔掉系统调用的三层皮(下) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- Linux内核分析作业 NO.4
扒开系统调用的三层皮(上) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)
LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
- linux内核分析作业5:分析system_call中断处理过程
1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
随机推荐
- JS 保存表单默认值 为空时自动填充默认值
var inputArray = document.getElementsByTagName("input"); var strArray = []; ; i < input ...
- android基础---->DiskLruCache的使用及原理
DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,今天我们开始对于DiskLruCache的学习.DiskLruCache的测试代码:DiskLruCache的测试代码下载.关于FidkLru ...
- HTML5+CSS3 表格设计(Table)
<style> body { width: 600px; margin: 40px auto; font-family: 'trebuchet MS', 'Lucida sans', Ar ...
- 查询hadoop参数变量
[hadoop@master hadoop]$ hive -S -e 'set -v'|grep querylog|grep -E -v 'CLASSPATH|class'hive.querylog. ...
- 【转载】网络安全---Strurts2漏洞介绍
Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,3 月 7 日带来了本年度第一个高危漏洞——CVE编号 CVE-2017-5638 .其原因是由于 Apache S ...
- Redis连接(二)
Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语 ...
- WebService 的简单使用
简单介绍 WebService是一种跨语言,跨进程,跨机器的数据交互技术. SOAP:简单对象访问协议,通过XML数据交互的轻量级协议,WebService就是采用的这种协议 WSDL:web服务描述 ...
- oracle的认证方式
使用as sysdba是使用操作系统验证方式,不需要输入密码
- Linux救援模式
Linux系统使用版本:CentOS 6.5 救援模式有什么作用: ◆可以更改root密码: ◆恢复硬盘.文件系统操作: ◆系统启动不来的时候,只能通过救援模式来启动: 救援模式启动的步骤如下: 1. ...
- 一致性hash 大众点评订单分库分表实践
井底之蛙 https://mp.weixin.qq.com/s?src=3×tamp=1543228894&ver=1&signature=uF6nV0yYseJ55 ...