MIT6.828 HW1 Boot xv6

环境

ubuntu 20.04 64位系统

本次作业的地址:homework
MIT6.828地址:MIT6.828-2018-fall

正文

如果做过前面lab1的老铁一定感觉lab1的内容之多,后面做起来也不容易,相对而言,这一份作业就没那么困难了,这次作业主要做的是调试,不需要写代码。

准备工作
这次使用的代码是xv6,而不是之前lab1的代码,所以需要重新从github拉下来:

git clone git://github.com/mit-pdos/xv6-public.git

然后make一下,这里为就用下mit的例子:

$ cd xv6-public
$ make
...
gcc -O -nostdinc -I. -c bootmain.c
gcc -nostdinc -I. -c bootasm.S
ld -m    elf_i386 -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o
objdump -S bootblock.o > bootblock.asm
objcopy -S -O binary -j .text bootblock.o bootblock
..

好了,万事俱备只欠东风。
打开两个terminal,一个先收入make qemu-gdb,一个输入make gdb就行,不过这里官方给的代码有一点小错误,直接输入make gdb是出错的,所以我们在xv6的Makefile里面任选一行,加入以下内容:

修复Makefile的问题

这样一来应该可以运行make gdb了。
接下来继续回到作业的内容,首先使用命令:

nm kernel | grep _start

接着我们得到以下的内容:


输出的结果

我们看到内核的起始地址在0x10000c,所以我们在这里打一个断点,然后看看此时在栈内的内容,注意作业并没有要求我们解释栈当中所有的内容,并且尝试解释这些内容是什么意思,下面在我的机子上实验的内容:
栈内的内容

先回想以下,0x10000c这个地址内核执行的第一句代码的地址,所以说我们在前面栈的内容都是由引导程序在执行的时候压入的。在想想,结合一下以前面的lab1,我们通过call指令跳转到了内核当中执行,在bootmain.c当中的代码,下面的代码对应的汇编是call 0x10018:

  entry = (void(*)(void))(elf->entry);
  entry();

这两句代码帮我们跳转到了内核的当中,因为call的执行都会将下依据需要执行的指令压入到栈,所以0x000_7d97就是call下一条语句的代码的,在bootmain.asm当中发现,内容确实如此:

0x00009d97

确实对了,好像接下来一堆0x0不知道怎么来的,暂且不理会,在bootmain.S当中,有以下两条语句:

  movl    $start, %esp
  call    bootmain

start标号的地址在0x7c00,所以我们看下0x7c00开始的地址内容,如下:

0x7c00

和上面对照一下,0x8ec0_31fa在哪,可以看到0x8ec0_31fa后面紧跟着的就是0x7c4d,在bootmian.asm看一下,结果如下:
0x7c4d

原来又是下一条代码的地址,和之前那个比起来没什么花样。因为我们在bootmain.S当中对edi等寄存器都设置为0,所以在call bootmain的时候压入了这些寄存器的值,所以压入了一大堆的0。好了我们已经把栈当中的内容都解释清楚了。
来到本次作业的Exercise,我没有完全按照作业的问题顺序来作实验,因为上面的问题搞清楚了,exercise的几个小问题都很简单:

  1. 将断点设置在0x7c00,逐步调试,在那里初始化了栈?
  2. 逐步执行call bootmain,现在栈里面有什么?
  3. bootmain.asm当中第一条对栈做了什么操作?仔细查看bootmain.asm
  4. call 0x10000c做了对栈做了什么呢?

这几个问题确实很简单,直接放在一起回答,我们call bootmain上一句代码初始化了栈,在calll bootmain后,我们在栈内压入了0x7c4d,经过之前的C calling convention学习,我们知道了调用函数的时候先要执行push %ebp,所以bootmain.asm当中第一局指令压入了ebp。在call 0x10000c的时候,我们又压入了0x7d97

PS:不知道各位是否还记得lab1 part3 最后一个循环的条件,while(*ebp != 0x0),通过上面的实验,我们看到了我们在栈内压入了ebp,此时ebp = 0x0,循环条件就是从这里的得到的,不得不说,MIT的代码还是写的很好的,我们也逐渐感受到了它的巧妙。

本次的作业就做完了,还是比较简单的,稍微调试一下就知道所有问题的答案了,奥利给!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容