操作系统真相还原——第6章内存管理系统

news2024/11/15 17:30:01

第八章 内存管理系统

makefile

  1. 编译整个项目,如果改变局部关系,只靠人工难以维护文件间的依赖关系,所以通过make程序进行处理

  2. makefile文件是make程序的搭档:发现某个文件更新后,只编译该文件和受该文件影响的相关文件,其他不受影响的文件不重新编译,从而提高了编译效率

    • makefile文件类似于脚本程序,定义了各种关键字、语法结构、函数、变量
    • make程序通过解析makefile文件后,自动找出变更的文件以及依赖此变更文件的相关文件,然后对所有受影响的相关文件执行事先定义好的命令规则
  3. makefile基本语法

    // 一组规则
    目标文件(输出):依赖文件(输入)
    [Tab]命令(规则)
    
    • 目标文件:指规则中想要生成的文件,可以是.o文件、可执行文件或者伪目标
    • 依赖文件:生成此规则中目标文件所需要的文件
    • 命令:一个或多个shell命令,其中每条命令必须以Tab开头,单独占一行
  4. make程序通过文件的属性和数据相关的时间戳进行判断更新部分

    • atime:即access time,表示访问文件数据部分时间,每次读取文件数据部分时就会更新atime,比如cat或less命令会进行更新,而ls命令则不会
    • ctime ,即change time ,表示文件属性或数据的改变时间,每当文件的属性或数据被修改时,就会更新ctime,也就是说ctime 同时跟踪文件属性和文件数据变化的时间。
    • mtime ,即modify time,表示文件数据部分的修改时间,每次文件的数据被修改时就会更新mtime 。在上面说过啦, ctime 也跟踪数据变化时间,所以,当文件数据被修改时, mtime 和ctime 一同更新。
  5. 默认makegile文件查找次序

    • GNUmakefile
    • makefile
    • Makefile
  6. 伪目标:规则中不存在依赖文件的一组规则,不能和真实目标同名

  7. 约定俗称的伪目标名称

    伪目标名称功能描述
    all完成所有模块的编译工作,类似于rebuild all
    clean用于清空编译完成的所有目标文件, 一般用rm 命令实现
    dist用于将打包文件后的tar 文件再压缩成gz 文件
    install将编译好的程序复制到安装目录下,通过prefix参数配置
    printf用于打印已经发生改变的文件
    tar用于将文件打包成tar 文件,也就是所谓的归档文件
    test用于测试makefile流程
  8. 递归式推导目标:检查最终输出的目标文件,没有则向上查找制作该文件的规则进行执行。如果没有显式写命令,可能进行自动推导

  9. makefile变量定义

    变量格式定义:变量名 = 值(字符串,不用加引号)
    变量名引用格式:$(变量名)
    
  10. make还自定义一些系统级变量,可分为命令相关变量和参数相关变量

    变量名描述
    AR打包程序,默认是“ar”
    AS汇编语言编译器,默认是“as”
    CCC语言编译器,默认是“cc”
    CXXC++语言编译器,默认是“g++”
    CPPC预处理器,默认是“$(CC)- E
    FCFortran的编译器和预处理器
    GET从SCCS文件中提取文件程序
    PCpascal语言编译器
    MAKEINFO将texinfo文件转换成info文件
    RM删除命令
    TEX从TeX源文件中创建TexDVI文件的程序
    WEAVE将Web转换为TeX程序
    YACC将处理的C程序转换为Yacc词法分析器
    YACCR处理Ratfor程序的Yacc此法分析器
    ------参数相关的系统变量
    ARFLAGS打包程序$(AR)的参数
    ASFLAGS汇编语言编译器参数
    CFLAGSc 语言编译器参数
    CXXFLAGSC++编译器参数
    CPPFLAGSC 预处理器参数
    FFLAGSFortran 语言编译器参数
    LDFLAGS链接器参数
    PFLAGSPascal 语言编译器参数
    YFLAGSYacc 词法分析器参数
  11. 在编写规则时,若一行写不下,可以在行尾添加反斜杠字符’\',这样下一行的内容便被认为是同一行

  12. makefile 中用#来单行注释,只要各行第一个非空字符(除空格、tab )是#,本行内容便被注释了

  13. make all命令可以查看make程序执行过程

  14. 隐含规则可推导最终的可执行文件

    • C程序:x.o的生成依赖于x.c,生成x.o的命令
      $(CC) - c ${CPPFLAGS) ${CFLAGS)
    • C++程序:x.o的生成依赖于x.cc,生成x.o的命令
      $(CXX) -c $ (CPPFLAGS) $(CFLAGS)
    • Pascal程序:x.p的生成依赖于x.p,生成x.o的命令
      $(PC) -c $ (CPPFLAGS) $(CFLAGS)
  15. 自动化变量代表一组文件名,值的范围是文件名集合

    • $@:表示规则中的目标文件名集合,$@表示其中一个目标文件名
    • $<:表示规则中依赖文件的第一个
    • $^:表示规则中依赖文件的集合
    • $?:表示规则中,所有比目标文件mtime更新的依赖文件集合
  16. 模式规则

    • %用来匹配任意多个非空字符。g%.o 是以字符g 开头的所有以.o为结尾的文件
  17. makefile示例

    #无省略
    test2.o:test2.c
    	gcc -c -o test2.o test2.c
    test1.o:test1.c
    	gcc -c -o test1.o test1.c
    test.bin:test1.o test2.o
    	gcc -o test.bin test1.o test2.o
    all: test.bin
    	@echo "compile done"
    	
    # 变量定义
    test2.o:test2.c
    	gcc -c -o test2.o test2.c
    test1.o:test1.c
    	gcc -c -o test1.o test1.c
    objfiles = test1.o test2.o
    test.bin:$(objfiles)
    	gcc -o test.bin $(objfiles)
    all: test.bin
    	@echo "compile done"
    # 使用自动化变量
    test2.o:test2.c
    	gcc -c -o test2.o test2.c
    test1.o:test1.c
    	gcc -c -o test1.o test1.c
    objfiles = test1.o test2.o
    test.bin:$(objfiles)
    	gcc -o $@ $^
    all: test.bin
    	@echo "compile done"
    # 模式匹配
    %.o:%.c
    	gcc -c -o $@ $^
    objfiles = test1.o test2.o
    test.bin:$(objfiles)
    	gcc -o $@ $^
    all:test.bin
    	@echo "compile done"
    

