遲來的 1.5 篇, 我都已經辛苦的把 x86 protected mode 寫完了說。
我終於想出如何 save/restore in x86/dos real mode, 實在令我開心, 距離第一篇將近有 45 天的時間。這個程式是
原創等級的程式, 在我苦思如何在 stm32f4discovery (arm cortex m4) 實作 context switch 時來的靈感。在 100 行左右的組合語言程式碼就可完成, 實在是小而美。
當從 proc_a 到 (int $0x30) switch_proc 的 stack 變化, 這次不再是手工圖了, 有了漂亮的表格可看, 數字部份就是 stack 的位址變化。
497 | |
495 | %cx |
493 | flag |
491 | %cs |
48f | %eip |
48d | %ax |
所以再次回到 proc_a 時, 只要讓 esp 回到 0x495 即可。說的果然比做的容易多了, 那麼要怎麼實作呢?
這次捨棄固定的 stack_frame_a, stack_frame_b, 在每次進入 switch_proc 把 esp 存起來即可, 再根據 cur_proc 決定要存在 a_sp 或 b_sp, 並把 esp 指向 a_sp 或 b_sp 完成下次的 process switch。
有了這個, 這程式可以說是 context switch, 不只是 process switch 了, 已經可以把 context save/restore。
這是 proc_b 的 stack 變化過程:
59f | |
59d | %bx |
| flag |
| %cs |
597 | %eip |
595 | %ax |
要體驗她, 一樣需要在 bochs single step 過才能有所體會。
source code:
https://github.com/descent/process/
real_mode_stack branch
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。