操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in C)

系列文章目录

操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in C)


文章目录

  • 系列文章目录
  • 前言
  • 一、计算机中存储模型的软件抽象
    • 1.硬件层次
    • 2.操作系统层次
    • 3.编译器层次
  • 二、C语言
    • 1.为什么使用C语言编写操作系统
    • 2.使用C语言容易犯的内存错误
    • 3.如何学习C语言


前言

本节对应的是MIT 6.828课程第二节:Programming xv6 in C
PPT的链接如下:Programming xv6 in C
本文沿着PPT的思路,主要讲解了学习操作系统,所涉及到的计算机底层架构与C语言的相关知识,知识的细节并未涉及,仅仅是在表面提出一些宏观的描述,具体知识细节需要专门学习相关课程。


一、计算机中存储模型的软件抽象

文章中将存储模型的分层结构进行了如下软件抽象:
在这里插入图片描述

1.底层是由存储芯片与IO设备组成的物理存储结构,是硬件
2.之后将这些硬件,通过软件抽象统一到一个地址空间中,方便寻址(其中IO设备可能与存储芯片被分别统一到两个地址空间)
3.之后在统一连续的地址空间上划分相应的区域,也就是“段”。其中最核心的涉及就是栈和堆
4.在这些基础上,就有了各种各样的编程语言,更高级的编程语言有了垃圾回收、ARC、智能指针等机制

1.硬件层次

CPU与硬件开发板上的诸多外设交互的载体便是总线,下图均描述总线结构。
在这里插入图片描述
在这里插入图片描述
需要注意的是,总线并不是简单的一根线或者是几根线,它更多的是一种协议。协议中包含了数据、控制信号、权限等,类似于TCP/IP协议,根据这些内容,总线上的CPU、IO设备、内存,就可以实现有序的数据交互:
具体的知识可以参考博客:
揭秘计算机内部通信:探秘数据、地址与控制信号的奥秘
cpu 是如何工作的

2.操作系统层次

从操作系统的角度看待计算机中的存储模块,那便是一整块的存储空间(IO与内存统一寻址情况)。那么操作系统如何能够拥有这样的“视角”,可以忽略复杂的总线通信和多种多样的外围设备,原因是CPU内部的机制实现了该层抽象。
细节的知识可以参考博客:
CPU 地址空间分配原理分析

在这里插入图片描述
CPU可以通过简单的汇编指令读写地址空间的单元,每个单元是8 bits。
有下面几点需要注意:

1.由于考虑到可以通过增加或者减少RAM芯片来增加或者减少实际内存。所以CPU提前抽象出了足够大的地址空间,以便于之后的扩充
2.可以映射到硬件的地址可以被访问;不能映射到硬件的地址无法被访问
3.地址单元有三种权限:读(W)、写(W)、执行(X),这样不管是代码还是数据,都可以统一的存储到存储空间

之后的课程会深入了解该层次,并且讨论page(页)与cache的连续性问题

3.编译器层次

该层次个人理解就是C语言与汇编语言的层次,也可以是编译器的层次。将内存空间分为了多个区域,如下图:
在这里插入图片描述
其中,heap是堆空间,用来存放动态分配的内存,如malloc函数分配的内存;stack是栈空间,函数调用后就会进入栈空间,里面存放着属于该函数的局部变量;data是存放全局数据;text是存放代码。

其中栈空间的运行方式可以简单如下图:

在这里插入图片描述

二、C语言

C语言具体的语法内容就不在此处赘述,相信各位读者也已经很好的掌握。需要注意的有关C语言的知识点是Undefined behavior。可以参考文章:
C 未定义行为(Undefined behavior)

1.为什么使用C语言编写操作系统

(1)适用于底层编程

1.可以直接操作地址空间,相比于一些语言将地址空间的操作进行了抽象和封装
2.可以轻松地访问各种各样的硬件设备,因为众多硬件设备都对C语言有很好的支持

(2)内核完全控制内存分配

1.可以使用 C 语言直接构建内存分配器
2.没有垃圾回收机制

(3)执行效率高

1.是编译语言,不是解释性语言,不需要解释器,直接以机器指令执行。

2.使用C语言容易犯的内存错误

1.在free(释放)存储空间后使用它
2.重复释放一个存储空间
3.在使用内存时忘记初始化(申请的内存中并不一定是0)
4.对数组空间之外的元素操作(缓存溢出)
5.忘记释放动态分配的内存(内存泄漏)
6.强制转换一个对象到错误的变量类型
7.忘记检查动态分配的内存是否成功
8.使用指向堆栈上位置的指针

3.如何学习C语言

可以参考博客,该博客是美国大学一个教授讲该如何教学生C语言,我们可以从老师的角度来进行C语言的学习,更加的有效
Teaching C
缺点是该博客是英文版,可能后续会进行翻译。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图像识别系统】表情识别Python+人工智能深度学习+TensorFlow+卷积算法网络模型+图像识别

表情识别系统,本系统使用Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对7种表情图片数据集(‘Neutral’, ‘Anger’, ‘Disgust’, ‘Fear’, ‘Happy’, ‘Sad’, ‘Surprise’)进行…

安装存储器的段描述符并加载GDTR

