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