新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android arm linux 系統調用實現

        Android arm linux 系統調用實現

        作者: 時間:2016-11-09 來源:網絡 收藏
        In this article we will dive into system call interface implementation in arm linux(with gnu eabi).我們將從bionic中的open函數開始追溯arm linux的系統調用實現(使用gnu eabi)。

        Linux的應用程序要想訪問內核必須使用系統調用從而實現從usr模式轉到svc模式。在arm中,這個過程是通過swi(或者和它等價的指令)來實現模式轉換的。

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

        從bionic libc中的open函數追溯系統調用實現

        相關文件:

        • bionic/libc/unistd/open.c

        • bionic/libc/arch-arm/syscalls/__open.S

        • linux/arch/arm/kernel/entry-common.S

        • linux/arch/arm/kernel/entry-armv.S

        • linux/arch/arm/kernel/entry-header.S

        相關調用過程:

        • int open(const char *pathname, int flags, ...);bionic/libc/unistd/open.c

        • __openbionic/libc/arch-arm/syscalls/__open.S

          __open:

          .save {r4, r7}

          stmfd sp!, {r4, r7}

          ldr r7, =__NR_open

          swi #0

          ldmfd sp!, {r4, r7}

          movs r0, r0

          bxpl lr

          b __set_syscall_errno

        • vector_swilinux/arch/arm/kernel/entry-common.S

          adr tbl, sys_call_table @ load syscall table pointer

          cmp scno, #NR_syscalls @ check upper syscall limit

          adr lr, BSYM(ret_fast_syscall) @ return address

          ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine

        • sys_call_table系統調用跳轉表,里面保存了各個系統調用實現的地址。

          .type sys_call_table, #object

          ENTRY(sys_call_table)

          #include "calls.S"



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 塘沽区| 迁安市| 香河县| 工布江达县| 湖南省| 海伦市| 和田市| 阿尔山市| 宁夏| 乐陵市| 平安县| 玉屏| 富锦市| 沅陵县| 封开县| 永平县| 莫力| 贵州省| 乌鲁木齐市| 木兰县| 镶黄旗| 顺平县| 隆尧县| 庆阳市| 蓬安县| 镇江市| 龙江县| 清苑县| 筠连县| 定襄县| 英德市| 辽阳县| 盈江县| 依兰县| 清丰县| 桑日县| 监利县| 加查县| 德令哈市| 太仆寺旗| 许昌市|