操作系统与内核、系统编程与应用编程

news2024/10/7 10:16:00

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


操作系统与内核

    • 计算机系统组成
    • 操作系统
    • linux内核
      • 内核简介
      • 体系结构属性
      • 开发和规范
      • 主要子系统
      • 内核特性
    • 系统编程和应用编程


专栏:《嵌入式软硬件》


计算机系统组成

计算机系统由软件和硬件组成。
在这里插入图片描述
总线
贯穿整个系统的一组电子管道称为总线

-	片内总线
-	系统总线
-	数据总线DB
-	地址总线CB
-	控制总线CB
-	外部总线

IO设备
I/O设备是系统与外界联系的通道

  • 键盘鼠标是输入设备
  • 显式器是输出设备
  • 磁盘既是输入设备也是输出设备
  • 输入输出是相对于内存来说的。

内存
内存是一个重要的部件,它是与CPU进行沟通的桥梁。它用来存放程序以及程序要处理的数据,磁盘中的程序要加载到内存才能运行。
处理器 (运算器+控制器)
中央处理器(CPU),简称处理器。 CPU主要有运算器、控制器、寄存器构成。

-	取指
-	译码
-	执行
-	写回
-	跳转

计算机硬件组成示意图
在这里插入图片描述
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动一个外存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新安排去处理其他的工作。在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。

操作系统

操作系统有效地管理计算机系统中的资源,合理地管理计算机系统的工作流程,方便用户使用的程序的集合。其中资源包括软件资源和硬件资源。操作系统有五大任务:

-	文件管理
-	处理器管理 
-	内存管理
-	设备管理
-	作业管理

在这里插入图片描述
操作系统有三个基本抽象概念(进程、虚拟存储器和文件)。文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
在这里插入图片描述
进程
进程是操作系统对正在运行的程序的一种抽象。一个系统可以运行多个进程,而每个进程好像在独占使用硬件。

进程上下文切换示意图

在这里插入图片描述

进程虚地址空间
在这里插入图片描述

虚拟存储器

  • 虚拟存储器为每个进程提供了一个大的、一致的、私有的地址空间。
  • 它将内存看成是存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存与磁盘中来回交换数据。
  • 为每个进程提供一致的地址空间,简化了存储管理。
  • 保护每个进程的地址空间不被其他进程破坏。

文件
文件是一系列的字节序列,它向应用程序提供了一个统一的视角,来看待系统中各式各样的I/O设备。
虚拟文件系统VFS:

  • 虚拟文件系统是内核实现的一种架构,为用户空间提供统一的文件操作接口,即文件系统调用。它在内核内部为不同的真实文件系统提供一致的抽象接口。
  • 用户通过系统用与内核中的虚拟文件系统交互,进而操作实际的文件系统和设备。

在这里插入图片描述

linux内核

内核简介

在这里插入图片描述

在这里插入图片描述
Linux是最受欢迎的自由电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。 技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。

Linux是一个一体化内核(monolithic kernel)系统。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。

体系结构属性

在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。体系结构分析的一个目标是提供一种方法更好地理解源代码。
Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。Linux 内核的uClinux移植提供了对非 MMU 的支持

开发和规范

核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。实际上,操作系统的内核版本指的是在Linux本人领导下的开发小组开发出的系统内核的版本号。自1994年3月14日发布了第一个正式版本Linux 1.0以来,每隔一段时间就有新的版本或其修订版公布。
Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。事实证明,GPL对于Linux的成功起到了极大的作用。它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。

主要子系统

系统调用接口: SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
进程管理: 进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。
进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法, 不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O⑴ 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。O⑴ 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。
内存管理: 内核所管理的另外一个重要资源是内存。为了提高效率VFS 在用户和文件系统之间提供了一个交换层管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止 4KB缓冲区。Linux 提供了对 4KB缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
虚拟文件系统: 虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。
在这里插入图片描述

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

内核特性

如果 Linux 内核的可移植性和效率还不够好,Linux 还提供了其他一些特性,它们无法划分到上面的分类中。
作为一个生产操作系统和开源软件,Linux 是测试新协议及其增强的良好平台。Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。
Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。
Linux 最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。该系统对内核进行了修改,称为基于内核的虚拟机(KVM)。这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了 KVM 的内核之上运行。除了运行 Linux 的其他实例之外, Microsoft® Windows® 也可以进行虚拟化。惟一的限制是底层处理器必须支持新的虚拟化指令 。

