專利名稱:Linux中的早期串口打印調(diào)試方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及到嵌入式設(shè)備的早期打印調(diào)試方法,特別涉及到一種使用Linux操作 系統(tǒng)的嵌入式設(shè)備的早期打印調(diào)試方法。
背景技術(shù):
目前Linux操作系統(tǒng)的應(yīng)用范圍非常廣泛,使用Linux的嵌入式設(shè)備越來越多。在 新設(shè)備上,Linux內(nèi)核的移植、開發(fā)工作成為使用Linux的第一個(gè)技術(shù)性難關(guān)。Linux內(nèi)核的移植開發(fā),首先需要解決的是調(diào)試方法的問題。當(dāng)前在Linux中 進(jìn)行早期調(diào)試非常困難,在Printk功能啟用之前(包括2. 6. 22版本之后加入的early_ printk),缺乏直觀高效的調(diào)試信息輸出方式。許多技術(shù)開發(fā)人員使用點(diǎn)亮設(shè)備上指示燈的 方式來獲得當(dāng)前Linux系統(tǒng)的工作狀態(tài),這種方式不但使用不便,而且能夠展示的信息相 當(dāng)有限。
發(fā)明內(nèi)容
本發(fā)明的主要目的為提供一種Linux中的早期串口打印調(diào)試方法,可提高Linux 開發(fā)、移植的效率。為了實(shí)現(xiàn)上述目的,本發(fā)明提出一種Linux中的早期串口打印調(diào)試方法,包括步 驟在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從Bootloader向Linux 傳遞信息的信息傳遞空間;在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址保存到預(yù)留的 信息傳遞空間;將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux ;從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址。優(yōu)選地,所述信息傳遞空間、Bootloader空間、Linux空間不互相覆蓋。優(yōu)選地,所述打印函數(shù)的類型包括Bootloader早期用匯編代碼實(shí)現(xiàn)的不使用堆 棧的打印以及Bootloader后期用C代碼實(shí)現(xiàn)的使用堆棧的打印。優(yōu)選地,所述打印函數(shù)的地址保存在信息傳遞空間中。本發(fā)明還提出一種Linux中的早期串口打印調(diào)試裝置,包括地址規(guī)劃模塊,在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從 Bootloader向Linux傳遞信息的信息傳遞空間;實(shí)現(xiàn)保存模塊,在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址 保存到預(yù)留的信息傳遞空間;傳遞模塊,將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux ;獲取模塊,從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址。優(yōu)選地,所述信息傳遞空間、Bootloader空間以及Linux空間不互相覆蓋。
優(yōu)選地,所述打印函數(shù)的類型包括Bootloader早期用匯編代碼實(shí)現(xiàn)的不使用堆棧的打印以及Bootloader后期用C 代碼實(shí)現(xiàn)的使用堆棧的打印。優(yōu)選地,所述打印函數(shù)的地址保存在信息傳遞空間中。本發(fā)明所述的Linux中的早期串口打印調(diào)試方法,豐富了 Linux的調(diào)試手段,可以 在Linux啟動(dòng)的最早期實(shí)現(xiàn)真正的調(diào)試信息即時(shí)打印,提高了 Linux開發(fā)、移植的效率。
圖1為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的流程示意圖;圖2為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的地址空間規(guī)劃示意 圖;圖3為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的Bootloader實(shí)現(xiàn)流 程示意圖;圖4為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的Linux實(shí)現(xiàn)流程示意 圖;圖5為本發(fā)明Linux中的早期串口打印調(diào)試裝置一實(shí)施例的結(jié)構(gòu)示意圖。本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說明。
具體實(shí)施例方式本發(fā)明中,Bootloader (引導(dǎo)程序),是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程 序。通過Bootloader,可以初始化硬件設(shè)備、建立內(nèi)存空間映射,從而將系統(tǒng)的軟硬件環(huán)境 帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。Uart (Universal Asynchronous Receiver/Transmitter),俗稱串口,是一種通用 串行數(shù)據(jù)總線,用于異步通信。該總線雙向通信,可以實(shí)現(xiàn)全雙工傳輸和接收。在嵌入式設(shè) 計(jì)中,UART用來與PC進(jìn)行通信,包括與監(jiān)控調(diào)試器和其它器件,如EEPROM通信。參照?qǐng)D1所示,其為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的流程示 意圖,該方法包括步驟S10、在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從Bootloader 向Linux傳遞信息的信息傳遞空間;其中,上述信息傳遞空間、Bootloader空間、Linux空 間不互相覆蓋。其中,上述嵌入式單板的CPU地址空間中,還可規(guī)劃出Bootloader的空間。步驟Sl 1、在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址保存 到預(yù)留的信息傳遞空間;其中,上述打印函數(shù)的類型有兩種,一種是Bootloader早期用匯 編代碼實(shí)現(xiàn)的不使用堆棧的打印,另一種是Bootloader后期用C代碼實(shí)現(xiàn)的使用堆棧的打 印。進(jìn)一步的,兩者類型的打印函數(shù)的地址都保存到信息傳遞空間中。步驟S12、將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux;其中,啟動(dòng)參 數(shù)為Linux已經(jīng)實(shí)現(xiàn)的參數(shù)傳遞方法。本步驟可在加載Linux操作系統(tǒng)時(shí)進(jìn)行。步驟S13、從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址;并在此基 礎(chǔ)上實(shí)現(xiàn)Linux下的打印函數(shù)。其中,Linux下的打印函數(shù)也有兩種,一種是在Linux啟動(dòng) 的早期匯編代碼階段的匯編打印函數(shù),用匯編代碼實(shí)現(xiàn)的打??;另一種是在Linux啟動(dòng)的
4早期C代碼階段的C打印函數(shù),用C代碼實(shí)現(xiàn)的打印。本步驟可通過修改Linux代碼實(shí)現(xiàn), 且可在啟動(dòng)初期進(jìn)行。本實(shí)施例中,在Linux啟動(dòng)階段使用的打印方法通過串口和顯示設(shè)備輸出調(diào)試信 肩、ο參照?qǐng)D2所示,其為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的地址 空間規(guī)戈丨J不意圖,嵌入式設(shè)備米用mips (Microprocessor without inter locked piped stages,無內(nèi)部互鎖流水級(jí))架構(gòu)的處理器,根據(jù)mips處理器的要求Bootloader加載地址 為0x9fc0 0000。在本實(shí)施例中,將Bootloader的代碼段指定鏈接到0x8cl0 0000地址, 規(guī)劃0x8c0 0000地址到0x8cl0 0000共IM空間為信息傳遞空間,用于存貯boot_info信 息。移植后的Linux代碼段鏈接到0x8340 0000地址,只要Linux編譯之后不超過140M, 則不會(huì)覆蓋到信息傳遞空間及其上的Bootloader代碼段空間,進(jìn)而保證了信息傳遞空間、 Bootloader空間、Linux空間不互相覆蓋。參照?qǐng)D3所示,其為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的 Bootloader實(shí)現(xiàn)流程示意圖,給出了在Bootloader階段與本發(fā)明相關(guān)的操作流程,包括步驟201 ,Bootloader指定加載到0x9fc 00000地址,且將其代碼段鏈接到0x8cl0 0000。步驟202,在boot階段實(shí)現(xiàn)串口的驅(qū)動(dòng),使能設(shè)備串口。步驟203,在早期的匯編代碼階段,實(shí)現(xiàn)匯編代碼版本的串口打印函數(shù)。該打印函 數(shù)用于boot的初期,其功能有限,且因?yàn)椴粚?duì)堆棧進(jìn)行維護(hù),調(diào)用者在寄存器的使用上受 限。該打印函數(shù)可命名為a_print。步驟204,在后期的C代碼階段,實(shí)現(xiàn)C語言代碼版本的串口打印函數(shù)。該打印函 數(shù)用于C語言調(diào)用,其功能強(qiáng)大,有堆棧,調(diào)用者無需考慮寄存器的使用限制;但此時(shí)的函 數(shù)不能在無堆棧的匯編程序中調(diào)用。該打印函數(shù)可命名為c_print。步驟205,將 a_print 和 c_print 的地址保存到 boot_info 中。步驟206,Bootloader 引導(dǎo) Linux 時(shí),將 boot_info 的地址 0x8c00 0000,作為啟 動(dòng)參數(shù)傳遞到Linux中。參照?qǐng)D4所示,其為本發(fā)明Linux中的早期串口打印調(diào)試方法一實(shí)施例的Linux 實(shí)現(xiàn)流程示意圖,給出了在操作系統(tǒng)階段與本發(fā)明相關(guān)的操作流程,包括步驟301,鏈接Linux的代碼段加載到0x8340 0000。步驟302,Linux啟動(dòng)時(shí),第一階段是匯編代碼。在此階段,可以得到Bootloader 傳遞的參數(shù),并將bootjnfo的地址保存到內(nèi)存變量中。該過程可以在啟動(dòng)mips Linux的 第一時(shí)間進(jìn)行,傳遞到Linux中的參數(shù)保存在寄存器a0-a4中,可以直接從寄存器中讀取到 數(shù)據(jù)。步驟303,通過boot_info地址加偏移值得到a_print函數(shù)的地址。a_print的地 址具體保存在bootjnfo中的具體位置,可通過技術(shù)開發(fā)人員對(duì)bootjnfo結(jié)構(gòu)的規(guī)劃而 確定。步驟304,基于a_print實(shí)現(xiàn)匯編函數(shù)early_os_a_print。在該函數(shù)中,將打印的 字符串及其它參數(shù),傳遞給a_print,以完成匯編版本的Linux打印程序。如此,在Linux的 最初匯編代碼階段,即可使用該函數(shù)打印調(diào)試信息。該early_0S_a_print函數(shù)的使用準(zhǔn)則
5禾口 a_print相同。 步驟305,在進(jìn)入到C代碼階段后,通過bootjnfo地址加偏移值得到c_print函 數(shù)的地址。c_print的地址具體保存在bootjnfo中的具體位置,可通過技術(shù)開發(fā)人員對(duì) boot_info結(jié)構(gòu)的規(guī)劃而確定。 步驟306,基于c_print實(shí)現(xiàn)C函數(shù)early_os_c_print。在該函數(shù)中,將步驟305中 得到的c_print函數(shù)地址賦值到一個(gè)函數(shù)指針變量上,通過函數(shù)指針可直接調(diào)用c_print 函數(shù)。如此,可在Linux最初進(jìn)入c代碼階段可打印調(diào)試信息。該early_0S_C_print函數(shù) 的使用準(zhǔn)則和c_print相同。步驟307,在Linux代碼進(jìn)一步執(zhí)行后,Printk功能可以被使用時(shí),便可使用Linux 提供的打印函數(shù);同時(shí),也可繼續(xù)使用early_0S_C_print函數(shù)。參照?qǐng)D5所示,其為本發(fā)明Linux中的早期串口打印調(diào)試裝置的結(jié)構(gòu)示意圖,該裝 置包括地址規(guī)劃模塊51、實(shí)現(xiàn)保存模塊52、傳遞模塊53以及獲取模塊54。該地址規(guī)劃模塊 51,在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從Bootloader向Linux傳遞 信息的信息傳遞空間;該實(shí)現(xiàn)保存模塊52,在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù), 并將打印函數(shù)地址保存到預(yù)留的信息傳遞空間;該傳遞模塊53,將預(yù)留的信息傳遞空間地 址作為啟動(dòng)參數(shù)傳遞給Linux ;該獲取模塊54,從信息傳遞空間中取得Bootloader中實(shí)現(xiàn) 的打印函數(shù)地址。上述信息傳遞空間、Bootloader空間以及Linux空間不互相覆蓋。上述打印函數(shù)的類型包括Bootloader早期用匯編代碼實(shí)現(xiàn)的不使用堆棧的打印 以及Bootloader后期用C代碼實(shí)現(xiàn)的使用堆棧的打印。上述打印函數(shù)的地址保存在信息傳遞空間中。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用 本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān) 的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。
權(quán)利要求
一種Linux中的早期串口打印調(diào)試方法,其特征在于,包括步驟在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從引導(dǎo)程序Bootloader向Linux傳遞信息的信息傳遞空間;在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址保存到預(yù)留的信息傳遞空間;將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux;從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址。
2.根據(jù)權(quán)利要求1所述的Linux中的早期串口打印調(diào)試方法,其特征在于,所述信息傳 遞空間、Bootloader空間以及Linux空間不互相覆蓋。
3.根據(jù)權(quán)利要求1或2所述的Linux中的早期串口打印調(diào)試方法,其特征在于,所述打 印函數(shù)的類型包括Bootloader早期用匯編代碼實(shí)現(xiàn)的不使用堆棧的打印以及Bootloader后期用C代碼 實(shí)現(xiàn)的使用堆棧的打印。
4.根據(jù)權(quán)利要求3所述的Linux中的早期串口打印調(diào)試方法,其特征在于,所述打印函 數(shù)的地址保存在信息傳遞空間中。
5.一種Linux中的早期串口打印調(diào)試裝置,其特征在于,包括地址規(guī)劃模塊,在嵌入式單板的CPU地址空間中,預(yù)留一段受保護(hù)的用于從引導(dǎo)程序 Bootloader向Linux傳遞信息的信息傳遞空間;實(shí)現(xiàn)保存模塊,在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址保存 到預(yù)留的信息傳遞空間;傳遞模塊,將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux ;獲取模塊,從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址。
6.根據(jù)權(quán)利要求5所述的Linux中的早期串口打印調(diào)試裝置,其特征在于,所述信息傳 遞空間、Bootloader空間以及Linux空間不互相覆蓋。
7.根據(jù)權(quán)利要求5或6所述的Linux中的早期串口打印調(diào)試裝置,其特征在于,所述打 印函數(shù)的類型包括Bootloader早期用匯編代碼實(shí)現(xiàn)的不使用堆棧的打印以及Bootloader后期用C代碼 實(shí)現(xiàn)的使用堆棧的打印。
8.根據(jù)權(quán)利要求7所述的Linux中的早期串口打印調(diào)試裝置,其特征在于,所述打印函 數(shù)的地址保存在信息傳遞空間中。
全文摘要
本發(fā)明揭示了一種Linux中的早期串口打印調(diào)試方法及裝置。該方法包括在嵌入式單板的CPU地址空間中,預(yù)留一信息傳遞空間;在Bootloader階段實(shí)現(xiàn)串口驅(qū)動(dòng)和打印函數(shù),并將打印函數(shù)地址保存到預(yù)留的信息傳遞空間;將預(yù)留的信息傳遞空間地址作為啟動(dòng)參數(shù)傳遞給Linux;從信息傳遞空間中取得Bootloader中實(shí)現(xiàn)的打印函數(shù)地址。本發(fā)明可以在Linux啟動(dòng)的最早期實(shí)現(xiàn)真正的調(diào)試信息即時(shí)打印,提高了Linux開發(fā)、移植的效率。
文檔編號(hào)G06F11/36GK101894069SQ20101019716
公開日2010年11月24日 申請(qǐng)日期2010年6月10日 優(yōu)先權(quán)日2010年6月10日
發(fā)明者石東佳 申請(qǐng)人:中興通訊股份有限公司