Featured image of post 北航OS Lab1 上机

北航OS Lab1 上机

C功底大考察

exam

exam难度相较上次已大幅降低,如果lab1本身实现没有问题,再看过一点点学长博客或代码,基本就约等于点击即送了。

在此统计一下近三年的exam。再往前lab1就主要学习readelf,考核点不在于vprintfmt了。

近三年的exam均采用了新增%…[字母]的形式,也不必担心新的字母有什么新的实现,一般就是%d,%s,%c等等的组合罢了。

21级:%R

21级(2023上机):

实现 %...R: %...R等价于(%...d,%...d)

所以只需要

1
2
3
4
5
6
7
8
case 'R':
	print_char(out, data, '(', 0, 0); 
	//...  照搬case 'd'的内容
	print_char(out, data, ',', 0, 0); 
	// width可无脑取0,因为width是最小长度限制,大于此长度不会截断
	//...  再次照搬case 'd'的内容
	print_char(out, data, ')', 0, 0); 
	break;

不用畏惧两个参数,无非是两次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某种简单计算后的结果

所以也只需要

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
case 'P':
	print_char(out, data, '(', 0, 0); 
	//...  照搬case 'd'的内容
	print_char(out, data, ',', 0, 0); 
	// width可无脑取0,因为width是最小长度限制,大于此长度不会截断
	//...  再次照搬case 'd'的内容
	print_char(out, data, ',', 0, 0); 
	//...  再再次照搬case 'd'的内容
	print_char(out, data, ')', 0, 0); 
	break;

需要注意的是,第三次照搬就不需要通过va_arg了,而是直接计算出来。

MYGO!!!!! : %k

我们的上机相较过去有一定的突破,但也不多: %...k等价于%...s => %...d

但是%...k中的...的属性并不是全部无脑分配给%s与%d了

这些属性具体给谁按照题意要求即可

其实也只需要

1
2
3
4
5
6
case 'k':
	//...  照搬case 's'的内容
	print_str(out, data, " => ", 0, 0); 
	// 这里width还可以可无脑取0
	//...  照搬case 'd'的内容
	break;

如果lab1不出意外还出这类题的话,相信你看完这些讲解,应当是能直接秒杀了。

这里给你一点更快的建议:

  • nyy可以复制自光标起的n行
  • p可以实现粘贴
  • 在实验报告中也提到过的,print_char,print_num,print_str之类的函数也可以提前了解一下 HINT

extra

本次extra题考验你C语言指针功夫!

其实和往年题也比较类似的: 考查你对out函数的理解。

一般来说都会设置一个比较新的背景,

  • 21级的sprintf写入到字符串
  • 22级的模仿printscan
  • 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的整体代码量与实现难度有一定基础的认知。

祝上机顺利!

Easy Life and Easy Learning
使用 Hugo 构建
主题 StackJimmy 设计
  1. 1 Designant. Designant
  2. 2 Demiurge Rabpit
  3. 3 Lament Rain Ashrount vs. 打打だいず
  4. 4 Breach of Faith Supire feat.eili
  5. 5 WORLDCALL Blacklolita
  6. 6 Meteorite Lotus wa.
  7. 7 И00. Se-U-Ra
  8. 8 Observatory かめりあ
  9. 9 白噪音 - -
Designant. - Designant
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.