當前位置:編程學習大全網 - 源碼下載 - 怎樣查看linux單板操作系統類型

怎樣查看linux單板操作系統類型

使用的Linux內核源代碼版本是3.14.12(最新是3.14.16了),是比較新的版本,而且3.14也是壹個會長期維護的版本。由內核源代碼到生成內核,需要首先進行配置,自己喜歡並常用的方法是:make menuconfig。因為試圖生成壹個最小的內核,所以就選擇盡量少的配置。沒有料到的是在這裏費了很長的時間。

首先,加載啟動生成的內核時,沒有任何顯示!就是說,在u-boot打印出信息:Starting kernel ...後,屏幕上再無任何輸出。

這裏需要簡單介紹壹下Beaglebone Black單板的輸出。它有壹個micro HDMI,這個經過轉換後,連接到所用的SOC AM3358上的圖形顯示卡(可直接驅動LCD)上。很顯然,這個輸出不適合開發過程中使用,因為它依賴比較復雜的驅動程序。單板機通常有JTAG接口,可以用來顯示輸出,也可以用來調試單板機的運行。這個比較偏向硬件,可能是硬件工程師喜歡的方式。對於我來講,使用串口進行輸入輸出是比較合適的方式。串口的電路和驅動都比較簡單,適合做最初的開發使用。AM3358有6個串口(UART0 ~ UART5),Beaglebone black將UART 0的管腳直接接了出來,總***六根。因為SOC工作在TTL電壓(3.3V),接口沒有在電氣物理層面上做轉換使之符合RS232的要求,所以不能直接連接任何設備的串口,比如PC機的串口。好在市場上存在這種USB轉串口的, 接口為TTL 3.3V的連接線,通過它,可以將這個串口直接連接至PC機的USB端口。

在LINUX PC上,用minicom終端軟件,通過USB轉RS232的設備,可以對Beaglebone black的啟動過程進行監測,並可以做交互。

內核啟動後,沒有觀測到任何輸出,這是壹個比較棘手的問題,因為沒有任何信息可供參考判斷。內核啟動的第壹步,首先是將內核解壓到壹個固定的物理地址開始的區域,在TI的SOC上,壹般這個地址是0x8000 8000,因為TI的ARM架構的SOC, 內存開始地址通常為0x8000 0000。在過去版本的正常啟動裏,解壓開始和結束,會輸出“Uncompressing Linux... done, booting the kernel.”。如何知道究竟運行到了哪裏?為什麽出錯?

好在單板機上,壹般都有幾個led顯示管,通過寫入壹個內存區域的二進制位,來點亮它。那麽可以找到驅動某個led的物理地址,在內核設置並啟用虛擬內存機制之前,直接在對應的地址位寫1來點亮某個led。啟用虛擬地址機制後,就無法如此操作,因為不知道這個物理地址對應的虛擬地址是什麽,甚至都不知道這個地址的對應關系是否已經建立。不過,至少在虛擬地址機制開啟前,可以通過這個方式來查找內核啟動過程是否走過了某壹段。很不幸的是,使用這種方式,驗證了內核已經正確執行到了開始啟用虛擬內存的地方。如果虛擬內存機制設置完畢,就會跳轉到內核"start_kernel"這個函數,它是壹個C程序。由此開始,內核就基本上是在執行C語言的代碼了!

為什麽解壓縮完成卻沒有輸出“Uncompressing Linux... done, booting the kernel.”?原來是使用了設備描述樹來創建設備的內核,在開始階段(讀取並分析設備描述樹之前),並沒有創建任何串口設備。如果是在開始就創建並使用這些設備,那麽就是又回到用靜態變量來存儲設備和驅動的老做法了!所以使用Device Tree Blob來指定設備的內核,在啟動開始的解壓縮階段,再也無法輸出類似的信息了!

既然是通過設備描述樹來指定設備,那麽也許要查看壹下設備描述樹的源文件,看看那裏對uart0是如何描述的。通過查看"am335x-boneblack.dts"文件和它所包含的文件,發現uart0啟用時,需要用"pinctl-single"這個管腳復用的驅動來設置管腳。在內核配置文件裏,有選擇這個驅動的選項,但是因為我追求最小內核,所以沒有選用它!重新配置內核選項,選中這個驅動,內核啟動的輸出就正常了!

這裏順帶解釋壹下管腳復用。SOC芯片,壹般都集成了CPU和其它很多外設,例如串口控制器,USB控制器,等等。芯片輸出的管腳,不能完全將所有的外設連接都輸出,這樣就存在多個外設信號連接到壹個管腳的現象。例如串口0的RX信號,和I2C 2的SDA信號,還有其它6種信號,***用壹個管腳!如果需要將這個管腳設置為做串口0的RX信號,就需要在壹個內存地址(寄存器)裏寫入0, 如果需要它做為I2C 2的SDA,需要寫入3。管理這種復用的驅動程序,最簡單的那種(每個管腳配置占用四個字節),叫pinctl-single。之前內核不能輸出信息,就是因為沒有配置選中這個驅動。

內核啟動完成,最後加載壹個內存根文件系統,並嘗試執行根目錄下的init程序。這個初始根文件系統的內容是最簡單和常用的命令。用klibc和busybox的生成結果,充當這個文件系統的內容,是最常用的做法。內存文件系統(非內存塊設備)和內核初始根文件系統,是LINUX裏的發明,降低了內核復雜度的同時,增加了靈活性!

內核啟動完成,執行klibc的SHELL(sh.shared)後,卻發現內核沒有識別到MMC卡(或是4GB 的eMMC)!根據內核啟動過程的輸出提示,發現是加載對應MMC的電源驅動失敗。還是查找設備描述樹源文件,發現Beaglebone black的mmc使用壹個最簡單的電源驅動:regulator-fixed。而內核配置裏,漏掉了這個驅動。又是最求最小內核配置惹的禍!重新配置並選中這個驅動,現在看起來壹切正常。

到此為止,壹個小的系統就誕生了。它運行在Beaglebone black的板子上,MMC卡,USB和網卡都可以使用用。當然這還是壹個比較小的配置,以後根據需要,可能還需要追加必要的驅動。下壹步就是開始編譯生成系統的各種程序了。首當其沖的就應該是"systemd",它是最新的,也是最流行的,替代過去UNIX/Linux INIT的程序。

  • 上一篇:電腦藍屏代碼0x0000007A(0x07BCOOO,0xC00000A3,0xF7800B6E,0x08607860)
  • 下一篇:誰知道這是什麽動畫?
  • copyright 2024編程學習大全網