exam
exam难度相较上次已大幅降低,如果lab1本身实现没有问题,再看过一点点学长博客或代码,基本就约等于点击即送了。
在此统计一下近三年的exam。再往前lab1就主要学习readelf,考核点不在于vprintfmt了。
近三年的exam均采用了新增%…[字母]的形式,也不必担心新的字母有什么新的实现,一般就是%d,%s,%c等等的组合罢了。
21级:%R
21级(2023上机):
实现 %...R
:
%...R
等价于(%...d,%...d)
所以只需要
|
|
不用畏惧两个参数,无非是两次va_arg,照搬两次case ’d’的内容的时候都是实现了的。
具体可参见nr的博客:https://www.cnblogs.com/juantify/p/17238949.html
22级:%P
22级堪称与21级一模一样,唯一的改变是读两个参数需要输出三个数:
%...P
等价于(%...d,%...d,%...d)
读取两个数x,y 输出三个数x,y,z 其中z=(x+y)*(x-y)
记不大清了,反正只是x,y某种简单计算后的结果
所以也只需要
|
|
需要注意的是,第三次照搬就不需要通过va_arg了,而是直接计算出来。
MYGO!!!!! : %k
我们的上机相较过去有一定的突破,但也不多:
%...k
等价于%...s => %...d
但是%...k
中的...
的属性并不是全部无脑分配给%s与%d了
这些属性具体给谁按照题意要求即可
其实也只需要
|
|
如果lab1不出意外还出这类题的话,相信你看完这些讲解,应当是能直接秒杀了。
这里给你一点更快的建议:
nyy
可以复制自光标起的n行p
可以实现粘贴- 在实验报告中也提到过的,print_char,print_num,print_str之类的函数也可以提前了解一下
extra
本次extra题考验你C语言指针功夫!
其实和往年题也比较类似的: 考查你对out函数的理解。
一般来说都会设置一个比较新的背景,
- 21级的
sprintf
写入到字符串 - 22级的模仿
print
写scan
- 23级的
fmemprintf
写入到内存信息流
本质上都是仿照着kern/printk.c
来书写
HINT也会提示你去参考这个函数()
核心的方法就是写一个新的out函数
因为调用vprintfmt的时候,最终都是落实到out函数上,vprintfmt主要做的就是格式解析的工作。因此只需要写好自定义out函数,就能实现自定义支持格式的新功能。
其他的内容在此不愿详细解释,大家根据题面与HINT努力实现就好,都是一些很简单的,功能明确的C函数。(大多数人挂都是这些环节的C语言bug)
题目背景: FILE*结构体: char *base; 基地址(起始地址) char *ptr; 写地址(当前地址) char *end; 末地址
可以理解为FILE*掌管着一段字符串以及一个用于操作的指针
下面是实现的五个函数,其中四个函数是明确要求的必需函数,还有一个是实现过程中需要自主实现并调用的。
fmemopen
笔者debug了30min便在于strcmp前面忘加!
OS的debug难度实在太大。 当你出现错误,你得不到任何有效信息,有可能就只是make run之后系统卡死 如果错的不那么错误(例如我这样),也许会返回一个无厘头的错误结果,但事实上这个结果反而误导了我的debug过程
fmemoutput(此函数为自主命名实现)
fmemprintf
fseek
fclose
后记
在OOU2hw5电梯、冯如杯、lab2等多项繁杂事务的强压之下,居然还能抽出时间点开这篇文章复习OS的lab1,真切希望我的内容可以帮助到你!!!
大概率很多人是没有怎么看extra的代码的,因为确实没必要看。 在这里放出来,是希望大家能对extra的整体代码量与实现难度有一定基础的认知。
祝上机顺利!