在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:
上一篇:三星S3C6410(ARM1176)平臺Android資源獲取與編譯(RedHat AS5)
下一篇:Exynos4412的外部中斷是如何安排的?
推薦閱讀
史海拾趣
面對競爭激烈的電子市場,EMMICRO公司制定了精準(zhǔn)的市場拓展策略。公司根據(jù)市場需求和客戶需求,不斷調(diào)整產(chǎn)品結(jié)構(gòu)和市場定位,積極開拓新的銷售渠道和合作伙伴。同時,公司還加大了對新興市場的投入和布局,通過差異化競爭策略,成功打開了多個新的市場領(lǐng)域。
在激烈的市場競爭中,APD公司始終堅持品質(zhì)至上的原則。公司建立了嚴(yán)格的質(zhì)量管理體系,從原材料采購到產(chǎn)品生產(chǎn)、檢測等各個環(huán)節(jié)都嚴(yán)格把關(guān)。憑借卓越的產(chǎn)品品質(zhì)和良好的售后服務(wù),APD贏得了眾多客戶的信賴和支持。
ESS一直將技術(shù)創(chuàng)新作為公司發(fā)展的核心動力。通過不斷投入研發(fā)資源,ESS在音頻芯片、視頻技術(shù)、傳真/調(diào)制解調(diào)器技術(shù)等領(lǐng)域取得了多項重要突破。這些技術(shù)創(chuàng)新不僅提升了ESS產(chǎn)品的性能和品質(zhì),還為公司在市場中贏得了更多競爭優(yōu)勢。同時,ESS還積極與全球知名企業(yè)和研究機(jī)構(gòu)合作,共同推動半導(dǎo)體芯片技術(shù)的創(chuàng)新和發(fā)展。正是這種持續(xù)的技術(shù)創(chuàng)新和不懈的追求卓越,使ESS在電子行業(yè)中始終保持領(lǐng)先地位。
隨著技術(shù)的不斷積累和市場的不斷拓展,Gems Sensors & Controls公司成功加盟了全球知名的世界500強(qiáng)企業(yè)丹納赫集團(tuán)。這一舉措不僅為公司帶來了更多的資源和支持,也加速了Gems的全球化布局。如今,Gems的生產(chǎn)基地遍布北美、歐洲和亞洲,并在全球范圍內(nèi)設(shè)立了銷售、設(shè)計和服務(wù)辦事處,能夠為客戶提供更加全面和便捷的服務(wù)。
提供RM/RVMB硬盤播放器方案 RM播放器方案,RMVB播放器方案,硬盤播放器方案,廣告機(jī)方案,RM播放方案,RM/RMVB播放方案 詳細(xì)介紹 1、流媒體視頻播放:全碼率支持RM/RMVB格式,網(wǎng)絡(luò)流媒體視頻音頻電視化。 2、影視播放:支持絕大部分視 ...… 查看全部問答∨ |
|
本帖最后由 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ī)處理、電視圖像顯示的新時代 ...… 查看全部問答∨ |
|
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ù)中都加了打印 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動器設(shè)計
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計
- 基于GPS自動授時的無線智能控制器的設(shè)計
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計
- 匠芯創(chuàng)推出面向具身智能高性能實時處理器M7000
- 通用汽車轉(zhuǎn)向LFP電池,LG新能源和三星SDI擬在美建廠
- 蓋世汽車研究院:政策助推疊加技術(shù)迭代 全固態(tài)電池蓄勢待發(fā)
- 小鵬汽車董事長預(yù)測:2027年激光雷達(dá)非智能駕駛必備
- 解碼大眾汽車中國戰(zhàn)略 - 決戰(zhàn)智能化電氣化的三板斧
- 2025從具身智能大腦展望人形機(jī)器人發(fā)展
- “荊楚”人形機(jī)器人即將量產(chǎn),智能時代的新篇章!
- 小鵬純視覺方案:技術(shù)突圍與市場下沉的雙重博弈
- 為什么無人出租車能“零”事故,而智能駕駛輔助卻事故頻發(fā)?
- 重磅!一顆要顛覆全球智駕的芯片點亮了!
- 3D視覺技術(shù)為工業(yè)自動化帶來新“視界”
- 邁來芯高可靠可編程霍爾開關(guān),5月21日 10:00 邀您觀看直播
- 【芯幣兌換】活動一:用社區(qū)芯幣兌換51開發(fā)板PCB板!
- 智能家電解決方案 互聯(lián)品質(zhì)生活
- 看視頻贏京東卡 | 泰享實測之水哥秘籍
- 齊分享,月月有獎第25期活動華麗升級來襲
- 開啟Altera SoC體驗之旅,玩轉(zhuǎn)Altera Cyclone V系列SoC
- NI labview、CompactDAQ技術(shù)集錦
- 閱讀瑞薩電子電源模塊系列白皮書,贏雙重好禮:提升能量有禮&推薦100%有禮 !
- 有獎直播:聯(lián)詠安防監(jiān)控方案及未來技術(shù)方向 報名開始啦!