北航内核操作系统-lab1
1.实验目的。

2.实验内容。
2.1Exercise 1.1 请修改 include.mk 文件,使交叉编译器的路径正确。之后执行 make指令,如果配置一切正确,则会在gxemul 目录下生成vmlinux 的内核文件。
修改路径为 /OSLAB/compiler/usr/bin/mips_4KC-

查看gxemul文件夹

实验一完成。
2.2Exercise1.2 阅读./readelf文件夹中kerelf.h readelf.c以及 main.c三个文件中的代码,并完成readelf.c中缺少的代码,readelf 函数需要输出elf 文件的所有section header的序号和地址信息,对每个 section header,输出格式为:"%d:0x%x\n",两个标识符分别代表序号和地址。
1.ELF的定义
ELF(Executable and Linkable Format)文件是一种目标文件格式,常见的ELF格式文件包括:可执行文件、可重定位文件(.o)、共享目标文件(.so)、核心转储文件等。ELF主要用于Linux平台,Windows下是PE/COFF格式。
2.ELF文件头
ELF文件头位于ELF文件的起始位置,它包含整个文件的静态信息,可以通过readelf命令进行查看,ELF文件头结构以及相关参数定义在/usr/include/elf.h中,分为32位和64位两种版本,分别为Elf32_Ehdr和Elf_64_Ehdr,它们绝大多数内容都是一样的,结构如下所示:
typedef struct {
Elf32_Half e_type;//Elf文件类型
Elf32_Half e_machine;//ELF文件的CPU平台属性
Elf32_Word e_version;//ELF版本信息
Elf32_Addr e_entry;//入口地址
Elf32_Off e_phoff;//程序头表的文件偏移(以字节为单位)。如果文件没有程序头表,则此成员值为零。
Elf32_Off e_shoff;//节头表的文件偏移(以字节为单位)。如果文件没有节头表,则此成员值为零。
Elf32_Word e_flags;//与文件关联的特定于处理器的标志。标志名称采用 EF_machine_flag 形式。
Elf32_Half e_ehsize;//ELF 头的大小(以字节为单位)
Elf32_Half e_phentsize;//文件的程序头表中某一项的大小(以字节为单位)。所有项的大小都相同
Elf32_Half e_phnum;//程序头表中的项数。
Elf32_Half e_shentsize;//节头的大小(以字节为单位)。节头是节头表中的一项。所有项的大小都相同
Elf32_Half e_shnum;//节头表中的项数
Elf32_Half e_shstrndx;//与节名称字符串表关联的项的节头表索引。
} Elf32_Ehdr;
补全readelf.c中代码:

编译与执行:


2.3Exercise 1.3 填写 tools/scse0_3.lds 中空缺的部分,将内核调整到正确的位置上。
注意目标代码文件的内容是由section组成的,而可执行文件的内容是由segment组成的。要注意区分段(segment)和节(section)的概念,这两个概念在后面会经常提到。我们写汇编程序时,用.text,.bss,.data这些指示,都指的是section,比如.text,告诉汇编器后面的代码放入.text section中。
目标代码文件中的section和sction header table中的条目是一一对应的。section的信息用于链接器对代码重定位。而文件载入内存执行时,是以segment组织的,每个segment对应ELF文件中program header table中的一个条目,用来建立可执行文件的进程映像。比如我们通常说的,代码段、数据段是segment,目标代码中的section会被链接器组织到可执行文件的各个segment中。.text section的内容会组装到代码段中,.data, .bss等节的内容会包含在数据段中。
补全scse_03.lds

生成vmlinux文件

查看各section地址

2.4Exercise 1.4 完成 boot/start.S 中空缺的部分。设置栈指针,跳转到 main函数。使用/OSLAB/gxemul -E testmips -C R3000 -M64 elf-file运行 (其中elf-file是你编译生成的 vmlinux文件的路径)。
这一部分涉及到一点汇编的知识,请各位读者自行学习。
补全boot/start.S

