1. 程式人生 > >UBOOT傳遞核心引數

UBOOT傳遞核心引數

1.核心引數傳遞

核心中的引數是核心提供的,在配置核心時指定,而u-boot提供的則在u-boot啟動時傳遞到核心取代核心提供的。u-boot的引數傳遞利用了三個通用暫存器R0,R1,R2。u-boot在啟動的過程中把引數放到3個暫存器中,到核心啟動時再把暫存器中的引數取出。一般我們需要通過u-boot/tools/目錄下的mkimage製作uImage,使用bootm命令進行載入,注意go命令是不傳遞核心引數的。

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

選項:
-A:set architecture to 'arch'       //用於指定CPU型別,比如ARM
-O:set operating system to 'os'     //用於指定作業系統,比如Linux
-T:set image type to 'type'         //用於指定image型別,比如Kernel
-C:set compression type 'comp'      //指定壓縮型別
-a:set load address to 'addr' (hex) //指定image的載入地址
-e:set entry point to 'ep' (hex)    //核心的入口地址,一般為image的載入地址+0x40(資訊頭的大小)
-n:set image name to 'name'         //image在頭結構中的命名
-d:use image data from 'datafile'   //無頭資訊的image檔名
-x:set XIP (execute in place)       //設定執行位置

例如:
mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img

注意核心的載入地址是記憶體的起始地址+0x8000,0x40是64k的頭部,是mkimage加上去的,0x30008040是核心第一條指令所在的地址。u-boot引數連結串列在記憶體中的地址是0x30000100。r0的值是0,r1是u-boot傳遞過來的機器碼,r2是引數連結串列在記憶體中的實體地址。

修改u-boot中我們的開發板的配置檔案/include/configs/TE2440II.h,增加如下巨集定義,使其能向核心傳遞引數(在這裡主要是console引數,否則無法在控制檯看到啟動資訊):
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG
#define CONFIG_BOOTARGS    " noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0 console=ttySAC0,115200"

上面的操作完成後,重新編譯u-boot,下載到nand中,重新啟動u-boot後,把我們編譯生成的uImage檔案下載到記憶體的0x30008000地址處,就可以用bootm命令來手動引導核心了(執行bootm 0x30008000)。

2.機器碼

核心會在編譯連結過程中,將各種處理器核心描述符組合成表,接著從機器描述符表中查詢有無r1暫存器指定的機器碼,如果沒有就將退出,所以這也說明了為什麼在u-boot中機器碼一定要和核心中的機器碼一致,否則核心就無法啟動。

先看看u-boot的機器碼和linux的機器碼是由什麼地方決定的,u-boot中的機器碼在u-boot的board/samsung/TE2440II/TE2440II.c中決定。

  /* arch number of SMDK2410-Board */
    gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

檢視u-boot/include/asm-arm/mach-type.h檔案有:

#define MACH_TYPE_SMDK2410        193
#define MACH_TYPE_S3C2440           362

Linux中決定機器碼的就是下面那個機器描述符。

MACHINE_START(SMDK2440, "SMDK2440")
    /* Maintainer: Ben Dooks <http://blog.csdn.net/charistain_huang/article/details/mailto:[email protected]> */
    .phys_io       = S3C2410_PA_UART,
    .io_pg_offst   = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params   = S3C2410_SDRAM_PA + 0x100,//注意:這個地址就是與u-boot中引數連結串列在記憶體中的實體地址相對應

    .init_irq      = s3c24xx_init_irq,
    .map_io        = smdk2440_map_io,
    .init_machine  = smdk2440_machine_init,
    .timer         = &s3c24xx_timer,
MACHINE_END

檢視核心目錄下的arch/arm/tools/mach-types.h檔案,有:
smdk2410        ARCH_SMDK2410        SMDK2410        193
s3c2440        ARCH_S3C2440        S3C2440                362
smdk2440        MACH_SMDK2440        SMDK2440        1008

關鍵字是s3c2440,所以我們上面看到的是0x000000a8(362)。
所以,我們這裡不去修改核心,而是直接修改u-boot 的 board/samsung/ok2440v3/ok2440v3.c檔案,如下:
    /* arch number of SMDK2410-Board */
    gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

