北航操作系统实验lab

lab1

图挂了以后补

实验内容

写在前面:我决定认真完成所有实验了,虽然它的指导书摸棱两可,虽然实验和我最初想要完成自己的操作系统也不太一样。但是其中的这些知识点还是值得一学的。在完成这个实验的同时我也会完成一份博客,希望能给学弟学妹提供一些帮助。

Exercise 1.1

请修改 include.mk 文件,使交叉编译器的路径正确。之后执行 make指令,如果配置一切正确,则会在gxemul 目录下生成vmlinux 的内核文件。

vim一下include.mk

修改路径为 /OSLAB/compiler/usr/bin/mips_4KC-

这里的代码需要学习makefile有一篇极好的教程

(17条消息) 跟我一起写 Makefile(一)haoel的博客-CSDN博客makefile

前4篇重点看,其它挑重点

这里:=其实是阻塞赋值

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo ​ y = $(x) bar ​ x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo ​ y := $(x) bar ​ x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

/usr/bin 是你在后期安装的一些软件的运行脚本。主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

可以看到生成了内核文件

Exercise1.2

阅读./readelf文件夹中kerelf.h readelf.c以及 main.c三个文件中的代码,并完成readelf.c中缺少的代码,readelf 函数需要输出elf 文件的所有section header的序号和地址信息,对每个 section header,输出格式为:"%d:0x%x\n",两个标识符分别代表序号和地址。

首先进入文件夹

在main.c中调用了

还需要在kerelf.h中查看elf(32位)格式

完成readelf.c文件

编译并且执行

Exercise 1.3 填写 tools/scse0_3.lds 中空缺的部分,将内核调整到正确的位置上。

lds用到的时候属实少,推荐这个教程链接脚本(Linker Scripts)语法和规则解析(自官方手册) - BSP-路人甲 - 博客园 (cnblogs.com)

比较精华的是这段

在此示例中,假设代码应在地址 0x10000 处加载,数据应从地址 0x8000000 开始。下面的链接脚本将会执行如下操作:

SECTIONS
{
  . = 0x10000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  .bss : { *(.bss) }
}

您将 ’SECTIONS ’ 命令作为关键字 ’SECTIONS ’ 编写,然后在花括号中包含一系列符号的赋值和输出段的描述。

上例中 ’SECTIONS ’ 命令中的第一行设置特殊符号 “. ” 的值,即位置计数器。如果未通过其他方式指定输出段的地址(稍后将介绍其他方式),地址就会被设置为位置计数器的当前值。然后将位置计数器增加输出段的大小。在‘SECTIONS ’命令的开头,位置计数器的值为 ‘ 0 ’ 。

第二行定义了一个输出段“ .text ”。 冒号是必需的语法 ,现在可以忽略它。在输出段名称后面的花括号中,列出应放置在此输出段中的输入段的名称。 “ ” 是与任何文件名匹配的通配符。表达式 ‘ **(.text)* ’ 表示所有输入文件中的所有 ‘.text*’ 输入段。

由于在定义输出段 ‘.text’ 时位置计数器为‘0x10000 ’,因此链接程序会将输出文件中 ‘.text’ 段的地址设置为‘0x10000 ’。

剩下的行定义了定义输出文件中的‘.data ’ 和‘.bss ’ 段。链接器会将‘.data ’ 输出段放置在地址’0x8000000 ’处。在链接器放置‘.data ’ 段后,位置计数器为’0x8000000 ’加上‘.data ’ 段的大小。因此‘.bss ’ 输出段在内存中将会紧紧挨在‘.data ’段后面。

链接器将通过增加位置计数器(如有必要)来确保每个输出部分具有所需的对齐方式。在此示例中, ‘.text’ 和‘.data ’ 段的指定地址可以满足任何对齐方式约束,但链接器可能必须在‘.data ’ 和‘.bss ’ 段之间创建一个小的间隙。

如上,这就是一个简单完整的链接脚本。

进入文件夹并且开始编辑

make

查看section地址

Exercise 1.4

完成 boot/start.S 中空缺的部分。设置栈指针,跳转到 main函数。使用/OSLAB/gxemul -E testmips -C R3000 -M64 elf-file运行 (其中elf-file是你编译生成的 vmlinux文件的路径)。

有关汇编我的巅峰期在上学期,目前快忘光了,之后补充我以前收集的教程

进入编辑

Exercise 1.5

阅读相关代码和下面对于函数规格的说明,补全 lib/print.c中 lp_Print()函数中缺失的部分来实现字符输出。

编写

最后得了60

改正

在求助了助教之后我终于发现了问题所在

我的scse0_3.1ds被我不小心新建了一个

我一直没察觉,改的是我自己创建的那个

改正后终于得到了100

思考

我有很多思考,但是这里写不下,我写在我博客里吧,之后还会继续更新。

你可能感兴趣的:(安全)