
mit 2018 6.828 xv6
文章平均质量分 72
yiichan
这个作者很懒,什么都没留下…
展开
-
MIT_6.828_lab2_总结
简而言之,使用pageinfo结构体映射物理页,使用pages数组保存页结构体,pagefreelist保存空闲页结构体,使用pa2page和page2pa实现物理页和页结构体的转换,使用二级页表机制进行物理地址与虚拟地址的转换,使用PDX、PTX等宏(其实就是简单的移位操作)实现虚拟地址查页表,各级页表的页表项结构相同,都是前20位物理页索引,后12位标志位。更详细的页表项、结构说明等,参见lab2_exercise1讲解。手动实现了10个函数boot_alloc()static void *原创 2021-07-31 17:30:47 · 546 阅读 · 0 评论 -
MIT_6.828_lab2_exercise5_讲解
exercise5要求补充mem_init()完全按照提示来就行了。// Set up a two-level page table:// kern_pgdir is its linear (virtual) address of the root//// This function only sets up the kernel part of the address space// (ie. addresses >= UTOP). The user part of the ad原创 2021-07-31 15:56:28 · 260 阅读 · 0 评论 -
MIT_6.828_lab2_exercise2_3_4_讲解
exercise2、3都是看文档,和调试命令不要不认真看文档!不然后面肯定会有做不下去的地方,逼着你再从头开始把文档看一遍!比如exercise2就是详细复习一下intel 80386处理器的页表机制具体实现,虽然以前学了,但是也一定要再认真看一下,不然写不下去的!exercise4要完成下面这几个函数,在kern/pmap.c中 pgdir_walk() boot_map_region() page_lookup() page_rem原创 2021-07-31 15:55:46 · 392 阅读 · 0 评论 -
MIT_6.828_lab2_exercise1_讲解
这一部分任务就是完成5个函数boot_alloc()mem_init()page_init()page_alloc()page_free()做之前,要先分析一下内存分布和地址转换的内容。这些内容都是我做的时候边做边摸索的,遇到做不下去,就观察一下查一查;如果不明白下面这些的话,这几个函数是完不成的。如果想直接看答案,这部分可以跳过。内存分布下面是lab1里面就介绍了的内存分布。+------------------+ <- 0xFFFFFFFF (4GB)| 32-原创 2021-07-23 10:59:03 · 504 阅读 · 2 评论 -
mit 6.828 lab1_exercise12_讲解
好难啊,去年做的时候就很难,难到直接不知道怎么出来的,现在能搞出来了。。。。。。Exercise 12. Modify your stack backtrace function to display, for each eip, the function name, source file name, and line number corresponding to that eip.In debuginfo_eip, where do __STAB_* come from? This questi原创 2021-07-18 18:16:57 · 1136 阅读 · 1 评论 -
mit_6.828_lab1_exercise11_讲解
test_backtrace反汇编后长这样test_backtrace(int x){f0100040: 55 push %ebpf0100041: 89 e5 mov %esp,%ebpf0100043: 53 push %ebxf0100044: 83 ec 0c sub $0xc,%espf0100047: 8b 5d 08原创 2021-07-15 16:19:15 · 478 阅读 · 0 评论 -
配置6.828时遇到的makefile错误
做6.828时,配置qemu,碰到了一个makefile错误,去年配没遇到过。qemu安装过程见课程官网tools安装说明。当我从官网git到qemu源码包之后,./config完,下一步就是make了,但是这时候报错了。make[1]: *** No rule to make target '/home/yiichan/qemu/exec.c', needed by 'exec.o'. Stop.Makefile:173: recipe for target 'subdir-i386-softm原创 2021-06-08 18:53:48 · 724 阅读 · 0 评论 -
Bochs调试
要打开的是bochsdbg.exe。首先在起始页面设置一些基本数据,之后进入调试窗口。b 0x7c00 设置断点c continue,即为不断执行,到断点或终点停下r 显示通用寄存器内容sreg 显示段寄存器内容xp 显示指定内存地址处的内容,默认显示一个双字,可以指定显示的双字个数。如xp/2 0xb8000 ,会从0xb8000起显示两个双字q 退出调试过程u/n 0xXXXX 反汇编指令,用于对0xXXXX地址后的n条指令进行反汇编,得到这n条原创 2020-06-25 20:50:56 · 652 阅读 · 0 评论 -
MIT 6.828 Lab1: PC Bootstrap and GCC Calling Conventions
Lab 1: Booting a PCPart 1: PC BootstrapGetting started with x86 assembly x86汇编入门汇编语言有两种格式,一种是AT&T格式,一种是Intel格式,两种格式不同。Simulating the x86 模拟x86处理器The PC’s Physical Address Space PC的物理内存空间The ...原创 2020-04-26 16:37:12 · 387 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise12
exercise 1.12这个实验说实话我没有理解,只能照猫画虎的做前几问,最后一问实在不会做。要求:在函数debuginfo_eip中,__STAB_*来自哪里?通过插入对stab_binsearch的调用来完成debuginfo_eip,使之能够找到一个地址的行号。在内核中添加一条backtrace命令,并且修改你的mon_backtrace函数,使之能够调用debuginfo_e......原创 2020-04-26 16:27:59 · 673 阅读 · 1 评论 -
MIT 6.828 Lab1 exercise11
exercise1.11对我这种汇编很差的人来说,这个练习也太难了点吧,一卡卡了我两天半。。。。先是看那个read_ebp()“会很有用”,于是去研究了内联汇编格式,一直看不懂,花了一天才知道这个内联汇编函数是在做什么;之后又去搜汇编函数调用栈过程,才知道栈中那一条条指令如何算,如何看;然后又复习了一下gdb汇编的单步调试命令,用这个一步步调,跟踪栈的变化,才理解了这个五层调用函数栈的变化过程;...原创 2020-04-24 15:38:22 · 480 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise10
exercise 1.10要求:在obj/kern/kernel.asm中找到test_backtrace函数,设置一个断点,检查内核启动后每次该函数被调用时发生了什么。多少个32位字在每次嵌套调用test_backtrace时被压入栈?这些被压栈的字是什么?解答:查询被调用过程,最后指向了一个C文件,lab/kern/init.c 其中有该函数的代码。test_backtrace(in...原创 2020-04-21 00:09:28 · 484 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise8
exercise 1.8要求:补充printfmt.c line 208处的代码,让程序能够打印出八进制形式数。解释printf.c和console.c之间的接口,特别是,console提供了什么函数?这个函数是怎样被printf.c使用的?解释下面这段来自console.c的代码片段。if (crt_pos >= CRT_SIZE) { int i; memmove(cr...原创 2020-04-20 22:51:36 · 604 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise9
exercise 1.9要求:找出内核初始化内核栈的地方(代码),和内核栈加载到主存的位置。内核是如何为栈保存这个区域的?这个栈指针初始化指向的保存区域的终点是哪里?解答:打开路径为lab/obj/kernel.asm的文件,这是内核的反汇编文件,其中的第58行指出了对esp的赋值,f0100034: bc 00 00 11 f0 mov $0xf0110000,%e...原创 2020-04-20 22:50:40 · 352 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise7
exercise 1.7要求:使用QEMU和GDB追踪JOS内核并停在 movl %eax,%cr0 处。检查0x00100000和0xf0100000处的值。之后单步运行这条指令,再重新检查这两处的值。确保你知道发生了什么。在新的映射机制建立后,如果映射没有就位,哪一条指令会是第一条无法工作的指令?注释掉 movl %eax,%cr0 ,看看你是不是正确的。注意实验文档上所说的,硬件实现...原创 2020-04-19 17:57:00 · 481 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise6
exercise 1.6要求:在BIOS启动boot loader和进入内核时,地址0x00100000处的连续8个字有什么不同?为什么?回答这个问题不需要运行qemu,请思考这个问题。(gdb) x/8x 0x1000000x100000: 0x00000000 0x00000000 0x00000000 0x000000000x100010...原创 2020-04-19 00:56:03 · 441 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise5
exercise 1.5要求:如果链接地址是错的,追踪boot loader代码会做什么。将boot/MakeFrag文件中的链接地址改成一个错误值,重新编译,追踪boot loader执行,看看会发生什么。不要忘记做完后将正确的链接地址改回去。我把链接地址改成了0x7cc0,结过qemu窗口出现了如下错误信息。qemu-system-i386 -drive file=obj/kern/k...原创 2020-04-19 00:55:33 · 697 阅读 · 3 评论 -
MIT 6.828 Lab1 exercise4
exercise 1.4作业写到现在,把这门课和coursera上吴恩达的机器学习放在一起,与国内的课程对比,发现国外的课程和国内相比,有很大差别。差别如下:国内重课堂讲授,国外课程讲授很少,只有短短的录播课或者想这门课直接没有视频,关键在于课堂外文章资料的自行阅读和研究实践国内研究性学习的效果不好。比如同样是课堂实验或者大报告,老师只会说“有兴趣的同学做一下”或者硬性要求要调研不少于多少...原创 2020-04-19 00:55:03 · 347 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise3
exercise 1.3Q1:在哪一点处理器开始转为32位模式?什么导致了从16位转为32位?A1:boot.s中的下面这段代码。当cr0 register写入1时,就转为了32位。 lgdt gdtdesc movl %cr0, %eax orl $CR0_PE_ON, %eax movl %eax, %cr0Q2:boot loader最...原创 2020-04-18 19:10:09 · 439 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise2
exercis 1.2The target architecture is assumed to be i8086[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b0x0000fff0 in ?? ()+ symbol-file obj/kern/kernel(gdb) si[f000:e05b] 0xfe05b: cmpl $0x0...原创 2020-04-18 19:09:34 · 527 阅读 · 0 评论 -
MIT 6.828 Lab1 exercise1
exercise 1.1要求熟悉一下6.828这门课的参考文献,为以后阅读和写汇编代码打基础。注意特别提及的那片参考文献,讲解了两种汇编语言格式的不同之处。下面是这篇引文的小总结。AT&T格式语法采用了一种独特的内联汇编技巧,下面是AT&T格式与Intel格式的不同之处。编译器命名:采用前缀%AT&T:%eaxIntel:eax源操作数/目的操作数...原创 2020-04-18 19:09:02 · 424 阅读 · 0 评论