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

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

时间:2024-06-04 20:03:45浏览次数:33  
标签:硬件 操作系统 Programming C语言 ---- 地址 内存 层次

系列文章目录

操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programming xv6 in 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
缺点是该博客是英文版,可能后续会进行翻译。


标签:硬件,操作系统,Programming,C语言,----,地址,内存,层次
From: https://blog.csdn.net/weixin_52042488/article/details/139426052

相关文章

  • 【Linux系统编程复习】一些常见的问题2
    11、如果要你实现一个mutex互斥锁你要怎么实现?实现mutex最重要的就是实现它的lock()方法和unlock()方法。我们保存一个全局变量flag,flag=1表明该锁已经锁住,flag=0表明锁没有锁住。实现lock()时,使用一个while循环不断检测flag是否等于1,如果等于1就一直循环。然后将flag设置为......
  • 计算器的初步实现(一)
    窗口的实现要用到JFrame,计算的实现要通过ActionListener1.窗口的实现publicclasscalculatorLBW522{publicvoidshowUI(){CalucOfactionual=newCalucOfaction();JFramejf=newJFrame();jf.setTitle("calculator");jf.s......
  • 实验一 交换网络组建
    1.简单局域网环境的搭建第一部分流程如下:(1)分配一个192.168.1.0/24的网段(2)给3个主机分配IP地址依次为192.168.1.1、192.168.1.2、192.168.1.3(3)熟悉基本的命令,如ping命令、ipconfig命令、tracert命令(4)实现同路由器下的主机连通性测试1.1特定网段192.168.168.1.......
  • 【MySQL】表左连接操作,对右表添加过滤数据的条件时,容易忽略的坑(左关联统计右表数据不
     疑问:sql中,左关联,右边表中无对应的数据,那能对右边的列进行筛选吗 ?带着疑问,我们看一下下面的文章MySQL】表左连接,对右表过滤数据时的坑左关联统计右边数据sqlSELECTma.id,ma.model_id,ma.event_rules_id,ma.model_applicati......
  • OSS存储文件
    阿里云OSS官方文档:快速使用OSSSDK_对象存储(OSS)-阿里云帮助中心(aliyun.com)在Maven工程中使用OSSJavaSDK,只需在pom.xml中加入相应依赖即可。在<dependencies>中加入如下内容:优先使用最新版本的依赖项,此处以3.15.1版本为例。<dependency><groupId>com.aliyun.......
  • 网络的基本概念
    IP地址:描述了一个设备在网络上的地址(可以理解为购物时的收货地址),在计算机中使用一个32位的4字节数字表示地址,一般把IP地址表示为四个0~255的数字,中间用.分隔开。比如192.168.2.0,等等。端口号:是为了区分主机上的不同应用程序。一个端口号只能对应一个应用程序,但是一个程序可以......
  • YOLOv8改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】
    ......
  • linux下用域名解析ip地址列表
    linux下用域名解析ip地址列表目录linux下用域名解析ip地址列表头文件/宏定义主函数验证结果头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<netdb.h>#include<arpa/inet.h>主函数/********************************************************************......
  • Spring-MVC注解支持Ant风格的模糊匹配和Restful风格的接收数据------Spring-MVC框架
    packagecom.alatus.mvc3.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassIndexController{......
  • golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?
     在Go语言中,net/http和net/rpc是两个不同的包,它们分别用于实现不同的网络通信模式:net/http:net/http包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。HTTP协议是基于请求-响应模型的,客......