操作系统用户界面

操作系统用户界面

3.1 操作系统启动过程
3.1.1 BIOS和主引导记录MBR

实模式和保护模式
实模式(实地址模式。REAL MODE)

  • 程序按照8086寻址方法访问0h - FFFFFh(1MB)空间
  • 寻址方式:物理地址(20位)=段地址:偏移地址。
  • CPU单任务运行

计算机的工作模式有两种,一个叫做实模式,一个叫做保护模式,在计算机刚刚加电启动的过程中计算机处实模式下面,实模式也叫REAL MODE。
实模式的特点就是在实模式下面程序安装8086的方式来 工作能够访问的内存空间是1MB在0h 一 FFFFFh这个范围里面。
1MB地址空间地址有20位采用段地址:偏移地址的方式来表示20位地址。段地址16位,偏移地址16位,CPU采用单任务运行,这是CPU刚开机的时候使用实模式。

保护模式(内存保护模式,PROTECT MODE)

  • 寻址方式: 段(32位)和偏移量(32位),寻址4GB空间
    • 段的属性:起始地址,存取属性,权限级别,…
  • 段页式寻址机制(段,页)
  • 虚拟地址,进程,封闭空间
  • 应用程序和操作系统运行的环境都被保护
  • CPU支持多任务

另外一种模式叫做保护模式,在操作系统启动起来以后,计算机也进入到了保护模式下面,保护模式也叫内存保护模式PROTECT MODE 保护模式的寻址方式和实模式发生了完全不同的变化。
在保护模式下面,段的概念有了新的含义,在保护模式下面采用了段页式的方式来进行寻址,用到了虚拟地址,应用程序和操作系统运行环境都被保护起来了。保护是保护了内存,CPU是多任务。
在这里插入图片描述
在实模式下面可以存取1MB存储空间,1MB是这样分配的,前面640K是基本内存,中间128K属于显卡,最末尾的256K属于BIOS。
在这里插入图片描述
BIOS又可以细分为以上三类,C0000 - - C7FFF属于显卡的BIOS;C8000 - - CBFFF属于IDE控制器的BIOS;最后F0000 - - FFFFF 最后的64KB属于系统BIOS。
系统BIOS
Basic I/O System (Firmware ,固件)

  • 基本输入/输出系统
  • 位置:F0000 - FFFFF
  • 功能
    • 系统启动配置
    • 基本的设备I/O服务
    • 系统的加电自检和启动

在这里插入图片描述
BIOS不属于硬件也不属于软件,我们把它叫做固件Firmware,固件是以硬件的方式存在,但是内部是软件是程序,以硬件形式存在的程序或软件我们把它叫做固件。
BIOS的中文就是基本的输入输出系统,顾名思义它能够进行系统的输入和输出。
它的位置位于最后的64KB,BIOS的功能有三个,第一个是完成系统的启动配置;第二个就是提供设备的基本IO服务;第三个是系统的加电自检和启动。

系统启动配置
CMOS设置

在这里插入图片描述
对系统的参数进行配置,对系统的日期,系统的启动分区,对系统的启动设备进行选择,我们对键盘上面大小写键进行设置,对数字键进行设置,都是在里面进行设置,这个设置也叫C模式设置,对系统重要的参数进行配置

基本的设备I/O服务
BIOS使用的中断类型号为10H ~ 1FH
在这里插入图片描述
BIOS提供的IO服务采用中断的方式来呈现,如上图13H对于软盘I/O 调用,软盘的输入输出服务,我们要去读写软盘可以使用13H中断。
INT 13H磁盘读写服务
在这里插入图片描述
如上图,13号中断的02号子功能可以帮助为读扇区,03H功能可以写一个扇区
在这里插入图片描述
比如说13H的02H子功能可以提供以上参数来读一个扇区,读扇区读到ES:BX这地方是软盘扇区里面读出来的内容把它写到缓冲区的地址,这是BIOD提供的基本输入输出功能。
加电自检POST

  • Power On Slef -Test(加电自检)
  • 初始化基本硬件
    • CPU,内存显卡
  • 自检正常不提示,错误则通过喇叭提示。
    BIOS提供加电自检和自举,计算机按下这个电源键,那它就开始进行加电自检,在加电子检的过程中会初始化一些基本硬件,比如说CPU、内存、显卡…这一些最核心的硬件进行初始化,如果在自检过程中发现异常会发出dilidili的提示声,不同的错误提示的声音是有所差别的。

按下PowerOn 或者Reset键执行第1行
执行FFFF0处的指令
在这里插入图片描述

