欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

S5PV210-uboot源碼分析-uboot環(huán)境變量-創(chuàng)新互聯(lián)

9、1、uboot的環(huán)境變量

創(chuàng)新新互聯(lián),憑借10多年的網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有近1000家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)建站。

1、環(huán)境變量的作用

(1)在我們不改變uboot源代碼的情況下,只需要改變環(huán)境變量的值就可以改變uboot運(yùn)行時(shí)的數(shù)據(jù)和一些特性。比如說(shuō),通過(guò)修改bootdelay環(huán)境變量,就可以更改開機(jī)倒數(shù)的秒數(shù)。

2、環(huán)境變量的優(yōu)先級(jí)

(1)uboot代碼當(dāng)中有一個(gè)值,環(huán)境變量(DDR 環(huán)境變量的分區(qū)中)中也有一個(gè)值,uboot程序?qū)嶋H運(yùn)行時(shí),規(guī)則是,如果環(huán)境變量(DDR中環(huán)境變量的分區(qū))為空,則使用代碼中的環(huán)境變量的值,如果環(huán)境變量不為空,優(yōu)先使用環(huán)境變對(duì)應(yīng)的值。

(2)比如說(shuō)我們的machid(機(jī)器碼),我們uboot中,在x210_sd.h中,定義了一個(gè)機(jī)器碼2456,這個(gè)是寫死在程序中的,所以我們?cè)陂_機(jī)的時(shí)候是可以看到這個(gè)環(huán)境變量的,用bdinfo來(lái)看。如果要修改uboot中配置的機(jī)器碼,可以修改x210_sd.h中的機(jī)器碼,但是修改源代碼后需要重新編譯燒錄,很麻煩,比較簡(jiǎn)便的方法就是使用環(huán)境變量machid即可。把環(huán)境變量machid設(shè)置成別的 set machid xxx 設(shè)置好后,系統(tǒng)在啟動(dòng)時(shí),會(huì)優(yōu)先使用machid環(huán)境變量中的值。

3、環(huán)境變量在uboot中的工作方式

(1)當(dāng)一個(gè)uboot鏡像剛開始燒錄到一個(gè)SD卡上的時(shí)候,第一次燒錄的時(shí)候,SD卡上的環(huán)境變量分區(qū)是空的。所以將來(lái)重定位到了DDR中去運(yùn)行的時(shí)候,DDR中的環(huán)境變量分區(qū)也是空的,所以這個(gè)時(shí)候會(huì)使用uboot代碼中默認(rèn)的環(huán)境變量,當(dāng)我們將改變環(huán)境變量后,在saveenv保存環(huán)境變量的時(shí)候,這個(gè)時(shí)候會(huì)將環(huán)境變量保存到了SD卡的環(huán)境變量的分區(qū)上去。當(dāng)我們?cè)诖藛?dòng)的時(shí)候,在將sd卡的環(huán)境變量分區(qū)重定位到DDR中的時(shí)候,環(huán)境變量在內(nèi)存就有了,所以就會(huì)使用內(nèi)存中的這一份環(huán)境變量。

(2)默認(rèn)環(huán)境變量在uboot/common/env_comon.c中的default_environment,這個(gè)東西就是一個(gè)字符數(shù)組,里面的內(nèi)容就是很多個(gè)環(huán)境變量連續(xù)分布組成的,每個(gè)環(huán)境變量的末端用'\0'作為結(jié)束符。

(3)DDR中的環(huán)境變量,在default_environment中,實(shí)質(zhì)是字符數(shù)組,在uboot中其實(shí)是一個(gè)全局變量,鏈接時(shí)在數(shù)據(jù)段的,重定位的時(shí)候就重定位到了DDR中的一個(gè)內(nèi)存地址中去了。這個(gè)地址處放的就是我們uboot在運(yùn)行的時(shí)候的環(huán)境變量了。

在重定位的時(shí)候,程序會(huì)去檢查SD卡的env分區(qū)中是否有環(huán)境變量,會(huì)進(jìn)行CRC校驗(yàn),如果檢驗(yàn)通過(guò)了,SD卡的env'分區(qū)有環(huán)境變量,那么就會(huì)將SD卡中的這一份環(huán)境變量會(huì)覆蓋default_environment中的環(huán)境變量,

9、2、環(huán)境變量相關(guān)命令的源碼分析1

1、printenv