3.

[/[email protected]/h /W]#

進入控制檯,/u會顯示成root,/h會顯示成hostname,/w會顯示成當前路徑。

4. “Hit any key to stop autoboot:”

doc/README.autoboot裡說得很清楚,自動引導只有需要最基本的兩個配置:CONFIG_BOOTDELAY和CONFIG_BOOTCOMMAND:
The basic autoboot configuration options are documented in the main
U-Boot README. See it for details. They are:
  bootdelay
  bootcmd
  CONFIG_BOOTDELAY
  CONFIG_BOOTCOMMAND
     根目錄下的Readme檔案裡對這幾個引數有說明:
Boot Delay:    CONFIG_BOOTDELAY - in seconds
        Delay before automatically booting the default image;
        set to -1 to disable autoboot.
bootcmd    see CONFIG_BOOTCOMMAND
Autoboot Command:
        CONFIG_BOOTCOMMAND
        Only needed when CONFIG_BOOTDELAY is enabled;
        define a command string that is automatically executed
        when no character is read on the console interface
        within "Boot Delay" after reset.
      由此,我們只需要在自已的開發板的配置檔案裡/include/configs/TE2440II.h

#define CONFIG_BOOTDELAY    5
#define CONFIG_BOOTCOMMAND    "nand read 0x30008000 0x00500000 0x00300000; bootm 0x30008000"

重新編譯u-boot,OK了,嘿嘿。

6.如果tftp出現T和#,那是tftp不斷重啟,據說是網絡卡還沒準備好的,所以將tftp超時的時間加大。

在net/tftp.c中,修改這句:

#define TIMEOUT        200000UL             /* Millisecs to timeout for lost pkt */

7.我使用的命令

1)print或printenv可以打印出環境變數

2)setenv bootargs 'noinitrd root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0,ttySAC0,115200'

這樣使用setenv 可以設定環境變數

3)setenv bootargs 這樣使用setenv 直接加環境變數的名字可以刪除環境變數

4)saveenv 儲存環境變數,否則復位後,上次用setenv設定的環境變數就不在了。

5)tftp 0x30008000 192.168.1.101:u-boot.bin

從IP地址為192.168.1.101的tftp伺服器處下載 u-boo.bin檔案到0x30008000處。

6)nand erase 0x0 0x30000

擦除0x0到0x30000範圍的nandflash

7)nand write 0x30008000 0x0 0x30000

從0x30008000將資料傳到0x0,長度為0x30000

8)nand scrub

擦除整個nandflash,先按y,再按回車

9)nand write.yaffs2 0x30008000 0x00800000 0x03c00000

寫yaffs2檔案系統用的

相關推薦

UBOOT傳遞核心引數

1.核心引數傳遞 核心中的引數是核心提供的,在配置核心時指定,而u-boot提供的則在u-boot啟動時傳遞到核心取代核心提供的。u-boot的引數傳遞利用了三個通用暫存器R0,R1,R2。u-boot在啟動的過程中把引數放到3個暫存器中,到核心啟動時再把暫存器中的引數取出

核心檢視uboot傳遞引數簡單方法