重新make,并执行/OSLAB/gxemul -E testmips -C R3000 -M64 elf-file命令

2.5Exercise 1.5 阅读相关代码和下面对于函数规格的说明,补全 lib/print.c中 lp_Print()函数中缺失的部分来实现字符输出。
参考实验手册
补全lp-Prin()函数


重新make:

所有试验完成。
北航内核操作系统-lab1的更多相关文章
- 北航内核操作系统-lab0
1.lab0环境介绍. 2.进入实验界面. 3.进入实战测试. 任务要求: 3.1编写斐波那契数列. 3.2编写Makefile脚本. Makefile介绍: make命令执行时,需要一个 Makef ...
- 内核操作系统Linux内核变迁杂谈——感知市场的力量
本篇文章个人在青岛游玩的时候突然想到的...今天就有想写几篇关于内核操作系统的博客,所以回家到以后就奋笔疾书的写出来发表了 Jack:什么是操作系统? 我:你买了一台笔记本,然后把整块硬盘彻底格式化, ...
- 操作系统 Lab1(2)
中断很久,一看发现又多了一些内容. 打算完成了 Lab1 challenge 1 中断像量表设置的时候我们需要设置一个用于系统调用的 trap门 也就是 利用中断切换特权级 To kernel 调用 ...
- 操作系统 Lab1
练习1 1 ucore.img 是如何生成的 使用 make V= 查看详细的步骤 cc kern/init/init.c 使用cc工具进行预处理 gcc -Idir 将dir 作为查找目录(头文件) ...
- 操作系统Lab1 详解(boot|kern/debug)
总体 : boot kern libs tools boot asm.h bootmain.c bootasm.S asm.h 汇编头文件 SEG_NULLASM 定义一个空段描述符 SEG_ASM ...
- ucore操作系统学习笔记(一) ucore lab1系统启动流程分析
一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...
- Linux 内核概述 - Linux Kernel
Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...
- Linux内核分析课程总结
Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...
- 《Linux内核设计与实现》CHAPTER1,2阅读梳理
<Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...
随机推荐
- 关于 OOP 和设计模式?
这部分包含 Java 面试过程中关于 SOLID 的设计原则,OOP 基础,如类,对象, 接口,继承,多态,封装,抽象以及更高级的一些概念,如组合.聚合及关联. 也包含了 GOF 设计模式的问题.
- Linux基础学习 | 用户及用户组
Linux 用户及用户组 目录 一.用户 添加用户实例 二.用户组 添加用户组实例 三.用户及用户组文件 四.各命令参数对照 一.用户 Linux系统是一个多用户多任务的分时操作系统.任何 ...
- simulink中的两种求导模块
最终图像都是下图形式
- GoLang数组切片
1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...
- 1kb 的 placeholder.js 增加 img 标签使用方式
预览 官方网站示例. 项目 github 地址 使用 引入 placeholder.js 到你的前段代码中: <script src="placeholder.js"> ...
- CCF201604-2俄罗斯方块
问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新的由4个小方 ...
- JDK卸载和彻底删除
第一步:点击"控制面板". 第二步:点击"卸载程序". 第三步:进入到"程序和功能"界面,找到jdk的两个程序:①java 8 update ...
- break,return,continue的区别和作用
学习目标: 理解break.return.continue在循环中的区别和作用 学习内容: 1.break break表示结束当前所在的循环. 循环输出到3,当i等于4后,跳出当前循环,继续向下执行循 ...
- java基础-多线程互斥锁
多线程(JDK1.5的新特性互斥锁)* 1.同步 * 使用ReentrantLock类的lock()和unlock()方法进行同步* 2.通信 * 使用ReentrantLock类的newCondit ...
- EMS邮箱数据库常用命令(二)
1.查询邮箱数据库的使用空间 查询Exchange环境中所有邮箱数据库. 键入以下命令 Get-MailboxDatabase -Status | FL name,DatabaseSize 命令执行后 ...