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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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

    文章

    9306

    瀏覽量

    374995
  • Linux
    +關注

    關注

    87

    文章

    11459

    瀏覽量

    212786
  • USR
    USR
    +關注

    關注

    1

    文章

    53

    瀏覽量

    11346
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    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 ?2274次閱讀

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

    可見,ARM Linux最初進入IRQ模式后,比較快速地從IRQ模式切換到了SVC模式,但是這個
    的頭像 發表于 07-27 14:54 ?4523次閱讀
    <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 ?1173次閱讀

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

    ARM處理器具有多種工作模式,這些模式根據處理器執行的任務和當前的狀態進行劃分。常見的ARM處理器工作模式包括用戶
    的頭像 發表于 09-10 11:22 ?2094次閱讀
    主站蜘蛛池模板: 日本人HD18HD18| 兽皇VIDEO另类HD| 色婷婷综合久久久久中文一区二区 | 甜性涩爱快播 | 亚洲AV国产福利精品在现观看 | 打扑克床上视频不用下载免费观看 | 久久精品亚洲AV中文2区金莲 | 国产麻豆精品人妻无码A片 国产麻豆精品久久一二三 国产麻豆精品传媒AV国产在线 | 奶好大下面流了好多水水 | 中文字幕亚洲综合小综合在线 | 亚洲九九视频 | 99久久久A片无码国产精 | 久久综合伊人 | 久草在线福利视频在线播放 | 亚洲精品久久久久69影院 | 亚洲日本一区二区三区在线不卡 | 亚洲成色爱我久久 | 久久精品久久久久 | 菠萝菠萝蜜高清观看在线 | 亚洲国产在线视频精品 | 国产在线高清视频无码 | 98久久人妻少妇激情啪啪 | 福利社的阿姨 | 国产免费福利在线视频 | 芳草地社区在线视频 | 秀婷程仪公欲息肉婷在线观看 | 久久精品视在线-2 | 日韩黄色免费 | 日本内射精品一区二区视频 | 孕妇bbwbbwbbwbbw超清 | 爱豆剧果冻传媒在线播放 | 蜜芽在线影片 | jizz破处| 国偷自产AV一区二区三区健身房 | 久久无码AV亚洲精品色午夜麻豆 | 凹凸精品视频分类视频 | 欧美四虎精品二区免费 | 日本中文字幕巨大的乳专区 | 免费无码一区二区三区蜜桃大 | 99pao成人国产永久免费视频 | 99在线观看免费视频 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品