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

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

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

3天內不再提示

ARM Linux:usr模式轉為svc模式的實現原理

如意 ? 來源:CSDN ? 作者:劉洪濤 ? 2020-06-20 10:23 ? 次閱讀

大家都知道linux的應用程序要想訪問內核必須使用系統調用從而實現從usr模式轉到svc模式。下面咱們看看它的實現過程。

系統調用是os操作系統提供的服務,用戶程序通過各種系統調用,來引用內核提供的各種服務,系統調用的執行讓用戶程序陷入內核,該陷入動作由swi軟中斷完成。

at91rm9200處理器對應的linux2.4.19內核系統調用對應的軟中斷定義如下:

#if defined(__thumb__) //thumb模式

#define __syscall(name) /

“push {r7}/n/t” /

“mov r7, #” __sys1(__NR_##name) “/n/t” /

“swi 0/n/t” /

“pop {r7}”

#else //arm模式

#define __syscall(name) “swi/t” __sys1(__NR_##name) “/n/t”

#endif

#define __sys2(x) #x

#define __sys1(x) __sys2(x)

#define __NR_SYSCALL_BASE 0x900000 //此為OS_NUMBER 《《 20運算值

#define __NR_open (__NR_SYSCALL_BASE+ 5) //0x900005

舉一個例子來說:open系統調用,庫函數最終會調用__syscall(open),宏展開之后為swi #__NR_open,即,swi #0x900005觸發中斷,中斷號0x900005存放在[lr,#-4]地址中,處理器跳轉到arch/arm/kernel/entry-common.S中vector_swi讀取[lr,#-4]地址中的中斷號,之后查詢arch/arm/kernel/entry-common.S中的sys_call_table系統調用表,該表內容在arch/arm/kernel/calls.S中定義,__NR_open在表中對應的順序號為

__syscall_start:

。。.

.long SYMBOL_NAME(sys_open) //第5個

。。.

將sys_call_table[5]中內容傳給pc,系統進入sys_open函數,處理實質的open動作

注:用到的一些函數數據所在文件,如下所示

arch/arm/kernel/calls.S聲明了系統調用函數

include/asm-arm/unistd.h定義了系統調用的調用號規則

vector_swi定義在arch/arm/kernel/entry-common.S

vector_IRQ定義在arch/arm/kernel/entry-armv.S

vector_FIQ定義在arch/arm/kernel/entry-armv.S

arch/arm/kernel/entry-common.S中對sys_call_table進行了定義:

.type sys_call_table, #object

ENTRY(sys_call_table)

#include “calls.S” //將calls.S中的內容順序鏈接到這里

源程序:

ENTRY(vector_swi)

save_user_regs

zero_fp

get_scno //將[lr,#-4]中的中斷號轉儲到scno(r7)

arm710_bug_check scno, ip

#ifdef CONFIG_ALIGNMENT_TRAP

ldr ip, __cr_alignment

ldr ip, [ip]

mcr p15, 0, ip, c1, c0 @ update control register

#endif

enable_irq ip

