MIT6.828学习之homework1:Boot xv6

因为搞不太清楚栈内的变化,所以我花了超大功夫,从0x7c00 (the boot loader 开始)一步一步观察,直到0x0010000c (内核开始),只是我没想到,这中间居然有将近5万条指令,着实让我震惊!
在这里插入图片描述在这里插入图片描述在这里插入图片描述断点设在br *0x0010000c,可以看到如下信息:
在这里插入图片描述在这里插入图片描述
通过我的实验可以知道
0x7c00:8ec031fa是执行完movl $start, %esp后的结果,我本以为这是栈的开始,结果不是,下面那个才是!
0x7bfc:0x00007c4d存的是call bootmain指令的下一条指令的地址,或者说是返回地址
0x7bf8:0x0 存的是bootmain的调用者程序的栈帧基地址ebp:0x0
0x7bf4、0x7bf0、0x7bec:0x0分别是保存edi、esi、ebx的值,都为0
0x7be8~0x7be0:0x0 是执行了sub $0xc, %esp后的结果,我认为是留出给局部变量的
0x7bdc:0x00007db4存的是 call *0x10018(内核入口)指令的下一条指令的地址

下面是问答:

  1. 首先重新启动qemu和gdb,并将断点设置为0x7c00,即the boot block(bootasm.S)的起点。单步执行指令(在gdb提示符处键入si)。在bootasm.S中,堆栈指针初始化了吗?(单步执行,直到看到一条将值移动到堆栈指针寄存器%esp中的指令。)
    答:堆栈指针初始化了。在bootasm.S中有一条指令是movl $start, %esp就是在初始化堆栈指针,只是不知道为什么我没有找到movl %0x0, %ebp,但ebp依然等于0x0。
  2. 单步通过调用bootmain;现在堆栈上有什么?
    答:此时堆栈上只有0x7c00:8ec031fa0x7bfc:0x00007c4d
  3. bootmain的第一个汇编指令对堆栈做什么?在bootblock.asm中查找bootmain。
    答:第一个指令时是push %ebp,用于保存bootmain的调用者的栈帧基指针ebp。
  4. 通过gdb继续跟踪(如果必要的话使用断点——请参阅下面的提示),并查找将eip更改为0x10000c的调用。这个调用对堆栈做了什么?(提示:考虑这个调用试图在引导序列中完成什么,并尝试在bootmain中识别这一点。,以及bootmain代码中相应的指令。这可能会帮助您设置适当的断点来加快速度。)
    答:这个调用将该call指令的返回地址0x7db4存入到栈0x7bdc(esp)

其他:

  • 能改变esp值的一般是push、pop、lea(lea -0xc(ebx), %esp)、add、sub;
  • rep stos %al, %es(%edi) 负责依次赋值
    rep指令的目的是重复其后面的指令.ECX的值是重复的次数.
    STOS指令的作用是将al中的值拷贝到ES:EDI指向的地址,edi每次自增 ???
### 关于 xv6 中线程与同步的相关作业资料 xv6 是一个用于教学目的的操作系统,其设计旨在帮助学生理解操作系统的内部工作原理。在 xv6 的上下文中,线程和锁是实现并发控制的重要机制之一。以下是关于 xv6 中线程与同步的一些关键概念及其应用: #### 1. **线程与锁的基础** xv6 提供了一个简单的多线程模型来模拟现代操作系统中的线程管理功能。通过引入 `pthread` 风格的 API,xv6 支持基本的线程创建、销毁以及互斥锁的功能。例如,在引用中提到的一个典型场景展示了如何使用互斥锁保护共享资源[^2]。 ```c pthread_mutex_lock(&bucket_locks[i]); insert(key, value, &table[i], table[i]); pthread_mutex_unlock(&bucket_locks[i]); ``` 上述代码片段说明了在访问哈希表桶时,如何利用互斥锁防止多个线程同时修改同一数据结构而导致的竞争条件。 #### 2. **真实硬件上的实验环境** 为了更好地学习线程与锁的实际效果,建议在真实的多核处理器上运行这些程序而不是仅依赖虚拟机(如 qemu 或 xv6 自身)。这是因为实际硬件能够更准确地反映现实世界中的性能瓶颈和竞争情况[^1]。 #### 3. **Qt 线程的安全性注意事项** 虽然 Qt 主要应用于 GUI 开发领域,但它也提供了丰富的线程支持工具。对于那些希望进一步探索跨平台应用程序开发的学生来说,了解 Qt 如何处理线程非常重要。特别需要注意的是,任何涉及 QObject 子类的对象都应小心对待它们的生命期管理和信号槽连接逻辑,因为默认情况下这些对象仍然属于创建它们的那个原始线程而非新启动的工作线程[^3]。 #### 4. **守护线程的作用** 除了普通的用户级线程之外,还存在一种特殊类型的后台服务进程——即所谓的“守护线程”。这类线程通常执行一些辅助性的长期任务,并且当所有非守护状态下的主线程结束之后便会自动终止而不影响整个应用程序退出流程[^4]。 尽管这里讨论的内容超出了单纯围绕 xv6 的范围,但对于全面掌握操作系统理论知识而言却是不可或缺的一部分。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值