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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

[architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器

發(fā)布時間:2025/3/21 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

★★★ 個人博客導(dǎo)讀首頁—點擊此處 ★★★
.

文章目錄

        • 1、armv7的通用寄存器簡介
        • 2、寄存器的保存和恢復(fù)
        • 3、Linux Kernel參考代碼

1、armv7的通用寄存器簡介

ARMV7處理器有40個32位寄存器,包括:通用寄存器32個、狀態(tài)寄存器7個(CPSR和SPSR)、程序計數(shù)器一個(PC).
ARMV7有7-9種模式, 詳細(xì)的寄存器如下圖所示,帶顏色的為該模式下的私有寄存器(或者叫banked寄存器)

2、寄存器的保存和恢復(fù)

在進(jìn)行userspace進(jìn)程切換時,會對共有寄存器進(jìn)行保存和回復(fù),具體會保存和恢復(fù)哪些寄存器呢,如下圖所示

3、Linux Kernel參考代碼

(linux_5.9/arch/arm/kernel/entry-armv.S)/** Register switch for ARMv3 and ARMv4 processors* r0 = previous task_struct, r1 = previous thread_info, r2 = next thread_info* previous and next are guaranteed not to be the same.*/ ENTRY(__switch_to)UNWIND(.fnstart )UNWIND(.cantunwind )add ip, r1, #TI_CPU_SAVEARM( stmia ip!, {r4 - sl, fp, sp, lr} ) @ Store most regs on stackTHUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stackTHUMB( str sp, [ip], #4 )THUMB( str lr, [ip], #4 )ldr r4, [r2, #TI_TP_VALUE]ldr r5, [r2, #TI_TP_VALUE + 4] #ifdef CONFIG_CPU_USE_DOMAINSmrc p15, 0, r6, c3, c0, 0 @ Get domain registerstr r6, [r1, #TI_CPU_DOMAIN] @ Save old domain registerldr r6, [r2, #TI_CPU_DOMAIN] #endifswitch_tls r1, r4, r5, r3, r7 #if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_SMP)ldr r7, [r2, #TI_TASK]ldr r8, =__stack_chk_guard.if (TSK_STACK_CANARY > IMM12_MASK)add r7, r7, #TSK_STACK_CANARY & ~IMM12_MASK.endifldr r7, [r7, #TSK_STACK_CANARY & IMM12_MASK] #endif #ifdef CONFIG_CPU_USE_DOMAINSmcr p15, 0, r6, c3, c0, 0 @ Set domain register #endifmov r5, r0add r4, r2, #TI_CPU_SAVEldr r0, =thread_notify_headmov r1, #THREAD_NOTIFY_SWITCHbl atomic_notifier_call_chain #if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_SMP)str r7, [r8] #endifTHUMB( mov ip, r4 )mov r0, r5ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previouslyTHUMB( ldmia ip!, {r4 - sl, fp} ) @ Load all regs saved previouslyTHUMB( ldr sp, [ip], #4 )THUMB( ldr pc, [ip] )UNWIND(.fnend ) ENDPROC(__switch_to)

總結(jié)

以上是生活随笔為你收集整理的[architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。