新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM linux系統調用的實現原理

        ARM linux系統調用的實現原理

        作者: 時間:2011-06-02 來源:網絡 收藏
        源程序:

        本文引用地址:http://www.104case.com/article/150660.htm

          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, #SWI_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

          adrcond 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

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 嵊州市| 弥渡县| 永善县| 郓城县| 巴楚县| 辽源市| 平度市| 德清县| 文化| 元江| 张家界市| 牡丹江市| 阿坝| 永修县| 宽甸| 浦东新区| 杭锦后旗| 宜章县| 昌平区| 东明县| 班戈县| 融水| 海城市| 嘉兴市| 松滋市| 泸州市| 华坪县| 双柏县| 平安县| 洛浦县| 留坝县| 都江堰市| 富平县| 金昌市| 安宁市| 舞阳县| 莲花县| 乳源| 东阿县| 晋州市| 石门县|