(1)分析do_printenv函數(shù)

(2)在do_printenv函數(shù)中可以看出來(lái),如果argc=1的話,就會(huì)打印出來(lái)所有的環(huán)境變量,如果argc不等于1就會(huì)只打印出來(lái)我們我要打印出來(lái)的環(huán)境變量。

(3)argc=1時(shí),就會(huì)執(zhí)行那個(gè)三重for循環(huán),第一重for循環(huán)就是處理所有的環(huán)境變量,你有多少了個(gè)環(huán)境變量,那么第一重的for循環(huán)就會(huì)循環(huán)多少次。

(4)這個(gè)函數(shù)要看明白,首先要明白環(huán)境變量在內(nèi)存中是怎么存儲(chǔ)的問(wèn)題,根據(jù)代碼和上節(jié)課將到的default_enironment字符數(shù)組,知道,環(huán)境變量在內(nèi)存中是以一個(gè)字符數(shù)組的形式存儲(chǔ)的,每個(gè)環(huán)境變量的名到他的值都是連續(xù)的字符,一個(gè)環(huán)境變量的名字和值結(jié)束后就會(huì)有一個(gè)'\0'來(lái)標(biāo)志這第一個(gè)環(huán)境變量的字符結(jié)束了,接著要在內(nèi)存中接著放第二個(gè)環(huán)境變量的字符一次挨著放的,每個(gè)環(huán)境變量的結(jié)束分割是'\0',所以代碼中,可以用'\0'這個(gè)標(biāo)志,來(lái)區(qū)分我們?cè)趦?nèi)存中讀取字符時(shí),讀取到哪個(gè)位置表示一個(gè)環(huán)境變量讀取完了,可以接著讀取下一個(gè)了。

9、3、環(huán)境變量相關(guān)命令的源碼分析2

1、setenv

(1)_do_setenv (flag, argc, argv);//沒(méi)有下劃線的表示可以自己用的,一個(gè)下劃線表示系統(tǒng)自己用的,兩個(gè)下劃線的表示系統(tǒng)內(nèi)部自己用的,三個(gè)下劃線開頭表示我們就不要碰了

}

(2)setenv的思路,先去DDR中去尋找有沒(méi)有這個(gè)環(huán)境變量,如果有,則覆蓋這個(gè)環(huán)境變量,如果沒(méi)有則在最后新增一個(gè)環(huán)境變量,

第一步:遍歷DDR中環(huán)境變量的字符數(shù)組,找到原來(lái)就有的那個(gè)環(huán)境變量對(duì)應(yīng)的地址 168-174行

第二部:去擦除原來(lái)的環(huán)境變量在_do_setenv 259-265行

第三步:寫入新的環(huán)境變量 266-273行

本來(lái)setenv做完上面的就完事了,但是還要考慮一些附加的問(wèn)題,

問(wèn)題1、就是環(huán)境變量太多,超出了DDR中環(huán)境變量的分區(qū),這時(shí)就溢出了,

問(wèn)題2,有些環(huán)境變量,如bundrate,在gd中有對(duì)應(yīng)的全局變量,這種環(huán)境變量在set的時(shí)候,還要對(duì)應(yīng)的更新對(duì)應(yīng)的全局變量,否則就會(huì)出現(xiàn)在本次運(yùn)行中,環(huán)境變量和全局變量不一致的情況。

9、4、環(huán)境變量相關(guān)命令的源碼分析3

1、saveenv

(1)我們的uboot執(zhí)行saveenv的函數(shù)是在env_aotu.c中那個(gè)do_saveenv函數(shù),為什么是這個(gè)文件中的這個(gè)函數(shù)呢,是由在x210_sd.h中那個(gè)#define CFG_ENV_IS_IN_AUTO宏來(lái)配置的,aotu的意思就是自動(dòng)適配的,在do_saveenv函數(shù)中開始的部分,有一個(gè)寄存器(這個(gè)寄存器是用戶自定的寄存器,是在start.S中往里面寫值的)來(lái)判斷我們是從哪個(gè)介質(zhì)中啟動(dòng)的,從哪個(gè)介質(zhì)中啟動(dòng),就執(zhí)行哪個(gè)對(duì)應(yīng)的函數(shù),我們的SD卡啟動(dòng)的,所以對(duì)應(yīng)的實(shí)際上應(yīng)該是movinand(因?yàn)閙ovinand就是inand,而inand的操作和SD卡的操作很像inand就是小版的sd卡可以這么理解,因?yàn)榘遄由系膇nand是是接在SD卡通道0的,SD通道2和3是接SD卡的,可以看出來(lái)其實(shí)兩者很像)。