实现assert断言

  1. 系统越复杂,模块越多越容易出错。为了方便调试,一个好的习惯是在关键部分设置哨兵进行监测数据的合法性
  2. 在C语言中ASSERT是用宏来定义的,其原理是判断传给ASSERT 的表达式是否成立,若表达式成立则什么都不做,否则打印出错信息并停止执行,我们仿照它来实现自己的版本。

image-20220811104919101

的习惯是在关键部分设置哨兵进行监测数据的合法性
2. 在C语言中ASSERT是用宏来定义的,其原理是判断传给ASSERT 的表达式是否成立,若表达式成立则什么都不做,否则打印出错信息并停止执行,我们仿照它来实现自己的版本。

[外链图片转存中…(img-bv93JnTk-1677658749817)]

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

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

相关文章

为什么95%的Java程序员人,都是用不好Synchronized?

Synchronized锁优化 jdk1.6对锁的实现引入了大量的优化&#xff0c;如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 锁主要存在四中状态&#xff0c;依次是&#xff1a;无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁&#xff0c;他们…

upload-labs通关详细教程

文章目录文件上传要点1、前端验证绕过做题步骤源码分析2、Content-Type方式绕过做题步骤源码分析3、黑名单绕过做题步骤源码分析4、.htaccess文件绕过简介做题步骤源码分析5、后缀大小写绕过简介做题步骤源码分析6、文件后缀&#xff08;空&#xff09;绕过简介做题步骤源码分析…

CAN工具-VSpy(ValueCAN) - Panel面板(续)

继续上次的Panel面板介绍&#xff01;&#xff01;&#xff01;7. LED 控件LED控件可以用作指示器。在Graphical Panels中选中该控件&#xff0c;在界面右侧侧拉框的Properties中可设置LED控件的通用属性。LED控制属性LED On Color&#xff1a;双击打开标准的Windows颜色选择器…

Vue 3.0 学习笔记之基础知识

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言Vue 3.0 创建与Vue2.0对比的变化关闭语法检查setup 组合式函数compositions前言 Vue 3.0 创建 与Vue2.0对比的变化 关闭语法检查 lintOnSave: false setup 组合式函数compositions…

Git 初体验 (处理 .ssh 文件的相关问题)

目录前沿环境入门教程出现的问题问题 1 &#xff1a;C 盘用户文件中找不到 .ssh 文件问题 2 : 在 clone 远程仓库文件时报错问题3 : 第一次从 Gitee clone 项目时会弹出一个 Git 窗口,要你输入用户和密码获取 credential (可以信任的证明)自我实践总结引用前沿 很早前安装了 G…

二叉树——删除二叉搜索树中的节点

删除二叉搜索树中的节点 链接 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可…

2022_SPL_CMINet

Cross-Stage Multi-Scale Interaction Network for RGB-D Salient Object Detection 用于rgb-d显着目标检测的跨阶段多尺度交互网络 目录 文章目录 前言 一、引言 二、提出的方法 A.概述 感觉有点乱&#xff0c;没看太懂&#xff0c;没关系&#xff0c;我们接着往下看 …

