内核与Shell的关系

编程

1, 操作系统的核心-内核

1.1 操作系统的含义

通常包含两种:

  • 完整的软件包,这包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具,注入命令行解释器、图形用户界面、文件操作工具和文本编辑器等。
  • 在更狭义的范围内,是指管理和分配计算机资源(即CPU、RAM和设备)的核心层软件。

而内核则通常指第二种含义。一般情况下,会将Linux内核可执行文件命名为/boot/vmlinuz或与之类似的路径名。早期的UNIX实现称其内核为UNIX,在后续实现了虚拟内存机制的UNIX系统中,其内核名称变更为vmunix。对于Linux来说,文件名称中的系统名需要调整,而以“z”替换“linux”末尾的“x”,已在表明内核是经过压缩的可执行文件。

1.2 内核的职责

内核用来实现上层服务,上层命令,上层应用等所需要的功能,例如底层磁盘的读写操作,网络的连接,键盘鼠标的驱动,进程调度,内存管理等等都是由操作系统的kernel去完成的,具体如下:

  • 进程调度:Linux属于抢占式多任务操作系统。这组规则控制着哪些进程获得对CPU的使用,以及每个进程能使用多长时间,这两者都由进程调度程序(而非进程本身)决定。
  • 内存管理:进程与进程之间、进程与内核之间彼此隔离,因此一个进程无法读取或修改内核或其他进程的内存内容;只需将进程的一部分保持在内存中,这不但降低了每个进程堆内存的需求量,而且还能在RAM中同时加载更多的进程(在任一时刻,CPU都有至少一个进程可以执行,从而使得对CPU资源的利用更加充分。
  • 提供了文件系统:允许对文件执行创建、或许、更新以及删除等操作。
  • 创建和终止进程:内核将新程序载入内存,为其提供运行所需的资源。这样一个运行中的程序,我们称之为“进程”。
  • 对设备的访问:内核既为程序访问设备提供了简化版的标准接口,同事还要仲裁多个进程对每一个设备的访问。
  • 联网:内核以用户进程的名义收发网络消息(数据包)。该任务包括将网络数据包路由至目标系统。
  • 提供系统调用应用编程接口(API):进程可医用内核入口点(也成为系统调用)请求内核去执行各种任务。

2,内核态和用户态

  现代处理器架构一般允许CPU至少在两种不同状态下运行,即:用户态和内核态(有时也称之为监管态supervisor mode)。执行硬件指令可使CPU在两种状态间来回切换。与之对应,可将虚拟内存划分(标记)为用户空间部分或内核空间部分。在用户态下运行时,CPU执行访问被标记为用户空间的内存,试图访问属于内核空间的内存会引发硬件异常。当在内核态下运行时,二者都可被访问。

  某些操作,仅当处理器内核态运行。比如,执行宕机(halt)指令去关闭系统、访问内存管理软件、以及设备I/O操作的初始化等。实现者们利用这一硬件设计,将操作系统置于内核空间。这确保了用户进程即不能访问内核指令和数据结构,也无法执行不利于系统运行的操作。

3,shell

3.1 是什么

shell翻译为“外壳”、“表面”,它代表两个含义:

  • shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,用于读取用户输入的命令,并执行相应的程序以响应命令。shell既是一种命令语言,又是一种程序设计语言。
  • shell是指一种应用程序,这个程序提供一个界面,用户可以通过这个界面访问操作系统。

3.2 用途

设计shell的目的不仅仅是用于人机交互,对shell脚本(包含shell命令的文本文件)进行解释也是其中用途之一。为实现这一目的,每款shell都内置有许多通常与编程语言相关的功能,其中包括变量、循环和条件语句、I/O命令以及函数等。

用户,也就是我们,由于权限,安全等问题,用户不允许直接操控kernel,这时就出现了shell程序。本质上讲,shell就是一个桥梁,用户和内核之间建立的“友谊”,都是通过这个“桥梁完成的”,也就是我们想让内核帮我们做一些事情,首先需要将用户的指令去传递给shell,翻译成内核可以理解的一些信息,从而让内核为我们服务。如下图:

3.3 分类

shell分为 CLI 命令行界面 (command line interface) 和 GUI 图像化用户界面 (Graphical user interface) 两大类。

当今主流系统,windows,macos所有的shell都是GUI,都是通过鼠标的点击,托拉等操作,将用户的指令传递给操作系统内核,这时候操作系统才能按照我们希望的结果,满足我们的需求。

但对于linux而言,图形界面仅仅是它的一个上层应用软件,对于我们绝大多数linux的操作系统而言,都是通过命令行界面完成的。也就是说在linux中图形界面能完成的命令行界面都能完成,而命令行界面能完成的图形界面都完成不了。

按语言来分类,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

以上是 内核与Shell的关系 的全部内容, 来源链接: utcz.com/z/511342.html

回到顶部