色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

系統調用:用戶棧與內核棧的切換(上)

麥辣雞腿堡 ? 來源:技術簡說 ? 作者:董旭 ? 2023-07-31 11:27 ? 次閱讀

當發生系統調用、產生異常,外設發生中斷等事件時,會發生用戶棧和內核棧之間的切換,本文從系統調用角度分析用戶棧與內核棧的切換。

系統調用的演變

x86 的系統調用經歷了 int / iret 到 sysenter / sysexit 再到 syscall / sysret 實現方式的轉變,關于具體的演化和區別、系統調用的其他細節等將在以后的系統調用專欄里分析。本文從系統調用最原始的int 0x80開始分析用戶棧與內核棧的切換,重點看系統調用過程用戶棧與內核棧切換的過程中的一些細節。

系統調用-分析從用戶棧切換內核棧

內核SYSCALL 入口代碼在entry_64.S中:

//arch/x86/entry/entry_64.S
ENTRY(entry_SYSCALL_64)
 UNWIND_HINT_EMPTY
 /* Interrupts are off on entry. */
 swapgs
 // 將用戶棧偏移保存到 per-cpu 變量 rsp_scratch 中
 movq %rsp, PER_CPU_VAR(rsp_scratch)
 // 切換到進程內核棧
 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp

 /* 在棧中倒序構建 struct pt_regs */
 pushq $__USER_DS   /* pt_regs- >ss */
 pushq PER_CPU_VAR(rsp_scratch) /* pt_regs- >sp */
 pushq %r11    /* pt_regs- >flags */
 pushq $__USER_CS   /* pt_regs- >cs */
 pushq %rcx    /* pt_regs- >ip */
GLOBAL(entry_SYSCALL_64_after_hwframe)
 //rax 保存著系統調用號
 pushq %rax    /* pt_regs- >orig_ax */

 PUSH_AND_CLEAR_REGS rax=$-ENOSYS

 TRACE_IRQS_OFF

 /* 保存參數寄存器,調用do_syscall_64函數 */
 movq %rax, %rdi
 movq %rsp, %rsi
call do_syscall_64  /* returns with IRQs disabled */

上面的匯編指令中先將當前用戶棧(用戶空間棧頂)記錄在CPU獨占變量區域里(PER_CPU變量),如下所示:

movq %rsp, PER_CPU_VAR(rsp_scratch)

然后將CPU獨占區域里記錄的內核棧頂放入rsp/esp寄存器

movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp

就是這么簡潔,**上面兩句匯編:就 將用戶棧頂保存在了當前CPU的rsp_scratch這樣一個PER_CPU變量里,完成了用戶棧的保存 ,然后 將當前內核棧的地址存放到當前棧指針寄存器中 ,**那么此時棧寄存器指向的就是內核棧的棧頂,由此優雅、完美地完成了用戶棧到內核棧的切換!

接下來所有的壓棧操作都是在內核棧里操作了,依次將用戶空間寄存器壓棧,此時也是往內核棧push的, 內核使用struct pt_regs初始化內核棧,也就是通過push保存寄存器的值 (將用戶棧信息:用戶調用的系統調用號、參數、代碼段地址、數據段地址等以struct pt_regs形式壓入棧) ,形成一個pt_regs結構 ,如下圖(源于上篇文章中的分析):

圖片

在棧中順序固定且倒序壓棧(在x86_64中,內核棧rbx rbp r12 r13 r14 r15不是必須保存的項(為了訪問不越界相應空間必須保留),根據需要保存,linux后續版本采取都保存方式),其中rax保存系統調用號

