一步步编写操作系统 59 cpu的IO特权级1
在保護模式下,處理器中的“階級”不僅體現在數據和代碼的訪問,還體現在指令中。
一方面將指令分級的原因是,有些指令的執行對計算機有著嚴重的影響,它們只有在0特權級下被執行,因此被稱為特權指令(Privilege Instruction)。比如hlt指令,它可以讓計算機停機,處理器只信任操作系統,所以它不得不放在0特權級下。同類的指令還有lgdt,lidt,ltr,popf等,這些對計算機的正常運行起著非同小可的影響,操作系統只有親自執行它們才放心。
另一方面體現在I/O讀寫控制上。IO讀寫特權是由標志寄存器eflags中的IOPL位和TSS中的IO位圖決定的,它們用來指定執行IO操作的最小特權級。IO相關的指令只有在當前特權級大于等于IOPL時才能執行,所以它們稱為IO敏感指令(I/O Sensitive Instruction),如果當前特權級小于IOPL時執行這些指令會引發處理器異常。這類指令有in、out、cli、sti。所以你懂的,不止是操作系統可以進行IO端口訪問,用戶進程也是可以的,只是操作系統不允許用戶進程這么做。
平時我們被灌輸的思想是用戶進程無法直接訪問硬件,必須要向操作系統求助,只有高高在上的操作系統才有能力訪問外設。操作系統的職責就是管理計算機中的資源,資源包括軟件和硬件,不允許用戶進程直接操作外設,這只是操作系統的一種管理策略,因為這是出于對計算機的保護,誰能保證用戶程序個個都那么善良可靠呢,萬一用戶程序非法使用硬件,這種破壞可是難以估量呢,保護計算機安全是操作系統的責任,不應該讓不受信任的程序有破壞計算機的可能。
我們在很久以前就介紹過eflags寄存器啦,現在來查看下eflags寄存器的IOPL位,如圖
在eflags寄存器中第12~13位便是IOPL(I/O Privilege Level),即IO特權級,它除了限制當前任務進行IO敏感指令的最低特權級外,還用來決定任務是否允許操作所有的IO端口,對,沒錯,是全部IO端口,IOPL位是打開所有IO端口的開關(用來單獨設置端口訪問的方式是IO位圖,一會介紹)。每個任務(內核進程或用戶進程)都有自己的eflags寄存器,所以每個任務都有自己的IOPL,它表示當前任務的要想執行全部IO指令的最低特權級,也就是處理器最低的CPL,只有任務的當前特權級大于等于IOPL才允許執行全部IO指令,即數值上CPL <= IOPL。
CPL為0時處理器是法力無邊的,所以0特權級下處理器是不受IO限制的。IOPL如何設置呢?下節再說。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 59 cpu的IO特权级1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广东和江苏的GDP总量,均已突破万亿美元
- 下一篇: 一步步编写操作系统 55 CPL和DPL