精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java開發操作系統內核:實現進程的優先級切換

移動開發 開發
為了保護系統內核不受惡意程序的破壞,我們原來的做法是專門為應用程序分配單獨使用的內存,使得應用程序對數據的讀寫都限制在內核給他分配的內存段內。

為了保護系統內核不受惡意程序的破壞,我們原來的做法是專門為應用程序分配單獨使用的內存,使得應用程序對數據的讀寫都限制在內核給他分配的內存段內。程序對內存段的讀寫,完全是由DS寄存器指向的全局描述符決定的,如果惡意程序通過修改DS寄存器的值,使得它在運行時,讓DS寄存器指向內核數據段的全局描述符,那么惡意程序就可以讀寫內核的數據了,為了防范出現這種情況,我們要做的是讓應用程序沒有讀寫段寄存器的權力,因此我們就必須設定應有程序的優先級。

在X86架構下,程序可以分為4個等級,分別是0,1,2,3.級別數越低,它的權限就越高,系統內核是權限最高的,因此它運行的優先級為0,為了防止應用程序作亂,我們在啟動它之前,必須把它的優先級設定為最低級,也就是3.

為了讓應用程序運行在低特權級上,內核在啟動應用程序前,必須把應用程序代碼所在的內存段的級別設置為3,在一個級別為3的代碼段上運行指令時,如果指令的優先級高于3,例如讀寫段寄存器等,那么就會觸發CPU錯誤,根據上篇文章講過的內核異常處理機制,內核就會把應用程序的殺掉。于是我們修改內核啟動應用程序的相關代碼,在write_vga_desktop.c中:

void cmd_hlt() {
file_loadfile("abc.exe", &buffer);
    struct SEGMENT_DESCRIPTOR *gdt =(struct SEGMENT_DESCRIPTOR *)get_addr_gdt();
    set_segmdesc(gdt+11, 0xfffff, buffer.pBuffer, 0x409a + 0x60);
    //new memory 
    char *q = memman_alloc_4k(memman, 64*1024);
    set_segmdesc(gdt+12, 64 * 1024 - 1, q ,0x4092 + 0x60);
    struct TASK *task = task_now();
    start_app(0, 11*8,64*1024, 12*8, &(task->tss.esp0));
    memman_free_4k(memman, buffer.pBuffer, buffer.length);
    memman_free_4k(memman, q, 64 * 1024);
}

上面代碼跟以前相比,差別在于set_segmdesc調用中,設置內存段屬性時,我們多加了0x60,加上0x60的目的是,把該描述符所指向的內存其優先級設置為3.這樣一來,應用程序一旦指向高優先級的CPU指令,例如move ds, ax這種讀寫段寄存器的指令時,就會引發CPU異常。

同時我們通過調用task_now()獲得當前正在運行的進程對象,每個進程對象都含有一個TSS數據結構,其內容如下(在multi_task.h中):

struct TSS32 {
    int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
    int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
    int es, cs, ss, ds, fs, gs;
    int ldtr, iomap;
};

TSS結構我們在早前講到進程切換的章節里有過對它的詳細解讀,這里我們需要注意它的幾個變量:esp0, ss0, esp1, ss1, esp2, ss2。一個進程在運行時,它可以運行在不同優先級下,在不同優先級下運行時,它必須使用不同的堆棧,這些變量就是用于存儲不同優先級下對應的堆棧段和堆棧指針的。如果進程要切換到優先級0,那么CPU會自動從esp0和ss0中讀取堆棧指針和堆棧內存段的全局描述符,如果進程要從優先級0切換到優先級1,那么我們內核需要自己把對應優先級0的堆棧指針和堆棧段描述符的值存入到esp0和ss0。也就是說如果進程從低優先級切換到高優先級時,CPU會自動幫我們從TSS中讀取對應的堆棧段全局描述符和堆棧指針,實現相應的堆棧切換。如果進程從高優先級切換到低優先級時,需要進程自己把高優先級的堆棧段描述符和堆棧指針存儲到TSS中的相應位置。

