日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统开发系列—13.g.操作系统的系统调用 ●

發布時間:2024/4/17 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统开发系列—13.g.操作系统的系统调用 ● 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在我們的操作系統中,已經存在的3個進程是運行在ring1上的,它們已經不能任意地使用某些指令,不能訪問某些權限更高的內存區域,但如果一項任務需要這些使用指令或者內存區域時,只能通過系統調用來實現,它是應用程序和操作系統之間的橋梁。

所以,一件事情就可能是應用程序做一部分,操作系統做一部分。這樣,問題就又涉及特權級變換。

很明顯,這已經難不倒我們了,因為進程的切換就是不停地在重復這么一個特權級變換的過程。在那里,觸發變換的是外部中斷,我們把這個誘因換一下就可以了,變成"int nnn",一切就都解決了。

我們來實現一個叫做int get_ticks()的函數,用這個函數來得到當前總共發生了多少次時鐘中斷。設置一個全局變量ticks,每發生一次時鐘中斷,它就加1,進程可以隨時通過get_ticks()這個系統調用來得到這個值。

見syscall.asm:

_NR_get_ticks equ 0 ; 要跟 global.c 中 sys_call_table 的定義相對應! INT_VECTOR_SYS_CALL equ 0x90global get_ticks ; 導出符號bits 32 [section .text]get_ticks:mov eax, _NR_get_ticksint INT_VECTOR_SYS_CALLret

這里將系統調用對應的中斷號設為0x90,它只要不和原來的中斷號重復即可。

馬上來定義INT_VECTOR_SYS_CALL對應的中斷門,protect.c:

PUBLIC void init_prot() { ...init_idt_desc(INT_VECTOR_SYS_CALL, DA_386IGate,sys_call, PRIVILEGE_USER); ... }

?這樣我們就將第INT_VECTOR_SYS_CALL號中斷與sys_call對應起來了。這里的call [sys_call_table+eax*4](調用的是sys_call_table[eax]),與irq_table類似,sys_call_table是一個函數指針數組,每一個成員都指向一個函數,用以處理相應的系統調用。

extern sys_call_tableglobal sys_callsys_call:call savesticall [sys_call_table + eax * 4]mov [esi + EAXREG - P_STACKBASE], eaxcliret

前面eax已被賦值為_NR_get_ticks(即0),而sys_call_table[0]已經初始化為sys_get_ticks,所以call [sys_call_table+eax*4]這一句調用的便是sys_get_ticks。

mov [esi+EAXREG-P_STACKBASE],eax是把函數sys_call_table[eax]的返回值放在進程表中eax的位置,以便進程P被恢復執行時eax中裝的是正確的返回值。

現在可以在進程中添加調用get_ticks的代碼了:

void TestA() {int i = 0;while (1) {get_ticks();disp_str("A");disp_int(i++);disp_str(".");delay(1);} }

別忘了在kernel.asm和syscall.asm中導入和導出相應符號。

修改

void TestA() {int i = 0;while (1) {disp_str("A");disp_int(get_ticks());disp_str(".");delay(1);} }

運行如下,第一個是A0x0,第二個是A0x27,兩次之間的“#”恰好是39個,我們的get_ticks一切正常:

?

源碼

轉載于:https://www.cnblogs.com/joey-hua/p/5487034.html

總結

以上是生活随笔為你收集整理的操作系统开发系列—13.g.操作系统的系统调用 ●的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。