OS-lab1
boot
boot文件夹中只有start.S文件,这个文件用于初始化内核。关掉中断,设置内核栈,并跳转到main函数。
init
-
init.c
执行初始化操作。
-
main.c
主函数,调用init.c完成初始化等任务。
lib
-
print.c
lp_Print
函数主要是解析字符串,完成printf
函数主要功能。函数开头通过宏定义定义了OUTPUT
函数,这个函数是调用myoutput
函数,完成输出一个字符的功能。接下来首先解析输出格式,也就是找到%
,对应for
循环;然后判断前导零、对齐等参数,对应分支语句;接着按照判断出来的格式对应输出,对应switch
部分。
下方的PrintChar
、PrintString
、PrintNum
是专门用来处理对应类型的输出格式的函数。 -
printf.c
printf
函数提供了printf
的定义和处理框架,即利用C语言的边长参数va_list
对每一个输出部分读取后调用lp_Print
函数进行处理。
myoutput
函数调用printcharc
来输出字符到面板,也就是把字符写入到面板读取的地址。
_panic
函数是通过printf
函数完成了特定的对错误信息的输出。
readelf
-
kerelf.h
定义了elf文件的格式,即三个结构体
Elf32_Ehdr
、Elf32_Shdr
、Elf32_Phdr
,以及其他的一些文件类型等信息的定义。 -
types.h
通过
typedef
重定义了一些数据类型。 -
readelf.c
is_elf_format
函数用于检查文件是否为elf格式。
readelf
函数用来解析elf文件。首先调用is_elf_format
判断文件是否为elf格式;再通过循环输出文件的section header的信息。 -
main.c
这个文件通过调用readelf函数来检查readelf函数的实现。
tools
里面只有一个链接文件,通过在里面定义.data、.bss等定义了内核文件的内存布局。
实验流程
lab1主要完成三个任务,第一个是完成tools里的链接文件和boot里的start.S文件使得内核能够编译运行。第二个任务是完成readelf内的readelf.c文件,实现一个简单的解析elf格式的功能。第三个任务是完成lib中的print.c,实现printf函数。