系统编程和应用编程

系统编程
在操作系统之上利用系统调用、C库进行对系统资源进行访问。如apache 、gcc、gdb 等。
应用编程
在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序设计(QT)MFC程序设计(MFC)等。

系统调用在系统中所处的位置
所有操作系统都提供多种服务的入口点,由此程序向系统核请求服务。这些入口点被称之为系统调用(system call)。
在这里插入图片描述

C库
这里我们所说的C库(libc),指的是标准C定义的C函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。GNU发布的libc称为glibc。
系统调用与C库关系

  • 系统调用与C库从形式上来看都C函数。
  • C库函数有些是调用系统调用来实现的,比如说malloc、free调用brkprintf调用write系统调用,有些函数不需要任何系统调用,比如abs、strcpy、atoi等,因为它并不是必需要使用内核服务。
  • 系统调用通常提供的是最小界面,而C库函数通常提供更复杂的功能。

内核如何处理系统调用

  • 每个系统调用被赋予一个系统调用号。
  • 在i386平台上,执行一个系统调用是通过int 0x80指令完成的。
  • eax存放系统调用号。
  • ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器指向用户空间存储所有系统调用参数的缓存。

错误处理

  • 在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述。
  • errno这个全局变量在<errno.h>头文件中声明如下:extern int errno;
  • 错误处理函数
	perror
	strerror

在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu18.04系统如何安装和使用telnet工具

在ubuntu18.04中如何安装和使用telnet工具呢?本文给出详细说明。 1.更新软件列表 sudo apt update 2.安装telnet服务 sudo apt install openbsd-inetd telnetd 3.查看telnet运行状态 netstat -a | grep telnet 4.登录测试 telnet 127.0.0.1

【NLP】PNR指标

PNR&#xff08;Positive Negative Rate&#xff09; 正逆序比 正序数 / 逆序数&#xff1b; 当正序数量越多、逆序数量越少时&#xff0c;表明模型对序关系的刻画越准确&#xff0c;模型效果越好。 参考&#xff1a;https://www.jianshu.com/p/e9813ac25cb6

如何使用不同的工具运行交互式的python

最近在极客时间学习陈旸老师《数据分析实战45讲》专栏&#xff0c;需要用到python&#xff0c;自19年后基本没用过python&#xff0c;现在又重头抓起&#xff0c;针对遇到的问题进行总结积累。代码片段均取自专栏内容。 示例代码&#xff1a; name raw_input("Whats your…

了解抖音本地生活服务商:连接你与便捷生活的桥梁

抖音本地生活服务商是抖音平台为用户提供的一项服务&#xff0c;旨在连接用户与本地商家&#xff0c;为用户提供更便捷的本地生活服务。下面是四川不若与众对抖音本地生活服务商的介绍。 1. 提供多样化的服务&#xff1a;抖音本地生活服务商为用户提供了多样化的服务&#xff0…

MongoDB【MongoDB索引Index (索引概述、索引类型、复合索引、)】(三)-全面详解(学习总结---从入门到深化)

目录 MongoDB索引Index 聚合操作 通过聚合操作可以处理多个文档&#xff0c;并返回计算后的结果。 对多个文档进行分组对分组的文档执行操作并返回单个结果分析数据变化 聚合管道 分别由多个阶段来处理文档&#xff0c;每个阶段的输出是下个阶段的输入&#xff0c; 返回的是…

C / C++的wprintf打印速度太慢,改WriteConsoleW输出提速200+倍

在 C / C 处理将UTF-8字符串内容输出到终端控制台时&#xff0c;平时惯用一个广泛使用的 wprintf() 函数&#xff0c;虽然它支持 Unicode 、UTF-8 字符&#xff0c;但在测试过程中发现它输出大文件时会有严重拖累性能&#xff0c; 测试打印文件&#xff1a;一个将近6万行的 Jav…

VTK 学习笔记一

https://www.cnblogs.com/yangai/p/5955614.html VTK笔记-了解VTK_黑山老妖的笔记本的博客-CSDN博客 一、VTK一般流程 1、source 数据源 VTK基础教程&#xff08;1&#xff09;- vtkPolyData 介绍_TGTSTTG的博客-CSDN博客 vtkSource 数据源&#xff0c;个人理解的就是故事灵…

