娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月16日(星期日)

正在發(fā)生

2020年02月16日 | 淺析基于ARM的Linux下的系統(tǒng)調(diào)用的實現(xiàn)

發(fā)布者:心靈舞者 來源: eefocus關(guān)鍵字:ARM  Linux下  系統(tǒng)調(diào)用 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

在Linux下系統(tǒng)調(diào)用是用軟中斷實現(xiàn)的,下面以一個簡單的open例子簡要分析一下應(yīng)用層的open是如何調(diào)用到內(nèi)核中的sys_open的。


t8.c


   1:  #include

   2:  #include

   3:  #include

   4:  #include

   5:   

   6:  int main(int argc, const char *argv[])

   7:  {

   8:      int fd;

   9:   

  10:      fd = open(".", O_RDWR);

  11:   

  12:      close(fd);

  13:      return 0;

  14:  }


這里需要注意的是:open是C庫提供的庫函數(shù),并不是系統(tǒng)調(diào)用,系統(tǒng)調(diào)用時在內(nèi)核空間的,應(yīng)用空間無法直接調(diào)用。在《Linux內(nèi)核設(shè)計與實現(xiàn)》中說:要訪問系統(tǒng)調(diào)用(在Linux中常稱作syscall),通常通過C庫中定義的函數(shù)調(diào)用來進(jìn)行。


將t8.c進(jìn)行靜態(tài)編譯,然后反匯編,看一下是如何調(diào)用open的?


   1:  arm-linux-gcc t8.c --static

   2:  arm-linux-objdump -D a.out >a.dis


下面我們截取a.dis中的一部分進(jìn)行說明:


   1:  ......

   2:  00008228

