第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
1. 第15章代碼修改
先不說習題,說一說我對源碼的修改。從運行結果來看,主要是增加了顏色支持。不過把我的代碼與配書代碼相比較的話,還是有很多不同的。這些修改是怎么來的,可以參考我之前的博文。
運行效果如下圖
2. 習題解答
請注意,我是在上面的修改的基礎上完成了習題,下文的截圖是習題代碼和上面修改后的代碼進行對比的截圖。
雖然我的答案不是那么漂亮,但是經測試符合題目要求,所以寫出來和大家討論。囿于篇幅,我只講解關鍵的部分,一些不那么重要的修改(比如修改了字符串的內容等)就不贅述了。
2.1 第一題
修改本章的源程序,使之能夠順序完成以下工作:
(1)從程序管理器任務切換到任務A,顯示消息后返回程序管理器;
(2)從程序管理器任務切換到任務B,顯示消息后返回程序管理器;
(3)再從程序管理器任務切換到任務A,顯示另一條消息,然后返回程序管理器;
(4)再從程序管理器任務切換到任務B,顯示另一條消息,再返回程序管理器;
解答:首先,我對terminate_current_task這個過程進行了修改。紅色是添加的部分。
分析:(1)和(2)很好實現,因為配書源碼已經幫我們做了。需要注意的是(3),當再從程序管理器任務切換到任務A的時候,注意,這時候還在A的全局空間,所以必須對terminate_current_task加上retf(第497行),這樣才能返回到A的用戶空間,然后打印另一條消息。
第471~472行,用內核數據的選擇子core_data_seg_sel加載了用戶程序的DS,如果不返回用戶空間,還沒有什么大的影響;但是,一旦返回,因為需要改變特權級,CPU就會則檢查DS,ES,FS和GS的內容,如果段選擇子指向數據段或者非一致代碼段且段描述符的DPL在數值上小于返回后的新CPL,那么就把數值0傳送到該段寄存器。
如果忘了這個知識點,可以參考我的博文調用門詳解的末尾部分。
所以,461~464用于保存用戶程序在用戶空間的“現場”,第493~496用于恢復“現場”。
其次,填寫用戶TSS信息的時候,我增加了對ESP的填寫。配書代碼沒有,我覺得這是一個BUG。雖然不填寫也不會影響實驗結果,但是從嚴謹的角度講,有必要填寫,不然用戶的ESP就是一個不確定的值,很可能造成“災難”。
最后,內核代碼末尾增加了切換相關的代碼。
需要注意的是第1148和1157行,作用都是取得TCB的基地址。
另外,用戶程序也有修改。
下圖顯示對字符串有修改。
下圖顯示在用戶程序末尾增加了一段。
最后,程序的運行結果是
第二題我們下次再說。敬請期待…
附:
修改代碼下載地址:
http://download.csdn.net/detail/u013490896/9573297
習題代碼下載地址:
http://download.csdn.net/detail/u013490896/9578126
總結
以上是生活随笔為你收集整理的第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 处理器在实施任务切换时的操作——《x86
- 下一篇: 关于计算机考试网上操作的题目及答案,《计