u-boot  設定bootargs=console=ttyS0,115200n8 initrd=2g,1 root=/dev/ram rawview=myrawview static int __init rawview_setup(char *str){ print

uboot傳遞引數到kernel的兩種方式

第一:         寫新引數到bootargs,驅動中用__setup(“新引數名=”, function)註冊自定義函式解析新引數“=”後的字串,再使用EXPORT_SYMBOL()匯出。 第二:         自定義新引數到uboot環境變數中,uboot中使用g

uboot核心引數傳遞核心解析uboot傳遞核心引數

一、核心引數的傳遞 uboot將核心引數存放在記憶體的某一地址上,bi_boot_params存放uboot傳給kernel 核心引數的首地址. int board_init (void) {gd->bd->bi_arch_number = MACH_TYPE_

【Linux】【cmdline】uboot傳遞核心的root裝置序號動態變化導致啟動失敗

現象 板子上插入SD卡啟動Linux系統後,emmc的裝置名稱是/dev/mmcblck1;板子上沒有插入SD卡,Linux啟動後,emmc的裝置名稱是/dev/mmcblck0. uboot傳遞給核心的cmdline引數bootargs 中root=/de

for AM335x(uboot核心

U-Boot for AM335x :  http://www.eefocus.com/marianna/blog/cate_17941_0.html?p=2 (移植全集) 為AM335x移植Linux核心主線程式碼 http://www.eefocus.com/mari

Ajax傳遞複雜引數到伺服器端的方法

我們大概都知道,使用Ajax傳遞簡單引數到伺服器端(SpringMVC)的方法,如下: $.ajax({ type : "POST", url : CONFIG.mec_otm.order + "/cancel", data : { "resu

Linux下TCP/IP核心引數優化

/proc/sys/net目錄 所有的TCP/IP引數都位於/proc/sys/net目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失),例如下面這些重要的引數: 引數(路徑+檔案) 描述

2018-10-14 ref引用傳遞 out引數

ref引數 將一個變數傳入一個函式中進行 “處理”,“ 處理”完成後,再將“處理”結果帶出函式 要求: 函式外必須為變數賦值,而函式內可以不賦值。 語法 形參和實參前都要加ref關鍵字。         static void

linux——系統核心引數優化

vim /etc/sysctl.conf net.ipv4.tcp_syncookies = 1 fs.file-max = 999999 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_tw_reuse = 1 net.i

linux 核心引數設定 - sysctl

sysctl 命令用於檢視和修改核心引數 檢視指定引數: sysctl kernel.threads-max 檢視所有引數: sysctl -a 修改指定引數: sysctl -w kernel.threds-max=102400   sysctl 設定的核心

ajax向後臺傳遞list引數

學習記錄:複習 使用ajax向後臺傳遞list引數 前臺 jsp頁面 <button onclick="login222();">測試</button> js function login222() { var l

關於ajax 傳遞引數

ajax 傳送的資料,預設都是字串,不能直接傳遞list(列表),或者dict(字典)。 若要 傳遞list(列表),或者dict(字典),需要進行一些操作。 list 需要進行列表序列化,在ajax下新增引數 tradiction :true dict 若要序列

springmvc傳遞物件引數時讓為空的欄位不傳遞(開發筆記)

引入jar 我這裡用的spring boot 只要引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

在jsp頁面的url連結傳遞中文引數的亂碼問題

已知專案中配置如下: strust2裡面,在web.xml檔案配置瞭如下: <filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework

解決前臺URL傳遞中文引數到java後臺亂碼問題

//前端js用encodeURI函式轉換例:var a = encodeURI(encodeURI(name));//後端用URLDecoder類轉換例:String name = request.getParameter("a"); System.out.println("前臺傳入引數:" + name);

nginx的linux伺服器核心引數調整【轉】

概述 由於預設的linux核心引數考慮的是最通用場景,這明顯不符合用於支援高併發訪問的Web伺服器的定義,所以需要修改Linux核心引數,讓Nginx可以擁有更高的效能; 在優化核心時,可以做的事情很多,不過,我們通常會根據業務特點來進行調整,當Nginx作為靜態web內容伺服器、反向代理或者提供壓縮伺服

檔案上傳的同時傳遞其他引數

FF4中增加了一個很有意思的物件,FormData。通常我們提交(使用submit button)時,會把form中的所有表格元素的name與value組成一個queryString,提交到後臺。這用jQuery的方法來說,就是 serialize。但當我們使用Ajax提交時,這過程就要變成人工的了

postman傳遞list引數給Springboot的controller

                post在raw中選擇,傳遞json格式的資料,資料格式,如下: [ &nbs

塊裝置核心引數max_segments和max_sectors_kb解析

linux塊裝置在處理io時會受到一些引數(裝置的queue limits引數,以下簡稱limits引數)的影響,比如一個請求中允許的最大扇區數,最大segment數等。這些引數可以在/sys/block//queue/下檢視,塊裝置在初始化時會設定預設值。這裡主要分析max_segments和ma