• Linux内核分析 期中总结


    期中总结

    于佳心  原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

    计算机是如何工作的?

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

    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内核分析》教程,顿时感觉知识点捋顺了许多,为了不让辛苦学到的知识消失,还是需要定时复习一下 

  • 相关阅读:
    webpack配置
    gulp-babel 取消严格模式方法
    时间线
    tojson
    [[],[],[]]这样的数据转化成[{},{},{}]
    BUGFREE的安装
    Linux 打包压缩与搜索命令
    Linux 文件目录管理命令
    Linux 文本文件编辑命令
    Linux 工作目录切换命令
  • 原文地址:https://www.cnblogs.com/javablack/p/5427326.html
Copyright © 2020-2023  润新知