计算机在按下电源键或按下复位键的之后CPU开始执行指令执行程序,按下电源键或按下复位键,计算机执行的第一条指令是什么指令呢?或者说执行第一条指令地址在哪里呢?地址在FFFF0处,为什么开机或复位的时候第一条指令位于FFFF0处这个位置呢?这与CPU内部寄存器的初始化有关系,CS:IP这两个寄存器在初始化之后分别是FFFF和0,所以CPU复位以后执行的第一条指令就在这个位置。
那么内存的FFFF0的位置分别是什么指令呢?
是一条跳转指令JUMP POST;这条指令就跳转到加电自检,这是加电自检的工作。

在这里插入图片描述

加电自检完成以后会继续查找显卡的BIOS,调用显卡的BIOS,来完成显卡的初始化工作,然后依次检查其它设备的BIOS并且调用这些BIOS来执行相应设备的初始化,之后显示启动画面,启动画面会显示BIOS的信息,芯片组的型号,以及主板的信息。
在这里插入图片描述

再往后面就是从硬盘、软盘或光驱或U盘来读入相应的操作系统,到底是从哪一个设备读取的操作系统,要看我们在C模式设置下面设定的是哪一个设备,是我们的启动设备。
一般情况下都是选择硬盘启动,操作系统起来以后会由操作系统来接管计算机。这是BIOS的加电自检和自举的一个功能。
在这里插入图片描述

在刚才BIOS自取的过程中,它会去读硬盘上面或软盘上面存放的操作系统。
在BIOS读硬盘的过程中,它会首先去读硬盘或软盘的一个特殊的扇区,这个扇区就是硬盘或软盘的首扇区,这个首扇区里面放的内容,我们叫做主启动记录MBR。MBR的内容存放在硬盘/软盘的首扇区里面,放的内容是和操作系统启动的相关信息(Main Boot Record)比如说操作系统放在那个路径下面,操作系统需要什么样子的参数,这些和操作系统启动有关的信息都放在首扇区里面,我们把首扇区里面的内容把它叫做主启动记录。这个记录512个字节,它的结束符很特殊0xAA55h。
前面512个字节可以根据实际的情况存放有效的代码。
在这里插入图片描述
主启动记录与硬盘的分区以及格式化的关系

在这里插入图片描述

上面的白色大方框代表整个硬盘,硬盘的第一个扇区很特殊,我们用它来存放MBR也就是主启动记录。接下来的空间再来进行分区。
在这里插入图片描述
中间第二个大框把它作为一个分区把它分给Windows用,我们用Windows FAT32/NTFS进行格式化,剩下的空间在来分个区域。
在这里插入图片描述
这里是Linux 分区,我们可以用Linux里面的EXT2/EXT3/…对它进行一个格式化,剩下的空白是其他分区,其他的文件 系统。
现在已经有三个分区,那三个分区它在格式化的时候,它会在每个分区的首扇区记录下一些特殊的内容,每一个分区的首扇区都是非常特别的区域,在每一个分区首扇区放的内容我们叫分区启动信息。而首扇区的内容我们叫做主启动记录。
剩下三个分区的首扇区我们叫做分区启动记录PBR。
在这里插入图片描述
主启动扇区的内容它的作用就是用来启动操作系统,用来加载操作系统,或者进行多操作系统的启动管理。
在这里插入图片描述

具体来说MBR里面的内容有三方面的功能,用来提供菜单让用户有多操作系统的选择,或者是加载核心文件,直接去加载操作系统,再或者进行跳转工作跳转到其他可启动的区域去执行操作系统的加载实现一个跳转。

在这里插入图片描述
这是关于MBR的内容
在这里插入图片描述
上图是BIOS和MBR的运行过程,在加电启动的过程中,用户可能会进行一个C模式的设置(硬盘启动)比如说我们要设置极端几系统从硬盘启动或者从U盘启动,从光驱启动都可以,我们可能会进行一个C模式的设置,接下来BIOS它会去读取MBR的内容,把它读取到内存里面去,接下来就把控制权交给MBR。
MBR里的程序就知道应该去如何读取操作系统,把操作系统读到内存里面来,接下来就是MBR它会读取启动的分区表,找到启动的活动分区,并且确认其他的活动分区都不是确认的接下来活动分区就会读取第一个分区,也就是分区引导记录PBR,并且把PBR加载到内存里面去,接下来就是PBR它会去控制后面的引导过程。

3.1.2 操作系统启动过程

在这里插入图片描述
操作系统的启动是指的从加电开始到用户的工作环境建立好,把桌面准备好的过程叫做操作系统的启动过程。
从加电开始到最终用户可以直接使用计算机桌面出现,这个过程包含三个步骤,初始引导、核心初始化、系统初始化。

在这里插入图片描述

我们首先来看初始引导,初始引导的目的是要把操作系统的核心装入到 内存并且使之接管计算机系统。
操作系统的核心是以文件的方式存在于硬盘上面,在安装操作系统的时候,操作系统的核心就是以文件的方式从光驱上面或者从U盘这种安装盘上面拷贝到硬盘特定的存储路径下面。