這也是為何我們調用start_app時,要把TSS對應的esp0變量的地址傳入,因為start_app要啟動一個優先級為3的應用程序,一旦應用程序運行起來時,進程的優先級會從0變為3,因此我們需要把切換前的堆棧指針和堆棧段存儲到TSS結構的esp0和ss0中。我們再看看start_app的實現:

start_app:  ;void start_app(int eip, int cs,int esp, int ds, &(task->tss.esp0))
    pushad

    mov eax, [esp+52]
    mov [eax], esp
    mov [eax+4], ss

    mov eax, [esp+36]  ;eip
    mov ecx, [esp+40]  ;cs
    mov edx, [esp+44]  ;esp
    mov ebx, [esp+48]  ;ds

    mov  ds,  bx
    mov  es,  bx

    or ecx,3
    or ebx, 3
    push ebx
    push edx
    push ecx
    push eax
    retf

esp+52對應的正好是start_app的最后一個參數,也就是&(task->tss.esp0),也就是當前進程含有的TSS結構中,esp0變量的地址。我們把它的地址賦值給寄存器eax, 指令mov [eax], esp 它的作用就是把當前堆棧指針存入TSS結構里的esp0變量,指令mov [eax+4], ss, 它的作用是把當前堆棧段描述符存儲到TSS結構的ss0變量。

上面代碼中,有兩條指令特別值得我們注意,他們是:

or ecx, 3
or ebx, 3

ecx寄存器存儲的是應用程序的代碼段,ebx寄存器存儲的是應有程序的內存段。我們以前講過,在把全局描述符賦值給段寄存器時,需要把該描述符對應在全局描述符表中的下標乘以8后再傳給段寄存器,為何要乘以8呢?假設某個全局描述符它的下標是1,乘以8相當于左移三位:

00000001  ->  00001000

左移三位后會在右邊空出3個0,這三個0是有專門作用的,前兩個0用于表示對應內存段的優先級,也叫請求優先級,當內核要運行應用程序的代碼時,我們需要把應用程序代碼段賦值給寄存器cs,把應用程序的內存段賦值給ds,如果要把優先級從0切換成3時,我們需要把請求優先級也設置為3,這就是前面兩條指令的作用:

or ecx, 3
or ebx, 3

上面兩條指令運行后,最右邊的兩個0都會變成1,也就是把請求優先級設置成了3。還值得注意的是,以前我們把CPU控制器交給應用程序時,使用的指令是call far,但如果跳轉時帶有優先級切換,那么CPU就不允許使用call far 或者是jmp far 這兩種指令,我也不知道英特爾為何這么設計,要實現從優先級0跳轉到優先級3,必須先把優先級3對應的堆棧和堆棧指針壓入當前堆棧,然后把優先級3的代碼段描述符和IP指針壓入堆棧,然后再執行retf命令,這幾個步驟對應的正好是最后幾條指令:

    push ebx
    push edx
    push ecx
    push eax
    retf

執行完上面幾條指令后,應用程序就可以運行起來了,并且應用程序是運行在優先級為3的條件下,此時應用程序不運行執行任何權限超過3的指令,例如存儲段寄存器相關的指令,如果應用程序執行類似指令:move ds, ax時,CPU會產生OD異常,于是根據上一節內容,應用程序會被殺掉。

在應用程序運行過程中,如果它需要調用內核API,也就是需要運行內核代碼時,CPU會自動從TSS中讀取esp0和ss0兩個變量的信息,然后自動把堆棧段和堆棧指針切換到內核原來的堆棧段和堆棧指針,這樣可以省卻我們大量的麻煩,于是相關代碼便可以得到極大的精簡,例如實現API調用的02Dh中斷的實現如下:

asm_cons_putchar:
AsmConsPutCharHandler equ asm_cons_putchar - $$

        push ds
        push es
        pushad
        pusdad

        ;把內存段切換到內核
        mov  ax, SelectorVram
        mov  ds, ax
        mov  es, ax 

        call kernel_api
        cmp eax, 0
        jne end_app

        popad
        pop es
        pop ds
        iretd
end_app:
        mov esp, [eax]
        popad
        ret