//rax 保存著系統調用號
 pushq %rax    /* pt_regs- >orig_ax */
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40278
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
收藏 人收藏

    評論

    相關推薦

    C函數調用機制與幀原理詳解

    當一個C函數被調用時,函數的參數如何傳遞、堆棧指針如何變化、幀是如何被建立以及如何被消除的,一直缺乏系統性的理解,因此決定花時間學習下函數調用時整個
    發表于 06-08 10:49 ?1290次閱讀
    C函數<b class='flag-5'>調用</b>機制與<b class='flag-5'>棧</b>幀原理詳解

    操作系統為什么分內核態和用戶態?這兩者如何切換

    操作系統為什么分內核態和用戶態,這兩者如何切換?進程在地址空間會劃分為哪些區域?堆和有什么區別?
    發表于 07-23 09:01

    ARMv8的函數調用是什么意思?調用的內存管理是怎樣的

    調用解析概念: 任意體系結構的CPU,都設計了一套通用寄存器、狀態寄存器及其他控制寄存器,用以維系系統的正常運行。函數調用過程中,CPU一般都需要處理幾件事情:保存母函數現場(寄存器
    發表于 05-13 10:36

    用一個實例展示一下Linux內核幀的入和退過程

    1、Linux內核調試方法總結之幀  幀  幀和指針可以說是C語言的精髓。幀是一種特殊的數據結構,在C語言函數
    發表于 11-04 15:47

    一文詳解Linux內核回溯與妙用

    網上或多或少都能找到回溯的一些文章,但是講的都并不完整,沒有將內核回溯的功能用于實際的內核、應用程序調試,這是本篇文章的核心:盡可能引導讀者將
    的頭像 發表于 10-05 10:02 ?5376次閱讀
    一文詳解Linux<b class='flag-5'>內核</b>的<b class='flag-5'>棧</b>回溯與妙用

    對Linux的進程內核的認識

    在每一個進程的生命周期中,必然會通過到系統調用陷入內核。在執行系統調用陷入內核之后,這些
    發表于 05-12 08:53 ?623次閱讀
    對Linux的進程<b class='flag-5'>內核</b><b class='flag-5'>棧</b>的認識

    帶你了解嵌入式C語言函數調用

    大家都知道函數調用是通過來實現的,而且知道在中存放著該函數的局部變量。但是對于的實現細節可能不一定清楚。
    發表于 07-12 17:08 ?2109次閱讀
    帶你了解嵌入式C語言函數<b class='flag-5'>調用</b><b class='flag-5'>棧</b>

    淺談鴻蒙內核源碼的CPU四次換,寄存器改值

    本篇有相當的難度,涉及用戶內核的兩輪切換,CPU四次換,寄存器改值,將圍繞下圖來說明.?
    的頭像 發表于 04-28 16:56 ?1604次閱讀
    淺談鴻蒙<b class='flag-5'>內核</b>源碼的CPU四次換<b class='flag-5'>棧</b>,寄存器改值

    淺談鴻蒙內核源碼的

    上面的代碼和鴻蒙內核方式一樣,都采用了遞減滿的方式, 什么是遞減滿?
    的頭像 發表于 04-24 11:21 ?1434次閱讀
    淺談鴻蒙<b class='flag-5'>內核</b>源碼的<b class='flag-5'>棧</b>

    鴻蒙內核源碼分析:用戶內核的兩次切換

    這是系統調用的總入口,所有的系統調用都要跑這里要統一處理.通過系統號(保存在R7),找到注冊函數并回調.完成
    的頭像 發表于 04-23 17:17 ?1894次閱讀
    鴻蒙<b class='flag-5'>內核</b>源碼分析:<b class='flag-5'>用戶</b><b class='flag-5'>棧</b>和<b class='flag-5'>內核</b><b class='flag-5'>棧</b>的兩次<b class='flag-5'>切換</b>

    是什么?有什么作用?

    大多數的處理器架構,都有實現硬件。有專門的指針寄存器,以及特定的硬件指令來完成 入/出 的操作。例如在 ARM 架構,R13 (S
    的頭像 發表于 06-17 11:19 ?1.3w次閱讀

    Linux中的進程、線程內核以及中斷

    首先, (stack) 是一種串列形式的 數據結構。這種數據結構的特點是 后入先出 (LIFO, Last In First Out),數據只能在串列的一端 (稱為:頂 top) 進行 推入
    的頭像 發表于 05-14 09:30 ?698次閱讀
    Linux中的進程<b class='flag-5'>棧</b>、線程<b class='flag-5'>棧</b>、<b class='flag-5'>內核</b><b class='flag-5'>棧</b>以及中斷<b class='flag-5'>棧</b>

    系統調用用戶內核切換(下)

    , regs- >dx, regs- >r10, regs- >r8, regs- >r9) ; } syscall_return_slowpath( regs ) ; }
    的頭像 發表于 07-31 11:29 ?668次閱讀

    linux中的進程,線程,內核的區別

    大多數的處理器架構,都有實現硬件。有專門的指針寄存器,以及特定的硬件指令來完成 入/出 的操作。例如在 ARM 架構,R13 (S
    發表于 08-18 10:57 ?499次閱讀
    linux中的進程<b class='flag-5'>棧</b>,線程<b class='flag-5'>棧</b>,<b class='flag-5'>內核</b><b class='flag-5'>棧</b>的區別

    malloc在Linux執行的是哪個系統調用

    ()和mmap(),至于為什么是兩個,這跟ptmalloc內存池的分配策略有關,稍后介紹。 既然是系統調用,那么就必須處于內核態去處理,而系統內核
    的頭像 發表于 11-13 10:36 ?1006次閱讀
    malloc在Linux<b class='flag-5'>上</b>執行的是哪個<b class='flag-5'>系統</b><b class='flag-5'>調用</b>
    主站蜘蛛池模板: 亚洲日韩成人| 四虎影院2022| 欧美猛男gaygayxxgv| 内射一区二区精品视频在线观看| 暖暖日本 在线 高清| 日本午夜精品理论片A级APP发布| 十分钟免费观看高清视频大全| 午夜一级毛片看看| 一手揉着乳头一手模仿抽插视频 | 日本黄色www| 同桌别揉我奶了嗯啊| 亚洲国产精品嫩草影院久久| 一区视频免费观看| 啊灬啊灬啊灬快灬深高潮啦 | 99热久久久无码国产精品性麻豆| 抽插性奴中出乳精内射| 国产亚洲日韩欧美视频| 精品熟女少妇AV久久免费A片| 美女被撕开胸罩狂揉大乳| 人体内射精一区二区三区| 性绞姿始动作动态图| 最近中文字幕无吗免费高清| 成人天堂婷婷青青视频在线观看| 国产系列在线亚洲视频| 乱爱性全过程免费视频| 三级网址在线播放| 亚洲中文无码AV在线观看 | 最近免费中文字幕大全免费 | 久久久性色精品国产免费观看| 青青视频国产依人在线| 亚洲国产在线精品国自产拍五月| 97 sese| 国产美女影院| 欧美fxxx| 亚洲蜜桃AV色情精品成人| caoporen超碰在线视频| 国产睡熟迷奷系列网站| 欧美性appstin孕妇| 亚洲国产精品无码2019| yw193龙物免费官网在线| 精彩国产萝视频在线|