从交易成本模型的角度解析高频交易策略的优劣

高频交易作为一种快速的股市交易方式&#xff0c;越来越受到了投资者的关注。但是&#xff0c;高频交易捕捉到的价格差很小&#xff0c;因此需要使用的交易成本模型与传统的投资方式有所不同。本文将从交易成本模型的角度出发&#xff0c;探讨高频交易策略的优劣。 一、交易成…

jar-protect Jar 包加壳工具

jar-protect 是 java 的 jar 加密加壳工具&#xff0c;对 class 文件进行加密防护&#xff0c;避免反编译破解。 java 本身是开放性极强的语言&#xff0c;代码也容易被反编译&#xff0c;没有语言层面的一些常规保护机制&#xff0c;jar 包很容易被反编译和破解。 受 classfi…

【资料分享】RK3568核心板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)

1 核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板&#xff0c;每核主频高达1.8GHz/2.0GHz。核心板CPU、ROM、RAM、电源、晶振、连接器等所有器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过…

Android中的SDK以及利用Android Studio生成aar

1、什么是SDK&#xff08;Software Development Kit&#xff09; 广义上的SDK&#xff1a; 指的是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合。比如你在编辑器里敲代码的时候它会自动补全代码&#xff0c;自动错误检查&#xff0c…

Linux开发工具Make/Makefile篇

文章目录 &#x1f348;0. 前言&#x1f349;1. 见见猪跑&#x1f34a;2. 依赖关系和依赖方法&#x1f34b;3. 清理&#x1f34c;4. 不可多次编译的原理&#x1f34d;4.1 原因&#x1f34d;4.2 stat命令&#x1f34d;4.3 验证 &#x1f96d;5. 伪目标&#x1f34e;6. 取消回显 …

【如何用大语言模型快速深度学习系列】从word2vec、SVD到GloVe

三天热度果然名不虚传&#xff0c;写作的效率有所下降&#xff0c;但是只要坚持二十一天就能养成习惯啦&#xff01;冲冲冲&#xff01; 上一节回顾 文章链接 在上一章我们将词的概念&#xff0c;通过n-gram组合成了n个词的切片&#xff0c;终于将前后词之间建立了一个联系&a…

MySQL授权操作

目录 授权和撤销授权 创建用户 授权 撤销授权 授权其他用户与撤销权限 授权和撤销授权 创建用户 create user 用户名% identified by 密码; 示例&#xff1a;create user tom% identified by 123456; 授权 GRANT ALL ON 库名.表名 TO 用户名’客户端主机 ; 示例&a…

【动手学习深度学习--逐行代码解析合集】08模型选择、欠拟合和过拟合

【动手学习深度学习】逐行代码解析合集 08模型选择、欠拟合和过拟合 视频链接&#xff1a;动手学习深度学习–模型选择、欠拟合和过拟合 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、生成数据集 import math import numpy a…

ROS:参数名称设置

目录 一、前言二、rosrun设置参数三、launch文件设置参数四、编码设置参数4.1C实现4.1.1ros::param设置参数4.1.2ros::NodeHandle设置参数 4.2python实现 一、前言 在ROS中节点名称话题名称可能出现重名的情况&#xff0c;参数名称也可能重名。 关于参数重名的处理&#xff0c…

Css:浮动相关

1.为什么需要浮动&#xff1f; 多个块级元素纵向排列找 标准流&#xff0c;多个块级元素横线排列找 浮动 2.浮动的特性 浮动会脱离标准流&#xff08;脱标&#xff09; 浮动的盒子不再保留原来的位置 3.清除浮动

BM68-矩阵的最小路径和

题目 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

T100新程序的开发【完整步骤】

简易程序的开发 记录T100中一个简易程序的开发完整步骤。 一、程序基本数据设置作业 打开作业 azzi900,弹出作业详情。 新增一个程序编号。 一些属性概念 程序编号:手动输入你建立的新程序。程序名称:手动输入你建立的名称。归属模块:取决于你程序编号的第一个字母。归属…

C语言判断当前目录下是否存在某一个文件

要判断当前目录下是否存在文件A&#xff0c;可以使用C语言中的标准库函数access来实现。access函数用于检查指定文件是否存在及是否具有指定的访问权限。 #include <stdio.h> #include <unistd.h>int main() {const char* filename "fileName";// 检查…