初始引导的过程,首先计算机加电,加电就跳转到加电自检上面JUMP POST 开机的第一条指令,加电自检完成以后,就去执行BIOS里面的启动程序。
BIOS里面有一个启动程序,启动程序的作用就是去读取0面0道第一扇区的内容(MBR)0面0道第一扇区,也就是分区的首扇区,或是硬盘的首扇区或是软盘的首扇区,就是MBR,把MBR的内容加载也就是加载MBR里面的引导程序到内存里边来。
引导程序进入内存以后就去运行引导程序,引导程序会根据相关参数,读取硬盘指定位置的文件读到内存里,MBR的引导程序,它知道该如何读取操作系统的内核文件,操作系统的内核文件放在什么地方,该如何初始化操作系统内核,在引导程序里面都有相关的参数,引导程序的作用就是把操作系统的内核把它读到内存里面去,并且让操作系统内核运行起来,这是初始内核过程,这个过程用到几个程序,第一个是启动程序,
这个启动程序位于BIOS里面,第二个是引导程序,引导程序位于MBR里面位于硬盘的首扇区或者位于启动设备的首扇区一样。引导程序的作用就是去引导OS内核,这是第三个我们要关注的程序,操作系统内核。
在这里插入图片描述
核心初始化的目的就是让操作系统的内核初始化系统的核心数据。比如说完成寄存器的初始化,完成内存的初始化,完成页表的初始化以及构建核心进程,这是核心初始化。
在这里插入图片描述
核心初始化完成以后就是系统初始化,系统初始化的作用就是为用户最终使用系统做准备,使系统处于待命状态。
什么为待命状态?
桌面出现或者是控制台出现,我们看到桌面看到控制台就可以正常使用计算机。这个过程我们叫做系统初始化,系统初始化的主要工作包括初始化文件系统,初始化网络系统,初始化控制台,初始化图形界面,等等。

在这里插入图片描述
特定的操作系统它的启动过程
Windows启动过程首先加电自检,加电自检完成以后,BIOS进行一个初始引导,BIOS从MBR里面读取引导程序,把引导程序装到内存,接下来的引导程序就知道要怎么启动Windows,这个引导程序它就知道应该先去启动DOS7.0,然后把DOS7.0调入内存,这是调入操作系统的核心,接下来Windows就开始接管系统,然后进行核心初始化,进行系统初始化。
在这里插入图片描述

Windows核心初始化过程就包括对于资源的状态核心的数据进行相应的初始化,对于系统初始化最重要的就是GUI的生成,使系统处于最终的待命状态出现桌面或者出现控制台,这个核心初始化过程和系统初始化过程这些过程非常复杂就不去细究它的细节

在这里插入图片描述

LINUX启动过程,首先是加电自检,然后BIOS把MBR读入内存,MBR里面的引导程序就回去加载Linux内核的映像,Linux内核映像前面是非压缩的,后面是压缩的所以KERNEL内核映像加入到内核区域之后它是边解压边执行,最后内核初始化内核启动最终控制台出现或者是,桌面出现。
Linux 的内核映像是一个压缩映像,当然前面有一部分代码是非压缩的,后面大部分是压缩的这样可以节省内核的内存,尤其是在嵌入式系统里面对内核的大小是比较敏感的。

在这里插入图片描述

内核完成引导以后,加载init程序,加载init进程,init编程它的编号是1,就是1号进程,1号进程它的主要作用就像它的名字所暗示的一样就是完成初始化的。
init进程执行这个/etc/inittab脚本,通过这个脚本始化,不同的用户具有不同的运行级别,脚本是有差异的。
脚本文件主要是能完成键盘的设置,字体的设置还有网络设置,装载一些特定的模块,这是init程序init进程。
在这里插入图片描述
Linux登陆的过程,上图流程图显示的是Linux的登陆过程,init进程首先可以通过fork函数去执行登陆getty,去执行终端的登录,fork是一个创建进程的函数,接下来等待用户的登录,用户输入用户名,读取密码,验证密码,验证不正确就退出重来,如果匹配的话就往下面执行,执行exec,不同的用户有不同的shell,执行这个用户对应的shell,接下来读取用户输入的命令,用户在控制台上面输入什么命令呢?在sh:的地方读取用户输入的命令,执行这个命令,如果用户输入的是退出命令,就回到最上面重新来登陆。这个linux里面用户登录过程。
3.2 操作系统生成

我们平时上面用户用的操作系统我们都是从网上下载的或是购买的,我们这一节要介绍我们如何生成一个自己的操作系统,对现有的操作系统进行优化,或者裁剪。

在这里插入图片描述

