orig_ax ; enter_from_user_mode() ; local_irq_enable() ; if ( READ_ONCE ( ti- >flags) /* * NB: Native and x32 syscalls are dispatched from the same * table. The only functional difference is the x32 bit in * regs- >orig_ax, which changes the behavior of some syscalls. */ if ( likely (( nr __SYSCALL_MASK]( regs- >di, regs- >si, regs- >dx, regs- >r10, regs- >r8, regs- >r9) ; } syscall_return_slowpath( regs ) ; } 上" />

在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

系統(tǒng)調用:用戶棧與內核棧的切換(下)

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

接下來:call
do_syscall_64,進入do_syscall_64函數:

__visible void do_syscall_64(struct pt_regs *regs)
{
 struct thread_info *ti = current_thread_info();
 unsigned long nr = regs- >orig_ax;

 enter_from_user_mode();
 local_irq_enable();

 if (READ_ONCE(ti- >flags) & _TIF_WORK_SYSCALL_ENTRY)
  nr = syscall_trace_enter(regs);

 /*
  * NB: Native and x32 syscalls are dispatched from the same
  * table.  The only functional difference is the x32 bit in
  * regs- >orig_ax, which changes the behavior of some syscalls.
  */
 if (likely((nr & __SYSCALL_MASK) < NR_syscalls)) {
  regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);
 }

 syscall_return_slowpath(regs);
}

上述函數的主邏輯很簡單:

1、 通過之前保存下來的pt_regs(往內核棧中格式化壓入的),獲取用戶傳入的系統(tǒng)調用號nr,系統(tǒng)調用號保存在了regs->orig_ax:

unsigned long nr = regs- >orig_ax;

2、 通過系統(tǒng)調用號nr,執(zhí)行對應的回調函數,sys_call_table是函數指針數組,不同nr對應不同系統(tǒng)調用對應的函數。其中regx->di、regx->si、regs->dx、regs->r10、regs->r8、regs->r9分別是之前保存到內核棧(以struct
pt_regs格式化)保存到pt_regs中的,對應著用戶傳入該系統(tǒng)調用的參數1~6:

if (likely((nr & __SYSCALL_MASK) < NR_syscalls)) {
  regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);
 }

以上就完成了用戶調用系統(tǒng)調用,并從用戶棧切換到內核棧,并執(zhí)行到系統(tǒng)調用號對應函數的過程。 具體的系統(tǒng)調用相關細節(jié)將在以后系統(tǒng)調用相關文章中分析。

系統(tǒng)調用-分析從內核棧切換用戶棧

上面分析到了執(zhí)行系統(tǒng)調用對應的函數,如下所示,并將返回值保存在regs->ax中了

regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);

函數執(zhí)行到do_syscall_64->syscall_return_slowpath(regs),開始為返回用戶態(tài)做準備.

并最終回到系統(tǒng)調用 內核SYSCALL 入口:ENTRY(entry_SYSCALL_64)->return_from_SYSCALL_64,繼續(xù)完成系統(tǒng)調用返回工作,并切換用戶棧與內核棧,使用struct pt_regs恢復用戶態(tài)寄存器值。

總之

用戶棧——>內核棧 cpu保存用戶當前堆棧信息保存到內核的棧中(恢復時用到),然后將cpu指向內核堆棧,去執(zhí)行內核代碼。完成用用戶棧到內核棧轉換。