:

   3:      8228:   e92d4800    push    {fp, lr}

   4:      822c:   e28db004    add fp, sp, #4  ; 0x4

   5:      8230:   e24dd010    sub sp, sp, #16 ; 0x10

   6:      8234:   e50b0010    str r0, [fp, #-16]

   7:      8238:   e50b1014    str r1, [fp, #-20]

   8:      823c:   e59f0028    ldr r0, [pc, #40]   ; 826c

   9:      8240:   e3a01002    mov r1, #2  ; 0x2   ;  #define  O_RDWR  00000002 

  10:      8244:   eb002e7d    bl  13c40 <__libc_open>

  11:      8248:   e1a03000    mov r3, r0

  12:      824c:   e50b3008    str r3, [fp, #-8]

  13:      8250:   e51b0008    ldr r0, [fp, #-8]

  14:      8254:   eb002e9d    bl  13cd0 <__libc_close>

  15:      8258:   e3a03000    mov r3, #0  ; 0x0

  16:      825c:   e1a00003    mov r0, r3

  17:      8260:   e24bd004    sub sp, fp, #4  ; 0x4

  18:      8264:   e8bd4800    pop {fp, lr}

  19:      8268:   e12fff1e    bx  lr

  20:      826c:   00064b8c    .word   0x00064b8c

  21:  ......

  22:  00013c40 <__libc_open>:

  23:     13c40:   e51fc028    ldr ip, [pc, #-40]  ; 13c20 <___fxstat64+0x50>

  24:     13c44:   e79fc00c    ldr ip, [pc, ip]

  25:     13c48:   e33c0000    teq ip, #0  ; 0x0

  26:     13c4c:   1a000006    bne 13c6c <__libc_open+0x2c>

  27:     13c50:   e1a0c007    mov ip, r7

  28:     13c54:   e3a07005    mov r7, #5  ; 0x5   

  #在arch/arm/include/asm/unistd.h中:#define __NR_open  (__NR_SYSCALL_BASE+5)

                    其中,__NR_OABI_SYSCALL_BASE是0

  29:     

13c58: ef000000 svc 0x00000000 #產(chǎn)生軟中斷

  30:     13c5c:   e1a0700c    mov r7, ip

  31:     13c60:   e3700a01    cmn r0, #4096   ; 0x1000

  32:     13c64:   312fff1e    bxcc    lr

  33:     13c68:   ea0008d4    b   15fc0 <__syscall_error>

  34:  ......


通過上面的代碼注釋,可以看到,系統(tǒng)調(diào)用sys_open的系統(tǒng)調(diào)用號是5,將系統(tǒng)調(diào)用號存放到寄存器R7當(dāng)中,然后應(yīng)用程序通過svc 0x00000000產(chǎn)生軟中斷,陷入內(nèi)核空間。


也許會好奇,ARM軟中斷不是用SWI嗎,這里怎么變成了SVC了,請看下面一段話,是從ARM官網(wǎng)copy的:


SVC


超級用戶調(diào)用。 

語法


SVC{cond} #immed


其中:


cond


    是一個可選的條件代碼(請參閱條件執(zhí)行)。 

immed


    是一個表達(dá)式,其取值為以下范圍內(nèi)的一個整數(shù):


        在 ARM 指令中為 0 到 224–1(24 位值)


        在 16 位 Thumb 指令中為 0-255(8 位值)。


用法


SVC 指令會引發(fā)一個異常。 這意味著處理器模式會更改為超級用戶模式,CPSR 會保存到超級用戶模式 SPSR,并且執(zhí)行會跳轉(zhuǎn)到 SVC 向量(請參閱《開發(fā)指南》中的第 6 章 處理處理器異常)。


處理器會忽略 immed。 但異常處理程序會獲取它,借以確定所請求的服務(wù)。 

Note


作為 ARM 匯編語言開發(fā)成果的一部分,SWI 指令已重命名為 SVC。 在此版本的 RVCT 中,SWI 指令反匯編為 SVC,并提供注釋以指明這是以前的 SWI。 

條件標(biāo)記


此指令不更改標(biāo)記。 

體系結(jié)構(gòu)


此 ARM 指令可用于所有版本的 ARM 體系結(jié)構(gòu)。


在基于ARM的Linux中,異常向量表已經(jīng)被放置在了0xFFFF0000這個位置。這個過程的完成:


start_kernel ---> setup_arch ---> early_trap_init


   1:  void __init early_trap_init(void)

   2:  {

   3:      unsigned long vectors = CONFIG_VECTORS_BASE;  // 就是0xFFFF0000

   4:      extern char __stubs_start[], __stubs_end[];

   5:      extern char __vectors_start[], __vectors_end[];

   6:      extern char __kuser_helper_start[], __kuser_helper_end[];

   7:      int kuser_sz = __kuser_helper_end - __kuser_helper_start;

   8:   

   9:      /*

  10:       * Copy the vectors, stubs and kuser helpers (in entry-armv.S)

  11:       * into the vector page, mapped at 0xffff0000, and ensure these

  12:       * are visible to the instruction stream.

  13:       */

  14:      memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);

  15:      memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);

  16:      memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);

  17:   

  18:      /*

  19:       * Copy signal return handlers into the vector page, and

  20:       * set sigreturn to be a pointer to these.

  21:       */

  22:      memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,

  23:             sizeof(sigreturn_codes));

  24:   

  25:      flush_icache_range(vectors, vectors + PAGE_SIZE);

  26:      modify_domain(DOMAIN_USER, DOMAIN_CLIENT);

  27:  }

關(guān)于上面這個函數(shù)的詳細(xì)解釋,參見:


http://www.cnblogs.com/pengdonglin137/p/3603549.html


把異常中斷向量表的位置設(shè)置為0xffff0000的話,需要修改協(xié)處理器CP15的寄存器C1的第13位,將其設(shè)置為1。以Tq2440的提供的內(nèi)核2.6.30.4為例看一下:


 arch/arm/kernel/head.S


   1:      adr    lr, __enable_mmu        @ return (PIC) address

   2:      add    pc, r10, #PROCINFO_INITFUNC

其中,PROCINFO_INITFUNC的值是16,r10的值是__arm920_proc_info的地址:


   1:  __arm920_proc_info:

   2:      .long    0x41009200

   3:      .long    0xff00fff0

   4:      .long   PMD_TYPE_SECT |

   5:          PMD_SECT_BUFFERABLE |

   6:          PMD_SECT_CACHEABLE |

   7:          PMD_BIT4 |

   8:          PMD_SECT_AP_WRITE |

   9:          PMD_SECT_AP_READ

  10:      .long   PMD_TYPE_SECT |

  11:          PMD_BIT4 |

  12:          PMD_SECT_AP_WRITE |

  13:          PMD_SECT_AP_READ

  14:      b    __arm920_setup

  15:      .long    cpu_arch_name

  16:      .long    cpu_elf_name

  17:       ......

  18:      .size    __arm920_proc_info, . - __arm920_proc_info

看一下__arm920_setup的實現(xiàn)(proc-arm920.S (archarmmm)):


   1:      .type    __arm920_setup, #function

   2:  __arm920_setup:

   3:      mov    r0, #0

   4:      mcr    p15, 0, r0, c7, c7        @ invalidate I,D caches on v4

   5:      mcr    p15, 0, r0, c7, c10, 4        @ drain write buffer on v4

   6:  #ifdef CONFIG_MMU

   7:      mcr    p15, 0, r0, c8, c7        @ invalidate I,D TLBs on v4

   8:  #endif

   9:      adr    r5, arm920_crval

  10:      ldmia    r5, {r5, r6}            @ 參看以下下面的arm920_crval的實現(xiàn),本句話執(zhí)行完后r5和r6分別為:0x3f3f和0x3135

  11:      mrc    p15, 0, r0, c1, c0        @ get control register v4   獲取協(xié)處理器p15的寄存器才c1

  12:      

bic r0, r0, r5

  13:      

orr r0, r0, r6 @ 我們只關(guān)注第13位,這里將r0的第13位設(shè)置為了1

  14:      

mov pc, lr

  15:      .size    __arm920_setup, . - __arm920_setup

  16:   

  17:      /*

  18:       *  R

  19:       * .RVI ZFRS BLDP WCAM

  20:       * ..11 0001 ..11 0101

  21:       * 

  22:       */

  23:      .type    arm920_crval, #object

  24:  arm920_crval:

[1] [2] [3] [4]
關(guān)鍵字:ARM  Linux下  系統(tǒng)調(diào)用 引用地址:淺析基于ARM的Linux下的系統(tǒng)調(diào)用的實現(xiàn)

上一篇:三星S3C6410(ARM1176)平臺Android資源獲取與編譯(RedHat AS5)
下一篇:Exynos4412的外部中斷是如何安排的?

推薦閱讀

傳出樂金電子(LG Electronics)3月初將于韓國推出V30升級版的新旗艦機(jī)V30s,首次導(dǎo)入人工智能(AI)影像識別技術(shù)LG Lens,預(yù)估售價落在100萬韓元(約917美元)出頭。??據(jù)韓媒電子新聞(ET News)報導(dǎo),樂金先前在MWC 2017曾公開V30s,V30s設(shè)計與V30相同,但存儲容量新增256GB版本,過去V30與V30 Plus分別為64GB與128GB,市面上搭載256GB的機(jī)款,只有售價逼...
毫無疑問,2018年是人工智能(AI)發(fā)展的重要一年,因為進(jìn)一步推動了人工智能的主流應(yīng)用,并成功地實現(xiàn)了提供更多功能的自動化。越來越多的企業(yè)探索人工智能的應(yīng)用程序,并且公眾已經(jīng)習(xí)慣于每天與人工智能技術(shù)進(jìn)行交互。人工智能技術(shù)將繼續(xù)改變世界。在2019年,人工智能應(yīng)用不僅將繼續(xù)在全球普及中增長,而且還將圍繞重要主題開展更深層次的對話,推動創(chuàng)新...
內(nèi)容說明本實用新型涉及一種流量計,特別涉及一種石油管道流量計。發(fā)明背景隨著石油行業(yè)的高速發(fā)展,油田的開發(fā)和生產(chǎn)管理逐漸向智能化管理發(fā)展,并得到了廣泛的推廣和應(yīng)用。井下流量控制技術(shù)是油田技術(shù)不可缺少的重要部分,現(xiàn)有技術(shù)中對石油管道流量進(jìn)行測量時,通常是在石油管道內(nèi)直接設(shè)置流量傳感器,通過流量傳感器實時檢測石油在管內(nèi)的流速,并將檢測...

史海拾趣

問答坊 | AI 解惑

《ARM嵌入式系統(tǒng)開發(fā)典型模塊》

《ARM嵌入式系統(tǒng)開發(fā)典型模塊》…

查看全部問答∨

可以播放RM/RMVB的硬盤播放器

提供RM/RVMB硬盤播放器方案 RM播放器方案,RMVB播放器方案,硬盤播放器方案,廣告機(jī)方案,RM播放方案,RM/RMVB播放方案 詳細(xì)介紹    1、流媒體視頻播放:全碼率支持RM/RMVB格式,網(wǎng)絡(luò)流媒體視頻音頻電視化。 2、影視播放:支持絕大部分視 ...…

查看全部問答∨

CT機(jī)的基本構(gòu)造及工作原理

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 計算斷層攝影(ct)診斷 計算斷層攝影(computed tomography),簡稱ct ,是電子計算機(jī)和x線相結(jié)合,應(yīng)用到醫(yī)學(xué)領(lǐng)域的重大突破,它使傳統(tǒng)的x線診斷技術(shù)進(jìn)入了計算機(jī)處理、電視圖像顯示的新時代 ...…

查看全部問答∨

電路分析

大家來分享電路基礎(chǔ)教程。…

查看全部問答∨

這個怎么理解

#if FLASH_F2812 // All sectors on an F2812 - Sectors A - J #define SECTOR_F2812  (SECTORA|SECTORB|SECTORC|\\                        SECTO ...…

查看全部問答∨

無線模塊輸出純信號

接收模塊是3腳vcc+    DATA輸出        GND- DATA        輸出是TTl方式 輸出要怎么接       讓輸出是純信號 假設(shè)有一遙控器按下發(fā)射&nbs ...…

查看全部問答∨

nand flash掛載問題

Wince6.0下,想用nandflash做永久性存儲設(shè)備。 但是只有當(dāng)注冊表設(shè)置成AutoPart=1和AutoFormat=1時,對nandflash進(jìn)行分區(qū)和格式化,才能在my device里看到nandflash的分區(qū)。如果不進(jìn)行分區(qū)和格式化,只是設(shè)置AutoMount=1,就看不到nandflash的分區(qū) ...…

查看全部問答∨

如何得到邏輯器件時延?比如邏輯電路里有一個比較器,我想看它的時延是多少?什么方法最簡單呢?在ISE里還是用synlify呢?

如何得到器件時延?比如電路里有一個比較器,我想看它的時延是多少?什么方法最簡單呢?在ISE里還是用synlify呢? 若是用timing analysor或者synplify,是不是要用約束條件啊?感覺不需要這么麻煩吧?簡單的邏輯電路應(yīng)該不用時序仿真這么復(fù)雜的吧 ...…

查看全部問答∨

ActivateDeviceEx()動態(tài)加載DLL疑問?

我調(diào)用ActivateDeviceEx函數(shù)動態(tài)加載編寫的DLL驅(qū)動程序。 ActivateDeviceEx()對應(yīng)的是XXX_Init()函數(shù),可是調(diào)用ActivateDeviceEx函數(shù)時,不但執(zhí)行了XXX_Init()函數(shù),打印輸出顯示還執(zhí)行了XXX_Open(),XXX_Close()函數(shù)。(我在這些函數(shù)中都加了打印 ...…

查看全部問答∨

怎樣將工程下載到Vxsim模擬器上運(yùn)行?

本人剛接觸vxworks,望高手能講得具體點,多謝了…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 敦化市| 青州市| 长宁区| 江西省| 汝州市| 安远县| 德钦县| 宜良县| 乌拉特中旗| 威宁| 丰原市| 武平县| 会宁县| 阿鲁科尔沁旗| 安岳县| 拉萨市| 定安县| 山东| 九龙城区| 巴彦淖尔市| 潢川县| 广水市| 安阳县| 双辽市| 乾安县| 吴旗县| 马尔康县| 江津市| 潮州市| 六安市| 松江区| 旬邑县| 揭阳市| 洮南市| 广汉市| 泗水县| 静安区| 攀枝花市| 徐汇区| 黄平县| 固镇县|