操作系统的生成指的是满足特定的硬件环境和用户需要,组装和构建操作系统的过程。
特定的硬件环境,不同的硬件配置就需要操作系统对不同的硬件有响应的支持,硬件变化了那操作系统对应的模块也应该发生变化。
用户的需求,有些用户可能需要使用到网络,有的用户可能不需要使用到网络,有的用户可能需要使用到光驱,有的用户可能不用光驱,根据 用户的需要,根据用户的需要改变操作系统的功能模块,根据硬件环境的变化改变操作系统的功能模块。
通过操作系统满足硬件环境满足用户的需要,我们来组装和构建一个新的操作系统。这个过程我们称为操作系统的生成。
在这里插入图片描述

操作系统生成的主要步骤第一步就是根据硬件的环境和用户的要求配置功能模块和构造参数。
第一步就是要根据硬件的配置和用户的要求来配置操作系统里面各个功能模块,操作系统由很多功能模块组成,有些模块我们要,有些模块我们不要,根据用户的要求和硬件的配置我们来决定,不同的用户对操作系统的工作参数要进行改变,不同的运行环境也需要对操作系统的参数进行变换。这是生成操作系统的第一步配置功能模块和构造参数。第一步做完以后它的结果就是修改操作系统的源代码。第二步就是要构建操作系统映像,构建的意思就是build的意思,源代码已经对它进行配置参数进行调整,第二步自然是编译操作系统的源代码,重新把它编译为二进制的映像。

在这里插入图片描述

操作系统生成前提,要生成一个新的操作系统的前提有三个,第一个是操作系统是由可拆装的模块构成的,操作系统本身是由一个个可拆剪,可拆装的模块构成。如果整个操作系统它是一个整体,所有的功能都密不可分,那么这样的操作系统我们就没有办法对它进行一个重新的配置,重新的参数调整。
第二个是需要交互式的配置工具,我们要有工具而且是交互性的工具去改变操作系统现有的配置,改变现有的参数,要有这样子的交互工具。
第三个是要有映像的构建工具,我们要能够把第二步获得的源代码对它进行一个重新的编译。要有一个编译工具一个build工具把它重新生成二进制文件。这是生成操作系统的三个前提。
在这里插入图片描述

Linux操作系统满足我们之前说的三个前提,上图是linux官网,官网首页列出了最新的linux版本,我们要生成新的linux,生成自己的linux往往需要在这个网站上下载特定的源代码,然后对它进行重新的配置,编译,然后让它生成一个新的自定义的linux。

在这里插入图片描述
linux操作系统生成可以分为以上6步。

在这里插入图片描述

第一步是首先获取Linux源代码,版本很多,可以用最新版本的也可以用老一些的版本,我们linux网站上面下载某个版本的源代码,然后把它解压。

在这里插入图片描述
第二部就是要选择和启动内核控制程序,要生成操作系统有三个前提条件,其中有一个就是要有一个交互式的配置工具,我们需要选一个合适的配置工具,用来配置内核,在linux里面有六个命令,或者说有六个工具来对内核进行交互性的配置

用得最多的是 make meuconfig,采用文本选择界面这样一种形式和用户交互,在字符终端上面给出一个类似于窗口的交互界面。

在命令行里面输入make menuconfig就会出现这个界面
在这里插入图片描述
make menuconfig这个代码应该在linux内核源代码解压以后,在主要文件夹里面输入这个命令才能 出现这个一个界面,也就是说这个命令一定要
命令原代码解压之后在主目录中输入这样的命令才会出现这样一个界面,这个界面是类似于窗口的图形界面,在这里面我们可以通过上下的光标键,来选择操作系统的各个模块,每个模块前面有个标识,通过反复按下空格键,前面的标识会有变化,有什么变化呢,如果这个模块我们需要把它编译到内核里面,模块标识符号就会选中
在这里插入图片描述
会变成M或者变成Y表示我们要选中这个模块放到内核里面,如果我们不要这个模块我们认为硬件配置上面或者用户需求里面不需要这个模块i那我们通过反复切换空格键中括号内容会变成空我们不要这个模块。

我们也可以通过make xconfig通过这个命令对计算机进行配置,配置界面类似于这样一个界面,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
我们在第二步的交互配置过程中,我们会遇到类似这样的一些选项,这些选项都代表操作系统一些不同的模块或者是不同的一些系统配置参数,比如说Loadable module support它就表示我们需不需要操作系统 对模块进行支持,linux它是一个可以支持模块机制的操作系统,我们需不需要linux对这个模块进行支持呢,在这些条目里面可以做相应的配置。

比如说我们可以选择CPU的类型,你是windowsCPU还是ARM的CPU,还是PowerPC的cpu可以在Rrocessor family 进行选择,
这是根据硬件的配置,来改变操作系统的一些参数。

