Linux期中总结

  • Linux课程第一周实验及总结:[http://www.cnblogs.com/20135302wei/p/5218607.html]

    • 冯诺依曼体系结构的核心思想是存储程序计算机。在计算机中有两种指令,一是用户指令,一是系统调用。

    • 当用户使用计算机时,计算机根据其汇编的指令一步步运行,当使用系统调用完后,再返回用户模式,保证系统的稳定。

    • 程序中执行call的堆栈变化
    • 汇编基础
      通用寄存器

      16位  32位

      AX    eax 累加器
      BX    ebx 基址寄存器
      CX    ecx 计数寄存器
      DX    edx 数据寄存器
      BP    ebp 堆栈基址指针
      SI     esi 变址寄存器
      DI     edi 变址寄存器
      SP     esp 堆栈顶指针

  • Linux课程第二周实验及总结:[http://www.cnblogs.com/20135302wei/p/5248478.html]

    • 函数调用约定

      函数调用约定 参数传递顺序 负责清理参数占用的堆栈
      __pascal 从左到右 调用者
      __stdcall 从右到左 被调函数
      __cdecl 从右到左 调用者
      • 调用函数的代码和被调函数必须采用相同的函数的调用约定,程序才能正常运行。

        Windows中C/C++程序的缺省函数调用约定是__cdecl
        linux中gcc默认用的规则是__stdcall
    • 三个法宝

      存储程序计算机、函数调用堆栈、中断机制
    • 两把宝剑

      中断上下文、进程上下文的切换
  • linux课程第三周实验及总结:[http://www.cnblogs.com/20135302wei/p/5273142.html]

    • 计算机的启动过程概述

      • x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置。
      • BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。这里一般是把硬盘的第一个扇区MBR和活动分区的引导程序加载到内存(即加载BootLoader),加载完整后把控制权交给BootLoader。
      • 引导程序BootLoader开始负责操作系统初始化,然后起动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img
      • 内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。
      • 一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。
        • initrd文件的功能主要有两个:
        • 1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)
        • 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去
  • linux课程第四周实验及总结:[http://www.cnblogs.com/20135302wei/p/5289989.html]

    • system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号

      • 一个应用程序调用fork()封装例程,那么在执行int $0x80之前就把eax寄存器的值置为2(即__NR_fork)
      • 在系统调用号( eax)之外,参数的个数不能超过6个( ebx,ecx, edx, esi, edi, ebp)
    • 当用户态进程调用一个系统调用时, CPU切换到内核态并开始执行一个内核函数。
      • 在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常
  • linux课程第五周实验及总结:[http://www.cnblogs.com/20135302wei/p/5316624.html]

      • 给MenuOS增加time和time-asm命令(四步操作命令)
    • 系统调用的中断处理过程



    • 进程的作用:将信号、进程间通信、内存管理和文件系统联系起来
    • 操作系统的三大功能: 进程管理、内存管理、文件系统
    • 内核通过唯一的进程标识PID来区别每个进程
    • fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建
      1号进程是所有用户态进程的祖先,0号进程是所有内核线程的祖先
  • linux课程第七周实验及总结:[http://www.cnblogs.com/20135302wei/p/5352571.html]

    • execve系统调用

      • Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数

        • int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

          • execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。
        • 库函数exec*都是execve的封装例程

      execve和fork都是特殊一点的系统调用:一般的都是陷入到内核态再返回到用户态。
      
      fork父进程和一般进程调度一样,子进程返回到一个特定的点ret_from_fork,子进程是从ret_from_fork开始执行然后返回到用户态;
      
      execve特殊:执行到可执行程序--陷入内核--构造新的可执行文件--覆盖掉原可执行程序--返回到新的可执行程序,作为起点(也就是main函数) ,需要构造他的执行环境;
  • linux课程第八周实验及总结:[http://www.cnblogs.com/20135302wei/p/5388498.html]

    • 进程切换在内核中实现的时机有以下三个时机

        • 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();

        • 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;

        • 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

  • linux课程课本第1-2章学习笔记:[http://www.cnblogs.com/20135302wei/p/5280800.html]

    • 处理器的活动必然其下三者之一:

      • 运行于用户空间,执行用户进程
      • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
      • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
    • 内核开发的特点
      • 内核开发时既不能访问C库也不能访问标准的C头文件
        应对:include/linux文件夹中包含了所需的内核头文件。
      • 内核编程时必须使用GNU C
      • 内核编程时缺乏像用户空间那样的内存保护机制
        内核中内存不分页。
      • 内核编程时难以执行浮点运算
      • 内核给每个进程只有一个很小的定长堆栈
      • 由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
        SMP:对称多处理系统。
        常用的解决竞争的方法:自旋锁信号量
      • 要考虑可移植性的重要性
        诸如保持字节序,64位对其,不假定字长和页面长度等。
  • linux课程课本第3章学习笔记:[http://www.cnblogs.com/20135302wei/p/5335493.html]

    • 进程和线程

    • 进程的任务结构

    • 进程和线程的创建

    • 进程的终止

  • linux课程课本第4章学习笔记:[http://www.cnblogs.com/20135302wei/p/5389439.html]

    • 调度:调度是一个平衡的过程。一方面,它要保证各个运行的进程能够最大限度的使用CP;另一方面,保证各个进程能公平的使用CPU。

    • 调度功能:决定哪个进程运行以及进程运行多长时间。

    • 调度实现原理:与进程的优先级有关

    • Linux上调度实现的方法:O(1)的调度算法

    • 调度相关的系统调用

  • linux课程课本第5章学习笔记:[http://www.cnblogs.com/20135302wei/p/5302683.html]

    • Linux 内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和参数,执行正确的系统调用函数,并把返回值带回用户空间。
    • system_ call()函数通过将给定的系统调用号与NR_ syscalls 做比较来检查其有效性。如果它大子或者等于NR_syscalls,该函数就返回-ENOSYS
  • linux课程课本第18章学习笔记:[http://www.cnblogs.com/20135302wei/p/5327484.html]

    • 调试过程其实是一种寻求实现与目标偏差的行为。
    • oops是内核告知用户有不幸发生的最常用的方式。

    • 内核bug的原因可能有:

      - 错误代码
      - 同步时发生的错误,例如共享变量锁定不当
      - 错误的管理硬件
      - ……

      内核bug发作的症状可能有:

      - 降低所有程序的运行性能
      - 毁坏数据
      - 使得系统处于死锁状态
      - ……

      内核开发比起用户开发要多考虑一些独特的问题,比如:

      - 定时限制
      - 竞争条件
      - ……
      原因是允许多个线程在内核中同时运行。
  • 《深入理解计算机系统》第7章学习笔记:[http://www.cnblogs.com/20135302wei/p/5357264.html]

    • 符号——全局符号和本地符号、符号表、符号解析
    • 链接——静态链接、动态链接(链接又包括两个主要任务:符号解析和重定位)
    • 链接文件的创建及引用——gcc、ar rcs、sharedj及fPIC命令参数
    • 重定位——重定位条目、重定位符号引用(PC相对引用和绝对引用)
    • 目标文件——可重定位目标文件(其中又详细介绍了ELF可重定位文件的结构及格式)、可执行目标文件、共享目标文件
  •         链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。
    
            链接可以执行于编译时,即源代码被翻译成机器代码时;也可执行于加载时,即在程序被加载器加载到存储器并执行时;甚至执行于运行时,由应用程序来执行。

20135302魏静静——Linux课程期中总结的更多相关文章

  1. 20135302魏静静——linux课程第三周实验及总结

    linux课程第三周实验及总结 一.实验:跟踪分析Linux内核的启动过程 使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxKer ...

  2. 20135302魏静静——linux课程第四周实验及总结

    linux课程第四周实验及总结 一.实验 我选择的是第20号系统调用,getpid 代码如下: /* getpid.c */ #include <unistd.h> #include &l ...

  3. 20135302魏静静——linux课程第五周实验及总结

    linux课程第五周实验及总结 一.学习总结 给MenuOS增加time和time-asm命令(四步操作命令) rm menu -rf 强制删除git clone http://github.com/ ...

  4. 20135302魏静静——linux课程第六周实验及总结

    linux课程第六周实验及总结 实验及学习总结 1.进程描述符task_struct数据结构 进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 操作系统的三大功能: 进程管理.内存管理.文 ...

  5. 20135302魏静静——linux课程第七周实验及总结

    linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——g ...

  6. 20135302魏静静——linux课程第八周实验及总结

    linux课程第八周实验及总结 实验及学习总结 1. 进程切换在内核中的实现 linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的. 实现的时机有以下三个时机: 中断处理过程(包括时钟中 ...

  7. 20135302魏静静Linux内核分析第二周学习总结

    操作系统是如何工作的 1. 小结:计算机是怎样工作的 三个法宝 存储程序计算机.函数调用堆栈.中断机制 两把宝剑 中断上下文.进程上下文的切换 2. 堆栈 堆栈是C语言程序运行时必须的一个记录调用路径 ...

  8. Linux内核分析课程期中总结

    Linux内核分析课程期中总结 姓名:王朝宪 学号:20135114 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  9. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

随机推荐

  1. iOS - UITableView判断reloadData加载数据已经结束

    问题: stackoverflow上有人提问这样的问题 http://stackoverflow.com/questions/16071503/how-to-tell-when-uitableview ...

  2. c++11——改进容器性能

    使用emplace_back就地构造 emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升. ...

  3. Web和Native使用外部字体ttf方法

    论坛教程:http://bbs.egret.com/forum.php?mod=viewthread&tid=24879&extra=&highlight=%E5%AD%97% ...

  4. URL上的中文编码

    参考:http://www.chinaz.com/web/2013/0226/293639.shtml 一 URL上拼接中文会进行编码 在URL上拼接中文时,比如www.abc.com?season= ...

  5. SignalR实现在线聊天室功能

    一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> ...

  6. 【BZOJ1500】[NOI2005]维修数列 Splay

    [BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...

  7. idea创建maven多应用工程

    新建一个project ,名称为ismp,新建三个module,一个公共依赖module common,一个web module adminweb,一个java后台类 user; 目录结构如下: 如果 ...

  8. 微信小程序 --- 页面渲染

    page.wxml文件 <view>{{text}}</view> page.js 文件: //获取应用实例 const app = getApp() Page({ data: ...

  9. codeforces#505--C Plasticine Zebra

    C. Plasticine zebra time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. HDU_1457_后缀自动机四·重复旋律7

    #1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成 ...