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

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

3天內不再提示

上下文切換與棧寄存器變化

冬至子 ? 來源:BU科研通通 ? 作者:BU科研通通 ? 2023-09-20 15:46 ? 次閱讀

call指令

CPU執(zhí)行call指令時,進行兩步操作:

(1)將當前的IP或CS和IP壓入棧中;

(2)轉移。

即:

(1)(sp) = (sp)-2

((ss)*16 +(sp)) = (IP)

(2)(IP) = (IP)+16位位移。

16位位移=“標號”處的地址-call指令后的第一個字節(jié)的地址

ret和retf指令

ret指令用棧中的數(shù)據,修改IP的內容,從而實現(xiàn)近轉移;

retf指令用棧中的數(shù)據,修改CS和IP的內容,從而實現(xiàn)遠轉移。

CPU執(zhí)行ret指令時,進行下面的兩步操作:

(1)(IP) = ((ss)*16 +(sp))

(2)(sp) = (sp)+2

CPU執(zhí)行retf指令時,進行下面四步操作:

(1)(IP) = ((ss)*16) + (sp)

(2)(sp) = (sp) + 2

(3)(CS) = ((ss)*16) + (sp)

(4)(sp) = (sp) + 2

中斷過程的上下文切換:

圖片

在進程切換時,一個進程存儲在處理器寄存器中的中間數(shù)據叫做進程的上下文。在進程未占用處理器時,進程的上下文是存儲在進程的私有堆棧中的。

圖片

關于寄存器

64位環(huán)境中用rip rsp rbp表示

32位環(huán)境用eip esp ebp 表示

CS是代碼段寄存器

IP是指令指針寄存器(相當于偏移地址)

SS:存放棧的段地址;

SP:堆棧寄存器SP(stack pointer)存放棧的偏移地址;

BP: 基數(shù)指針寄存器BP(base pointer),存儲堆?;刂?。

SP,BP一般與段寄存器SS 聯(lián)用,以確定堆棧寄存器中某一單元的地址。

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

    關注

    68

    文章

    19103

    瀏覽量

    228828
  • 寄存器
    +關注

    關注

    31

    文章

    5295

    瀏覽量

    119838
  • 串口中斷
    +關注

    關注

    0

    文章

    64

    瀏覽量

    13847
