第三章 操作系统用户界面总结

1. 操作系统启动过程

① BIOS加电自检, 查找启动设备

③ 主引导记录MBR

④ 硬盘启动

⑤ OS取得系统控制权,加载OS内核

1148102-20170810165506589-1074448099

1.1 BIOS加电自检,查找启动设备

BIOS(Basic Input/Output System)是基本输入输出系统的简称。BIOS 能为电脑提供最低级、最直接的硬件控制与支持,是联系最底层的硬件系统和软件系统的桥梁。为了在关机后使 BIOS 不会丢失,早期的 BIOS 存储在 ROM 中,并且其大小不会超过 64KB;而目前的 BIOS 大多有 1MB 到 2MB,所以会被存储在闪存(Flash Memory)中。

1.1.1 BIOS的主要作用:

(1)CPU 加电后会首先执行 BIOS 程序,其中 POST(Power-On Self-Test)加电自检程序是执行的第 一个例行程序,主要是对 CPU、内存等硬件设备进行检测和初始化。

(2)BIOS 中断调用即 BIOS 中断服务程序,是计算机系统软、硬件之间的一个可编程接口。开机时,BIOS 会通知 CPU 各种硬件设备的中断号,并提供中断服务程序。软件可以通过调用 BIOS 中断对软盘驱动器、键盘及显示器等外围设备进行管理。

(3)BIOS 会根据在 CMOS 中保存的配置信息来判断使用哪种设备启动操作系统,并将 CPU 移交给操作系统使用。

1.1.2 BIOS的执行过程:

(1)在CPU加电之后,会把CPU所有寄存器的值设为默认值,除了CS寄存器的值改为0xFFFF,其他寄存器的值都为0,这样,根据CS 和 IP的值就可以找到指令的物理地址0xFFFF:0x0000,也就是0xFFFF0。
(2)这时CPU就在这个位置开始执行,这里存放的一条无条件跳转指令JMP,跳转到BIOS的真正启动代码处。
(3)BIOS首先进行POST(Power-On Self Test,加电后自检),POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
(4)BIOS 程序在执行一些必要的开机自检和初始化后,会将自己复制到从 0xA0000 开始的物理内存中并继续执行
(5)然后,BIOS 开始搜寻可引导的存储设备(即根据用户指定的引导顺序从软盘、硬盘或是可移动设备中寻找)。如果找到,则将存储设备中的引导扇区读入物理内存 0x7C00 处,并跳转到 0x7C00 继续执行,从而将 CPU 交给引导扇区中的 Boot 程序。

1.1.3 BIOS总结:

  • 不属于硬件与软件,属于固件(以硬件存在的软件);
  • 位置:F0000——FFFFF;
  • 功能:引导启动配置→基本的设备I/O服务→加电自检和自举;

1.2 主引导记录MBR

​ BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。之后计算机加载该设备中第一块扇区到0x7c00,大小为512个字节,如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)

1.2.1 主引导记录的结构

主引导记录只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。

主引导记录由以下三部分组成:

(1) 第1-446字节:调用操作系统的机器码。
在CPU上电之后,若由硬盘启动,则BIOS将硬盘的主引导记录(位于0柱面、0磁道、1扇区)读入7C00处,然后将控制权交给主引导代码。主引导代码的任务包括:
① 扫描分区表,找到一个激活(可引导)分区;

​ ② 找到激活分区的起始扇区;

​ ③ 将激活分区的引导扇区装载到内存0x7C00处;

(2) 第447-510字节:分区表(Partition table),将硬盘分成若干个区。

(3) 第511-512字节:主引导记录签名(0x55和0xAA)。

1.2.2 分区表

​ 硬盘分区有很多好处,考虑到每个区可以安装不同的操作系统,"主引导记录"因此必须知道将控制权转交给哪个区。分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区"

每个主分区16个字节,由6个部分组成:

(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。

(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。

(3) 第5个字节:主分区类型。

(4) 第6-8个字节:主分区最后一个扇区的物理位置。

(5) 第9-12字节:该主分区第一个扇区的逻辑地址。

(6) 第13-16字节:主分区的扇区总数。

1.3 硬盘启动

​ 这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。

1.3.1 情况A:卷引导记录

​ 前面提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"卷引导记录"(Volume boot record,缩写为VBR)。"卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。

1.3.2 情况B:扩展分区和逻辑分区

​ 随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。

  • 计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。

  • 计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。

1.3.3 情况C:启动管理器

​ 在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。

Linux环境中,目前最流行的启动管理器是Grub

bg2013021505

1.4 OS取得系统控制权,加载OS内核

控制权转交给操作系统后,操作系统的内核首先被载入内存。以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。

​ 然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。

​ 至此,全部启动过程完成。

1.5 相关概念

1.5.1 计算机工作模式

所谓工作模式,是指CPU的寻址方式、寄存器大小、指令用法和内存布局等;

(1)实模式:实地址模式,计算机刚刚加电启动时进入的模式。PC 机加电后,CPU 进入实模式,分段管理内存,最多访问 1M 地址空间(没 ; 有打开 A20 的情况下)。

  • 程序按照8086寻址方式访问0h-FFFFh空间(1MB)

  • 寻址方式:物理地址(20位)=段地址:偏移地址

  • CPU单任务运行

(2)实模式存取的1MB空间:

  • 00000-9FFFF(640k):基本内存

  • A0000-BFFFF(128K):显卡显存(存储显卡将要处理的数据)

  • C0000-FFFFF(256K):BIOS

    ​ C0000-C7FFF:显卡BIOS

   C8000-CBFFF:IDE控制器BIOS

   F0000-FFFFF:系统BIOS:完成系统启动配置;基本的设备I/O服务;系统的加电自检和自举。

20171223130749492

(3)保护模式:内存保护模式,操作系统启动以后进入的模式

  • 寻址方式:段(32位)和偏移量(32位),寻址4GB空间

  • 使用段页式寻址机制

  • 使用了虚拟地址的概念

  • 应用程序和操作系统都被保护起来了

  • CPU此时支持多任务

reference

【操作系统原理概述】第三章 操作系统用户界面https://blog.csdn.net/yzt629/article/details/91894818

实模式和保护模式https://blog.csdn.net/qq_37653144/article/details/82818191

浅谈操作系统-启动过程https://blog.csdn.net/wchstrife/article/details/78879554

计算机是如何启动的?http://www.ruanyifeng.com/blog/2013/02/booting.html

电脑到底是怎么启动的,可能远不像你想的那么简单https://www.bilibili.com/video/BV1CJ411C72i/?spm_id_from=trigger_reload

操作系统启动https://blog.csdn.net/weixin_30739595/article/details/95632407

华科操作系统原理第三章


2. 操作系统生成

​ 满足特定硬件环境和用户的需要,组装和构建操作系统的过程

2.1 主要步骤

  • 根据硬件环境/用户要求配置功能模块和构造参数
  • 构建OS的映像

2.2 生成前提

  • 操作系统由可拆装模块构成
  • 有交互式配置工具
  • 有映像构建工具

例:Liunx操作系统的生成

1、获取Liunx内核的源代码

2、选择和启动内核配置程序

3、根据需要配置内核模块和参数

  • 设置对可加载模块支持
  • 设置CPU的类型
  • 对普通的一些属性进行设置
  • 并口支持
  • 即插即用配置
  • 块设备支持的选项
  • 选取TCP/IP networking选项
  • 网络设备支持的选项
  • 鼠标设置选项
  • 文件系统类型
  • 声卡驱动
  • USB接口支持

4、重新编译新的内核

5、编译和安装模块

6、启动新内核

  • cp bzImage /boot/bzImage (拷贝到目录下)
  • GRUB(配置)

reference

操作系统用户界面——操作系统生成https://blog.csdn.net/GM_AMRC/article/details/100073558


3. 用户界面

3.1 用户界面概念

3.1.1 用户界面定义

​ OS提供给用户控制计算机的机制,又称用户接口。

3.1.2 用户界面分类

(1)操作界面

(2)系统调用(system call,系统功能调用,程序界面)

3.1.3 典型的操作界面

  • 图形界面
  • 命令界面
  • 批处理命令/程序

操作界面

  • 图形用户界面(GUI)

​ 窗口,图标,菜单,按钮,鼠标(消息,事件)

  • 键盘命令(COMMAND)

​ 在控制台环境下接收键盘输入的命令

​ 类型:普通命令、批处理程序、shell

3.1.4 批处理

  • 普通命令的集合,批执行,由command解释执行

  • 支持变量替换、条件、转移、循环、注释等简单语法

  • *.BAT(windows后缀)

3.1.5 shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

  • shell是操作系统与用户交互的界面

  • 表现为通过控制台执行用户命令的方式

  • shell本身不执行命令,仅仅是组织和管理命令

3.1.6 Bash为现在主流的shell

Bash功能:

  • 命令行编辑功能
  • 命令和文件名补全功能
  • 命令历史功能
  • 命令别名功能
  • 提供作业控制功能
  • 管道与重定向
  • 具有将命令序列定义为功能键的功能
  • shell脚本编程

3.2 shell脚本编程

脚本(Script)通过类似程序的方式执行具有一定逻辑顺序的命令序列完成较复杂的功能和人机交互。

  • 脚本程序保护在文本文件中
  • 脚本程序是shell命令语句的集合
  • shell脚本程序由shell环境解释执行
  • 执行shell脚本文件需要具有可执行属性:Chmod+x MyScript.sh

运行方法

1、直接运行(用缺省版本的shell运行脚本程序)

2、使用特定版本的shell执行脚本

$bash first_script
  • 指定一个特定shell版本(此例是bash)来执行该脚本
  • first_script逐行执行脚本中的命令并依次输出结果。
  • 当脚本文件中的命令依次执行完毕,该临时子shell也自动结束运行,
  • 返回到用户原来使用的shell状态。

3、在脚本文件首行指定shell

  • 在脚本开头增加一行:

    #!/bin/bash      ——#!必须顶格,后接shell全路径
    
  • 可从/etc/shell获知所有可用shell及其绝对路径。

reference

操作系统用户界面——用户界面https://blog.csdn.net/GM_AMRC/article/details/100075256

Shell 教程https://www.runoob.com/linux/linux-shell.html


4. 系统调用

4.1 系统调用定义

​ 操作系统内核为应用程序提供的服务/函数(使用代码调用固定函数)

4.2 特点

  • 运行于核态,每个系统都有独一的调用和函数编号,调用过程中有“自愿中断”

4.3 linux系统调用

  • 应用程序隐式调用→编译有INT 80h的代码→将用户定义的函数转义为内核实现→内核实现

1)作用

① 提高了系统的可扩展性

② 增强了系统的可靠性

③ 可移植性强

④ 提供了对分布式系统的支持

⑤ 融入了面向对象技术

2)如何使用