Postman 实现 UI 自动化测试

看到这篇文章的标题&#xff0c;是不是有小伙伴会感到惊讶呢&#xff1f; Postman 不是做接口测试的吗&#xff1f;为什么还能做 UI 自动化测试呢&#xff1f; 其实&#xff0c;只要你了解 Selenium 的运行原理&#xff0c;就可以理解为什么 Postman 也能实现 UI 自动化测试了…

EPICS motor模块

一、概要 1&#xff09; 在EPICS motor模块中的是什么并且它为了什么&#xff1f; 2&#xff09; 支持的电机控制器和模型 3&#xff09;电机记录特性 4&#xff09;配置示例 5&#xff09;反馈 6&#xff09; 重试 7&#xff09; 回程差矫正 8&#xff09;发行 二、术…

Linux上的校验和验证

校验和&#xff08;checksum&#xff09;程序用来从文件中生成相对较小的唯一密钥。我们可以重新计算该密钥&#xff0c;用以检查文件是否发生改变。修改文件可能是有意为之&#xff08;添加新用户会改变密码文件&#xff09;&#xff0c;也可能是无意而为&#xff08;从CD-ROM…

Java:Java仍然处于领先地位?

没有多少编程语言能够自吹自擂并持续流行20多年&#xff0c;但Java就是其中之一。Java应用程序不仅局限于web和移动开发&#xff0c;而且给大数据和人工智能留下了深刻的印象。不用多说&#xff0c;让我们讨论一下Java流行的几个原因!!1.实用性根据JamesGosling的说法&#xff…

QT+OpenGL 面剔除和帧缓冲

QTOpenGL 面剔除和帧缓冲 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 面剔除 OpenGL能够检查所有面向&#xff08;Front Facing&#xff09;观察者的面&#xff0c;并且渲染他们&#xff0c;而丢…

springboot logback日志+异常+阿里云日志 aliyun-log-logback-appender

前言最近有个新项目用了&#xff0c;springboot3.0&#xff0c;以前项目日志保存得方式是阿里云云服务自动读取日志文件&#xff0c;最近项目部署得方式可能有变化&#xff0c;所以新项目用logbackaliyun-log-logback-appender得方式保存到阿里云日志服务。用logback得原因主要…

《OpenGL宝典》--统一变量

统一变量 [layout (location 0)] uniform float f 1.0f;若设置layout&#xff0c;则不需要使用glGetUniformLocation来获取统一变量的位置 使用glUniform*传递值&#xff0c;glUniformMatrix*()设置矩阵统一变量。 glUseProgram(myShader); glUniform1f(0,45.2f);//0为loc…

思迅软锁安装配置说明

思迅软锁安装配置说明 一、软锁安装、申请及配置流程 1.软件安装环境要求 2.软件安装配置流程 步骤1: 在平台下载软锁程序并安装。在安装了总部数据库的服务器上&#xff0c;运行“思迅软锁服务.exe”程序&#xff0c;按照指引进行安装&#xff0c;安装完成后将在电脑的桌面上…

微服务之Gateway服务网关

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

「亲测」0成本考证填报个税纳税额减免3600

「亲测」0成本考证填报个税纳税额减免3600 今天开始2022综合所得的年度汇算就开始办理了&#xff0c;刚刚步入工作的同学&#xff0c;对个税的填报有些苦恼&#xff0c;好像除了房租就没有能减税的政策了。 别急别急&#xff0c;其实个⼈所得税⾥⾯包含⼀个叫“专项附加扣除”的…

C++ 认识和了解C++

1.在使用C语言写代码的时候开头要用到的是&#xff1a; #include<iostream> using namespace std;不可以写成这样&#xff1a; #include iostream.h&#xff08;1&#xff09;iostream是输入输出流类&#xff0c; istream输入流类 cin >> ostream输出流类 cout &…

40系笔记本(可不联网激活)深度学习生产力(环境配置和简单训练测试)

40系笔记本深度学习、转码生产力&#xff08;环境配置和简单训练测试&#xff09;这里写自定义目录标题深度学习环境准备CUDA、CUDNN版本问题torch版本问题其他软件版本的安装命令训练测试代码地址关于Linux还是Windows的问题结果博主首发购买了枪神7超竞4080的版本&#xff0c…

git开发流程

分支介绍 dev&#xff1a;开发环境&#xff0c;从feature去mr test: 测试环境&#xff0c;从feature去mr pre&#xff1a; 预生产环境&#xff0c;从master去mr&#xff0c;为了验证master代码 master: 生产环境&#xff0c;从feature去mr feature&#xff1a; 开发分支----小…