linux及安全第八周总结——20135227黄晓妍
实验部分
实验环境搭建
-rm menu -rf
git clone https://github.com/megnning/menu.git
cd menu
make rootfs
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
gdb
file ../linux-3.18.6/vmlinux
target remote:1234
![](http://images2015.cnblogs.com/blog/744818/201604/744818-20160417144449910-660272918.png)
设置断点
我设置的断点依次为:schedule,pick_next_task,context_switch,switch_to。不过这里跟踪不到switch_to。我们先来分析前面四个。
运行到schedule.
schedule的作用非常,它是进程调度的主体函数。pick_next_task是它里面重要的选择下一个进程的函数,context_switch是它里面实现进程的切换的函数。switch_to是保存进程上下文的函数。全部都在schedule内部。
运行到pick_next_task.这个方法的是先调度调度策略函数,选择一种调度策略以后,调度函数来选择下一个运行的进程
运行到context_switch.它是实现进程切换的函数。
在context_switch里跟踪到switch_to.
由于switch_to内部是汇编代码,我们无法继续跟踪,我们找来swtich_to的代码来分析:
从swtich_to理解进程上下文切换和中断上下文切换:
中断上下文切换是从用户态陷入内核,保存的是用户态进程的堆栈和状态,以及内核的堆栈和状态,在内核执行完毕以后,弹栈用户态进程的eip,flag等等,返回到用户态进程,继续执行。
进程上下文切换都发生在内核态,当一个进程时间片使用完,或者有优先级更高的(实时或者普通)进程进入进程就绪队列中,发生抢占时,先调用schedule,由pick_next_task选择下一个进程,swtich_to需要将当下的进程的堆栈和状态压栈保存,然后弹栈下一个进程的堆栈和状态,运行下一个进程。
总结部分
进程切换的关键代码switch_to分析
进程调度与进程调度的时机分析
进程调度算法多样化的原因
不同类型的进程有不同的调度需求,所以需要多种调度算法来满足其需求。
进程分类:
- 第一类
- I/O密集型(频繁进行I/O,要花费大量的时间等待I/O操作的完成)
- CPU密集型(计算密集型,需要大量的CPU时间进行运算,会导致其他交互进程反应迟钝)
- 第二类
- 批处理进程
- 实时处理进程
- 交互式进程
进程调度策略
是一组规则,决定什么时候以怎样的方式选择一个新的进程运行
linux的进程调度
- 根据优先级排队(优先级的值是调度算法判断的标准,优先级是根据特定的算法计算出的)
- 优先级是动态的(调度程序会根据进程的行为周期调整进程的优先级,例如,长时间等待,优先级上升;长时间在CPU运行,优先级下降)
可以设置优先级的系统调用
进程调度的时机的所有可能
- 用户态进程只能先被中断,才有进程调度的时机(所以用户态进程只能被动调度)
- 内核线程可以直接调用schedule()(但是它可能被时钟;中断I/O中断,它可能主动调度,也可能被动调度)
进程上下文切换相关代码分析
进程切换
目的:为了控制进程的执行,内核必须由能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程
与中断的区别:挂起正在执行的进程,要保存的现场和中断不一样。中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;然而进程上下文切换,它是在两个进程之间切换,需要保存以下现场:
- 用户地址空间:包括程序代码,数据,用户堆栈
- 控制信息:进程描述符,内核堆栈
- 硬件上下文(中断虽然也要保存,但是方法不同,进程切换使用switch_to机制)
schedule()函数
- schedule_sched中重要的代码
connect_switch如何实现进程的切换
switch_to如何实现保存堆栈和内核状态,需要重点理解它的汇编代码
- schedule_sched中重要的代码
linux系统的一般执行过程
linux系统的一般执行分析和特殊情况的分析
linux系统正在运行,此时正在运行用户态进程X,根据进程调度策略,要将X进程切换成Y进程,那这个切换的过程是怎样的呢?
- 一般情况
中断和中断返回。有中断上下文的切换;
在进程调度中,还有进程上下文的切换 - 特殊情况
- 至少有一方处于内核态
- 内核线程主动调度schedule
- 创建子进程
- 加载新的可执行程序
内核与舞女
0~3g用户态可以访问
0~4g内核态都可以访问
意思是,其实3g以上的空间,内核态进程都是共享的,用户态进程陷入内核之后,每个进程的数据段,代码段的地址空间都是完全相同的,只有在返回用户态以后才会有所区别。可以将内核比喻成taxi gril。哪一个进程请求,都可以进入内核态,之后又返回自己的用户态;当内核态没有进程的时候,就运行0号进程,自己空转。
linux系统构架和执行过程概览
linux操作系统构架概览
什么是操作系统以及操作系统存在的意义是什么
linux操作系统结构
ls——最简单也最复杂的操作
- 在控制台输入ls命令
- 为什么我们敲击键盘就会在终端上显示?涉及I/O中断,系统内部将当前进程中断,然后还要再控制台输出。这又涉及终端控制台设备驱动的概念。
- shell程序分析输入的参数,确定这是ls命令
- 什么是shell?终端解释程序。
- shell调用fork来生成shell本身的拷贝
- 中断解释程序会做什么呢?它会调用系统调用fork生成一个shell本身的拷贝
- 什么是系统调用?内存保护,内核态用户态相关,本质上是一个中断,int0x80陷入内核。还涉及创建子进程。
- 系统调用如何实现?中断,陷入内核。
- 调用exec系统调用将ls的可执行文件装入内存
- 设计内存管理模块,进程的地址空间,分页机制,文件系统,可执行文件格式ELF
- 从系统调用返回
- 装载的可执行程序
- 如何做到正确的返回?修改了原来的exec的系统调用,压入内核栈的ip和sp使他返回的时候能够正确地执行ls程序
- shell和ls都得以执行
从CPU的角度看linux系统的执行
从内存的角度看Linux系统的执行
linux及安全第八周总结——20135227黄晓妍的更多相关文章
- linux及安全第七周总结——20135227黄晓妍
实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...
- linux及安全第六周总结——20135227黄晓妍
总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...
- linux及安全第五周总结——20135227黄晓妍
(注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了.本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分.) 实验部分 使用g ...
- linux及安全第三周总结——20135227黄晓妍
总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init 内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...
- linux安全第一周总结——20135227黄晓妍
实验部分: 我将源代码做了修改,将其中一个数字修改为我学号27 2.在实验楼环境下将其保存为text.c并将其编译,得到text.s 3.将.开头的多余的语句删去了之后,我得到了32位环境的汇编代码 ...
- linux及安全第二周总结——20135227黄晓妍
实验部分: 首先运行结果截图 代码分析: Mypcb.h /* * linux/mykernel/mypcb.h * * Kernel internal PCB types * * Copyri ...
- linux及安全期中总结——20135227黄晓妍
Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- Linux基础入门学习笔记20135227黄晓妍
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍
第四章 进程调度 进程调度程序是一个内核子系统 分配有限的处理器时间和资源 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行) 基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个 ...
随机推荐
- c/c++左值和右值
C/C++中的变量有左值和右值之分,他们的区别主要如下: (1)左值可以放在赋值号 = 的左右两边,右值只能放在赋值号 = 的右边 (2)在C语言中,有名字的变量即为左值:而函数的运行结果或表达式中间 ...
- android基础组件---->Checkboxe的使用
由于使用比较简单,这篇博客涵盖Checkboxes和Radio Buttons和Toggle Buttons.好了我们开始今天的学习.我被世俗隐瞒,转身又被自己撞倒.从莫须有的罪名起步,行色简单,心术 ...
- 国内linux 镜像
北京理工大学开源软件镜像服务mirrors.ustc.edu.cn 开源中国社区软件镜像下载资源库mirrors.oss.org.cn 阿里云开源镜像站mirrors.aliyun.com<ig ...
- Elasticsearch 常用基本查询
安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch 为了介绍Elasticsearch中的不同查询类型,我们将对带有下列字段的文 ...
- 关于移动端rem 布局的一些总结
1.rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位 2.为什么web app要使用rem? 实现强大的屏幕适配布局(淘宝,腾讯,网 ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
- 09.Curator临时节点
使用Curator也可以简化Ephemeral Node (临时节点)的操作.临时节点驻存在ZooKeeper中,当连接和session断掉时被删除.比如通过ZooKeeper发布服务,服务启 ...
- 【转】SQL Server编程游标
在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: ...
- Python+ Calibre 处理 中文报纸
import re ##2 line='<a href=nw.D110000renmrb_20180401_1-01.htm><script>document.write(vi ...
- Centos6与Centos7的区别
前言 centos7与6之间最大的差别就是初始化技术的不同,7采用的初始化技术是Systemd,并行的运行方式,除了这一点之外,服务启动.开机启动文件.网络命令方面等等,都说6有所不同.让我们先来了解 ...