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

本文主要是介绍操作系统入门系列-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
缺点是该博客是英文版,可能后续会进行翻译。


这篇关于操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in C)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029435

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点