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 ) ; } 上" />

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

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

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

3天內不再提示

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

麥辣雞腿堡 ? 來源:技術簡說 ? 作者:董旭 ? 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(往內核棧中格式化壓入的),獲取用戶傳入的系統調用號nr,系統調用號保存在了regs->orig_ax:

unsigned long nr = regs- >orig_ax;

2、 通過系統調用號nr,執行對應的回調函數,sys_call_table是函數指針數組,不同nr對應不同系統調用對應的函數。其中regx->di、regx->si、regs->dx、regs->r10、regs->r8、regs->r9分別是之前保存到內核棧(以struct
pt_regs格式化)保存到pt_regs中的,對應著用戶傳入該系統調用的參數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);
 }

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

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

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

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

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

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

總之

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

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

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

    關注

    3

    文章

    1381

    瀏覽量

    40362
  • Linux
    +關注

    關注

    87

    文章

    11336

    瀏覽量

    210097
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

    對Linux的進程內核的認識

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

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

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

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

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

    淺談鴻蒙內核源碼的

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

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

    這是系統調用的總入口,所有的系統調用都要跑這里要統一處理.通過系統號(保存在R7),找到注冊函數并回調.完成
    的頭像 發表于 04-23 17:17 ?1943次閱讀
    鴻蒙<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平臺下函數
    的頭像 發表于 12-29 16:40 ?1136次閱讀
    嵌入式<b class='flag-5'>系統</b>中<b class='flag-5'>棧</b>的變化

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

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

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

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

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

    大多數的處理器架構,都有實現硬件。有專門的指針寄存器,以及特定的硬件指令來完成 入/出 的操作。例如在 ARM 架構上,R13 (SP) 指針是堆棧指針寄存器,而 PUSH 是
    發表于 08-18 10:57 ?532次閱讀
    linux中的進程<b class='flag-5'>棧</b>,線程<b class='flag-5'>棧</b>,<b class='flag-5'>內核</b><b class='flag-5'>棧</b>的區別
    主站蜘蛛池模板: 欧美亚洲色帝国| 岛国大片在线播放免费| 久久国产精品久久国产精品| 2018高清国产一区二区三区| 欧美亚洲高清国产| 国产精品毛片在线视频| 自拍偷拍12p| 十分钟免费观看大全视频| 国家产午夜精品无人区| 5g在视影讯天天5g免费观看| 2023极品少妇XXXO露脸| 欧美精品一区二区在线电影| 国产精品永久AV无码视频| 真人美女精美小穴| 日本xxx片免费高清在线| 国产一区二区免费在线观看| 99热久久久无码国产精品性麻豆| 乌克兰14一18处交见血| 久久日本精品国产精品| 成人人观看的免费毛片| 一个人看www| 色欲久久精品AV无码| 久久中文字幕免费视频| 国产AV麻豆出品在线播放| 中文字幕高清在线中文字幕| 玩50岁四川熟女大白屁股直播| 邻家美姨在线观看全集免费| 国产精品亚洲专一区二区三区| 67194con免费福和视频| 亚洲精品第一综合99久久| 日本九九热在线观看官网| 快播电影频道| 含羞草在线| 国产第一页浮力影院| av天堂电影网| 与邻居换娶妻子2在线观看| 午夜黄视频| 肉肉描写很细致的黄文| 内射爽无广熟女亚洲| 久久精品国产欧美成人| 国产中文字幕乱码免费|