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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM Linux:usr模式轉(zhuǎn)為svc模式的實(shí)現(xiàn)原理

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

大家都知道linux的應(yīng)用程序要想訪問內(nèi)核必須使用系統(tǒng)調(diào)用從而實(shí)現(xiàn)從usr模式轉(zhuǎn)到svc模式。下面咱們看看它的實(shí)現(xiàn)過程。

系統(tǒng)調(diào)用是os操作系統(tǒng)提供的服務(wù),用戶程序通過各種系統(tǒng)調(diào)用,來引用內(nèi)核提供的各種服務(wù),系統(tǒng)調(diào)用的執(zhí)行讓用戶程序陷入內(nèi)核,該陷入動(dòng)作由swi軟中斷完成。

at91rm9200處理器對應(yīng)的linux2.4.19內(nèi)核系統(tǒng)調(diào)用對應(yīng)的軟中斷定義如下:

#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運(yùn)算值

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

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

__syscall_start:

。。.

.long SYMBOL_NAME(sys_open) //第5個(gè)

。。.

將sys_call_table[5]中內(nèi)容傳給pc,系統(tǒng)進(jìn)入sys_open函數(shù),處理實(shí)質(zhì)的open動(dòng)作

注:用到的一些函數(shù)數(shù)據(jù)所在文件,如下所示

arch/arm/kernel/calls.S聲明了系統(tǒng)調(diào)用函數(shù)

include/asm-arm/unistd.h定義了系統(tǒng)調(diào)用的調(diào)用號規(guī)則

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進(jìn)行了定義:

.type sys_call_table, #object

ENTRY(sys_call_table)

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

源程序:

ENTRY(vector_swi)

save_user_regs

zero_fp

get_scno //將[lr,#-4]中的中斷號轉(zhuǎn)儲到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系統(tǒng)調(diào)用號scno=0x900005

//eor scno,scno,#0x900000

//之后scno=0x05

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

//sys_call_table項(xiàng)為calls.S的內(nèi)容

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

//執(zhí)行sys_open函數(shù)

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

//對應(yīng)反匯編

//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”

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

    關(guān)注

    134

    文章

    9097

    瀏覽量

    367607
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209537
  • USR
    USR
    +關(guān)注

    關(guān)注

    1

    文章

    49

    瀏覽量

    11050
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    請問S3C2440為什么要設(shè)置CPU為SVC模式?

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

    簡述ARM的2種工作狀態(tài)和7種工作模式

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

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

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

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

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

    ARM七種處理器工作模式

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

    SVC工作模式優(yōu)點(diǎn)

    的服務(wù)。SVC這種工作模式優(yōu)點(diǎn)有以下幾點(diǎn):● 它使用戶程序從控制硬件的繁文縟節(jié)中解脫出來,而是由 OS 負(fù)
    發(fā)表于 12-13 07:58

    嵌入式Linux內(nèi)核制作的相關(guān)資料分享

    相關(guān)代碼。1.2 Linux內(nèi)核架構(gòu)現(xiàn)代CPU通常實(shí)現(xiàn)了不同的工作模式,如ARM實(shí)現(xiàn)7種工作模式
    發(fā)表于 12-20 07:23

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

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

    ARM處理器7種工作模式

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

    ARM linux系統(tǒng)調(diào)用的實(shí)現(xiàn)原理

    大家都知道linux的應(yīng)用程序要想訪問內(nèi)核必須使用系統(tǒng)調(diào)用從而實(shí)現(xiàn)usr模式轉(zhuǎn)到svc模式。下
    發(fā)表于 05-30 11:24 ?2237次閱讀

    ARM Linux各種驅(qū)動(dòng)的中斷服務(wù)程序工作在ARM的IRQ模式嗎?

    可見,ARM Linux最初進(jìn)入IRQ模式后,比較快速地從IRQ模式切換到了SVC模式,但是這個(gè)
    的頭像 發(fā)表于 07-27 14:54 ?4361次閱讀
    <b class='flag-5'>ARM</b> <b class='flag-5'>Linux</b>各種驅(qū)動(dòng)的中斷服務(wù)程序工作在<b class='flag-5'>ARM</b>的IRQ<b class='flag-5'>模式</b>嗎?

    以源代碼為例,講解ARM Linux系統(tǒng)調(diào)用的實(shí)現(xiàn)原理

    大家都知道linux的應(yīng)用程序要想訪問內(nèi)核必須使用系統(tǒng)調(diào)用從而實(shí)現(xiàn)usr模式轉(zhuǎn)到svc模式。下
    發(fā)表于 08-12 10:42 ?1076次閱讀

    ARM處理器的工作模式和特點(diǎn)

    ARM處理器具有多種工作模式,這些模式根據(jù)處理器執(zhí)行的任務(wù)和當(dāng)前的狀態(tài)進(jìn)行劃分。常見的ARM處理器工作模式包括用戶
    的頭像 發(fā)表于 09-10 11:22 ?1191次閱讀