收藏 人收藏

    評論

    相關推薦

    編寫一個任務調度程序,在上下文切換后遇到了一些問題求解

    \"rfe\" 不會在 A[11] 寄存器中設置新的返回地址。 當任務函數(shù)以\"ret16\" 結束時,μC 將在陷阱中運行。 我在上下文切換的準備過程中錯過了什么? 在上下文切換/\"rfe\" 之后,A[11] 的正確行為是
    發(fā)表于 05-22 07:50

    關于進程上下文、中斷上下文及原子上下文的一些概念理解

    調用,用戶空間的應用程序就會進入內核空間,由內核代表該進程運行于內核空間,這就涉及到上下文切換,用戶空間和內核空間具有不同的 地址映射,通用或專用的寄存器組,而用戶空間的進程要傳遞很多變量、參數(shù)給內核
    發(fā)表于 09-06 09:58

    BT堆棧上下文切換

    100ms就會產生一個上下文切換。上下文切換每秒似乎有點高。我想我真的不能抱怨10個開關,但是有什么東西嗎?在BT協(xié)議中真的需要這個嗎?不能處理中斷驅動嗎?(這是BT是可連接的,但既沒有連接,也沒有
    發(fā)表于 12-17 16:30

    上下文切換簡介

    處理系統(tǒng)中,CPU需要處理所有程序的操作,當用戶來回切換它們時,需要記錄這些程序執(zhí)行到哪里。上下文切換就是這樣一個過程,他允許CPU記錄并恢復各種正在運行程序的狀態(tài),使它能夠完成切換操作。
    發(fā)表于 08-06 08:08

    上下文切換的情況發(fā)生

    處理系統(tǒng)中,CPU需要處理所有程序的操作,當用戶來回切換它們時,需要記錄這些程序執(zhí)行到哪里。上下文切換就是這樣一個過程,他允許CPU記錄并恢復各種正在運行程序的狀態(tài),使它能夠完成切換操作。
    發(fā)表于 08-07 08:38

    ucos上下文該怎么切換?

    有兩個問題請教一下大神!??!-->1在ucos中的上下文切換時發(fā)生在pendSV異常中,代碼見下:PendSV_Handler CPSIDI; Prevent interruption
    發(fā)表于 08-26 03:21

    基于cortex-m3的rt-thread系統(tǒng)如何實現(xiàn)線程上下文切換

    rt_interrupt_from_thread變量設置為空。線程上下文切換是,上下文保存在各個線程的空間中, 這里我們只需要在PendSV中手動保存和恢復r4-r11寄存器,因為其
    發(fā)表于 05-05 15:00

    Cortex-M4在線程上下文切換中的優(yōu)化

    cortex-m4相對比cortex-m3,在線程上下文切換中,主要增加了FPU寄存器,總共需要保存34個寄存器,合計136byte。因此原來在cortex-m3上面運行的程序在cortex-m4f
    發(fā)表于 08-05 10:58

    討論ARM mbed OS(RTX) 的上下文切換

    1. 墊話從本文開始,正式進入對調度實現(xiàn)細節(jié)及底層的探討。本文討論 ARM mbed OS(RTX) 的上下文切換。解構調度,按說不應該從“上下文切換”如此 meta 的細節(jié)入手。但從我個人角度
    發(fā)表于 02-16 14:26

    rt-thread上下文切換函數(shù)的意義在哪?

    Cortex-M3內核上下文切換函數(shù)rt_hw_context_switch()/ rt_hw_context_switch_interrupt()中有個判斷rt_thread_switch_interrupt_flag的地方,不知道意義在哪?
    發(fā)表于 03-10 11:28

    中斷中的上下文切換詳解

    任務上下文切換的訴求。  為什么在中斷服務函數(shù)中會產生任務上下文切換的訴求?因為中斷中可能會進行信號量post之類的動作(這可能會觸發(fā)此前一直處于pend狀態(tài)的,且比當前被中斷打斷的任務優(yōu)先級更高的任務
    發(fā)表于 03-23 17:18

    CPU上下文切換的詳細資料講解

    當UCOS-III轉向執(zhí)行另一項新任務的時候,他保存了當前任務的CPU寄存器到堆棧,并從新任務的堆棧CPU寄存器載入CPU,這個過程叫做上下文切換
    發(fā)表于 08-16 17:31 ?2次下載
    CPU<b class='flag-5'>上下文切換</b>的詳細資料講解

    如何分析Linux CPU上下文切換問題

    在我的上一篇文章:《探討 Linux CPU 的上下文切換》中,我談到了 CPU 上下文切換的工作原理??焖倩仡櫼幌?,CPU 上下文切換是保證 Linux 系統(tǒng)正常運行的核心功能??煞譃檫M程
    的頭像 發(fā)表于 05-05 20:11 ?1901次閱讀

    Linux技術:什么是cpu上下文切換

    過多的上下文切換會消耗 CPU 的時間來保存和恢復寄存器、程序計數(shù)、內核和虛擬內存等數(shù)據,從而導致系統(tǒng)性能顯著下降。 既然上下文切換對系
    發(fā)表于 09-01 09:31 ?431次閱讀
    Linux技術:什么是cpu<b class='flag-5'>上下文切換</b>

    FreeRTOS系列技術文章:上下文切換

    嵌入式實時操作系統(tǒng)(RTOS)中的上下文切換是指保存和恢復任務的狀態(tài),以使調度程序能夠切換到另一個任務,從而促進多任務處理。
    的頭像 發(fā)表于 11-21 15:48 ?1081次閱讀