在这里插入图片描述
比如说上图有PCI卡的支持关于并口的支持,我们在标准的PC机里面都有PCI卡和并口的,嵌入式系统里面由于硬件是由用户定制的,在有一些嵌入式系统里面就不一定有PCI卡,不一定有并口,
所以我们在这样子的操作系统里面可以不对并口做支持,不需要操作系统对PAI卡有支持,还有块设备,软盘,网络这些模块在操作系统里面可要可不要,要根据硬件的配置,根据用户的要求
在这里插入图片描述
再比如说TCP/IP模块网络设备的支持,还有串口的支持声卡的支持,USB的支持,等等… 这些可以根据用户的要求用户的配置来选择,所以这些内容是我们第二步在进行交互配置的时候需要去理解和应用的。
第三步做完以后默认的操作系统源代码就已经被我们修改了,根据用户的要求根据硬件的实际配置情况,我们已经把源代码进行了一个修改,所以我们接下来要做的就是重新编译新的内核。

在这里插入图片描述

我们可以先后使用 make dep,make clean,make bzImage把内核编译出来,编译出来的结果就是一个二进制文件。
在这里插入图片描述

第五步就是要编译安装相应的模块可以使用 make modules 、make modules_install这两个命令,第一个命令是编译模块,第二个命令式安装模块。

在这里插入图片描述
第六步就是要让我们刚刚编译好的操作系统内核要生效,所以第六步骤就是要启动新内核让新内核来控制计算机。
要让新内核来控制计算机油这样几个操作我们要把编译出来的新内核,新的映像文件把它拷贝到/boot/bzImage这个文件目录下面。
接下来就要来配置GRUB,这个GRUB是一个非常主流的配置多操作系统配置启动过程的工具。
对 /boot/grub/grub.conf这个配置文件对它进行配置。
上图下方的内容
title 用来指示我们新编译的内核,这个newLinux build by Zhang San Feb.28,2018
这个提示信息出现在多操作系统选择界面的提示信息,这是我们自定义的。

root(hd0,1)表示启动设备,启动路径。kernel表示操作系统对应的映像文件就是/boot/bzImage
它的根目录 /dev/hda2,我们按照/dev/hda2这个模版修改grub.conf这个文件。

不同发行版本的linux里面这个配置的过程有差异,一定要根据自己选用的linux版本参造这一种思想来配置启动过程,不能完全照抄,比如说路径可能有变化,配置文件可能有变化,格式可能有变化
在这里插入图片描述

Linux操作系统的生成可以参考以上几个网址

3.3 用户界面

3.3.1 用户界面概念

在这里插入图片描述
用户界面的定义,用户界面指的是操作系统提供给用户,控制计算机的一种机制,又称为用户接口。
用户通过操作系统提供的机制来使用计算机,我们把这样一种交互机制我们称为用户界面。

在这里插入图片描述
用户界面有两种,一种叫做操作界面,一种叫做系统调用。
典型的操作界面

在这里插入图片描述

我们可以通过操作系统提供的图形界面来使用计算机,我们在绝大多数的时候,普通用户基本上都是使用这种图形界面来使用计算机。

我们可以通过图形界面上面的图标、按钮、菜单、工具栏这一些图形元素来操作计算机,计算机操作系统提供给用户的手段去控制计算机。
在这里插入图片描述

我们有时候也会去用黑白命令界面,控制台方式的界面去控制计算机,我们会在控制台上输入各种命令来使用计算机,这也属于操作命令的一种。
在这里插入图片描述
有时候也可以编写批处理命令来完成一系列的动作,这也属于一种操作界面。
在这里插入图片描述
有图形用户接口,有键盘命令,键盘命令我们可以在控制台上面输入各种各样的命令,键盘的命令又包括普通的命令,批处理程序还有shell 脚本。
普通命令是最常见的,批处理程序在windows里面有一种*.BAT的程序属于批处理程序,可以自动执行一系列相关的操作,shell脚本程序属于linux里面的都属于操作界面
在这里插入图片描述
上图是典型的DOS命令,也是操作系统提供给用户用来控制计算机的重要的形式。

在这里插入图片描述
这是linux里面一些常规的命令,必须要熟悉。

在这里插入图片描述
批处理是普通命令的集合,按批来执行一系列命令,而且这些命令之间有一定的逻辑关系。

可以通过变量替换,条件,转移,循环,注释这样一些基本编程的语法来编程批处理程序。批处理程序由command来编译执行,在windows里面批处理文件的后缀.BAT

