ucore lab1-lab6

给和我一样的菜鸡看的,大佬让步,还有就是老师在视频里说的lab1和lab2最难,我想说每个lab都很难

lab1:

1.开机后的第一条指令在0xffffff0 处,只是系统规定的,这开始是bios的eprom区域,这些代码开始把bootloader加载到也就是第一个扇区加载在0x7c00处.

需要注意两点,1是bootmain函数也是bootloader的一部分,他将整个ucore读到内存中,这里涉及到了链接,这些不会,

2是要注意首先读取了第一个扇区,然后将ucore的主体读到了0x1000000处,然后跳转到了你读取的第一个扇区的elf格式的其实地址

 

lab1要注意的实验是函数调用栈,要注意几点:

1.ret暗含了将返回地址压栈,在将来执行ret的时候就是取栈顶的值作为eip;

2.push ebp;move ebp esp是编译器自动添加的

3.还是上面两句,添加的位置是每个c函数的开始位置,也就是上一个调用函数的返回地址压栈后的位置,这里强调了c函数,在后面会有汇编函数,这是不会添加的

4.关于ebp和esp本身,网上有很多教程

5.在ret暗含的push nexteip之前会先将参数压栈

 还有关于中断的实验,首先中断是硬件产生的,硬件自动查找中断描述表,在进入alltraps时候会把几个重要的寄存器压栈,在返回时候,会使用iret返回,这条指令会将几个重要的寄存器回复,而不是单单改变eip

还有就是要建立函数分段的概念,显而易见,第一个扇区读到0x10000后,这就是代码段,堆栈还是0x7c00

 

lab2:连续物理内存分配

这里有个很恶心的内存的三个阶段,看了我好久;

一开始gdt为0,之后读取扇区到oxc01000,这地址是虚拟地址,是链接文件呢给的,系统会将其视为物理地址所以会错,所以就有了第二阶段,在第一个扇区的entry中将gdt改为-0xc000000,这儿还有个很坑的地方,就是现在github里面的方法不是这个,和 实验指导书不同,所以花了很久问了大佬才知道是被坑了,

第三个阶段是和页有关的系统将所有物理内存通过页结构体管理,所有有关这儿的工作可以当成是为了alloc_onepage这个宏做准备,此时页还没有lcr3,然后你分配了一个页给了页目录表,接下来又有一个函数将这0xc0000以上的kernel区域map到0x0开始,这时候页目录表里面一开始的项是空的,只有0c0000开始的index才有项,但是这样的话你lcr的函数就访问不到了,所以要建立临时映射,va通过gdt变成la,在通过page变成pa,在变成la后已经是0开始了,所以查询页目录表的第0项发现没有肯定不对,所以把后面的赋值给第0项

lab3虚拟内次:感觉没啥好说的

lab4内核线程,

proc结构体中有trapframe和context的原因,context是让进程进入forkrets,forkrets的作用是设置好了堆栈,trapframe是在push结束后建立器一个环境,这个环境从thread_entry开始,先调用主函数,然后在exit,

如果只有trapframe,那么进程切换时候就要改变寄存器值,我感觉好像也可以的样子,他这样写我也不懂,求大佬指教

这个lab主要就是汇编,把压栈和出栈看懂就看懂了,可以单步调试

lab5:用户线程,用户空间的va在kernel下面,物理地址则是可能不连续的在kernel上面,用户线程是在init_main执行过程中创建的,init_main左后一句是调度,所以这个进程不肯能退出,创建进程用的方法是老师说的寄居蟹方法,要注意的是已经分配的结构体内存地址是不会变的,变的只是内容,还有一点就是原来的进程是init_main第一次创建的usermain进程,是通过改变这个进程得到用户进程的,根据创建的过程所以每个用户进程都有内核栈,并且栈顶部就是trapframe,建立用户进程的过程是建立vma链表,设置pgdir,并且拷贝内核的pgdir,然后改变用户栈顶部的tf,细节还是汇编,这边还涉及了软中断返回iret,也是在这之后将环境设置好的,因为这个进程并不会被调度

接下来是fork,首先两个进程的页目录表肯定不同,接着vma相同但物理地址不同,

接下来是退出的僵尸态,理由是每个线程在内核都有内核栈并且有进程控块,这些回收只能由父进程来做

 

以后等变强了肯定还会在写下去,目前就先这样吧,文件系统实在太多了,就先知道个思想。

 

这次做ucore肯定比上次随便看看收货大的多,但远远不够,毕竟不能妄想这刚学一年不到的人能怎么样,ucore里面很多东西我都没管,包括链接,编译,这些以后学了再说,文章以后还会跟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值