相比于上個版本,代碼精簡了很多,那是因為我們不用再考慮應用程序切換到內核時堆棧如何切換,因為CPU已經幫我們處理了。這里我們再看看kernel_api的實現:

int* kernel_api(int edi, int esi, int ebp, int esp,
                int ebx, int edx, int ecx, int eax) {
    struct TASK *task = task_now();

    if (edx == 1) {
        cons_putchar(eax & 0xff, 1);
    }else if (edx == 2) {
        cons_putstr((char*)(buffer.pBuffer + ebx)); 
    }else if (edx == 4) {
        return &(task->tss.esp0);
    }

    return 0;
}

這里我們增加了一個標號為4的API調用,它只是簡單的返回內核存儲在TSS結構里的堆棧指針,當調用完kernel_api后,它的返回值會被存儲在寄存器eax中,于是API中斷發現eax不是0,那意味著eax存儲的是內核在切換到應用程序前的堆棧指針,于是它把這個指針的值賦值給堆棧指針寄存器esp,于是語句popad是把堆棧上寄存的所有通用寄存器的數值返回給對應通用寄存器,這條指令對應的指令是start_app調用中的pushad指令,執行完popad指令后,堆棧上存儲的是從start_app返回后的下一條指令的地址,因此接下來執行ret指令時,CPU控制權會重現返還給內核。

最后我們再看看有個應用程序代碼的修改,在api_call.asm中:

[SECTION .s32]
BITS 32
call main
mov  edx, 4  ;返回內核
int  02Dh


api_putchar:
  mov edx, 1
  mov al, [esp + 4]
  int 02Dh
  ret

%include "app.asm"

當代碼調用完main函數后,也就是應用程序執行完畢后,代碼把4賦值給edx寄存器,然后調用api中斷,根據前面的分析,中斷執行后CPU的控制權就交還給了內核。另外由于應用程序運行在優先級3,它要調用內核中斷時,需要使用指令int 02Dh來觸發中斷,我們必須把02Dh號中斷的優先級也設置成3,要不然應用程序就沒有資格調用02Dh號中斷,于是在kernel.asm中做如下修改:

.2DH:
    Gate SelectorCode32, AsmConsPutCharHandler,0, DA_386IGate+0x60

像前面說過的一樣,加上0x60就是把該中斷的優先級設置為3.

完成所有代碼修改后,內核運行情況如下:

雖然運行結果與往常一樣

 

但應用程序運行時的優先級已經轉變為3,因此應用程序沒有了執行高級指令的權限,因此內核得到了進一步的保護。
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

責任編輯:張子龍 來源: 簡書
相關推薦

2023-11-03 08:22:09

Android系統算法

2010-04-14 09:40:05

2020-06-04 08:36:55

Linux內核線程

2024-12-27 09:46:10

2010-03-18 14:09:20

Java線程同步

2012-08-14 09:38:29

WAN優化

2011-01-14 16:23:46

Linux內核

2010-09-01 14:10:36

CSS優先級

2022-12-23 09:41:14

優先級反轉

2009-12-17 18:19:12

Linux操作系統

2010-04-20 12:40:23

Unix操作系統

2024-03-11 07:46:40

React優先級隊列二叉堆

2009-07-21 08:41:05

Scala操作符優先級

2025-02-03 08:23:33

2010-04-14 13:59:45

Unix操作系統

2020-09-30 09:07:37

DevOps

2021-04-06 10:45:18

React前端優先級

2025-07-30 00:00:01

優先級線程池排序

2010-04-16 18:19:32

Unix操作系統

2010-09-13 17:30:07

CSS優先級
點贊
收藏

51CTO技術棧公眾號