把1~100之间的整数累加起来,我们知道这样累加的结果是5050,我们要写这样一个批处理程序要怎么写?
在这里插入图片描述
批处理程序里面有一些语法一些关键词,里面有一条for循环语句,因为我们要从1累加到100这是一个for循环,“/l”表示后面要处理的数据集它是一个列表表示list。后面,括号里面表示一个数据集,数据集是从1累计到100每次递增1,这个双百分号i“%%i”表示i是一个自变量,双百分号%%表示变量的一个定义,这个for循环的意思是说从1到100,每次累加1,从这样一个自变量做一个循环,在这样一个循环体里面,做sum +=%%i,这个循环的意思就是从1累加到100,最后把结果打印出来。
3.3.2 Shell 脚本编程

在这里插入图片描述
shell 是linux里面用来和用户进行交互的界面,shell上面是用户,下面是操作系统,shell 也属于用户和操作系统之间交互的机制。

在这里插入图片描述

交互过程,用户发布命令,命令交给shell,shell传给操作系统。
shell的表现形式通过控制台来执行用户的命令这样的表现形式
所以在控制台使用的各种命令都是通过shell的方式和计算机进行交互。操作系统在内部执行命令以后把结果通过shell返回给用户展示出来,这是shell大概的一个工作过程

在这里插入图片描述
shell在历史上主要有两种比较经典的类型,最早是Bsh,Bsh的特点就是有非常强的脚本编程能力。另外一个是Csh,Csh非常适合命令的交互使用,还有一个Ksh,Ksh结合了Bsh和Csh的优势。Bash是目前主流的一种shell 。Bash它是Bsh的升级也结合Ksh的优点。Bash是目前非常主流的。

在这里插入图片描述

像命令行的编辑功能、命令的历史管理功能,命名的别名功能,还有管道的重定向,shell的脚本编程都是Bash的功能。
在这里插入图片描述
在这里插入图片描述
在linux里面我们要输入一个命令,输入命令前面几个字符之后,敲TAB键,它就能自动帮我们帮外补全。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这是重定向的操作

在这里插入图片描述

比如说我们可以用ls命令显示/etc下面的子目录和文件的结构,把我接这个展示的结果重定向到etcdir.log 这样一个文件里面。在控制台上面我们看不到ls命令的执行结果,这个命令的执行结果已经写到了etcdir.log里面,这个就是重定向。我们从ls命令的输出结果从控制台上面重定向到etcdir.log这个文件里面。

在这里插入图片描述
管道实际上是重定向的一个升级应用,管道的符号是一根竖线,管道操作符用于连接管道左右两个命令,讲管道操作符左边命令的执行结果也就是输出作为管道右边的输入,对于管道前面命令来说,它的输出做了重定向,对于管道后面来说,它的输入做了重定向。
在这里插入图片描述
在这里插入图片描述
同一个命令也可以使用多个管道命令操作符,把多个命令连接起来。这是关于管道的功能

在这里插入图片描述

shell是用户和操作系统之间进行交互的一个机制,shell里面除了支持普通命令的执行,它也支持shell脚本程序。

在这里插入图片描述
在shell里面如何执行脚本编程,脚本也叫做script,脚本是通过类似于程序的方式来执行具有一定逻辑顺序的命令序列来完成较复杂的功能和人机交互。
非常类似windows里面的批处理程序,脚本程序 它以文本文件的形式表现,脚本程序放在文本文件里面,是一个可读的文本文件。
脚本文件是shell命令语句的集合,这个集合当然是一个有序的集合,有逻辑顺序的命令集合。

在这里插入图片描述
上图是一个脚本程序,这个脚本程序它的作用是用来帮助用户安装一个程序,我们编写好一个程序,把它打包交给用户去安装。这个脚本就是用来帮助用户去安装程序包的。

ldconfig是使配置文件生效。rm删除文件,删除目录,rm -rf这个表示要删除一个文件夹。把文件夹里面的子目录子文件夹都把它删掉。

在这里插入图片描述

脚本程序 它是由shell环境来解释执行的。这个脚本程序不需要编译,执行脚本程序,执行脚本文件它需要可执行的属性,一个文件的可执行程序用x表示,所以我们编写完一个脚本文件以后,我们需要chmod+ xMyScript.sh 这样一条命令去给脚本文件增加可执行属性,Myscript.sh是脚本文件的名称。我们根据实际情况来改变。chmod +x 是给脚本程序加可执行程序的属性,比如说我们不给这个脚本程序加上可执行的属性,那么这个脚本程序可能无法执行。

在这里插入图片描述

上图代码的功能是让用户在键盘上面输入大写小写的Y都可以,它就输出yes;如果用户输入的是大写小写的N就输出no。
上图这样的小程序根据用户输入做出相应的反馈,脚本程序执行以后就是下图的结果:
在这里插入图片描述
当用户输入y的时候,控制台输出yes,如果这个脚本程序再执行一遍,用户输入n,那控制台就会输出no。
在这里插入图片描述