內核棧——>用戶棧 再切換到內核堆棧前,將用戶堆棧信息壓入到內核棧中,內核函數執(zhí)行完回退棧幀,會將用戶的堆棧信息POP出棧,然后cpu堆棧寄存器就知道怎么回去了,返回的用戶程序中斷的地方繼續(xù)執(zhí)行。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1410

    瀏覽量

    41150
  • Linux
    +關注

    關注

    87

    文章

    11469

    瀏覽量

    212913
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    從 Linux 內核的角度談線程和進程

    1. 進程 進程是屬于用戶態(tài),和進程 虛擬地址空間(Virtual Address Space) 密切相關。那我們先了解下什么是虛擬地址空間:在32位機器
    的頭像 發(fā)表于 09-25 15:23 ?2693次閱讀
    從 Linux <b class='flag-5'>內核</b>的角度談線程<b class='flag-5'>棧</b>和進程<b class='flag-5'>棧</b>

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

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

    操作系統(tǒng)為什么分內核態(tài)和用戶態(tài)?這兩者如何切換

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

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

    調用的函數稱為非葉子函數,而無調用的則稱為葉子函數Q2:正常情況是否需要感知函數調用
    發(fā)表于 05-13 10:36

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

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

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

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

    對Linux的進程內核的認識

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

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

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

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

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

    淺談鴻蒙內核源碼的

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

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

    這是系統(tǒng)調用的總入口,所有的系統(tǒng)調用都要跑這里要統(tǒng)一處理.通過系統(tǒng)號(保存在R7),找到注冊函數并回調.完成
    的頭像 發(fā)表于 04-23 17:17 ?2119次閱讀
    鴻蒙<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>

    嵌入式系統(tǒng)的變化

    函數調用是通過來實現(xiàn)的,而且知道在中存放著該函數的局部變量。但是,對于的實現(xiàn)細節(jié)可能不一定清楚。本文將介紹一在Linux平臺下函數
    的頭像 發(fā)表于 12-29 16:40 ?1329次閱讀
    嵌入式<b class='flag-5'>系統(tǒng)</b>中<b class='flag-5'>棧</b>的變化

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

    首先, (stack) 是一種串列形式的 數據結構。這種數據結構的特點是 后入先出 (LIFO, Last In First Out),數據只能在串列的一端 (稱為:頂 top) 進行 推入
    的頭像 發(fā)表于 05-14 09:30 ?904次閱讀
    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>

    系統(tǒng)調用用戶內核切換(上)

    當發(fā)生系統(tǒng)調用、產生異常,外設發(fā)生中斷等事件時,會發(fā)生用戶內核之間的
    的頭像 發(fā)表于 07-31 11:27 ?1215次閱讀
    <b class='flag-5'>系統(tǒng)</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>的<b class='flag-5'>切換</b>(上)

    linux中的進程,線程,內核的區(qū)別

    大多數的處理器架構,都有實現(xiàn)硬件。有專門的指針寄存器,以及特定的硬件指令來完成 入/出 的操作。例如在 ARM 架構上,R13 (SP) 指針是堆棧指針寄存器,而 PUSH 是
    發(fā)表于 08-18 10:57 ?672次閱讀
    linux中的進程<b class='flag-5'>棧</b>,線程<b class='flag-5'>棧</b>,<b class='flag-5'>內核</b><b class='flag-5'>棧</b>的區(qū)別
    主站蜘蛛池模板: 四虎东方va私人影库在线观看 | 国产在线播 | 精品亚洲国产国拍 | 欧美性满足hd1819 | 97一区二区三区 | 四虎成人免费影院网址 | 国产乱码精品一区二区 | 绝色村妇的泛滥春情 | 免费在线观看你懂的 | 国产98在线传媒在线视频 | 97色在线 | 丁香六月激情综合 | 久久观看 | 日韩av线观看 | 欧美刺激午夜性久久久久久久 | 中文字幕人成不卡一区 | 国产欧美日韩电影 | 天天噜噜色 | 你懂的在线视频播放 | 久操伊人| 特一级毛片 | 国产片在线 | 69女porenhd| 欧美综合色 | 久久久久免费精品国产 | 在线视频亚洲一区 | 色视频日本 | 国产www在线播放 | 国产精品色婷婷在线观看 | 大尺度视频在线观看 | 日本媚薬痉挛在线观看免费 | 男人操女人免费视频 | 伊人成人在线 | 久操伊人网 | 久久国产精品亚洲综合 | 亚洲夂夂婷婷色拍ww47 | 免费一级欧美在线观看视频片 | 天天操夜操 | 免费一级毛片在级播放 | 亚洲综合天堂网 | 色y情视频免费看 |