亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 漫談兼容內核之一:reactos怎樣實現系統調用.txt

?? 漫談系統內核內幕 收集得很辛苦 呵呵 大家快下在吧
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
    前面講過,寄存器%edx指向用戶空間堆棧上的函數調用框架,實際上就是指向所傳遞的參數,現在把這個指針復制到%esi中,這是在為從用戶空間堆棧復制參數做準備。但是,光有復制的起點還不夠,還需要有復制的長度(字節數)、即參數的個數乘4,所以需要知道具體的系統調用有幾個參數。這個信息保存在一個以系統調用號為下標的無符號字節數組中(所以每個系統調用的參數總長度不能超過255字節),SSDT_ENTRY數據結構中的第三個成分(相對位移為12、或0xc)就是指向這個數組的指針。對于常規系統調用,這個數組是MainSSPT。可想而知,這個數組的內容也應來自sysfuncs.lst。代碼中先讓%ecx指向MainSSPT,再以%eax中的系統調用號與其相加,就使其指向了數組中的相應元素,而movb指令就把這個字節取了出來。所以,最后%ecx持有給定系統調用的參數復制長度。從%esp的內容中減去%ecx的內容,就在系統空間堆棧上保留了若干字節,其長度等于參數復制長度,這樣就為把參數從用戶空間堆棧復制到系統空間堆棧做好了準備。再往下看:
[code]
    /* Get pointer to function */
    movl (%edi), %edi
    movl (%edi, %eax, 4), %eax

    /* Copy the arguments from the user stack to our stack */
    shr $2, %ecx
    movl %esp, %edi
    cld
    rep movsd

    /* Do the System Call */
    call *%eax
    movl %eax, KTRAP_FRAME_EAX(%ebp)

    /* Deallocate the kernel stack frame  */
    movl %ebp, %esp
[/code]
    前面,寄存器%edi已經指向常規系統調用的SSDT_ENTRY數據結構,也就是指向了該數據結構中的第一個成分。SSDT_ENTRY數據結構的第一個成分是個指針,指向一個函數指針數組。對于常規系統調用,這就是MainSSDT。指令“movl (%edi), %edi”把%edi所指處的內容賦給了%edi,使原來指向這個指針的%edi現在指向了MainSSDT。這也是個以系統調用號為下標的數組,其定義為:
[code]
SSDT MainSSDT[] = {
  { (ULONG)NtAcceptConnectPort },
  { (ULONG)NtAccessCheck },
  { (ULONG)NtAccessCheckAndAuditAlarm },
  ……
  { (ULONG)NtReadFile },
  ……
}
[/code]
    在我們這個例子中,指令“movl (%edi, %eax, 4), %eax”,即“把%edi加相對位移為‘系統調用號乘4’之處的內容裝入%eax”,使%eax指向了NtReadFile()。然后就是把參數從用戶空間堆棧拷貝到系統空間堆棧,注意%ecx中的長度是以字節為單位的,所以要右移兩位變成以長字為單位。
    最后,指令“call *%eax”就使CPU進入了內核里面的NtReadFile(),其代碼在reactos/ntoskrnl/io/rw.c中。如果按Linux的規矩,這應該是sys_NtReadFile():