read从键盘读入一行字符,把各个字段赋给相应的变量。后面的answer是一个变量,如果用户在键盘上面输入了相应的字符,这个字符 就会赋给answer。
在这里插入图片描述

-n是用来指定输入字符的个数,当我们键盘上面输入字符的个数达到-n指定数量的时候,就自动结束输入,字符串后面会自动加上一个回车符表示输入结束。

-p这个输入它会给出提示信息,当我们要在键盘上面进行输入的时候呢,我们希望在控制台上面能够有个提示,我们要输入什么东西,-p表示要用户建立一个字符建立一个选择。
在这里插入图片描述

这里面还有echo关键字,echo它的作用是用来显示字符串。
echo的使用形式echo[-n] 字符串,使用方式 -n 这个参数是可有可无的,后面是字符串,这个字符串就是要在屏幕上面要显示的字符串。这个字符串可以加引号,也可以不加引号。如果这个字符串加引号的话那么就是原模原样在屏幕上面显示。如果是不加引号,那么这个字符串里的空格如果是两个空格或多个空格,就会把它压缩成一个空格再把它显示出来。

如果我们要显示的字符串上面有很多空格,那么连续的多个空格就会压缩为一个空格。

-n的选项是用来控制输入字符串以后要不要回车要不要换行,加-n 就表示输入字符串之后不换行,用户如果要继续输入的话,就是在之前输入的字符串后面继续进行输入。

在这里插入图片描述
在刚才的例子里面也涉及到了case的语法结构,case在c语言里面是一个多分支的选择。

case 是语法; expr是变量;in是用来检查这个变量它的取值是什么样的一个值,如果expr这个表达式上的值是pattern1那么就执行commands1 这样一个分支;如果expr的值是pattern2 这个值,那么就执行commands2 的分支下面的类似。
case语句借宿esac
esac就是case反过来写
read 我们要读一个字符串读到answer 里面这个字符串是多少我们用-n 1表示,只要你输入一个字符,如果输入的字符是大写的Y或者是小写的y就执行echo yes:: 分支,输出yes;如果输入是大写的N或者是小写的n就执行echo no::这是执行的结果,用户输入的是y,当用户输入一个字符的时候,下面就会显示yes

在这里插入图片描述

上图的例子是要输入两个整数,x,y两个整数来比较他们的大小。
echo -n “Please input x,y:”要求用户输入两个整数x,y;这是一个提示让你输入x,y。
read x,y 是读入x,y。
echo “x = $x, y= $y”这是把我们输入的x,y打印出来。让我们在确认一下x等于多少,y等于多少。接下来就是一个if语法块。
if语句的结束是fi,fi就是if反过来写。

在这里插入图片描述

这是if语句的基本结构。
在这里插入图片描述
这个程序的执行结果,如果我们输入的是20、30
就会在屏幕上面有
x= 20,y = 30 的提示。
输出字符串x比y要小。
在这里插入图片描述
这是if语法块shell脚本程序的例子。

在这里插入图片描述
脚本程序写好以后我们 有三种方法来运行脚本程序,方法一是直接运行,我们直接在控制台上面输入脚本的名称。
在操作系统里面可能会装不同版本的shell,到底用那个shell来执行脚本程序?用缺省版本的shell
,每个用户登录以后对于缺省得用户对应。

在这里插入图片描述

方法二使用特定版本的shell来执行脚本程序。
我们可以在控制台上面直接指定用bash这样的shell来执行脚本程序。
指定shell 有时候会需要指定路径,大多数时候我们没有指定路径那系统要能够找得到对应shell的路径。

第三种情况就是我们在脚本程序里面,首行加上#!/bin/bash 这样一行内容就意味着执行这样子的脚本程序就用/bin/bash 这个shell 来执行。这是在脚本程里面指定用什么shell来执行脚本。

3.4 系统调用

在这里插入图片描述

用户界面分两类 一类是操作界面,另一类叫做系统调用。

在这里插入图片描述
上图程序有一个函数add,这个add函数是我们自己定义的,把两个整形变量相加,返回它的和。这个函数可以是自己编写的也可以利用第三方的函数。
总之在上图的应用程序里面我们用了add这个函数,我们在编程的时候经常会用到各种各样的函数,这些函数或者这些子模块可能是自己编写的可能是系统提供的,可能是某个第三方提供的。

在这里插入图片描述

上图是DOS汇编的程序,它的功能是我们要在屏幕上显示“Hello!”的字符串。

这些程序很简单我们利用了DOS里面的21号中断09号功能来显示字符串。

这个程序编译运行以后在屏幕上面就会打印出hello,这个程序用到了09号功能就是在屏幕上面利用显卡输出字符串。这涉及到了底层的硬件操作。21号中断的09号功能这是DOS操作系统给用户提供的一个功能,我们可以看成是一个函数或者是子模块,供应用程序调用。

