<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM linux系統(tǒng)調(diào)用的實現(xiàn)原理

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

          作者: 時間:2011-06-02 來源:網(wǎng)絡(luò) 收藏

          大家都知道的應(yīng)用程序要想訪問內(nèi)核必須使用從而從usr模式轉(zhuǎn)到svc模式。下面咱們看看它的過程。

          本文引用地址:http://www.ex-cimer.com/article/150660.htm

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

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

            #if defined(__thumb__) //thumb模式

            #define __syscall(name)

            push {r7}nt

            mov r7, # __sys1(__NR_##name) nt

            swi 0nt

            pop {r7}

            #else //arm模式

            #define __syscall(name) swit __sys1(__NR_##name) nt

            #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系統(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個

            ...

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

            注:用到的一些函數(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進行了定義:

            .type sys_call_table, #object

            ENTRY(sys_call_table)

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

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

          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();