[code]
NTSTATUS STDCALL
NtReadFile (IN HANDLE FileHandle,
     IN HANDLE Event OPTIONAL,
     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
     IN PVOID ApcContext OPTIONAL,
     OUT PIO_STATUS_BLOCK IoStatusBlock,
     OUT PVOID Buffer,
     IN ULONG Length,
     IN PLARGE_INTEGER ByteOffset OPTIONAL,
     IN PULONG Key OPTIONAL)
{
……
}
[/code]
    這個函數的調用界面與應用程序在用戶空間進行這個系統調用時所遵循的界面完全相同,而應用程序壓入用戶空間堆棧的9個參數已經被拷貝到了系統空間堆棧中合適的位置上。于是,對于這個函數而言,就好像其調用者、在我們這個情景中是ReadFile()、就在系統空間中一樣。

    回到上面的匯編代碼中。當CPU從目標函數返回時,寄存器%eax持有該函數的返回值,這是要返回給用戶空間的,所以把它保存在堆棧框架中。
    下面就是從內核返回到用戶空間的過程,我把代碼留給讀者自己研究。不過需要給一點提示:
    (1).代碼中的APC指“異步過程調用(Asynchronous Procedure Call)”,相當于Linux中的Signal。
    (2).Windows把內核的運行狀態分成若干級別。最高的一些級別是不允許硬件中斷(不允許級別更低的硬件中斷);其次(2級和1級)是不允許進程調度(但是允許硬件中斷),DPC(2級,相當于bh函數)和APC(1級,相當于signal)都應該在禁止調度的條件下執行;最低(0級)就是允許進程調度。
    (3).從內核中也可以通過_KiSystemService()進行系統調用(不過要經過一個內核版本的stub函數),所以代碼中需要檢測和區分CPU進入_KiSystemService()之前的運行模式,并且線程的KTHREAD數據結構中也有個成分PreviousMode,用來保存這個信息。而KTHREAD_PREVIOUS_MODE(%esi)就指向當前進程的PreviousMode。
[code]
KeReturnFromSystemCall:

    /* Get the Current Thread */
    movl %fs:KPCR_CURRENT_THREAD, %esi

    /* Restore the old trap frame pointer */
    movl KTRAP_FRAME_EDX(%esp), %ebx
    movl %ebx, KTHREAD_TRAP_FRAME(%esi)

_KiServiceExit:

    /* Get the Current Thread */
    cli
    movl %fs:KPCR_CURRENT_THREAD, %esi
   
    /* Deliver APCs only if we were called from user mode */
    testb $1, KTRAP_FRAME_CS(%esp)
    je KiRosTrapReturn
   
    /* And only if any are actually pending */
    cmpb $0, KTHREAD_PENDING_USER_APC(%esi)
    je KiRosTrapReturn
   
    /* Save pointer to Trap Frame */
    movl %esp, %ebx
   
    /* Raise IRQL to APC_LEVEL */
    movl $1, %ecx
    call @KfRaiseIrql@4
   
    /* Save old IRQL */
    pushl %eax
   
    /* Deliver APCs */
    sti
    pushl %ebx
    pushl $0
    pushl $UserMode
    call _KiDeliverApc@12
    cli
   
    /* Return to old IRQL */
    popl %ecx
    call @KfLowerIrql@4
   
KiRosTrapReturn:
   
    /* Skip debug information and unsaved registers */
    addl $0x30, %esp                                 // + 0x48
    popl %gs                                         // + 0x44
    popl %es                                         // + 0x40
    popl %ds                                         // + 0x3C
    popl %edx                                        // + 0x38
    popl %ecx                                        // + 0x34
    popl %eax                                        // + 0x30

    /* Restore the old previous mode */
    popl %ebx                                        // + 0x2C
    movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi)

    /* Restore the old exception handler list */
    popl %fs:KPCR_EXCEPTION_LIST                     // + 0x28

    /* Restore final registers from trap frame */
    popl %fs                                         // + 0x24
    popl %edi                                        // + 0x20
    popl %esi                                        // + 0x1C
    popl %ebx                                        // + 0x18
    popl %ebp                                        // + 0x14
    add $4, %esp                                     // + 0x10

    /* Check if previous CS is from user-mode */
    testl $1, 4(%esp)
   
    /* It is, so use Fast Exit */
    jnz FastRet
   
    /*
     * Restore what the stub pushed, and return back to it.
     * Note that we were CALLed, so the first thing on our stack is the ret EIP!
     */
    pop %edx                                         // + 0x0C
    pop %ecx                                         // + 0x08
    popf                                             // + 0x04
    jmp *%edx
         
