在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            ARM linux系統調用的實現原理

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

            本文引用地址:http://www.biyoush.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

              //執(zhí)行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 下一頁

            評論


            相關推薦

            技術專區(qū)

            關閉