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

歡迎訪問 生活随笔!

生活随笔

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

windows

sel4源码解析(三) - sel4系统调用处理流程

發布時間:2023/12/16 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sel4源码解析(三) - sel4系统调用处理流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Armv8架構的系統調用指令是svc,通過x0-x7通用寄存器傳遞相關參數。在sel4中,x0寄存器保存capability或者badge參數、x1寄存器保存message的信息、x2-x5寄存器保存傳遞的message實體、x7寄存器保存系統調用編號。具體如下所示:

enum _register {X0 = 0, /* 0x00 */capRegister = 0,badgeRegister = 0,X1 = 1, /* 0x08 */msgInfoRegister = 1,X2 = 2, /* 0x10 */X3 = 3, /* 0x18 */X4 = 4, /* 0x20 */X5 = 5, /* 0x28 */X6 = 6, /* 0x30 */X7 = 7, /* 0x38 */X8 = 8, /* 0x40 */X9 = 9, /* 0x48 */X10 = 10, /* 0x50 */X11 = 11, /* 0x58 */X12 = 12, /* 0x60 */X13 = 13, /* 0x68 */X14 = 14, /* 0x70 */X15 = 15, /* 0x78 */X16 = 16, /* 0x80 */X17 = 17, /* 0x88 */X18 = 18, /* 0x90 */X19 = 19, /* 0x98 */X20 = 20, /* 0xa0 */X21 = 21, /* 0xa8 */X22 = 22, /* 0xb0 */X23 = 23, /* 0xb8 */X24 = 24, /* 0xc0 */X25 = 25, /* 0xc8 */X26 = 26, /* 0xd0 */X27 = 27, /* 0xd8 */X28 = 28, /* 0xe0 */X29 = 29, /* 0xe8 */X30 = 30, /* 0xf0 */LR = 30,/* End of GP registers, the following are additional kernel-saved state. */SP_EL0 = 31, /* 0xf8 */ELR_EL1 = 32, /* 0x100 */NextIP = 32, /* LR_svc */SPSR_EL1 = 33, /* 0x108 */FaultIP = 34, /* 0x110 *//* user readable/writable thread ID register.* name comes from the ARM manual */TPIDR_EL0 = 35,TLS_BASE = TPIDR_EL0,/* user readonly thread ID register. */TPIDRRO_EL0 = 36,n_contextRegisters = 37, };

異常向量表