① 客户只能通过以公有的方式定义的接口使用服务器,这意味着客户(客户程序员)唯一的责任是了解接口。

② 服务器(服务器程序设计人员)的责任是确保服务器根据该接口可靠并准确的执行。

③ 服务器设计任务只修改设计的实现细节,而不能修改接口。

这样程序员就能够独立的对客户和服务器进行改进,对服务器的修改不会对客户的行为造成意外的影响。

问题

1. 系统BIOS的功能有哪些?

① 系统启动配置 ② 基本的设备1/0服务 ③ 系统的加电自检和启动

2. 计算机加电后执行的第一条指令存放在哪里,有什么特点?

位置:第一条指令的位置在FFFF:0000,也就是物理地址FFFF0

特点:???????

reference

开机后的第一条指令https://blog.csdn.net/u010383242/article/details/50586782

3. 初始引导的目的和主要过程是什么?

目的:把OS核心装入内存,并使之开始工作接管计算机系统

主要过程:

  1. 加电,JUMP POST
  2. BIOS中的启动程序运行
  3. 启动程序
    • 读取0面0道第一扇区内容(1MB)
    • 加载MBR中的引导程序
  4. 引导程序
    • 根据相关参数,读取硬盘指定位置的文件到内存
    • 加载硬盘上OS内核,并初始化基本参数
  5. OS内核:逐步加载OS剩余部分,直至最后完全控制计算机

4. 何为操作系统的生成?简述Linux内核的生成过程。

操作系统生成的定义:满足特定硬件环境和用户的需要,组装和构建操作系统的过程

Linux内核的生成过程:

1、获取Linux内核的源代码
2、选择和启动内核配置程序
3、根据需要配置内核模块和参数
4、重新编译新的内核
5、编译和安装模块
6、启动新内核

5. 何为用户界面?有哪些类别?各有什么特点?

用户界面:OS提供给用户控制计算机的机制,又称用户接口。

类别:

(1)操作界面

(2)系统调用(system call,系统功能调用,程序界面)

6. 何为shell?有哪4类典型的shell?