str r4, [sp, #-S_OFF]! @ push fifth arg

get_current_task tsk

ldr ip, [tsk, #TSK_PTRACE] @ check for syscall tracing

bic scno, scno, #0xff000000 @ mask off SWI op-code

//#define OS_NUMBER 9[entry-header.S]

//所以對于上面示例中open系統調用號scno=0x900005

//eor scno,scno,#0x900000

//之后scno=0x05

eor scno, scno, #OS_NUMBER 《《 20 @ check OS number

//sys_call_table項為calls.S的內容

adr tbl, sys_call_table @ load syscall table pointer

tst ip, #PT_TRACESYS @ are we tracing syscalls?

bne __sys_trace

adrsvc al, lr, ret_fast_syscall @ return address

cmp scno, #NR_syscalls @ check upper syscall limit

//執行sys_open函數

ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine

add r1, sp, #S_OFF

2: mov why, #0 @ no longer a real syscall

cmp scno, #ARMSWI_OFFSET

eor r0, scno, #OS_NUMBER 《《 20 @ put OS number back

bcs SYMBOL_NAME(arm_syscall)

b SYMBOL_NAME(sys_ni_syscall) @ not private func

/*

* This is the really slow path. We‘re going to be doing

* context switches, and waiting for our parent to respond.

*/

__sys_trace:

add r1, sp, #S_OFF

mov r0, #0 @ trace entry [IP = 0]

bl SYMBOL_NAME(syscall_trace)

/*

//2007-07-01 gliethttp [entry-header.S]

//Like adr, but force SVC mode (if required)

.macro adrsvc, cond, reg, label

adr/cond /reg, /label

.endm

//對應反匯編

//add lr, pc, #16 ; lr = __sys_trace_return

*/

adrsvc al, lr, __sys_trace_return @ return address

add r1, sp, #S_R0 + S_OFF @ pointer to regs

cmp scno, #NR_syscalls @ check upper syscall limit

ldmccia r1, {r0 - r3} @ have to reload r0 - r3

ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine

b 2b

__sys_trace_return:

str r0, [sp, #S_R0 + S_OFF]! @ save returned r0

mov r1, sp

mov r0, #1 @ trace exit [IP = 1]

bl SYMBOL_NAME(syscall_trace)

b ret_disable_irq

.align 5

#ifdef CONFIG_ALIGNMENT_TRAP

.type __cr_alignment, #object

__cr_alignment:

.word SYMBOL_NAME(cr_alignment)

#endif

.type sys_call_table, #object

ENTRY(sys_call_table)

#include “calls.S”

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

    關注

    134

    文章

    9321

    瀏覽量

    375379
  • Linux
    +關注

    關注

    87

    文章

    11469

    瀏覽量

    212899
  • USR
    USR
    +關注

    關注

    1

    文章

    53

    瀏覽量

    11376
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    ARM處理器7種工作模式介紹

    ` ARM微處理器支持7種運行模式,分別如下: 用戶模式(usr):ARM處理器正常的程序執行狀態。快速中斷
    發表于 03-20 11:15

    ARM處理器7種工作模式介紹

    ARM微處理器支持7種運行模式,分別如下。 用戶模式(usr):ARM處理器正常的程序執行狀態。 快速中斷
    發表于 10-13 10:08

    請問S3C2440為什么要設置CPU為SVC模式

    在看Uboot的start.S文件時候,發現其最開始初始化系統,做的第一件事情,就是將CPU設置為SVC模式,但是S3C2440的CPU的core是ARM920T,其有7種模式,為何非
    發表于 04-29 05:20

    簡述ARM的2種工作狀態和7種工作模式

    狀態的切換),現在ARM都只使用Thumb狀態了。所以,我們不在討論狀態切換相關。一、ARM七種工作模式及其應用場合(Linux操作系統使用了其中U
    發表于 08-20 12:30

    ARM的2種工作狀態和7種工作模式。[附帶文檔下載]

    的切換),現在ARM都只使用Thumb狀態了。所以,我們不在討論狀態切換相關。一、ARM七種工作模式及其應用場合(Linux操作系統使用了其中USR
    發表于 08-20 09:14

    ARM的七種工作模式你都知道有哪些嗎?

    什么是用戶模式USR)?什么是管理模式SVC)?快速中斷模式與外部中斷模式有什么區別?
    發表于 06-30 06:00

    ARM七種處理器工作模式

    一、ARM七種處理器工作模式:用戶模式 usr:正常程序執行模式快速中斷模式FIQ:用于高速數據
    發表于 07-16 06:52

    SVC工作模式優點

    的服務。SVC這種工作模式優點有以下幾點:● 它使用戶程序從控制硬件的繁文縟節中解脫出來,而是由 OS 負
    發表于 12-13 07:58

    嵌入式Linux內核制作的相關資料分享

    相關代碼。1.2 Linux內核架構現代CPU通常實現了不同的工作模式,如ARM實現7種工作模式
    發表于 12-20 07:23

    ARMUSR模式SVC模式與IRQ模式分別有哪些限制呢?

    ARMUSR模式SVC模式與IRQ模式分別有哪些限制呢?求解答
    發表于 10-10 16:34

    ARM處理器7種工作模式

    狀態的切換),現在ARM都只使用Thumb狀態了。所以,我們不在討論狀態切換相關。 一、ARM七種工作模式及其應用場合(Linux操作系統使用了其中
    發表于 12-15 10:15

    ARM linux系統調用的實現原理

    大家都知道linux的應用程序要想訪問內核必須使用系統調用從而實現usr模式轉到svc模式。下
    發表于 05-30 11:24 ?2276次閱讀

    ARM Linux各種驅動的中斷服務程序工作在ARM的IRQ模式嗎?

    可見,ARM Linux最初進入IRQ模式后,比較快速地從IRQ模式切換到了SVC模式,但是這個
    的頭像 發表于 07-27 14:54 ?4538次閱讀
    <b class='flag-5'>ARM</b> <b class='flag-5'>Linux</b>各種驅動的中斷服務程序工作在<b class='flag-5'>ARM</b>的IRQ<b class='flag-5'>模式</b>嗎?

    以源代碼為例,講解ARM Linux系統調用的實現原理

    大家都知道linux的應用程序要想訪問內核必須使用系統調用從而實現usr模式轉到svc模式。下
    發表于 08-12 10:42 ?1180次閱讀

    ARM處理器的工作模式和特點

    ARM處理器具有多種工作模式,這些模式根據處理器執行的任務和當前的狀態進行劃分。常見的ARM處理器工作模式包括用戶
    的頭像 發表于 09-10 11:22 ?2141次閱讀
    主站蜘蛛池模板: 久久成人影视 | 最近国语剧情视频在线观看 | 韩国韩宝贝2020vip福利视频 | 国产三级久久久精品三级 | 午夜合集 | 国产精品久久久福利 | 禁漫羞羞入口 | 日韩成人黄色 | 欧美日本一区二区三区生 | 久青草国产手机在线视频 | 色综合久久久高清综合久久久 | 国产午夜久久精品 | 五月婷婷网站 | 国产伦一区二区三区免费 | 一级片影院 | 欧美城天堂网 | 中文字幕精品一区二区2021年 | 中文字幕亚洲一区二区v@在线 | 四虎精品久久久久影院 | 手机在线看片国产 | 69xxx网站| 欧美一级视频免费看 | 国产精品一级香蕉一区 | 午夜一级黄色片 | 亚洲男女免费视频 | 高清国产美女在线观看 | 国产精品高清免费网站 | 好大好硬好爽免费视频 | 国产免费色视频 | 国产爱搞 | 亚洲国产精品婷婷久久 | 四虎www成人影院免费观看 | 日本色图在线 | 轻点太大了好深好爽h文 | 美国一级做a一级爱视频 | 久久久久久91精品色婷婷 | xxxxbbbb欧美| 亚洲欧美经典 | 污污视频在线免费看 | 老司机精品视频免费 | 色婷婷久久久swag精品 |