文章目录
- 8.1 Makefile 简介
- makefile基本语法
- make参数
- 伪目标
- 自定义变量与系统变量
- 隐含规则
- 自动化变量与模式规则
- 8.2 实现assert断言
- 操作系统代码
- 编译、链接并写入磁盘
- 启动bochs执行
- 物理内存使用情况
- 8.3 实现字符串操作函数
- 操作系统代码
- 编译、链接并写入磁盘
- 启动bochs执行
- 物理内存使用情况
- 8.4 位图实现
- 操作系统代码
- 可用物理内存
- 物理内存使用情况
- 8.5.1 内存池规划
- 操作系统代码
- 编译、链接并写入磁盘
- 启动bochs执行
- 物理内存使用情况
- 8.5.1 物理页分配
- 操作系统代码
- 编译、链接并写入磁盘
- 启动bochs执行
- 物理内存使用情况
8.1 Makefile 简介
makefile基本语法
目标文件: 依赖文件
[Tab] 命令
目标文件:此规则中要生成的目标文件
依赖文件:此规则中要生成目标文件所要使用的文件
命令:此规则中要执行的动作(shell命令)
以上规则的意义是:要想生成目标文件,需要提前准备好依赖文件,若依赖文件列表中任一文件比目标文件新,则去执行规则中的命令
文件更新时间:
atime:读取文件数据的时间
ctime:文件数据或数据的改变时间
mtime:文件数据部分的修改时间(make语法中的命令执行参考该时间)
stat 文件名:查看上述三种时间数据
make参数
make 目标文件:执行指定目标文件处的语法
make:从上至下执行语句
当未指定使用的makefile文件时,会默认搜索名为makefile的文件
make:递归式推导目标
在makefile中的目标,是以递归方式逐层向上查找目标的,这一点能在多个目标相互依赖的情况下得到体现
伪目标
伪目标:当规则中不存在依赖文件时该目标文件就是伪目标,此时命令的执行不依赖于更新时间,而是直接执行
伪目标不能和真实目标文件同名,为了避免同名的情况,可使用".PHONY"来修饰为目标,格式为".PHONY:伪目标名"
常用手法:用于删除编译过程中产生的.o文件
.PHONY:clean
clean:
rm ./build/*.o
常用伪目标名称:
自定义变量与系统变量
自定义变量:
变量定义格式:变量名=值(字符串),多个值之间使用空格分开
变量引用格式:$(变量名)
系统变量:
隐含规则
在行尾添加反斜杠字符,则下一行的内容与反斜杠所在行同属一行
使用#表示注释,若行尾含有反斜杠,则下一行也被注释
自动化变量与模式规则
自动化变量:
make还支持一种自动化变量,此变量代表一组文件名
$@:表示规则中的目标文件集合
$<:表示依赖文件中的第1个文件
$^:表示所有的依赖文件
$?:表示所有比目标文件mtime更新的依赖文件
模式规则:
%用来匹配多个非空字符串,make会在当前路径进行模式匹配
8.2 实现assert断言
随着模块越来越多,程序出错的概率越来越大,为了方便调试在程序的关键部分设置"哨兵",让它来监督数据的正确性
操作系统代码
百度网盘链接:https://pan.baidu.com/s/1U8Gb0PZazvxFLJNIyHMizQ
提取码:dz4f
编译、链接并写入磁盘
启动bochs执行
./bochs/bin/bochs -f bochs/boot.disk
物理内存使用情况
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
内核位于0x3000
8.3 实现字符串操作函数
操作系统代码
百度网盘链接:https://pan.baidu.com/s/17IOgSbbumSr6acTMC50FYg
提取码:6rez
编译、链接并写入磁盘
启动bochs执行
./bochs/bin/bochs -f bochs/boot.disk
物理内存使用情况
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
内核位于0x3000
8.4 位图实现
操作系统代码
百度网盘链接:https://pan.baidu.com/s/1g1yCouZksePsKNpSaYSXTQ
提取码:koka
可用物理内存
物理内存使用情况
书中将位图放置于0x9F000,但在我的机器上此段内存不可用
于是我将位图放置于0x8F000
内存分布如下:
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
内核位于0x3000
位图位于0x8F000
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
8.5.1 内存池规划
操作系统代码
百度网盘链接:https://pan.baidu.com/s/1IO3KNknUOA8QL2q6S3tHGA
提取码:8z4d
编译、链接并写入磁盘
启动bochs执行
./bochs/bin/bochs -f bochs/boot.disk
物理内存使用情况
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
内核位于0x3000
位图位于0x8F000
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
8.5.1 物理页分配
操作系统代码
百度网盘链接:https://pan.baidu.com/s/1vWUCpGoVHA5Hpvz8CMDUfQ
提取码:o6l4
编译、链接并写入磁盘
启动bochs执行
./bochs/bin/bochs -f bochs/boot.disk
物理内存使用情况
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
内核位于0x3000
位图位于0x8F000
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB