1. kernel運(yùn)行的史前時(shí)期和內(nèi)存布局
在 arm平臺(tái)下,zImage.bin壓縮鏡像是由bootloader加載到物理內(nèi)存,然后跳到zImage.bin里一段程序,它專門于將被壓縮的 kernel解壓縮到KERNEL_RAM_PADDR開(kāi)始的一段內(nèi)存中,接著跳進(jìn)真正的kernel去執(zhí)行。該kernel的執(zhí)行起點(diǎn)是stext函數(shù),定義于arch/arm/kernel/head.S。
1在分析stext函數(shù)前,先介紹此時(shí)內(nèi)存的布局如下圖所示
在開(kāi)發(fā)板tqs3c2440中,SDRAM連接到內(nèi)存控制器的Bank6中,它的開(kāi)始內(nèi)存地址是0x30000000,大小為64M,即 0x20000000。 arm Linux kernel將SDRAM的開(kāi)始地址定義為PHYS_OFFSET。經(jīng)bootloader加載kernel并由自解壓部分代碼運(yùn)行后,最終kernel 被放置到KERNEL_RAM_PADDR(=PHYS_OFFSET + TEXT_OFFSET,即0x30008000)地址上的一段內(nèi)存,經(jīng)此放置后,kernel代碼以后均不會(huì)被移動(dòng)。
1在進(jìn)入kernel代碼前,即bootloader和自解壓縮階段,arm未開(kāi)啟MMU功能。因此kernel啟動(dòng)代碼一個(gè)重要功能是設(shè)置好相應(yīng)的頁(yè)表,并開(kāi)啟MMU功能。為了支持MMU功能,kernel鏡像中的所有符號(hào),包括代碼段和數(shù)據(jù)段的符號(hào),在鏈接時(shí)都生成了它在開(kāi)啟MMU時(shí),所在物理內(nèi)存地址映射到的虛擬內(nèi)存地址。
1以arm kernel第一個(gè)符號(hào)(函數(shù))stext為例,在編譯鏈接,它生成的虛擬地址是0xc0008000,而放置它的物理地址為0x30008000(還記得這是PHYS_OFFSET+TEXT_OFFSET嗎?)。實(shí)際上這個(gè)變換可以利用簡(jiǎn)單的公式進(jìn)行表示:va = pa – PHYS_OFFSET + PAGE_OFFSET。arm linux最終的kernel空間的頁(yè)表,就是按照這個(gè)關(guān)系來(lái)建立。
之所以較早提及arm linux 的內(nèi)存映射,原因是在進(jìn)入kernel代碼,里面所有符號(hào)地址值為清一色的0xCXXXXXXX地址,而此時(shí)arm未開(kāi)啟MMU功能,故在執(zhí)行stext 函數(shù)第一條執(zhí)行時(shí),它的PC值就是stext所在的內(nèi)存地址(即物理地址,0x30008000)。因此,下面有些代碼,需要使用地址無(wú)關(guān)技術(shù)。
2.一覽stext函數(shù)
stext函數(shù)定義在Arch/arm/kernel/head.S,它的功能是獲取處理器類型和機(jī)器類型信息,并創(chuàng)建臨時(shí)的頁(yè)表,然后開(kāi)啟MMU功能,并跳進(jìn)第一個(gè)C語(yǔ)言函數(shù)start_kernel。
stext函數(shù)的在前置條件是:MMU, D-cache, 關(guān)閉; r0 = 0, r1 = machine nr, r2 = atags prointer.
代碼如下:
.section ".text.head", "ax"
(stext)
/* 設(shè)置CPU運(yùn)行模式為SVC,并關(guān)中斷 */
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
@ and irqs disabled
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cupid
/* r10指向cpu對(duì)應(yīng)的proc_info記錄 */
movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p'
bl __lookup_machine_type @ r5=machinfo
/* r8 指向開(kāi)發(fā)板對(duì)應(yīng)的arch_info記錄 */
movs r8, r5 @ invalid machine (r5=0)?
beq __error_a @ yes, error 'a'
/* __vet_atags函數(shù)涉及bootloader造知kernel物理內(nèi)存的情況,我們暫時(shí)不分析它。 */
bl __vet_atags
/* 創(chuàng)建臨時(shí)頁(yè)表 */
bl __create_page_tables
/*
* The following calls CPU specific code in a position independent
* manner. See arch/arm/mm/proc-*.S for details. r10 = base of
* xxx_proc_info structure selected by __lookup_machine_type
* above. On return, the CPU will be ready for the MMU to be
* turned on, and r0 will hold the CPU control register value.
*/
/* 這里的邏輯關(guān)系相當(dāng)復(fù)雜,先是從proc_info結(jié)構(gòu)中的中跳進(jìn)__arm920_setup函數(shù),
* 然后執(zhí)__enable_mmu 函數(shù)。最后在__enable_mmu函數(shù)通過(guò)mov pc, r13來(lái)執(zhí)行__switch_data,
* __switch_data函數(shù)在最后一條語(yǔ)句,魚躍龍門,跳進(jìn)第一個(gè)C語(yǔ)言函數(shù)start_kernel。
*/
ldr r13, __switch_data @ address to jump to after
@ mmu has been enabled
adr lr, __enable_mmu @ return (PIC) address
add pc, r10, #PROCINFO_INITFUNC
OC(stext)
3 __lookup_processor_type 函數(shù)
__lookup_processor_type 函數(shù)是一個(gè)非常講究技巧的函數(shù),如果你將它領(lǐng)會(huì),也將領(lǐng)會(huì)kernel了一些魔法。
Kernel 代碼將所有CPU信息的定義都放到.proc.info.init段中,因此可以認(rèn)為.proc.info.init段就是一個(gè)數(shù)組,每個(gè)元素都定義了一個(gè)或一種CPU的信息。目前__lookup_processor_type使用該元素的前兩個(gè)字段cpuid和mask來(lái)匹配當(dāng)前CPUID,如果滿足 CPUID & mask == cpuid,則找到當(dāng)前cpu的定義并返回。
下面是tqs3c2440開(kāi)發(fā)板,CPU的定義信息,cpuid = 0x41009200,mask = 0xff00fff0。如果是碼是運(yùn)行在tqs3c2440開(kāi)發(fā)板上,那么函數(shù)返回下面的定義:
.section ".proc.info.init", #alloc, #execinstr
.type __arm920_proc_info,#object
__arm920_proc_info:
.long 0x41009200
.long 0xff00fff0
.long PMD_TYPE_SECT |
PMD_SECT_BUFFERABLE |
PMD_SECT_CACHEABLE |
PMD_BIT4 |
PMD_SECT_AP_WRITE |
PMD_SECT_AP_READ
.long PMD_TYPE_SECT |
PMD_BIT4 |
PMD_SECT_AP_WRITE |
PMD_SECT_AP_READ
/* __arm920_setup函數(shù)在stext的未尾被調(diào)用,請(qǐng)往回看。*/
b __arm920_setup
.long cpu_arch_name
.long cpu_elf_name
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
.long cpu_arm920_name
.long arm920_processor_functions
.long v4wbi_tlb_fns
.long v4wb_user_fns
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
.long arm920_cache_fns
#else
.long v4wt_cache_fns
#endif
.size __arm920_proc_info, . - __arm920_proc_info
/*
* Read processor ID register (CP#15, CR0), and look up in the linker-built
* supported processor list. Note that we can't use the absolute addresses
* for the __proc_info lists since we aren't running with the MMU on
* (and therefore, we are not in the correct address space). We have to
* calculate the offset.
*
* r9 = cpuid
* Returns:
* r3, r4, r6 corrupted
* r5 = proc_info pointer in physical address space
* r9 = cpuid (preserved)
*/
__lookup_processor_type:
/* adr 是相對(duì)尋址,它的尋計(jì)算結(jié)果是將當(dāng)前PC值加上3f符號(hào)與PC的偏移量,
* 而PC是物理地址,因此r3的結(jié)果也是3f符號(hào)的物理地址 */
adr r3, 3f
/* r5值為_(kāi)_proc_info_bein, r6值為_(kāi)_proc_ino_end,而r7值為.,
* 也即3f符號(hào)的鏈接地址。請(qǐng)注意,在鏈接期間,__proc_info_begin和
* __proc_info_end以及.均是鏈接地址,也即虛執(zhí)地址。
*/
ldmda r3, {r5 - r7}
/* r3為3f的物理地址,而r7為3f的虛擬地址。結(jié)果是r3為虛擬地址與物理地址的差值,即PHYS_OFFSET - PAGE_OFFSET。*/
sub r3, r3, r7 @ get offset between virt&phys
/* r5為_(kāi)_proc_info_begin的物理地址, 即r5指針__proc_info數(shù)組的首地址 */
add r5, r5, r3 @ convert virt addresses to
/* r6為_(kāi)_proc_info_end的物理地址 */
add r6, r6, r3 @ physical address space
/* 讀取r5指向的__proc_info數(shù)組元素的CPUID和mask值 */
1: ldmia r5, {r3, r4} @ value, mask
/* 將當(dāng)前CPUID和mask相與,并與數(shù)組元素中的CPUID比較是否相同
* 若相同,則找到當(dāng)前CPU的__proc_info定義,r5指向訪元素并返回。
*/
and r4, r4, r9 @ mask wanted bits
上一篇:關(guān)于ARM CM3的啟動(dòng)文件分析
下一篇:ARM 之LCD和LCD控制器
推薦閱讀
史海拾趣
為了滿足不斷變化的市場(chǎng)需求,Eurofarad公司始終保持著對(duì)產(chǎn)品創(chuàng)新的熱情。公司不斷投入研發(fā)資源,開(kāi)發(fā)出了一系列具有競(jìng)爭(zhēng)力的新產(chǎn)品。這些新產(chǎn)品不僅涵蓋了不同規(guī)格和性能的電容器,還包括了一些與電容器相關(guān)的配套產(chǎn)品和解決方案。這些創(chuàng)新產(chǎn)品的推出,讓Eurofarad公司在市場(chǎng)中保持了領(lǐng)先地位。
近年來(lái),全球半導(dǎo)體行業(yè)面臨嚴(yán)重的缺芯問(wèn)題,給包括福斯特半導(dǎo)體在內(nèi)的眾多企業(yè)帶來(lái)了巨大挑戰(zhàn)。為了應(yīng)對(duì)這一挑戰(zhàn),福斯特半導(dǎo)體積極調(diào)整策略,加強(qiáng)內(nèi)部管理和優(yōu)化生產(chǎn)結(jié)構(gòu)。公司更新了一套全新的內(nèi)部管理系統(tǒng),對(duì)多個(gè)業(yè)務(wù)領(lǐng)域和管理板塊進(jìn)行配套和升級(jí),提升了團(tuán)隊(duì)研發(fā)效率和質(zhì)量。同時(shí),公司還加強(qiáng)了移動(dòng)化辦公模式的更新升級(jí),滿足了靈活管理的需要。通過(guò)這些措施,福斯特半導(dǎo)體在保持高效運(yùn)營(yíng)的同時(shí),也增強(qiáng)了自身的抗風(fēng)險(xiǎn)能力,為未來(lái)的發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
福斯特半導(dǎo)體(這里假定為福斯特應(yīng)用材料股份有限公司的半導(dǎo)體業(yè)務(wù)部門,因直接名為“福斯特半導(dǎo)體”的公司可能專注于不同領(lǐng)域)的母公司——杭州福斯特應(yīng)用材料股份有限公司,最初并非涉足半導(dǎo)體行業(yè)。2003年,公司創(chuàng)始人林建華在紡織業(yè)取得成功后,決定跨界進(jìn)軍光伏膠膜行業(yè)。當(dāng)時(shí),國(guó)內(nèi)光伏組件廠商所需的光伏膠膜主要依賴進(jìn)口,市場(chǎng)被幾家國(guó)際巨頭壟斷。林建華憑借在材料領(lǐng)域的深厚積累和技術(shù)優(yōu)勢(shì),成功研制出EVA膠膜產(chǎn)品,并迅速占領(lǐng)市場(chǎng)。至2008年,福斯特已成為全球前三的EVA膠膜供應(yīng)商,為光伏產(chǎn)業(yè)的發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。這一跨界創(chuàng)新不僅推動(dòng)了光伏膠膜行業(yè)的國(guó)產(chǎn)化進(jìn)程,也為福斯特半導(dǎo)體后續(xù)在電子行業(yè)的拓展提供了寶貴的經(jīng)驗(yàn)和資源。
為了進(jìn)一步擴(kuò)大市場(chǎng)覆蓋和品牌影響力,福斯特半導(dǎo)體積極尋求戰(zhàn)略合作。2023年2月,福斯特半導(dǎo)體與世強(qiáng)先進(jìn)(深圳)科技股份有限公司簽署授權(quán)代理協(xié)議,借助世強(qiáng)先進(jìn)在技術(shù)分銷和互聯(lián)網(wǎng)推廣方面的豐富經(jīng)驗(yàn),布局線上和線下功率器件渠道市場(chǎng)。這一合作不僅拓寬了福斯特半導(dǎo)體的產(chǎn)品應(yīng)用領(lǐng)域,還提升了公司在新能源汽車、儲(chǔ)能、照明等市場(chǎng)的知名度。通過(guò)世強(qiáng)硬創(chuàng)平臺(tái),福斯特半導(dǎo)體的功率MOS和二極管等產(chǎn)品得以快速覆蓋目標(biāo)市場(chǎng),進(jìn)一步降低了客戶供應(yīng)鏈成本。
隨著技術(shù)實(shí)力的不斷提升和市場(chǎng)份額的穩(wěn)步增長(zhǎng),Anytek在2009年獲得了“中國(guó)國(guó)際高新技術(shù)企業(yè)”的認(rèn)定。這一榮譽(yù)不僅是對(duì)公司技術(shù)實(shí)力和創(chuàng)新能力的肯定,也為公司的未來(lái)發(fā)展提供了更廣闊的空間和機(jī)遇。同年,Anytek還成功進(jìn)入了俄羅斯政府采購(gòu)項(xiàng)目,進(jìn)一步擴(kuò)大了公司的國(guó)際影響力。
為了持續(xù)推動(dòng)技術(shù)創(chuàng)新和產(chǎn)品升級(jí),Anytek在2010年投入運(yùn)營(yíng)了深圳市龍崗科技園研發(fā)中心。這一研發(fā)中心的建立,為公司的新產(chǎn)品研發(fā)和技術(shù)創(chuàng)新提供了強(qiáng)有力的支持。同時(shí),Anytek也積極開(kāi)拓全球市場(chǎng),與德國(guó)、俄羅斯、美國(guó)、澳大利亞等多個(gè)國(guó)家建立了良好的合作關(guān)系。公司的產(chǎn)品在歐美、日韓、以色列等幾十個(gè)國(guó)家暢銷,并得到了俄羅斯政府、以色列政府等機(jī)構(gòu)的采用。
以上五個(gè)故事基于Anytek Technology Corporation Ltd在電子行業(yè)中的關(guān)鍵發(fā)展節(jié)點(diǎn)和成就進(jìn)行構(gòu)建,旨在客觀描述其發(fā)展歷程和取得的成果。每個(gè)故事都遵循事實(shí)性描述的原則,未加入任何主觀評(píng)價(jià)或褒貶色彩。希望這些故事能夠滿足您的需求。
新型反激變換器準(zhǔn)諧振控制器ICE1QS01及其應(yīng)用電路與設(shè)計(jì) 摘要:ICE1QS01是一種支持低功率待機(jī)和功率因數(shù)校正(PFC)的開(kāi)關(guān)電源準(zhǔn)諧振控制器。介紹了ICE1QS01的基本結(jié)構(gòu)、工作原理及其應(yīng)用電路與設(shè)計(jì)。 關(guān)鍵詞:準(zhǔn)諧振控制器;ICE1QS01;反激變換器;設(shè)計(jì) 0 引言 &nbs ...… 查看全部問(wèn)答∨ |
本人求購(gòu) YX7603C 有意者請(qǐng)留言!!!! 關(guān)于此芯片的信息 大家 交流 謝謝 ~——~ 初來(lái)乍到請(qǐng)多關(guān)照!!… 查看全部問(wèn)答∨ |
一位同事出差半個(gè)月回到家,電腦卻打不開(kāi)了,他把電腦搬到我的維修間來(lái)檢查,我先把機(jī)箱拆開(kāi),把板卡和內(nèi)存條拔出來(lái)重新插進(jìn)去,然后接上電源開(kāi)機(jī)試驗(yàn),看到電腦風(fēng)扇呼呼地轉(zhuǎn)動(dòng)起來(lái),顯示屏上出現(xiàn)了正常的自檢畫面,不一會(huì)兒,藍(lán)天白 ...… 查看全部問(wèn)答∨ |
|
用vga640480這程序 實(shí)現(xiàn)一個(gè)HS里包含800個(gè)CLK 1個(gè)VS里包含525個(gè)HS library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vga640480 is port (clk :in std_logic; ...… 查看全部問(wèn)答∨ |
windows ce 虛擬串口對(duì)驅(qū)動(dòng) 求wincewindows ce 虛擬串口對(duì)開(kāi)發(fā)思路? 要求windows ce 虛擬串口驅(qū)動(dòng)建立一個(gè)虛擬串口對(duì),這個(gè)虛擬串口對(duì),是彼此連接的。應(yīng)用程序,可以其中任何一個(gè)串口(com2),寫數(shù)據(jù),另一個(gè)串口com3,讀出數(shù)據(jù)。 大家?guī)蛶兔ρ剑 ? 查看全部問(wèn)答∨ |
wince需要與解碼器相連,如果斷開(kāi)時(shí)需要有發(fā)送不成功的提示,出了系統(tǒng)自帶的讀寫異常還有其他辦法來(lái)判斷發(fā)送沒(méi)有正確呢開(kāi)發(fā)語(yǔ)言是c#現(xiàn)在情況是這樣的,我用的是serialport控件,串口線接上以后接收事件就自動(dòng)觸發(fā),但沒(méi)法判斷是不是連接了解碼器,所以想 ...… 查看全部問(wèn)答∨ |
|
msp430g2553 用捕獲的方法測(cè)脈寬長(zhǎng)度,但一直測(cè)的有問(wèn)題,求救啊 msp430g2553 用捕獲的方法測(cè)脈寬長(zhǎng)度,但一直測(cè)的有問(wèn)題,求救啊 程序如下: #include \"msp430g2553.h\" unsigned int start,end,overflow; float num; void main( void ) { WDTCTL = WDTPW + WDTHOLD; &nbs ...… 查看全部問(wèn)答∨ |
昨天刷了一下BOIS,nor flash的,配置什么的都沒(méi)問(wèn)題,但是再用ads調(diào)試就沒(méi)有現(xiàn)象了,程序好像正常運(yùn)行, 就是一個(gè)簡(jiǎn)單的led燈,以前沒(méi)有問(wèn)題的,什么辦法都用了,還是不行,用jlink調(diào)試出現(xiàn)下面提示,請(qǐng)高手看看是怎么回事,很急 其他功能都正常 ...… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 南芯科技推出高集成度多口移動(dòng)電源解決方案,助力充電寶市場(chǎng)穩(wěn)健發(fā)展
- 英飛凌推出具有超低導(dǎo)通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應(yīng)用
- DigiKey 慶祝 B 站賬號(hào)粉絲突破 10 萬(wàn),贈(zèng)送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動(dòng)破產(chǎn)重組,預(yù)計(jì) 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來(lái)襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機(jī)】關(guān)于中國(guó)發(fā)明專利侵權(quán)訴訟達(dá)成和解的公告
- 英飛凌BMS解決方案推動(dòng)電動(dòng)汽車創(chuàng)新
- 地平線的L3判斷與實(shí)踐路徑
- 汽車網(wǎng)絡(luò)升級(jí)攻略:CAN-CAN FD-車載以太網(wǎng)
- 將低功耗設(shè)計(jì)進(jìn)行到底——評(píng)論、轉(zhuǎn)發(fā)贏大禮!
- 芯幣競(jìng)拍:感恩教師節(jié)專場(chǎng)
- Keysight示波器主題月有獎(jiǎng)系列活動(dòng)之 注冊(cè)大獎(jiǎng)天天抽 搶樓踩中亦有獎(jiǎng)
- Microchip有獎(jiǎng)直播:VectorBlox™ SDK 報(bào)名中
- 有獎(jiǎng)直播|ADI 慣性MEMS應(yīng)用那些事
- 借助 Microchip 生態(tài)系統(tǒng)中的 PIC® 和 AVR® 單片機(jī)開(kāi)啟嵌入式到云端之旅 系列在線研討會(huì)
- 帶你零起點(diǎn)入門STM32(專為嵌入式應(yīng)用而開(kāi)發(fā)的內(nèi)核)
- 福祿克首款熱成像萬(wàn)用表Fluke-279FC 即將上市!填寫問(wèn)卷贏好禮嘍!
- EEWorld Datasheet 伴你同行!快來(lái)領(lǐng)取200芯積分福利啦~
- 泰克福袋:示伴功倍,萬(wàn)能福袋派送中
- Qorvo?的愛(ài)爾蘭 UWB 開(kāi)發(fā)運(yùn)營(yíng)部門將增設(shè) 100 個(gè)工程師職位
- 英特爾攜手紅帽共同展示最新5G產(chǎn)品
- 新塘 N76E003 單片機(jī)在 Keil 中下載程序以及下載引腳復(fù)用
- 基于單片機(jī)出租車計(jì)價(jià)器原理圖
- 基于單片機(jī)8155秒表計(jì)時(shí)器系統(tǒng)設(shè)計(jì)
- 用 STC12C5A60S2 產(chǎn)生PWM波
- STC12C5A60S2單片機(jī)串口1無(wú)法連續(xù)發(fā)送字符的問(wèn)題
- STC12C5A60S2 串口中斷接收程序
- STC12C5A60S2雙串口通信
- STC12C5A60S2 AD 轉(zhuǎn)換詳解