新聞中心

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

        ARM linux系統調用的實現原理

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

        大家都知道的應用程序要想訪問內核必須使用從而從usr模式轉到svc模式。下面咱們看看它的過程。

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

          是os操作提供的服務,用戶程序通過各種系統,來引用內核提供的各種服務,系統調用的執行讓用戶程序陷入內核,該陷入動作由swi軟中斷完成。

          at91rm9200處理器對應的2.4.19內核系統調用對應的軟中斷定義如下:

          #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系統調用,庫函數最終會調用__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中的內容順序鏈接到這里

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

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 会昌县| 大城县| 桂平市| 松溪县| 莱西市| 宿州市| 大理市| 盱眙县| 万宁市| 大名县| 德安县| 海南省| 宝应县| 南安市| 汨罗市| 札达县| 八宿县| 弥渡县| 郯城县| 宁津县| 昌图县| 辛集市| 浪卡子县| 鄂伦春自治旗| 修武县| 芜湖县| 民和| 江安县| 安丘市| 灵丘县| 田东县| 弋阳县| 布拖县| 四子王旗| 鹤庆县| 赤城县| 镇赉县| 大田县| 芜湖县| 淮滨县| 南雄市|