轉自:https://blog.csdn.net/weixin_42418557/article/details/89220785
bootargs可以在DTS中生成,chosen里有屬性項bootargs,啟動linux時,內核會使用chosen中定義的bootargs,如果沒有定義bootargs,linux會使用kernel默認的bootcmdline。
如果bootcmdline為空,那么內核會使用UBOOT的環境變量bootargs。
格式是
由很多個鍵值對用空格隔開依次排列,
每個參數中都是:
參數名=參數值
整個 Kernel command line會被內核啟動時解析,
解析成一個一個的參數名=參數值的字符串。
這些字符串會被內核處理成啟動參數列表,從而影響啟動過程。
bootargs=console=ttyPS0,115200n8 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0
這是zedboard最常用的啟動參數字符串。
(1)console
使用特定的串口,常見的有:
console=ttyPS0,115200
console=ttyS0,115200n8
(2)earlyprintk
打印早期啟動信息。
(3)root
用來指定rootfs的位置, 常見的情況有:
root=/dev/ram rw rootwait
root=/dev/ram0 rw
(請注意上面的這兩種設置情況是通用的.)
root=/dev/mtdblockx rw rootwait
root=/dev/mtdblock/x rw
(mtdblock是塊設備)
root=/dev/mtdblockx只是告訴內核,root fs從第x個(x=0,1,2…)MTD分區掛載,mtdblock0對應第一個分區,mtdblock1對應第二個分區,以此類推.
rootwait
指定內核在所有設備節點都加載后,再檢查rootfs的合法性。
(4)rootfstype
跟root一起配合使用,常見的情況有:
rootfstype=jffs2
rootfstype=squashfs
(如果是jffs2,squashfs等文件系統的話,就需要rootfstype指明文件系統的類型,不然會無法掛載根分區.一般如果根文件系統是ext2的話,有沒有這個選項是無所謂的)
(5)mem=xxM
指定內存的大小,不是必須的
例如:
mem=64M
mem=1G
(6)ramdisk_size
ramdisk_size=xxM
告訴ramdisk 驅動,創建的ramdisk的size,默認情況下是4M,
例如:
ramdisk_size=8M
(7)initrd, noinitrd
當你沒有使用ramdisk啟動系統的時候,你需要使用noinitrd這個參數,
但是如果使用了的話,就需要指定
initrd=r_addr,size
( r_addr表示initrd在內存中的位置,size表示initrd的大小。)
ramdisk: 是一種基於內存的虛擬磁盤技術,采用ext2文件系統, 把內存當磁盤用。
initrd是另外單獨編譯生成的,是一個獨立的文件,它由bootloader單獨加載到ram中內核空間外的地址,
例如
加載的地址為0x800000(是物理地址而非虛擬地址),大小為8MB,
那么只要在命令行加入
initrd=0x800000,8M
系統就可以找到 initrd。
initrd依賴ram disk,需要配置
CONFIG_BLK_DEV_RAM
CONFIG_BLK_DEV_INITRD選項 – 支持initrd,
1。配置initrd
General setup —>
[] Initial RAM filesystem and RAM disk (initramfs/initrd) support
() Initramfs source file(s) //清空根文件系統的目錄配置
2。配置ramdisk
Block devices —>
<> RAM disk support
(16) Default number of RAM disks // 內核在/dev/目錄下生成16個ram設備節點
(4096) Default RAM disk size (kbytes)
(1024) Default RAM disk block size (bytes)
例如:
使用 initrd的內 核啟動參數:
initrd=addr,0x400000 root=/dev/ram rw
注:
addr是根文件系統的下載地址;
0x400000是根文件系統的大小,該大小需要和內核配置的ramdisk size 4096 kbytes相一致;
/dev/ram是ramdisk的設備節點,rw表示根文件系統可讀、可寫;
(8)init
init指定的是內核啟起來后,進入系統中運行的第一個腳本,一般是
init=/linuxrc
(9)ip
指定系統啟動之后網卡的ip地址,如果你使用基於nfs的文件系統,那么必須要有這個參數,其他的情況下就看你自己的喜好了。設置ip有兩種方法:
ip = ip_addr
ip=ip_addr:server_ip_addr:gateway:netmask:[<hostname>]:which netcard:off
例如:
ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
省略了hostname,所以兩個冒號之間保留為空。
(10)mtdparts,blkdevparts
要想這個參數起作用,內核中的mtd驅動必須要支持,
即內核配置時需要選上
Device Drivers
—> Memory Technology Device (MTD) support
—> Command line partition table parsing y
mtdparts的格式如下:
使用的時候需要按照下面的格式來設置:
mtdparts=mtd-id:<size1>[@<offset1>](<name1>)[ro],<size2>[@<offset2>](<name2>)[ro]…,-(others)
這里面有幾個必須要注意的:
a. mtd-id 必須要跟你當前平台的flash的mtd-id一致,不然整個mtdparts會失效
b. size在設置的時候可以為實際的size(xxM,xxk,xxG),也可以為’-’,這表示剩余的所有空間。
例如:
I)mtdparts=sa1100:-
flash 的mtd-id是sa1100,只有一個分區。
II)mtdparts=sa1100:256k(ARMboot)ro,-(root)
flash 的mtd-id是sa1100,有兩個分區。其中第一個分區是readonly的。
III)mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
flash有七個分區。
如果是FLASH,按照FLASHTYPE來進行描述。
mtdparts=flashtype1:size(name),size(name),
…,-(others);flashtype2:size(name),size(name),
…,-(others);flashtype3:size(name),size(name),…,-(others);…
flashtype表示Flash類型。
SPI Flash對應取值hi_sfc,
Nand Flash對應取值hinand,
例如:mtdparts=hi_sfc:1M(boot);hinand:4M(baseparam),4M(pqparam),4M(logo),8M(kernel),96M(rootfs),-(others)
系統中的MTD,一塊是SPIFLASH,一塊是NANDFLASH。
如果是eMMC,那么分區划分格式是: blkdevparts=mmcblk0:size(name),size(name),…,-(others)
系統中有一個塊設備,可以找到的設備名是/dev/block/mmcblk0。
這個mmcblk0,我們需要描述它的分區,那么就是用上述語句來描述。
分區的設備名就是/dev/block/mmcblk0p1,/dev/block/mmcblk0p2,/dev/block/mmcblk0p1…
以此類推。
注意:
當rootfstype為ext3/ext4時, rootfs分區的大小必須與文件系統鏡像大小保持完全一致。
我們來討論平常我經常使用的幾種組合:
(a)bootargs=initrd=0x800000,0xa00000 console=ttySAC0
root=/dev/ram0 rw mem=64M init=/linuxrc
啟動盤是RAMDISK格式鏡像,且直接就在內存中,位置在0x800000,大小是10M。
控制台使用ttySAC0,默認波特率。
rootfs掛載點是/dev/ram0,也就是我們的memory image。可讀可寫。
kernel mem限制為64M。
啟動后,從rootfs中尋找第一個初始化腳本執行,文件是/linuxrc。
(b) bootargs=mem=32M console=ttyS0,115200n8
root=/dev/ram rw init=/linuxrc
kernel mem限制為32M。
控制台使用ttyS0,波特率115200。
rootfs掛載點是/dev/ram。可讀可寫。由於沒有指定initrd,所以這個RAMDISK鏡像存在FLASH中。
啟動后,從rootfs中尋找第一個初始化腳本執行,文件是/linuxrc。
注意,這種情況下你應該要在bootm命令中指定ramdisk鏡像在flash中的地址。
(c)bootargs=mem=32M console=ttyS0,115200n8
noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc
kernel mem限制為32M。
控制台使用ttyS0,波特率115200。
啟動盤不是ramdisk格式鏡像,而是別的文件系統類型。
rootfs掛載點是/dev/mtdblock2。可讀可寫。文件系統是jffs2類型的。
啟動后,從rootfs中尋找第一個初始化腳本執行,文件是/linuxrc。
(d)bootargs=console=ttyPS0,115200n8 noinitrd
root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait
控制台使用ttyPS0,波特率115200,無校驗,8比特。
啟動盤不是ramdisk格式鏡像,而是別的文件系統類型。
rootfs掛載點是/dev/mmcblk0p2,eMMC的第二個分區,文件系統是ext4。啟動時,等待設備節點啟動后,再掛載rootfs。
(e)bootargs=mem=64M console=ttySAC0
noinitrd root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off
kernel mem限制為64M。
控制台使用ttySAC0,波特率默認。
啟動盤不是ramdisk格式鏡像,而是別的文件系統類型。
rootfs掛載點是/dev/nfs。nfsroot地址是192.168.0.3:/nfs。
IP是192.168.0.5
SERVERIP是192.168.0.3
GATEWAY是192.168.0.3
NETMASK是255.255.255.0
HOSTNAME是NULL
NETIF是eth0
off描述結束
(f)bootargs=noinitrd mem=64M console=ttySAC0
root=/dev/nfs nfsroot=192.168.0.3:/nfs
ip=192.168.0.5
同上,簡化版,只設置IP,其他未設置。
(g)bootargs=noinitrd mem=64M console=ttySAC0
root=/dev/nfs nfsroot=192.168.0.3:/nfs
ip=:::::eth0:dhcp
同上,簡化版,設置IP獲取方式為DHCP。
(h)bootargs=noinitrd console=ttySAC0
root=/dev/nfs nfsroot=192.168.1.88:/home/le/workspace/rootfs ip=192.168.1.70:192.168.1.88:192.168.1.88:255.255.255.0:linux.arm9.net:eth0:off
各參數的含義如下:
nfsroot 是開發主機的NFS服務文件夾。
“ip=”后面:
第一項(192.168.1.70)是目標板的臨時 IP(注意不要和局域網內其他 IP 沖突);
第二項(192.168.1.104)是開發主機的 IP;
第三項(192.168.1.104)是目標板上網關(GW)的設置;
第四項(255.255.255.0)是子網掩碼;
第五項是開發主機的名字(一般無關緊要,可隨便填寫)
eth0 是網卡設備的名稱。