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

news/2024/6/18 5:17:22 标签: linux, ubuntu, macos

第八章 内存管理系统

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.niftyadmin.cn/n/111340.html

相关文章

GPU会变得更便宜吗?GPU 定价更新

在英伟达和AMD发布了一段时间的一致显卡之后&#xff0c;事情在二月份已经降温。没有新的GPU可以谈论&#xff0c;没有特别惊人的交易或任何东西&#xff0c;但仍然值得看看市场现在的表现如何&#xff0c;因为它已经稳定下来&#xff0c;以及我们在未来几个月可以期待什么。过…

CSDN竞赛第32期题解

CSDN竞赛第32期题解 1、题目名称&#xff1a;传奇霸业 传奇霸业&#xff0c;是兄弟就来干。 小春(HP a)遇到了一只黄金哥布林(HP x)。 小春每次能对哥布林造成b点伤害&#xff0c;哥布 林每次能对小春造成y点伤害。 作为玩家的小春怎么可能随便让哥布林打死呢&#xff01;他…

Jackson CVE-2017-7525 反序列化漏洞

0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻&#xff0c;默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容&#xff1a;Java代码审计——Fastjson TemplatesImpl调用链 相关原理&#xff0c;可以参考&#xff1a;Jackson 反序列化漏洞原理 …

垃圾回收的概念与算法(第四章)

《实战Java虚拟机&#xff1a;JVM故障诊断与性能优化 (第2版)》 第4章 垃圾回收的概念与算法 目标&#xff1a; 了解什么是垃圾回收学习几种常用的垃圾回收算法掌握可触及性的概念理解 Stop-The-World&#xff08;STW&#xff09; 4.1. 认识垃圾回收 - 内存管理清洁工 垃圾…

GFD563A101 3BHE046836R0101

GFD563A101 3BHE046836R0101关于高端涂布机张力控制系统方案的介绍高端涂布机张力控制系统方案涂布机是将具有某种功效的胶&#xff0c;或者油墨类物质均匀粘连在塑料薄膜、铝箔、纺织品等表面的机械设备。本系统从放卷到收卷共采用七台变频器&#xff0c;其中收放卷采用闭环张…

SAP MM学习笔记4-在库类型都有哪些,在库类型有哪些控制点

SAP MM模块中的在库类型有3种&#xff1a; 1&#xff0c;利用可能在库 (非限制使用库存) 2&#xff0c;品质检查中在库 &#xff08;质检库存&#xff09; 3&#xff0c;保留在库&#xff08;已冻结库存&#xff09; 这3种在库标识该物料的状态&#xff0c;是否可用。 这3种…

深度学习 | BN层原理浅谈

深度学习 | BN层原理浅谈 文章目录深度学习 | BN层原理浅谈一. 背景二. BN层作用三. 计算原理四. 注意事项为什么BN层一般用在线性层和卷积层的后面&#xff0c;而不是放在激活函数后为什么BN能抑制过拟合(有争议)一. 背景 神经网络在训练时&#xff0c;由于内存限制&#xff0…

剑指 Offer 14-剪绳子

摘要 ​​​​​​剑指 Offer 14- I. 剪绳子 剑指 Offer 14- II. 剪绳子 II 343. 整数拆分 一、动态规划解析 这道题给定一个大于1的正整数n&#xff0c;要求将n 拆分成至少两个正整数的和&#xff0c;并使这些正整数的乘积最大化&#xff0c;返回最大乘积。令x是拆分出的第…