Armv8架構異常向量表有16個entry,分為四大類。它們之間的具體區別主要由三點構成:

  • 異常的類型(系統異常、快中斷、中斷或者同步異常);
  • 異常發生后,特權級沒有變化的話,可以根據堆棧寄存器SP0或者SPn來區分;
  • 異常發生后,特權級發生切換,可以根據機器狀態(AArch64或者AArch32)來區分。
  • 具體如下表所示:

    其中每一個大類內部按異常類型分為四個小類。大類之間的區別如下:

  • 第一類是發生異常后,特權級沒有變化,且使用SP0寄存器(一般特權級為EL0);
  • 第二類是發生異常后,特權級沒有變化,且使用SPx寄存器(一般特權級為EL1或者EL2);
  • 第三類是發生異常后,特權級發生切換,且當前采用的指令集是AArch64;
  • 第四類是發生異常后,特權級發生切換,且當前采用的指令集是AArch32;
  • sel4異常向量表

    Sel4提供的異常向量表如下所示:

    BEGIN_FUNC(arm_vector_table)ventry invalid_vector_entry // Synchronous EL1t/EL2tventry invalid_vector_entry // IRQ EL1t/EL2tventry invalid_vector_entry // FIQ EL1t/EL2tventry invalid_vector_entry // SError EL1t/EL2tventry cur_el_sync // Current EL Synchronous (EL1/2)ventry cur_el_irq // IRQventry invalid_vector_entry // FIQventry cur_el_serr // SErrorventry lower_el_sync // Synchronous 64-bit EL0/EL1ventry lower_el_irq // IRQ 64-bit EL0/EL1ventry invalid_vector_entry // FIQ 64-bit EL0/EL1ventry lower_el_serr // SError 64-bit EL0/EL1ventry invalid_vector_entry // Synchronous 32-bit EL0/EL1ventry invalid_vector_entry // IRQ 32-bit EL0/EL1ventry invalid_vector_entry // FIQ 32-bit EL0/EL1ventry invalid_vector_entry // SError 32-bit EL0/EL1 END_FUNC(arm_vector_table)

    系統調用會觸發的異常是同步異常,且特權級是從EL0切換到EL1,所以在系統調用后會執行lower_el_sync函數。系統調用的參數保存在x0-x7寄存器中。

    Sel4系統調用函數

    Sel4一共提供了11個系統調用函數。

    void seL4_Send(seL4_CPtr dest, seL4_MessageInfo_t msgInfo) seL4_MessageInfo_t seL4_Recv(seL4_CPtr src, seL4_Word *sender) seL4_MessageInfo_t seL4_Call(seL4_CPtr dest, seL4_MessageInfo_t msgInfo) void seL4_Reply(seL4_MessageInfo_t msgInfo) void seL4_NBSend(seL4_CPtr dest, seL4_MessageInfo_t msgInfo) seL4_MessageInfo_t seL4_ReplyRecv(seL4_CPtr src, seL4_MessageInfo_t msgInfo, seL4_Word *sender) seL4_MessageInfo_t seL4_NBRecv(seL4_CPtr src, seL4_Word *sender) void seL4_Yield(void) void seL4_Signal(seL4_CPtr dest) seL4_MessageInfo_t seL4_Wait(seL4_CPtr src, seL4_Word *sender) seL4_MessageInfo_t seL4_Poll(seL4_CPtr src, seL4_Word *sender)

    主要介紹seL4_Send函數。它對應著系統調用號是SysSend。

  • 該函數首先調用arm_sys_send體系架構相關函數,將參數傳到對應的物理寄存器中,并執行svc(supervisor call)指令;

  • 接著進入異常向量表lower_el_sync,保存上下文,根據ESR_ELX寄存器的EC值判斷當前異常狀態是data abort、instruction abort、supervisor call還是hypervisor call;

  • 這里是supervisor call,接著執行c_handle_syscall函數,判斷系統調用編號是否正確;

  • 如正確,執行handleSyscall函數,根據不同的系統調用編號進行不同的處理,這里是SysSend;

  • 最后根據cap的類型做相應的處理。

  • 下面是arm_sys_send函數:

    static inline void arm_sys_send(seL4_Word sys, seL4_Word dest, seL4_Word info_arg, seL4_Word mr0, seL4_Word mr1,seL4_Word mr2, seL4_Word mr3) {register seL4_Word destptr asm("x0") = dest;register seL4_Word info asm("x1") = info_arg;/* Load beginning of the message into registers. */register seL4_Word msg0 asm("x2") = mr0;register seL4_Word msg1 asm("x3") = mr1;register seL4_Word msg2 asm("x4") = mr2;register seL4_Word msg3 asm("x5") = mr3;/* Perform the system call. */register seL4_Word scno asm("x7") = sys;asm volatile("svc #0": "+r"(destptr), "+r"(msg0), "+r"(msg1), "+r"(msg2),"+r"(msg3), "+r"(info): "r"(scno)); }

    Sel4系統調用號

    enum syscall {SysCall = -1,SysReplyRecv = -2,SysSend = -3,SysNBSend = -4,SysRecv = -5,SysReply = -6,SysYield = -7,SysNBRecv = -8,SysDebugPutChar = -9,SysDebugDumpScheduler = -10,SysDebugHalt = -11,SysDebugCapIdentify = -12,SysDebugSnapshot = -13,SysDebugNameThread = -14, };

    注意事項

  • VBAR寄存器是存放異常向量表的首地址,要求是11bit對齊。
  • 總結

    以上是生活随笔為你收集整理的sel4源码解析(三) - sel4系统调用处理流程的全部內容,希望文章能夠幫你解決所遇到的問題。

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