在这里插入图片描述
这是linux里面的一个c程序。打印Hello World 然后程序退出,printf()和exit()都是系统提供的函数,这两个操作都涉及到外设或显卡的操作。因为我们在屏幕上面输入字符串,涉及到了进程的操作,我们知道exit是结束进程,结束程序的函数,这个程序也涉及到了底层操作系统内核的操作。

在这里插入图片描述
系统调用使操作系统内核为应用程序提供的服务或者是函数,我们再刚才的例子里面遇到21h(09)21号中断的09号功能,printf()和exit()都属于操作系统内核给我们提供的服务,这个服务都是在底层进行的,有的做硬件操作,有的对进程进行操作。在操作系统里面也有很多类似的函数供应用层程序来调用,我们把这样的函数和服务叫做系统调用。
系统调用是在内核里面实现的,在用户程序里面我们需要调用sys_foo()这个函数,但这个函数是在内核空间实现的,我们把类似这样的函数模块服务叫做系统调用,系统调用也是操作系统提供给用户的交互机制。

在这里插入图片描述
系统调用的特点,系统调用一般涉及核心资源或者是硬件的操作,类似printf() ,exit()函数都是在内核对硬件资源进行一个操作;
系统调用运行于核态,这与普通函数不一样,普通函数它也可能和用户程序一样都运行在用户态,但是系统调用一定是运行在内核空间,由操作系统提供的;

在这里插入图片描述
每一个系统调用都有一个唯一的编号,操作系统会提供一系列的系统调用给用户来使用,于是linux里面有两百多个系统调用给用户使用。不同版本的linux内核提供系统调用的数量不一样,有两三百个,每一个都有唯一的编号来区分。

在这里插入图片描述
系统调用在调用过程中会产生在中断。而且这个中断是自愿中断,用户程序要调用系统调用sys_foo(),在调用这一刻会产生中断,这个中断是程序员安排的,程序员需要在sys_foo 这个地方实现系统调用,这样的中断我们叫做自愿中断程序员安排的中断。
只要使用了系统调用就一定会产生中断。
在这里插入图片描述
call X 表示调用X号系统调用,在操作系统内核里面提供了N个系统调用。当应用程序要调用X号系统功能,在这个过程中会产生中断,当我们调用call X 的时候立即产生中断,虚线框里面就是发生中断的过程,发生了中断,系统要对它进行响应。
首先保护现场,这是标准的中断过程,我们根据系统调用号X来找到正确系统调用的入口,我们找到X号地址找到X号功能,X号功能执行完以后进行中断返回,返回到中断的地方,继续往下运行。这是系统调用产生的过程或中断响应过程。

在这里插入图片描述
DOS系统调用例子,DOS里面利用的是21号中断,让用户进行系统调用,在DOS里面所有的系统调用最终都会通过21h中断来完成。
这这个中断之前用AH来接受用户指定的系统调用号。
若调用09号系统调用,09号系统调用就是输出字符串,在屏幕上面显示,所以在DOS里面是利用AH寄存器来存放系统调用的编号最后产生21h中断。

在这里插入图片描述

在21号中断里面可以调用很多系统调用。

在这里插入图片描述

linux里面使用80号中断来实现系统调用,我们要显示Hello 字符串我们可以使用80h中断,在linux里面用EAX寄存器接受系统调用号。EAX指定系统调用号为4,就意味着我们要在屏幕上显示字符串。这是linux里面使用EAX寄存器来使用调用号。
在这里插入图片描述
在这里插入图片描述

在内核实现的时候printf()和exit()都会引发中断,我们成为隐式系统调用,表面上是普通的API函数实际上在内部会转换为“INT 80h”这样的指令会引发中断

在这里插入图片描述

在这里插入图片描述
把c程序转化为汇编,我们能够很清楚的发现,

在这里插入图片描述

红框模块指的就是printf,里面有INT80这样子的终端指令,用EAX来指定系统调用号4号
在这里插入图片描述
蓝框代码里面也转换为了INT 80终端指令用EAX指定1号系统调用,结束进程。
我们把c代码转换为汇编代码会发现系统调用确实会转换为终端指令,普通的函数转换成汇编以后不包括INT这样的中断指令,这是隐式系统调用的特点。

在这里插入图片描述
应用程序调用了XYZ这样的系统调用,这个程序先是在用户态工作,这个系统调用会在c库里面转换为包含INT80指令的汇编代码。这是一条中断指令包含80号中断,在linux里面系统调用都会转换为包含INT指令的代码,会引发中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中断服务程序会负责响应中断源,把用户调用的xyz函数转向到系统内部的调用,在操作系统内部会在xyz前面加“sys_”+xyz这样的前缀,表示现在内核实现系统调用。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值