码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核分析 期中总结

时间:2016-04-24 17:10:15      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

期中总结

 

计算机是如何工作的?

冯诺依曼体系结构:存储程序计算机,存储程序与程序控制

X86汇编基础:mov,push,pop,call,ret

汇编一个简单的C程序分析其汇编指令执行过程:汇编代码执行过程在堆栈中的变化

 

操作系统是如何工作的?

函数调用堆栈

三个法宝:

1.存储程序计算机工作模型
2.函数调用堆栈
3.中断

操作系统的两把剑:

1.中断上下文切换
2.进程上下文切换

建立框架:

pushl %ebp
movl %esp,%ebp

拆除框架:

movl %ebp,%esp
popl %ebp
ret

借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断

CPU和内核代码共同实现了保存现场和恢复现场

在mykernel基础上构造一个简单的操作系统内核

C代码宏嵌入汇编代码的写法

asm(

         汇编语句模板;

         输出部分;

         输入部分;

         破坏描述部分);

 

 

构造一个简单的Linux系统MenuOS

idle是0号进程,关于0号进程和1号进程,所谓道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)

 

扒开系统调用的三层皮(上)

用户态、内核态和中断处理

中断处理是从用户态进入内核态主要的方式

系统调用概述和系统调用的三层皮

系统调用是特殊的中断

三层皮:

1.API
2.中断向量
3.中断服务程序

 

扒开系统调用的三层皮(下)

给MenuOS增加time和time-asm命令

在MenuOS中添加命令的过程分四步:

1.更新menu代码到最新版

2.在main函数中增加MenuConfig

3.增加对应函数

4.make rootfs

使用gdb跟踪系统调用内核函数sys_time

系统调用在内核代码中的工作机制和初始化

技术分享

 

进程的描述和进程的创建

进程的描述

进程的三大功能

1.进程管理
2.文件管理
3.内核系统

进程的状态变化

技术分享

进程的创建

在fork中,两个进程,fork系统调用在父子进程个返回一次

子进程 pid=0

父进程 pid=子进程的id


新进程是从ret_ from_ fork开始执行

 

可执行程序的装载

预处理、编译、链接和目标文件的格式

技术分享

格式:

技术分享

三种文件

1.可重定位文件
2.可执行文件
3.共享Object文件

两个链接器:链接编辑器,动态链接器

庄周(调用execve的可执行程序)入睡(调用execve陷入内核),醒来(系统调用execve返回用户态)发现自己是蝴蝶(被execve加载的可执行程序)

庄子和蝴蝶:你可以装载我,我可以装载你

 

进程的切换和系统的一般执行过程

进程的调度时机与进程的切换

不同类型的进程有不同的调度需求

第一种分类:

I/0-bound:频繁的进程I/0,通常会花费很多时间等待I/O操作的完成

CPU-bound:计算密集型,需要大量的CPU时间进行运算

第二种分类:批处理进程,实时进程,交互性进程(shell)

Linux系统的一般执行过程

最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程

  • 正在运行的用户态进程X

  • 发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).

  • SAVE_ALL //保存现场

  • 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换

  • 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)

  • restore_all //恢复现场
  • iret - pop cs:eip/ss:esp/eflags from kernel stack

  • 继续运行用户态进程Y

几种特殊情况

通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;

内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;

创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;(next_ip=ret_from_fork)

加载一个新的可执行程序后返回到用户态的情况,如execve;

 

关于《Linux内核分析》

这是一本关于Linux内核的书:内核的目标,为达到目标所进行的设计以及设计的实现

 

从内核出发

内核有独一无二的特质,它实施自己的规则和奖罚措施,拥有整个系统的最高管理权

读书笔记链接:一二章

 

系统调用

描述了系统调用到底是什么,与库函数和API又怎样的关系

Linux程序如何实现系统调用,执行系统调用的连锁反应:陷入内核,传递系统调用号和参数,执行正确的系统调用函数,并把返回值带回用户空间

如何增加系统调用

读书笔记链接:第五章

 

调试

内核的调试:调试过程起始是一种寻求实现与目标偏差的行为

内核内置的调试架构,调试程序,记录日志,git二分法查找

读书笔记链接:第十八章

 

 

进程管理

操作系统中的核心概念:进程

进程的一般特性,进程与线程之间的关系,Linux如何存放和表示进程(task_struct,thread_info),如何创建进程(通过fork(),实际上最终是clone()),如何把新的执行映像装入到地址空间(exec()系统调用族),如何表示进程的层次关系,父进程如何收集后代的信息(wait()系统调用族),进程最终如何消亡(强制,或者调用exit())

读书笔记链接:第三章

 

链接

《深入理解计算机系统》中的内容

读书笔记链接:类似的第七章笔记

 

进程调度

进程调度程序是内核重要的组成部分

新CFS调度程序:适合众多可运行的进程,具有伸缩性,在调度周期和吞吐量之间求得平衡,满足各种负载的要求

进程调度所遵循的基本原则、具体实现、调度算法、牧犬Linux内核所使用的接口

读书笔记链接:第四章

 

Linux内核分析 期中总结

标签:

原文地址:http://www.cnblogs.com/javablack/p/5427326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!