线程编程中的堆栈组织
Stack organization in thread programming
我正在C++/汇编以及我自己的线程和PCB类中制作原始版本的操作系统。
每个线程都有自己的PCB,我可以在其中存储上下文信息。
每个PCB(过程控制块)都有自己的堆栈:
unsigned stack[stackSize];
和
sp, ss and ss pointer:
unsigned sp, ss, bp;
我应该将包装方法(调用专用线程的运行方法)放在堆栈上,但我不明白它将如何调用。(在start()方法中不调用Run,因为start只将PCB放在调度程序中)
我找到了这个代码:
stack[stackSize - 1] = FP_SEG(thread);
stack[stackSize - 2] = FP_OFF(thread);
stack[stackSize - 5] = 0x200; //PSW, interrupt flag = 1
stack[stackSize - 6] = FP_SEG(Thread::wrapper);
stack[stackSize - 7] = FP_OFF(Thread::wrapper);
我不明白为什么这些值被保存到堆栈中的这些位置。堆栈组织的特定规则是什么?
使用
所有这些寄存器的新值创建线程,这些值必须与线程一起保存在某个位置,以便可以重新调度线程。就是这个地方。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 模板元编程 - 尝试实现维度分析
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我是编程新手
- 我的 int main() 中出现堆栈溢出错误
- 如何以编程方式区分在内存的堆和堆栈部分创建的对象
- 在 Windows 上以编程方式设置堆栈大小
- CUDA 编程未处理的异常和堆栈溢出
- 线程编程中的堆栈组织
- 如何在Windows中以编程方式从调用堆栈帧中读取函数参数
- 内存管理 - C/C++ 中的并发编程、堆栈和堆
- 网络编程- c++网络库需要内核堆栈