代码清单 ;代码清单12-1;文件名:c12_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-5-16 19:54;修改于2022-02-16 11:15;设置堆栈段和栈指针mov ax, csmov ss, axmov sp, 0x7c00;计算GDT所在的逻辑段地址12 mov ax, [c…

视图的相关操作

4.1.1 创建视图 语法格式:create [ or replace ] view view_name [ ( column_list ) ] as select_statement [ with [ cascade | local ] check option ] 说明: &#xff0…

Redis的SDS数据结构解决C语言字符串缺陷

redis设计了SDS这一数据结构来表示字符串而不是使用c语言的字符串:字符数组 那么redis为什么要大费周章自己设计字符串呢? 答案是C语言字符串有缺陷 1.获取字符串长度,需要遍历字符数组,时间复杂度是O(N&#xff09…

167.二叉树:另一棵树的字树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

PostgreSQL 16 小课推广

PostgreSQL 16 小课推广 1. PostgreSQL 16 基础知识 PostgreSQL 16 的特点与优势安装与配置PostgreSQL 16数据库和表的基本概念与操作数据类型与约束SQL 语言基础 2. 数据查询与操作 SELECT 语句的使用聚合函数与分组查询子查询与连接查询数据插入、更新与删除视图与索引的…

二维码生成

摘要 QRCoder 是一个功能强大的 C# 库,用于生成 QR 码。QR 码是一种二维码,可以存储大量的信息,并且具有良好的识别率和存储容量。使用 QRCoder,用户可以方便地生成各种类型的 QR 码,包括 URL、文本、电话号码、电子邮…

<网络安全VIP>第二篇《工业控制软件》

1 PLC PLC,(Programmable Logic Controller),可编程逻辑控制器(PLC)是种专门为在工业环境下应用而设计的数字运算操作电子系统。 2 DCS 四、DCS的发展趋势 一、DCS的基本定义 DCS是分布式控制系统(Distributed Control System)的英文缩写,在国内自控行业又称之为集…

运放IC:HC358:1MHz,轨到轨I/O,低功耗运算放大ic,供应:传感器压力传感放大器移动通讯设备音频输出便携应用烟雾监测电池驱动的设备

运放IC: HC358:1MHz,轨到轨I/O,低功耗运算放大ic 概述:HC358是一款轨到轨输入输出,电压反馈运算放大 器。输入共模范围和输出摆幅较大,最低工作电源电压仅 为2.1V,最高电压可达5.5V。工作环…

冥想第一千一百七十八天

1.周末,早上先骑着电车到绿谷公园拿了姐给的精油,40分钟到家。 2.早上带着媳妇吃了饭,等丈母娘和小侄子。一起去荥泽水乡特别的推荐。感受特别好玩。 3.晚上带着丈母娘和小侄子吃了饭,给送到中原福塔。回来都都12点了。 4.累的&am…

【Nacos】docker-compose启动nacos v2.2.3,启动时修改默认密码不使用naocs

1. 背景 出于安全考虑,我司DevOps平台自动部署的容器化nacos密码不能是弱密码或默认值 但是nacos-v2.2.3官方镜像启动后会初始化nacos用户密码为nacos,修改启动时的变量并没有生效。 2. 部署验证 2.1 yml文件如下 注意将derby库的初始化文件挂载出来…

群体优化算法---蜂群优化算法应用于数据挖掘

介绍 蜂群优化算法(Bee Algorithm, BA)及其变种主要模拟蜜蜂的觅食行为,以解决复杂的优化问题。这类算法通过蜜蜂之间的信息交流和协作来探索解空间,寻找全局最优解。主要应用于参数优化,结构优化,机器学习…

初讲解运算符重载

运算符的重载 运算符重载基本概念运算符重载入门技术推演运算符重载碰上友元函数运算符重载的限制 什么是运算符重载? 运算符重载基本概念 所谓重载,就是重新赋予新的含义。 函数重载就是对一个已有的函数赋予新的含义,使之实现新功能&#x…

[Algorithm][动态规划][回文串问题][回文子串][最长回文子串][分割回文串Ⅳ]详细讲解

目录 0.原理讲解1.回文子串1.题目链接2.算法原理详解3.代码实现 2.最长回文子串1.题目链接3.代码实现 3.分割回文串 IV1.题目链接2.算法原理详解3.代码实现 0.原理讲解 动态规划能够将所有的子串是否是回文的信息,保存在dp表里面状态表示一般经验:以[i,…

【Redis】redis高阶-使用zset实现延时队列

Hi,大家好,我是抢老婆酸奶的小肥仔。 最近在使用redis时,就想能不能用其实现消息队列?也在网上看了下其他小伙伴写的实现,结合自身业务实现了如下消息队列,希望对大家有用。 废话不多说,直接开撸。 1、为…

Kafka之Broker原理

1. 日志数据的存储 1.1 Partition 1. 为了实现横向扩展,把不同的数据存放在不同的 Broker 上,同时降低单台服务器的访问压力,我们把一个Topic 中的数据分隔成多个 Partition 2. 每个 Partition 中的消息是有序的,顺序写入&#x…

【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战

目录 一、引言 二、模型简介 2.1 Qwen1.5 模型概述 2.2 Qwen1.5 模型架构 三、训练与推理 3.1 Qwen1.5 模型训练 3.2 Qwen1.5 模型推理 四、总结 一、引言 Qwen是阿里巴巴集团Qwen团队的大语言模型和多模态大模型系列。现在,大语言模型已升级到Qwen1.5&…

分布式session共享配置

目录 1、spring-session 1.1 添加依赖 1.2 spring-mvc.xml配置文件 1.3 web.xml 2、tomcat配置session、共享 2.1 Tomcat配置 2.2 Web.xml配置 1、spring-session 官方文档:https://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/ 1.…

【vue-7】图片轮播

实现功能&#xff1a; 1、通过button实现图片轮训播放&#xff1b; 2、通过标签列表项实现图片的播放&#xff1b; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

AI网络爬虫:对网页指定区域批量截图

对网页指定区域批量截图&#xff0c;可以在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;一步一步的思考&#xff0c;完成一个对网页指定区域截图的python脚本的任务&#xff0c;具体步骤如下&#xff1a; 设置User-Agent: Mozilla/5.0 (…