(2)用戶自定義信息的寄存器E010_F00C,這個(gè)寄存器中實(shí)現(xiàn)在start.S中,開始時(shí)由一個(gè)寄存器判斷出了是從哪個(gè)啟動(dòng)介質(zhì)啟動(dòng),完了之后,我們相應(yīng)的在這個(gè)用戶自定義信息的寄存器中存儲(chǔ)了我們從哪種介質(zhì)啟動(dòng)的信息標(biāo)志,由于我們是SD卡啟動(dòng),我們無(wú)法從那個(gè)寄存器中知道我們是哪種啟動(dòng)方式,我們只能通過(guò)實(shí)際來(lái)知道,因?yàn)槟莻€(gè)寄存器三星給的數(shù)據(jù)手冊(cè)中沒(méi)有。由這個(gè)用戶自定寄存器中的值在我們的env_aotu.c中的do_saveenv函數(shù)中開始的部分去進(jìn)行判斷執(zhí)行哪個(gè)保存環(huán)境變量的函數(shù),最后我們確定是調(diào)用的saveenv_movinand這個(gè)函數(shù)去保存我們的環(huán)境變量的。

(3)真正執(zhí)行保存環(huán)境變量的函數(shù)是這個(gè)movi_write_env,將環(huán)境變量從DDR中寫入到,保存到SD/iNand中,實(shí)際上就是將內(nèi)存中的那個(gè)default_enironment字符數(shù)組保存到了SD/iNand中,大小是16KB,剛好就是32個(gè)扇區(qū)(一個(gè)扇區(qū)512B)。

(4)raw_area_control是uboot中規(guī)劃inand/sd卡的原始分區(qū)表,env分區(qū)就記錄在這里,

9、5、uboot內(nèi)部獲取環(huán)境變量

1、getenv

(1)getenv,應(yīng)該是不可重入函數(shù)

(2)實(shí)現(xiàn)方式就是去遍歷default_enironment這個(gè)字符數(shù)組,也就是遍歷DDR中內(nèi)存中放env的那部分內(nèi)存里面的字符。

去和name相比較,如果找到了,就返回這個(gè)環(huán)境變量的首地址

2、getenv_r

(1)可重入函數(shù)。(你用的時(shí)候,沒(méi)有破壞原來(lái)的內(nèi)存中那一份,別人用的時(shí)候,內(nèi)存中的那一份還是好的)

(2)這個(gè)函數(shù),是在DDR中找到那一個(gè)環(huán)境變量后,將他的值放到了一個(gè)buf中,而getenv函數(shù)是將那個(gè)環(huán)境變量的值在DDR中對(duì)應(yīng)的內(nèi)存地址返回回來(lái),改的話,就直接改了DDR中環(huán)境變量的那一份,而getenv_r改的值的話,改的是buf中的那一份,為的是當(dāng)發(fā)送中斷,或者在多線程的情況下,你getenv的話執(zhí)行,在別人想用這個(gè)值的是,可是已經(jīng)被你改掉了,有可能會(huì)無(wú)意的改動(dòng)了內(nèi)存中值,而放在了buf中的話,當(dāng)發(fā)生這種情況的話,內(nèi)存中的那一份的值還是好好的,當(dāng)別人想用的時(shí)候還可以得到內(nèi)存中完好的那一份的值。

總結(jié):

功能是一樣的,但是可重入版本是安全一些的,建議應(yīng)該使用這個(gè)、

有關(guān)于環(huán)境變量的所有操作,只要理解了環(huán)境變量在DDR中的存儲(chǔ)方法,理解了環(huán)境變量和我們gd全局變量的關(guān)聯(lián),和優(yōu)先級(jí),理解了環(huán)境變量在存儲(chǔ)介質(zhì)中的存儲(chǔ)方式(就是我們專用的分區(qū)),那么整個(gè)環(huán)境變量相關(guān)的就都清楚了。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:S5PV210-uboot源碼分析-uboot環(huán)境變量-創(chuàng)新互聯(lián)
文章鏈接:http://chinadenli.net/article6/idsog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、做網(wǎng)站自適應(yīng)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管