IntRet:
    iret

FastRet:

    /* Is SYSEXIT Supported/Wanted? */
    cmpl $0, %ss:_KiFastSystemCallDisable
jnz IntRet
……
[/code]
    熟悉Linux的讀者知道CPU在返回用戶空間之前應該調用有關進程(線程)調度的函數,因而會期待在這段代碼中也看到這樣的操作,然而卻沒有看到。但是實際上確實有這樣的操作,只不過是深藏在函數KfLowerIrql()里面而已。
    搞懂了這個函數的讀者現在應該知道我們將要怎樣做了。不過,我們的目標不是把KiSystemService()與Linux的system_call()堆積、并列在一起,而是要把前者溶入到后者中去。再說,即使照搬了KiSystemService(),總不能因為這個程序調用了KfLowerIrql(),就又照搬KfLowerIrql()吧。如果按這樣類推,那就勢必要把整個ReactOS內核堆積到Linux內核中去了。由此可見,我們既要參考、借鑒ReactOS內核的實現,又要研究怎樣把它融合、嫁接到Linux內核中去,這當然是一項富有挑戰性的工作。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区2区视频在线观看| 欧美电影精品一区二区| 久久国产三级精品| 亚洲伦理在线免费看| 日韩久久久久久| 欧美无砖砖区免费| av电影天堂一区二区在线| 青娱乐精品视频在线| 亚洲一区二区三区四区在线| 国产午夜精品一区二区| 欧美高清一级片在线| 91亚洲永久精品| 国产成人在线网站| 免费欧美高清视频| 亚洲成av人片在www色猫咪| 欧美激情一区二区三区四区| 精品国产污污免费网站入口| 欧美二区三区的天堂| 在线观看免费成人| jizz一区二区| 国产一区二区三区免费| 久久精品国产精品亚洲红杏| 日本成人中文字幕在线视频| 亚洲国产中文字幕| 一区二区三区日韩欧美精品| 中文字幕在线观看不卡| 欧美激情一区二区三区四区| 国产午夜三级一区二区三| 精品国产乱码久久久久久牛牛 | 亚洲精品国产品国语在线app| 久久老女人爱爱| 久久久久久久久久久久久女国产乱| 日韩欧美高清一区| 日韩视频在线一区二区| 7799精品视频| 欧美一级国产精品| 91精品国产91久久久久久一区二区| 欧美影院午夜播放| 欧美日本在线观看| 91精品在线免费观看| 欧美人xxxx| 欧美一卡在线观看| 欧美精品一区在线观看| 日韩欧美激情四射| 精品久久久久久久久久久久久久久| 久久99精品国产麻豆婷婷| 欧美日韩一区二区三区不卡| 欧洲色大大久久| 欧美日韩国产精品自在自线| 欧美日高清视频| 日韩午夜中文字幕| 久久亚洲综合色一区二区三区| 日韩免费观看高清完整版在线观看| 精品久久久久av影院| 国产亚洲综合在线| 国产精品美女久久久久久久久久久 | 国产成人精品影视| 国产成人精品一区二区三区网站观看| 成人一区在线观看| 播五月开心婷婷综合| 欧美在线观看视频在线| 欧美一区二区三区视频| 国产日韩欧美精品一区| 亚洲人成网站精品片在线观看| 一二三四社区欧美黄| 国产丝袜在线精品| 奇米888四色在线精品| 美女看a上一区| 高清在线不卡av| 色香蕉成人二区免费| 欧美嫩在线观看| 久久久久亚洲综合| 亚洲综合色视频| 捆绑变态av一区二区三区| 成人精品鲁一区一区二区| 欧美日韩一级二级三级| 久久精品免视看| 亚洲午夜精品在线| 国产精品888| 欧美日高清视频| 欧美激情一区二区三区全黄| 亚洲国产精品天堂| 国产91精品露脸国语对白| 91福利在线免费观看| 精品成人佐山爱一区二区| 亚洲老妇xxxxxx| 国产一区二区三区四区五区入口 | 一个色在线综合| 国产一区二区三区在线观看免费| 日本道免费精品一区二区三区| 日韩午夜激情av| 一区二区三区四区五区视频在线观看| 日本视频一区二区三区| 91同城在线观看| 久久免费看少妇高潮| 污片在线观看一区二区| 成人精品视频.| 亚洲欧洲性图库| 另类综合日韩欧美亚洲| 欧美综合欧美视频| 国产精品免费免费| 麻豆精品国产传媒mv男同| 色婷婷久久综合| 国产精品美女视频| 韩日欧美一区二区三区| 欧美日韩国产片| 亚洲欧美一区二区三区孕妇| 成人综合婷婷国产精品久久蜜臀 | a美女胸又www黄视频久久| 日韩一区二区在线观看视频| 一区二区三区色| 91美女视频网站| 中文字幕国产一区| 国产精品一区一区| 精品美女在线观看| 日本人妖一区二区| 欧美日韩日日夜夜| 亚洲一区二区中文在线| 色偷偷久久人人79超碰人人澡| 国产欧美日韩精品a在线观看| 久久99蜜桃精品| 日韩视频一区二区在线观看| 日韩高清在线观看| 欧美久久免费观看| 婷婷亚洲久悠悠色悠在线播放 | 精品日韩在线观看| 麻豆成人91精品二区三区| 欧美精品久久99久久在免费线| 一区二区三区中文字幕精品精品| 99视频有精品| 亚洲欧美视频一区| 91福利在线导航| 亚洲综合免费观看高清完整版| 色婷婷久久99综合精品jk白丝| 亚洲狠狠丁香婷婷综合久久久| 99国产精品视频免费观看| 亚洲视频每日更新| 色婷婷综合久久久| 亚洲福利一区二区三区| 欧美日韩国产一区二区三区地区| 五月激情综合婷婷| 日韩三级在线免费观看| 久久国产精品区| 精品国产乱码久久久久久久久| 狠狠色丁香久久婷婷综| 久久久久久电影| av资源站一区| 一卡二卡三卡日韩欧美| 精品视频123区在线观看| 日本中文字幕不卡| 久久嫩草精品久久久精品| 国产精品一区二区三区乱码| 国产精品欧美经典| 在线观看欧美黄色| 美女www一区二区| 国产亚洲综合av| 91色.com| 日韩精品福利网| 久久久欧美精品sm网站| 91免费在线看| 日精品一区二区| 久久精品视频在线看| 色综合久久88色综合天天6| 性做久久久久久久免费看| 精品日本一线二线三线不卡| 成人黄色在线网站| 一区二区三区精品| 日韩欧美国产一区二区三区| 成人一区二区视频| 亚洲国产一区视频| 久久久久97国产精华液好用吗| 99久久婷婷国产| 日韩高清不卡在线| 欧美激情一二三区| 欧美精品三级在线观看| 国产成人精品免费看| 夜夜嗨av一区二区三区四季av| 日韩欧美综合在线| 91蜜桃在线免费视频| 蜜臀av一区二区| 亚洲欧美一区二区三区孕妇| 日韩免费看网站| 欧美在线一二三四区| 国产原创一区二区三区| 一区二区三区不卡视频| 久久亚洲春色中文字幕久久久| 一本大道av伊人久久综合| 激情成人午夜视频| 亚洲一区在线观看免费观看电影高清| 2020国产成人综合网| 欧美综合亚洲图片综合区| 国产精品99久久久久久久女警 | 色婷婷综合久久久中文一区二区| 日韩 欧美一区二区三区| 亚洲天堂网中文字| 久久色视频免费观看| 欧美一区二区三区视频| 欧美性生活大片视频| 不卡免费追剧大全电视剧网站| 精品一区二区在线观看|