欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    清华大学操作系统实验lab1实验报告.docx

    • 资源ID:86180625       资源大小:480.46KB        全文页数:14页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    清华大学操作系统实验lab1实验报告.docx

    练习1、理解通过make生成执行文件的过程。练习1.1 操作系统镜像文件ucore.img 是如何一步一步生成的?在 proj1 执行命令 make V=可以得到 make 指令执行的过程make V=+ cc boot/bootasm.Sgcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector - Ilibs/ -Os -nostdinc -c boot/bootasm.S -o obj/boot/bootasm.o+ cc boot/bootmain.cgcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector - Ilibs/ -Os -nostdinc -c boot/bootmain.c -o obj/boot/bootmain.o+ cc tools/sign.cgcc -Itools/ -g -Wall -O2 -c tools/sign.c -o obj/sign/tools/sign.o gcc -g -Wall -O2 obj/sign/tools/sign.o -o bin/sign+ ld bin/bootblockld -melf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o”obj/bootblock.out” size: 440 bytesbuild 512 bytes boot sector: ”bin/bootblock” success! dd if=/dev/zero of=bin/ucore.img count=10000记录了 10000+0 的读入记录了 10000+0 的写出5120230 字节(5.1 MB)已复制,0.0227439 秒,225 MB/秒dd if=bin/bootblock of=bin/ucore.img conv=notrunc记录了 1+0 的读入记录了 1+0 的写出512 字节(512 B)已复制,0.000214966 秒,2.4 MB/秒从这几条指令中可以看出需要生成 ucore.img 首先需要生成 bootblock,而生成 bootblock 需要先生成 bootmain.o 和 bootasm.o 还有 sign,这三个文件又分别由 bootmain.c、bootasm.S、sigh.c 来生成。ld -melf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o o obj/bootblock.o这句话用于生成 bootblock,elf_i386 表示生成 elf 头,0x7C00 为程序的入口。”obj/bootblock.out” size: 440 bytes这句话表示生成的bootblock的文件大小,由于大小不到512字节,所以需要给blootblock填充,填充的功能在sign.c中有所表达,最终两字节设置为了0x55,0xAAbuf510 = 0x55;buf511 = 0xAA;FILE *ofp = fopen(argv2, “wb+“); size = fwrite(buf, 1, 512, ofp);练习1.2 一个被系统认为是符合标准的硬盘主引导扇区的特征是什?么前面已经提到过:引导扇区的大小为512字节,最终两个字节为标志性完毕字节0x55,0xAA,做完这样的检查才能认为是符合标准的磁盘主引导扇 区。Sign.c文件中有作检查:if (size != 512) fprintf(stderr, “write ”%s” error, size is %d.n“ , argv2, size);return -1;练习2:使用qemu执行并调试lab1中的软件。练习2.1 从 CPU 加电后执行的第一条指令开头,单步跟踪 BIOS 的执行。练习2.2 在初始化位置0x7c00 设置实地址断点,测试断点正常。练习2.3 在调用qemu 时增加-d in_asm -D q.log 参数,便可以将运行的汇编指令保存在q.log 中。将执行的汇编代码与bootasm.S 和 bootblock.asm 进展比较,看看二者是否全都。试验是基于老 lab1/proj1 做的,练习开头时是打算用命令行一句一句执行得到结果的,后来觉察直接修改makefile 和 gdbinit 可以大大提高调试效率。于是在makefile 中增加以下代码lab1-mon: $(UCOREIMG)$(V)$(TERMINAL) -e “$(QEMU) -S -s -d in_asm -D $(BINDIR)/q.log -monitor stdio -hda $< - serial null“$(V)sleep 2$(V)$(TERMINAL) -e “gdb -q -tui -xtools/gdbinit“-S s 是使得qemu 在执行第一条指令之前停下来,在调用qemu 时增加- d in_asm -D q.log 参数,便可以将运行的汇编指令保存在q.log 中。然后sleep 两秒应当是给qemu 充分的时间预备等待连接。接下来使用GDB 调试工具,file obj/bootblock.o target remote :1234 set architecture i8086 b *0x7c00continue x /10i $pc-tui 供给了代码与命令行分屏查看的界面t,ools/gdbinit 中存放的是gdb 调试指令如下。先是加载调试文件,然后连接qemu,设置8086 的实模式,设置断点0x7c00,也就是bootloader 的第一条指令,然后运行到断点。再显示接下来的10 条指 令。运行结果图如下很明显,断点位置的代码和boot.asm 文件中的代码完全全都,说明断点设置成功。翻开q.log 文件看,看到了很奇葩的结果。能够看到cli,cld 之类生疏的指令, 但是他们的地址以及消灭的挨次都不是想象的那样( 从0x0x00007c00k 开头,第一条指令为cld)。之后听大神解释,在q.log 中进入 BIOS 之后的跳转地址与实际应跳转地址不相符,汇编代码也与 bootasm.S 和bootblock.asm 不一样。可以通过make debug 之后在qemu 的掌握台中输入x /10i $pc 看到BIOS执行bootloader 局部的代码。进过比照,这些代码 与 bootasm.S 与 bootblock.asm 中的代码完全全都。练习3 分析bootloader 进入保护模式的过程。clicld increment# Disable interrupts# String operations# Set up the important data segment registers (DS, ES, SS).xorwmovw movw movw%ax, %ax%ax, %ds%ax, %es%ax, %ss# Segment number zero# -> Data Segment # -> Extra Segment在开启A20之前,BIOS还做了很多事:关中断、去除方向标志,给各个数据段清零。1、为何开启A20,以及如何开启A20?seta20.1:inb $0x64, %altestb $0x2, %aljnz seta20.1# 等待8042键盘掌握器不忙movb $0xd1, %aloutb %al, $0x64# 发送写8042输出端口的指令seta20.2:inb $0x64, %altestb $0x2, %aljnz seta20.2# 等待8042键盘掌握器不忙movb $0xdf, %aloutb %al, $0x60# 翻开A20当 A20 地址线掌握制止时,则程序就像在 8086 中运行,1MB 以上的地是不行访问的。 在保护模式下 A20 地址线掌握是要翻开的。为了使能全部地址位的寻址力量,必需向键盘控 制器 8042 发送一个命令。键盘掌握器8042 将会将它的的某个输出引脚的输出置高电平,作 为 A20 地址线掌握的输入。一旦设置成功之后,内存将不会再被绕回(memory wrapping),这 样我们就可以寻址 intel 80286 CPU 支持的 16M 内存空间,或者是寻址 intel 80386 以上级别 CPU 支持的全部 4G 内存空间了。2、如何初始化GDT表?lgdt gdtdescmovl %cr0, %eaxorl $CR0_PE_ON, %eaxmovl %eax, %cr0#把gdt表的起始位置和界限装入GDTR存放器#把保护模式位开启复习一下cr0存放器,它的第0位为保护模式位PE:设置 PE 将让处理器工作在保护模式下。复位PE将返回到实模式工作。此外,gdtdesc指出了全局描述符表在符号gdt处,如下上面四句话实现了翻开保护模式位。3、如何使能进入保护模式?通过长跳转指令gdt:SEG_NULLASMSEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) SEG_ASM(STA_W, 0x0, 0xffffffff)# 空段# 代码段起始地址,大小# 数据段起始地址,大小ljmp $PROT_MODE_CSEG, $protcseg进入了保护模式。进入保护模式之后还有一个步骤:把全部的数据段存放器指向上面的GDT描述符表中的数据段0x10。练习四、分析bootloader加载ELF格式的OS的过程。在proj2中,增加主要增加了对磁盘简洁的读取函数readsect readseg,以及对ELF头的解析(ELF头构造在ELF.h文件中)。static voidreadseg(uintptr_t va, uint32_t count, uint32_t offset) uintptr_t end_va = va + count;/指针移到边界va -= offset % SECTSIZE;/ 计算开头读的第一个扇区号uint32_t secno = (offset / SECTSIZE) + 1;/逐个读取扇区for (; va < end_va; va += SECTSIZE, secno +) readsect(void *)va, secno);/实现了从 kernel 复制 8 个扇区包含 ELF 头,共 4KB到 0x10000疑问:为什么要把ELF头读到0X10000?从哪读?以下为一些硬件端口上实现读取一个扇区到内存0x10000。/ wait fordisk tobe readywaitdisk;outb(0x1F2,1);outb(0x1F3,secno &0xFF);/* readsect - read a single sector at secno into dst */static voidreadsect(void *dst, uint32_t secno) / count = 1outb(0x1F4, (secno >> 8) & 0xFF);outb(0x1F5, (secno >> 16) & 0xFF); outb(0x1F6, (secno >> 24) & 0xF) | 0xE0);outb(0x1F7, 0x20);/ wait for disk to be ready waitdisk;/ read a sectorinsl(0x1F0, dst, SECTSIZE / 4);/ cmd 0x20 - read sectorsReadsect函数的工作大致是:1. 读 I/O 地址 0x1f7,等待磁盘预备好;2. 写 I/O 地址 0x1f20x1f5,0x1f7,发出读取第 offseet 个扇区处的磁盘数据的命令;3. 读 I/O 地址 0x1f7,等待磁盘预备好;4. 连续读 I/O 地址 0x1f0,把磁盘扇区数据读到指定内存。练习五、实现函数调用堆栈跟踪函数需要编程uint32_t ebp = read_ebp, eip = read_eip;int i, j;for (i = 0; ebp != 0 && i < STACKFRAME_DEPTH; i +) cprintf(“ebp:0x%08x eip:0x%08x args:“ , ebp, eip); uint32_t *args = (uint32_t *)ebp + 2;for (j = 0; j < 4; j +) cprintf(“0x%08x “, argsj);cprintf(“n“); print_debuginfo(eip - 1); eip = (uint32_t *)ebp)1; ebp = (uint32_t *)ebp)0;可以获知栈底是在高地址,栈顶在低地址,压栈的次序为:参数编程的时候默认有四个参数、返回地址、上一层EBP、局部变量。注:read_ebp和readeip都是通过内联汇编实现的。Eip-1是为了能找到上一条指令结果图:练习六、完善中断初始化和处理 需要编程练习6.1 中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口?中断向量表一个表项占用8字节,其中2-3字节是段选择子,0-1字节和6-7 字节拼成位移,两者联合便是中断处理程序的入口地址。2. 请编程完善kern/trap/trap.c中对中断向量表进展初始化的函数idt_init。idt_init(void) extern uintptr_tvectors;int i;for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i +) SETGATE(idti, 0, GD_KTEXT,vectorsi, DPL_KERNEL);/初始化每一条IDT项/ 设置内核态到用户态的转换SETGATE(idtT_SWITCH_TOK, 0, GD_KTEXT,vectorsT_SWITCH_TOK, DPL_USER);/ 载入IDTlidt(&idt_pd);3. 请编程完善trap.c中的中断处理函数trap,在对时钟中断进展处理的局部填写trap函数中处理时钟中断的局部,使操作系统每遇到100次时钟中断后,调用print_ticks子程序,向屏幕上打印一行文字”100 ticks”。case IRQ_OFFSET + IRQ_TIMER:ticks +;if (ticks % TICK_NUM = 0) print_ticks;/当有100次时钟中断输出一次break;练习7、增加syscall功能,即增加一用户态函数可执行 一特定系统调用:获得时钟计数值,当内核初始完毕 后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的效劳。先附上两个最重要的图,分别是内核态切换到用户态、用户态切换到内核态的过程。这局部是最花时间的,光是看代码就有很多疑问。1、为什么需要构建一个临时的trapframe来实现切换栈,切换栈说白了不就是需要修改那几个存放器吗?2、PPT上两个切换过程中的的两个老栈顶是一个地址吗?老栈顶是什么意思?3、切换到用户态的过程中,trapframe的tf_esp为什么要指向原来的内核栈?有什么意义吗?4、切换到内核态的过程中,CPU压入的ss和esp是用户栈的还是内核栈的?种种疑心都消灭在我的脑海里,加上不同的同学对这些问题有不同的理解,我也不想再去回想他们的理解了。直到看到“在执行int 120之前,系统在核心态,int不会引起切换,切换工作需在iret中完成。在执行int 121之前,系统在用户态,int引起切换,iret不需要再切换。”,感觉似乎明白了一点。说一下我对上述两个过程的理解。l 内核到用户: 首先,我认为esp-8这个步骤不是必要的,由于从后续的过程看来,空出来的8个字节从来没有被使用过。然后开头中断,由于是在内核态,所以ss和esp临时还不需要转变,在原来的内核栈里就可以处理。然后通过CPU压入和操作系统压入内核栈的存放器数据,构造了一 个临时trapframeswitchk2u,通过pop esp跳到switchk2u,然后修改switchk2u的tf_esp,tf_ds,tf_es,tf_cs,tf_eflags,再通过一系列的pop和iret实现了对这些存放器的修改即实现了堆栈段、代码段和数据段的切换。l 用户到内核:由于是int 121的关系,ss和esp在执行中断例程之前就已经切换到了内核态,此后的操作都是在内核栈,还是由压入的存放器状态构造了一个临时的trapframeswitchk2u,把tf_cs,tf_ds,tf_es,tf_eflags改掉之后,听过一系列pop和iret跳到了正确的代码段和数据段,堆栈段就不用跳了,由于中断的时候就已经跳到内核堆栈了。

    注意事项

    本文(清华大学操作系统实验lab1实验报告.docx)为本站会员(24****店)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开