何为shell:shell是操作系统与用户交互的界面,表现为通过控制台执行用户命令的方式,shell本身不执行命令,仅仅是组织和管理命令;

image-20200823143737350

4类典型的shell:

  • Bourne Again Shell (简称bash)

  • Bourne Shell(简称sh)

  • C-Shelll(简称csh)

  • Korn Shell(简称ksh)

7. 何为输出重定向?举一个Linux或Windows中的重定向的应用命令或例子。

输出重定向:指不使用操作系统默认的标准输出设备显示信息,而是指定某个文件做为标准输出设备来存储文件信息。简单来说,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏)。

linux输出重定向例子:

  • 将标准输出重定向到文件
    $ ls /etc/ >etcdir.log

8. 试述运行shell脚本程序的三种方式?

1、直接运行(用缺省版本的shell运行脚本程序)

2、使用特定版本的shell执行脚本

3、在脚本文件首行指定shell

9. 系统调用与普通用户态函数比较,有何异同点?

系统调用:

  1. 使用INT和IRET指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备;
  2. 依赖于内核,不保证移植性;
  3. 在用户空间和内核上下文环境间切换,开销较大;
  4. 是操作系统的一个入口点;
  5. 系统调用由操作系统核心提供,运行于核心态;

函数调用:

  1. 使用CALL和RET指令,调用时没有堆栈切换;
  2. 平台移植性好;
  3. 属于过程调用,调用开销较小;
  4. 普通的函数调用由函数库或用户自己提供,运行于用户态;

reference

系统调用和函数调用的区别https://blog.csdn.net/qq_31759205/article/details/80602357

给linux系统增加一个系统调用https://blog.csdn.net/qq_41175905/article/details/80529245

10. 何为隐式系统调用?

?????????????????????

11. 试述Linux系统调用(INT 80H)的工作原理?

image-20200823151805753

12. 试述为Linux增加新的系统调用的过程?

  1. 添加源代码

    第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_标志;

  2. 连接新的系统调用

    添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存 在。为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件;

  3. 重建新的Linux内核

    为使新的系统调用生效,需要重建Linux的内核。这需要以超级用户身份登录;

  4. 用新的内核启动系统

    要使用新的系统调用,需要用重建的新内核重新引导系统。为此,需要修 改/etc/lilo.conf文件;

  5. 使用新的系统调用

    在应用程序中使用新添加的系统调用。

reference

如何在Linux中添加新的系统调用

13. 记录你电脑启动过程中输出的所有信息,理解其表示什么含义?有没有哪些信息是可以根据用户配置的不同可以改变或定制的?

win7系统自启动过程https://wenku.baidu.com/view/591cd58076a20029bd642dea.html

14. 回顾汇编语言中关于寄存器结构和定义部分的知识,理解各个寄存器的基本作用和用法。

汇编语言中寄存器的作用https://blog.csdn.net/cdsdtt123/article/details/41411219

15. 尝试去理解用 menucofig命令去配置Linux内核时,配置界面上每个条目的含义和作用?

16. 在windows和Linux上练习使用输出重定向和管道命令,给出2-3个例子。

17. 在Windows和Linux上分别练习使用批处理程序和Shell脚本编程,实现“统计命令行上指定的文本文件中所有英文单词的个数,并在文末加上当前统计时间,例如:Checked at 2019.10.20”。写出你的实现思路。

编程实验

1. (实验目的:熟悉Windows批处理编程)在Windows环境下,编写一个批处理程序(算命大师.bat),程序运行后,输入:出生年月日(例如20000731)。系统输出你的属相和星座,例如:你属兔,狮子座。

2. (实验目的:熟悉Linux脚本编程)在Linux环境下,编写一个Shell脚本程序,能统计给定文本文件的单词数,行数。

3. (实验目的:了解操作系统生成的概念,熟悉Linux内核编译和裁剪)在Ubuntu或Fedora环境下裁剪和编译Linux内核,并启用新的内核。源代码下载网址:www.kernel.org.

4. (实验目的:熟悉Linux系统调用原理)在Ubuntu或Fedora环境下为Linux内核增加1-3个新的系统调用,并启用新的内核,编写一个应用程序测试新增加的系统调用是否能正确工作。源代码下载网址:www.kernel.org.

原文地址:https://www.cnblogs.com/victorxiao/p/13549823.html