Linux-0.00 代码解析(四)
Linux 0.00 的編譯、運行、源碼下載:
http://blog.csdn.net/longintchar/article/details/78757065
Linux 0.00 Makefile 解讀:
http://blog.csdn.net/longintchar/article/details/78857966
Linux 0.00 代碼解析(一):
http://blog.csdn.net/longintchar/article/details/78766916
Linux 0.00 代碼解析(二):
http://blog.csdn.net/longintchar/article/details/79113612
Linux 0.00 代碼解析(三):
http://blog.csdn.net/longintchar/article/details/79114486
在閱讀源碼后,很多時候我們有修改源碼的沖動。比如說加一些自己的想法,看看修改前后運行結果的變化。這不失為一種好的學習方法。
一、讓任務切換頻率降低
假設N為初始計數值。任務切換的頻率=1193180/N,所以,N增大則切換的頻率變低(任務切換變慢),N減小則切換的頻率變高(任務切換變快)。
原來的代碼中, movl $11930, %eax 表示把N設置為11930,1193180/11930約等于100, 所以方波的頻率是100Hz,周期是10ms,即10ms產生一次中斷。
我的理解是因為N是16位的,所以N的最大值是0xFFFF(=65535),此時任務切換達到最小頻率。
f = 1193180/65535=18.2(Hz),1/18.2(Hz)= 55ms,即55ms左右切換一次。
關于定時器的設置可以參考我的博文:
http://blog.csdn.net/longintchar/article/details/78885556
二、write_char過程的修改
首先,我發現此過程沒有指定數據段,也就是說想調用這個過程,就要先設置好DS的值。我認為DS的值應該是內核數據段的選擇子,因為scr_loc這個變量屬于內核數據段。為何不在此過程中指定好數據段呢?竊以為,可以先壓棧DS,然后令DS=0x10.
其次,AL作為參數,表示字符的ASCII碼。我認為,可以順便用AH傳遞屬性。
所以,修改前后的代碼對比如下(左邊是修改后的)。
三、關于ignore_int
趙炯說當產生一個其他中斷(不是時鐘中斷也不是系統調用中斷)時,就會在屏幕上顯示一個字符“C”。可是我根本看不到字符“C”,一氣之下寫了一個死循環,還是看不到程序跑進來。為什么呢?如果你知道答案,非常歡迎你留言告訴我。
四、關于system_interrupt
由于write_char過程不再需要指定DS,所以代碼變得很簡單。
五、Task0和Task1
六、實驗結果對比
修改前:
修改后:
可以看到,除了顏色不一樣之外,任務的切換速度變慢。修改前每次連續打印約10個A,修改后每次連續打印約55個A。這和上文的分析是一致的。
【本系列完】
總結
以上是生活随笔為你收集整理的Linux-0.00 代码解析(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在自己的博客中搜索
- 下一篇: linux 其他常用命令