国产美女精品写真福利视频| 日韩成人免费观看| 99欧美精品| 18欧美乱大交hd1984| 91青青草免费观看| 日本天堂在线视频| 国内精品视频在线观看| 欧美福利视频导航| 黄色一级在线视频| 成人精品一区| 国产成人免费在线视频| 热久久99这里有精品| 亚洲精品卡一卡二| 天海翼精品一区二区三区| 欧美人妇做爰xxxⅹ性高电影| 妞干网视频在线观看| 高h视频在线| 国产91丝袜在线播放0| 国产成人精品一区二区在线| 精品97人妻无码中文永久在线| 尤物tv在线精品| 宅男噜噜噜66一区二区66| 黑人糟蹋人妻hd中文字幕| 老司机在线永久免费观看| 97精品视频在线观看自产线路二| 国产精品久久久久久久9999| 欧美日韩中文视频| 国产精品麻豆久久| 亚洲欧美激情视频| 伊人久久一区二区三区| 99tv成人影院| 欧美在线你懂的| 少妇高潮毛片色欲ava片| 黄色一级大片在线免费看产| 久久精品日产第一区二区三区高清版 | 五月婷婷深爱五月| 嗯啊主人调教在线播放视频| 一区二区三区日本| 中文字幕一区二区三区乱码| 国产三级电影在线观看| 久久亚洲精品国产精品紫薇 | 伊人久久大香线蕉| 亚洲成人中文字幕| 久久精品久久99| 欧美日韩破处视频| 欧美午夜片在线看| 99免费视频观看| 高潮在线视频| 亚洲成av人片一区二区梦乃| 黄色片免费在线观看视频| 欧美天天影院| 国产精品久久久久影视| 日本不卡一二三区| 精品影院一区| 久久精品人人做人人爽97 | 禁断一区二区三区在线| 精品网站999www| 性欧美18—19sex性高清| 国内不卡的一区二区三区中文字幕 | 粉嫩aⅴ一区二区三区四区| 亚洲影院色在线观看免费| 97视频免费在线| 久久99久国产精品黄毛片色诱| 国产精品日韩在线一区| 亚洲自拍偷拍另类| 久久99久久99| 2014亚洲精品| 亚洲精品综合网| 不卡免费追剧大全电视剧网站| caoporn国产精品免费公开| 成人毛片视频免费看| 成人高清视频在线观看| 久久99九九| 国产免费av高清在线| 国产精品女同一区二区三区| 一本色道久久99精品综合| 在线免费av导航| 亚洲sss视频在线视频| 国产免费毛卡片| 国产综合av| 制服丝袜中文字幕一区| 黄色a级三级三级三级| www.成人网| 亚洲美女性生活视频| 成人一级片免费看| 欧美成人69| 2020欧美日韩在线视频| 中文字幕网址在线| 国产成人免费视频| 你懂的视频在线一区二区| а天堂8中文最新版在线官网| 成人欧美一区二区三区视频网页 | 中文字幕有码在线视频| 亚洲va国产va欧美va观看| 人人爽人人av| 91精品国产自产精品男人的天堂 | 91精品办公室少妇高潮对白| www.午夜av| 免费福利视频一区| www.日本久久久久com.| 日韩精品乱码久久久久久| 日韩在线观看一区二区| 成人欧美一区二区三区视频xxx | 日韩乱码一区二区三区| 国产精品白丝jk黑袜喷水| 久久久久久99| 性欧美高清come| 色94色欧美sute亚洲线路一久| 一级片免费在线观看视频| 久久av综合| 欧美成人免费播放| 国产一级淫片a视频免费观看| 国产原创一区二区三区| 欧美久久电影| 91九色在线看| 91超碰这里只有精品国产| 一区二区视频观看| 欧美日韩少妇| 国产欧美精品久久久| 三级做a全过程在线观看| 成人欧美一区二区三区| 四虎永久在线精品无码视频| 最新国产精品精品视频| 中文字幕免费精品一区| 日韩伦理在线视频| 国产福利精品一区| 在线丝袜欧美日韩制服| 韩国精品主播一区二区在线观看| 精品成人免费观看| 69xx绿帽三人行| 美女任你摸久久| 欧美成人蜜桃| zzzwww在线看片免费| 91精品国产一区二区三区| 一级在线观看视频| 日日夜夜免费精品| 极品尤物一区二区三区| 手机av免费在线| 欧美猛男男办公室激情| www.日本高清视频| 日韩电影在线看| 日本不卡二区高清三区| 欧美大片免费| 国产视频久久网| 国产成人精品片| 成人国产精品免费观看动漫| 又大又硬又爽免费视频| 日韩欧美另类中文字幕| 欧美大片在线看免费观看| 国产精品自偷自拍| 亚洲欧美一区二区三区国产精品| 色乱码一区二区三区在线| 欧美三级伦理在线| 国产精品一区二区三区久久| av大全在线免费看| 欧美日本一区二区三区四区| 精品一区二区6| 麻豆精品视频在线| 三级网在线观看| 欧美a级大片在线| 欧美丰满片xxx777| 欧美熟妇交换久久久久久分类 | 亚洲性猛交xxxxwww| 一级黄色在线观看| 国产精品毛片无遮挡高清| 亚洲美女爱爱视频| 欧美freesex交免费视频| 国产成人免费观看| jk漫画禁漫成人入口| 亚洲午夜av久久乱码| 亚洲视频在线免费播放| 国产91免费看片| 国产真人真事毛片| www.亚洲色图| 黑人糟蹋人妻hd中文字幕| 精品高清久久| 成人黄色网免费| 午夜小视频在线| 欧美一区二区黄| 日韩欧美亚洲国产| 久久久久久久综合| 亚洲精品第三页| 亚洲网站在线| 欧美在线激情| 国产麻豆精品| 69av成年福利视频| 尤物在线视频| 亚洲成人999| 91丨九色丨海角社区| 自拍偷拍欧美激情| 亚洲熟女乱综合一区二区三区| 丝袜a∨在线一区二区三区不卡| 亚洲国产精品毛片| 1769国产精品视频| 欧美最顶级的aⅴ艳星| 久久亚洲天堂| 日韩大陆毛片av| 一级片视频网站| 五月婷婷久久丁香| 久艹在线观看视频| 99久久精品费精品国产一区二区| 91福利国产成人精品播放| 国内精品亚洲| 日韩欧美精品久久| 99这里只有精品视频| 国产精品ⅴa在线观看h| 亚洲图区一区| 一区二区三区视频在线| 天堂在线资源8| 91精品综合久久久久久| 成年人视频免费| 性做久久久久久久免费看| 国产又粗又长免费视频| 99国产精品视频免费观看| 天天看片天天操| 久久亚洲综合| 欧美大片在线播放| 欧美一区二区三区免费看| 日韩三级在线播放| 婷婷五月色综合香五月| 91在线视频精品| 国产福利亚洲| 国产成人拍精品视频午夜网站 | 欧美电影免费网站| 亚洲一区二区三区久久| 日韩精品第二页| 日韩av色综合| av漫画网站在线观看| 久久偷看各类女兵18女厕嘘嘘| 加勒比一区二区三区在线| 亚洲激情久久久| 国产91免费在线观看| 欧美一区二区三区在线观看| 欧美 亚洲 另类 激情 另类| 日韩欧中文字幕| 欧美精品亚洲精品日韩精品| 一区二区三区日韩欧美| 久久高清内射无套| 综合av第一页| 午夜剧场免费在线观看| 亚洲欧美在线视频观看| 最新av电影网站| 国产精品日产欧美久久久久| 阿v天堂2014| 亚洲国产高清aⅴ视频| 久久国产柳州莫菁门| 久久久五月婷婷| 欧美 日韩 国产 成人 在线观看| 99re热这里只有精品免费视频| 星空大象在线观看免费播放| 成人激情黄色小说| 国产草草浮力影院| 99精品欧美一区二区三区小说| 中文字幕乱视频| 91污片在线观看| 亚洲图片另类小说| 国产午夜精品在线观看| 亚洲一级片在线播放| 国产精品女人毛片| 国产激情无码一区二区三区| 一区二区三区四区av| 黄色一级片免费看| 欧美午夜无遮挡| 无码人妻熟妇av又粗又大| 欧美色电影在线| 国产精品视频第一页| 欧美成人精品福利| 五月婷婷狠狠干| 亚洲欧洲在线看| 1769视频在线播放免费观看| 久久精品亚洲国产| 肉体视频在线| 97精品视频在线| 欧美大片免费观看网址| 国产欧美亚洲精品| 中文字幕久久精品一区二区| 精品无人乱码一区二区三区的优势 | 欧美日韩一区二区三区视频 | 免费成人在线电影| 国产精品69av| 秋霞一区二区三区| 鲁鲁狠狠狠7777一区二区| 成人免费在线观看av| 黄色a级片免费看| 噜噜噜91成人网| 手机在线国产视频| 99久久99久久综合| 成人信息集中地| 亚洲6080在线| 亚洲视频在线观看一区二区| 精品国产91亚洲一区二区三区婷婷| 视频国产在线观看| 久久精品国产亚洲7777| 国产免费拔擦拔擦8x高清在线人 | 最新日韩中文字幕| 欧美激情成人动漫| 国产精品男人爽免费视频1| 日韩精品视频一区二区三区| 欧美日韩精品免费看| 欧美激情1区2区| 中文字幕无码不卡免费视频| 国产激情偷乱视频一区二区三区| 我和岳m愉情xxxⅹ视频| 亚洲图片激情小说| 日日夜夜操视频| 精品电影一区二区| 精品国产丝袜高跟鞋| 日韩美女免费视频| caoporn成人| 一个色的综合| 亚洲欧美视频| 国产国语老龄妇女a片| 一色屋精品亚洲香蕉网站| 特黄视频免费看| 日韩精品一区二区三区蜜臀| av电影在线网| 日韩av免费看网站| 国产亚洲精品美女久久| 永久免费在线看片视频| 青青草97国产精品免费观看 | 久久综合88中文色鬼| 欧美日韩视频免费观看| 国产在线视频欧美一区二区三区| 99视频精品全国免费| 国产福利一区视频| 久久午夜羞羞影院免费观看| 亚洲一区 视频| 日韩三级免费观看| 免费av网站在线看| 国产精品高潮呻吟久久av无限| 亚洲图区在线| 久久国产亚洲精品无码| 成人午夜电影网站| 欧美片一区二区| 91精品在线观看入口| 免费黄网站在线| 国产精品综合久久久| 日韩国产专区| wwwwww.色| 国产精品少妇自拍| 亚洲天堂免费av| 色老头一区二区三区| 欧美性www| 中文字幕在线中文字幕日亚韩一区| 日本欧美一区二区| 欧美性受xxxx黑人| 欧美日韩国产三级| 蜜芽在线免费观看| 亚洲一区二区免费在线| 欧美/亚洲一区| 亚洲精品鲁一鲁一区二区三区| 亚洲激情成人在线| 亚洲国产精品久久人人爱潘金莲| 欧美精品性视频| 综合久久成人| 三上悠亚久久精品| av网站一区二区三区| 五月天综合激情网| 国产小视频91| 欧美久久久网站| 日韩 欧美 自拍| 国产成人久久精品77777最新版本| 九九在线观看视频| 日韩av在线免费观看| www.成人爱| 一本色道久久99精品综合| 国产精品一区二区你懂的| 日本一级淫片色费放| 亚洲日本成人网| 日日夜夜综合| 久久www视频| 99re8在线精品视频免费播放| 午夜精品久久久久久久蜜桃| 日韩在线视频线视频免费网站| 精品国产乱码久久久久久樱花| 丁香六月激情网| 久久久久久毛片| 99热这里只有精品66| 午夜精品久久久久久久白皮肤 | 天天干天天色天天爽| 大美女一区二区三区| 高潮毛片又色又爽免费| 久久精品亚洲精品| 希岛爱理av免费一区二区| 孩娇小videos精品| 亚洲一区二区三区在线播放| 黄色av免费在线观看| 91麻豆国产精品| 国产日韩欧美一区在线 | 欧美日韩第一| 国产裸体视频网站| 色综合天天综合网天天狠天天| 麻豆传媒在线完整视频| 久久综合久久久| 韩国三级电影一区二区| 可以免费看的av毛片| 日韩一区二区精品视频| 美女呻吟一区| 思思久久精品视频| 欧美日韩国产影院|