背景

上一讲我们完成了 编译 QEMU 以及简单地做了仿真。这一讲在 启动uboot 的基础上进行,以加强对于 运行地址,加载地址等理解。

有关资料: uboot 与 代码重定位

有这样的约定,uboot正常运行的模式称为自主模式;倒计时被中断以后的交互模式称为下载模式

在Uboot中加载内核与设备树一般通过网络(tftp)、读存储介质(sd卡\usb等)以及仿真器等方式。

uboot通过tftp加载uImage

为了通过 tftp 加载有关的文件到指定的内存地址,需要先完成下面2个步骤。

在主机搭建tftp服务器

在Linux使用tftp一般以搭建tftp服务器,Windows可以使用软件完成(例如tftpd32)。

参考文章:《ubuntu 下tftp的安装、配置、使用》

QEMU网络功能配置

为了 让 QEMU 能够与主机 建立网络连接,我们采用桥接的网络连接与Host通信(需要主机内核tun/tap模块支持)

参考文章:《QEMU 配置网络》

很可惜我的Ubuntu有问题。折腾了好久网络都没有通,但根据以往的开发经验,教程是可行的。

这里需要用到 uboot的命令,添加/改动uboot变量有2种方法,一种是在运行的时候通过setenv, saveenv等命令完成的;另外一种就是把有关的命令固化在程序中。

我相信大家对于uboot下载模式下的命令非常熟悉,下面我们简单介绍在代码中固化配置的方法。

1)修改uboot代码并编译

include/configs/vexpress_common.h中加入相应的宏定义(相当于步骤4)

// 根据自己的实际情况修改对应的地址
#define CONFIG_IPADDR 192.168.31.240
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.31.241
/* 指定启动文件为uImage */
#define CONFIG_BOOTFILE "uImage"
/* 指定启动命令 */
#define CONFIG_BOOTCOMMAND "tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; setenv bootargs'root=/dev/mmcblk0 console=ttyAMA0'; bootm 0x60003000 - 0x60500000"

关于设备树,可以参考文章: 《设备树DTS 学习: uboot 传递 dtb 给 内核》

实际上,CONFIG_BOOTCOMMAND的值会在uboot启动以后自动执行,相当于在下载模式输入下面的指令

tftp 0x60003000 uImage
tftp 0x60500000 vexpress-v2p-ca9.dtb
setenv bootargs'root=/dev/mmcblk0 console=ttyAMA0'
bootm 0x60003000 - 0x60500000

重新编译uboot

#!/bin/sh
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
# make clean && make vexpress_ca9x4_defconfig # 不需要改配置
make -j4

仿真(节选)

$ qemu-system-arm -M vexpress-a9 -m 256 -kernel u-boot -nographic

U-Boot 2018.01 (Feb 23 2020 - 10:43:34 +0800)

DRAM:  256 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0 => print
...
arch=arm bootcmd=tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; setenv bootargs'root=/dev/mmcblk0 console=ttyAMA0'; bootm 0x60003000 - 0x60500000
...
bootfile=uImage
...
ipaddr=192.168.31.240
...
netmask=255.255.255.0
...
serverip=192.168.31.241

2)指定编译 kernel 与 dtb

LOADADDR(运行地址) 和uboot的启动加载位置一致

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi- make dtbs -j4
make uImage LOADADDR=0x60003000 -j4

3)进行仿真(把uImage 与 dtb 放到tftp目录下)

sudo qemu-system-arm -M vexpress-a9 -m 256 -kernel u-boot -nographic -net nic,macaddr=00:16:3e:00:00:01 -net tap -sd a9rootfs.ext3

成功的话,会有以下的结果(节选):

TFTP from server 192.168.31.241; our IP address is 192.168.31.240
Filename 'uImage'.
Load address: 0x60003000
Loading: #########################
#########################
####
8.3 MB/s
done
Filename 'vexpress-v2p-ca9.dtb'.
Load address: 0x60500000
Loading: ##
10.3 MB/s
done starting kernel...

补充一点,既然网络是通的,那么就可以通过uboot 引导nfs,只要修改bootargs的一些参数即可,不在这里赘述,有兴趣的读者可以参考:《配置uboot指定nfs挂载根文件系统》

uboot通过sd卡加载uImage

uboot通过sd卡加载内核 的步骤和以前差不多。

参考: 《用QEMU模拟运行uboot从SD卡启动Linux》

制作SD卡镜像

1)生成一个空的SD卡镜像

dd if=/dev/zero of=uboot.disk bs=1M count=256
# 注意自己控制 count 大小

2)创建GPT分区,

创建两个分区(一个用来存放kernel和设备树,另一个存放根文件系统)

sgdisk -n 0:0:+10M -c 0:kernel uboot.disk
sgdisk -n 0:0:0 -c 0:rootfs uboot.disk

查看分区:

$ sgdisk -p uboot.disk
Disk uboot.disk: 524288 sectors, 256.0 MiB
Logical sector size: 512 bytes
Disk identifier (GUID): 87B3B250-BA97-4089-A0F1-E7807FE061B6
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 524254
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB) Number Start (sector) End (sector) Size Code Name
1 2048 22527 10.0 MiB 8300 kernel
2 22528 524254 245.0 MiB 8300 rootfs

3)寻找一个空闲的loop设备 并 将SD卡镜像映射到loop设备上

LOOPDEV=`losetup -f`
sudo losetup $LOOPDEV uboot.disk
sudo partprobe $LOOPDEV

此时会看到/dev/loop0p1 和/dev/loop0p2 两个节点

$ ls /dev/loop*
/dev/loop0 /dev/loop1 /dev/loop4 /dev/loop7
/dev/loop0p1 /dev/loop2 /dev/loop5 /dev/loop-control
/dev/loop0p2 /dev/loop3 /dev/loop6

4)格式化

sudo mkfs.ext4 /dev/loop0p1
sudo mkfs.ext4 /dev/loop0p2

5)挂载

mkdir p1 p2
sudo mount -t ext4 /dev/loop0p1 p1
sudo mount -t ext4 /dev/loop0p2 p2

6)拷贝文件

# 将 zImage 和 dtb 拷贝到 p1
# schips @ ubuntu in ~/arm/sc/linux-4.14.14 [17:55:39]
$ sudo cp arch/arm/boot/zImage p1
$ sudo cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb p1 # 将 文件系统中的文件拷贝到 p2
## 因为在上一讲我已经做好了一个 ext3的镜像,所以我直接使用了 # schips @ ubuntu in ~/arm/sc/linux-4.14.14 [17:59:24] C:1
$ sudo mount -t ext3 ../busybox-1.27.0/a9rootfs.ext3 _tmp -o loop
$ sudo cp _tmp/* p2 -arf

7)取消挂载

sudo umount p1 p2
sudo losetup -d /dev/loop0

启动uboot

使用下面的命令运行uboot

qemu-system-arm -M vexpress-a9 -m 1024M -smp 1 -nographic -kernel u-boot -sd ./uboot.disk

在倒计时结束之前打断它,不要让其进入自主模式

U-Boot 2018.01 (Feb 23 2020 - 18:07:26 +0800)

DRAM:  1 GiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
=>

查看 SD卡的情况,可以用下面的命令查看(默认SD卡就是出于可用状态):

mmc dev 0mmc info

=> mmc dev 0
switch to partitions #0, OK
mmc0 is current device => mmc info
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 2.0
High Capacity: No
Capacity: 256 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes

使用part list mmc 0查看分区内容:

=> part list mmc 0

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
Attributes
Type GUID
Partition GUID
1 0x00000800 0x000057ff "kernel"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
guid: d3485081-83ea-4027-a379-2f3172877833
2 0x00005800 0x0007ffde "rootfs"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
guid: d058e69e-02aa-4543-9f1a-4bd3809fb275

查看SD卡2个分区里面的东西:

分区1: ls mmc 0:1 或者 ext4ls mmc 0:1

分区2: ls mmc 0:2 或者 ext4ls mmc 0:2

=> ls mmc 0:1
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
3961960 zImage
14692 vexpress-v2p-ca9.dtb
=> ext4ls mmc 0:1
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
3961960 zImage
14692 vexpress-v2p-ca9.dtb => ext4ls mmc 0:2
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
12288 app
<DIR> 3072 bin
<DIR> 1024 dev
<DIR> 1024 etc
<DIR> 4096 lib
<SYM> 11 linuxrc
<DIR> 1024 mnt
<DIR> 1024 proc
<DIR> 1024 root
<DIR> 3072 sbin
<DIR> 1024 sys
<DIR> 1024 tmp
<DIR> 1024 usr
<DIR> 1024 var

加载kernel、设备树

加载sd卡分区中指定的文件(内核)到指定的内存: load mmc 0:1 0x60008000 zImage或者ext4load mmc 0:1 0x60008000 zImage

=> load mmc 0:1 0x60008000 zImage
3961960 bytes read in 11446 ms (337.9 KiB/s)

加载sd卡分区中指定的文件(设备树)到指定的内存:load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb 或者 ext4load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb

=> load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
14692 bytes read in 35 ms (409.2 KiB/s)

设置bootargs

setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel'

引导内核

=> bootz 0x60008000 - 0x61000000

关于 uboot 启动命令可以参考:《Uboot 命令行 介绍》

固化启动命令

如果没有问题的话,那么可以在uboot的代码中将上面的命令固化进程序中

include/configs/vexpress_common.h中修改CONFIG_BOOTCOMMAND

改成

#define CONFIG_BOOTCOMMAND  "load mmc 0:1 0x60008000 zImage ;load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb; setenv bootargs \"root=/dev/mmcblk0p2 earlycon console=ttyAMA0\"; bootz 0x60008000 - 0x61000000"

再重新编译即可。

启动结果

完整的启动结果如下:

$ qemu-system-arm -M vexpress-a9 -m 1024M -smp 1 -nographic -kernel u-boot -sd uboot.disk
WARNING: Image format was not specified for 'uboot.disk' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions. U-Boot 2018.01 (Feb 23 2020 - 18:07:26 +0800) DRAM: 1 GiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
=> load mmc 0:1 0x60008000 zImage
3961960 bytes read in 11530 ms (335 KiB/s)
=> load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
14692 bytes read in 38 ms (377 KiB/s)
=> setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel'
=> bootz 0x60008000 - 0x61000000
Kernel image @ 0x60008000 [ 0x000000 - 0x3c7468 ]
## Flattened Device Tree blob at 61000000
Booting using the fdt blob at 0x61000000
Loading Device Tree to 7fef1000, end 7fef7963 ... OK Starting kernel ... Booting Linux on physical CPU 0x0
Linux version 4.14.14 (schips@ubuntu) (gcc version 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02)) #1 SMP Sat Feb 22 21:14:14 CST 2020
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
OF: fdt: Machine model: V2P-CA9
Malformed early option 'earlycon'
debug: ignoring loglevel setting.
Memory policy: Data cache writeback
On node 0 totalpages: 262144
free_area_init_node: node 0, pgdat 80a5f080, node_mem_map bf7fb000
Normal zone: 2048 pages used for memmap
Normal zone: 0 pages reserved
Normal zone: 262144 pages, LIFO batch:31
CPU: All CPU(s) started in SVC mode.
random: fast init done
percpu: Embedded 16 pages/cpu @bf7ae000 s36428 r8192 d20916 u65536
pcpu-alloc: s36428 r8192 d20916 u65536 alloc=16*4096
pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
Built 1 zonelists, mobility grouping on. Total pages: 260096
Kernel command line: root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel
log_buf_len individual max cpu contribution: 4096 bytes
log_buf_len total cpu_extra contributions: 12288 bytes
log_buf_len min size: 16384 bytes
log_buf_len: 32768 bytes
early log buf free: 14720(89%)
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1029388K/1048576K available (6144K kernel code, 402K rwdata, 1364K rodata, 1024K init, 169K bss, 19188K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xc0800000 - 0xff800000 (1008 MB)
lowmem : 0x80000000 - 0xc0000000 (1024 MB)
modules : 0x7f000000 - 0x80000000 ( 16 MB)
.text : 0x80008000 - 0x80700000 (7136 kB)
.init : 0x80900000 - 0x80a00000 (1024 kB)
.data : 0x80a00000 - 0x80a649b8 ( 403 kB)
.bss : 0x80a6bd30 - 0x80a964b4 ( 170 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
Hierarchical RCU implementation.
RCU event tracing is enabled.
RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
GIC CPU mask not found - kernel will fail to boot.
GIC CPU mask not found - kernel will fail to boot.
smp_twd: clock not found -2
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
clocksource: arm,sp804: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275 ns
Failed to initialize '/smb@4000000/motherboard/iofpga@7,00000000/timer@12000': -22
Console: colour dummy device 80x30
console [tty0] enabled
Calibrating local timer... 90.87MHz.
Calibrating delay loop... 560.33 BogoMIPS (lpj=2801664)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x60100000 - 0x60100060
Hierarchical SRCU implementation.
smp: Bringing up secondary CPUs ...
smp: Brought up 1 node, 1 CPU
SMP: Total of 1 processors activated (560.33 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 1024 (order: 4, 65536 bytes)
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
hw-breakpoint: debug architecture 0x4 unsupported.
Serial: AMBA PL011 UART driver
OF: amba_device_add() failed (-19) for /memory-controller@100e0000
OF: amba_device_add() failed (-19) for /memory-controller@100e1000
OF: amba_device_add() failed (-19) for /watchdog@100e5000
10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 35, base_baud = 0) is a PL011 rev1
console [ttyAMA0] enabled
1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 36, base_baud = 0) is a PL011 rev1
1000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 37, base_baud = 0) is a PL011 rev1
1000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 38, base_baud = 0) is a PL011 rev1
OF: amba_device_add() failed (-19) for /smb@4000000/motherboard/iofpga@7,00000000/wdt@f000
SCSI subsystem initialized
libata version 3.00 loaded.
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource arm,sp804
NET: Registered protocol family 2
TCP established hash table entries: 8192 (order: 3, 32768 bytes)
TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
UDP hash table entries: 512 (order: 2, 16384 bytes)
UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 1 counters available
workingset: timestamp_bits=30 max_order=18 bucket_order=0
squashfs: version 4.0 (2009/01/31) Phillip Lougher
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
9p: Installing v9fs 9p2000 file system support
io scheduler noop registered (default)
io scheduler mq-deadline registered
io scheduler kyber registered
clcd-pl11x 10020000.clcd: PL111 designer 41 rev2 at 0x10020000
clcd-pl11x 10020000.clcd: /clcd@10020000 hardware, 1024x768@59 display
Console: switching to colour frame buffer device 128x48
clcd-pl11x 1001f000.clcd: PL111 designer 41 rev2 at 0x1001f000
clcd-pl11x 1001f000.clcd: /smb@4000000/motherboard/iofpga@7,00000000/clcd@1f000 hardware, 640x480@59 display
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
erase region 0: offset=0x0,size=0x40000,blocks=256
40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000
Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
erase region 0: offset=0x0,size=0x40000,blocks=256
Concatenating MTD devices:
(0): "40000000.flash"
(1): "40000000.flash"
into device "40000000.flash"
libphy: Fixed MDIO Bus: probed
libphy: smsc911x-mdio: probed
smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56
isp1760 4f000000.usb: bus width: 32, oc: digital
isp1760 4f000000.usb: NXP ISP1760 USB Host Controller
isp1760 4f000000.usb: new USB bus registered, assigned bus number 1
isp1760 4f000000.usb: Scratch test failed.
isp1760 4f000000.usb: can't setup: -19
isp1760 4f000000.usb: USB bus 1 deregistered
usbcore: registered new interface driver usb-storage
rtc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0
IR NEC protocol handler initialized
IR RC5(x/sz) protocol handler initialized
IR RC6 protocol handler initialized
IR JVC protocol handler initialized
IR Sony protocol handler initialized
IR SANYO protocol handler initialized
IR Sharp protocol handler initialized
IR MCE Keyboard/mouse protocol handler initialized
IR XMP protocol handler initialized
mmci-pl18x 10005000.mmci: Got CD GPIO
mmci-pl18x 10005000.mmci: Got WP GPIO
mmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 31,32 (pio)
input: AT Raw Set 2 keyboard as /devices/platform/smb@4000000/smb@4000000:motherboard/smb@4000000:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0
mmc0: new SD card at address 4567
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
mmcblk0: mmc0:4567 QEMU! 256 MiB
aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30
aaci-pl041 10004000.aaci: FIFO 512 entries
oprofile: using arm/armv7-ca9
NET: Registered protocol family 17
9pnet: Installing 9P2000 support
Registering SWP/SWPB emulation handler
mmcblk0: p1 p2
rtc-pl031 10017000.rtc: setting system clock to 2020-02-23 10:36:55 UTC (1582454215)
ALSA device list:
#0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb@4000000/smb@4000000:motherboard/smb@4000000:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
EXT4-fs (mmcblk0p2): Filesystem with huge files cannot be mounted RDWR without CONFIG_LBDAF
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
Freeing unused kernel memory: 1024K
random: crng init done Processing /etc/profile... Done / # ls
app etc lost+found root tmp
bin lib mnt sbin usr
dev linuxrc proc sys var

总结

通过上文,我们了解了如何在QEMU中启动uboot,并通过不同的方式来引导内核。也了解了整个嵌入式系统的完整启动流程。

QEMU 运行uboot,动态加载内核与文件系统的更多相关文章

  1. (转)高性能JavaScript:加载和运行(动态加载JS代码)

    浏览器是如何加载JS的 当浏览器遇到一个<script>标签时,浏览器首先根据标签src属性下载JavaScript代码,然后运行JavaScript代码,继而继续解析和翻译页面.如果需要 ...

  2. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  3. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  4. Android应用安全之外部动态加载DEX文件风险

    1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...

  5. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  6. Unity3D动态加载外部资源

    最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...

  7. Unity 动态加载 Prefab

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  8. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  9. android: 动态加载碎片布局的技巧

    虽然动态添加碎片的功能很强大,可以解决很多实际开发中的问题,但是它毕竟只是在 一个布局文件中进行一些添加和替换操作.如果程序能够根据设备的分辨率或屏幕大小在运 行时来决定加载哪个布局,那我们可发挥的空 ...

随机推荐

  1. Codeforces Global Round 5E(构造,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_w ...

  2. 如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭

    如何确认 fastboot unlock 解锁成功 1.fastboot 模式下按音量上键后是否提示 Unlock Pass...return to fastboot in 3s 2.重启后界面是否显 ...

  3. vue通过get方法下载java服务器excel模板

    vue方法 handleDownTemplateXls(fileName){ if(!fileName || typeof fileName != "string"){ fileN ...

  4. Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配

    一.正则表达式之单个字符匹配 格式:lst = re.findall(正则表达式,要匹配的字符串)预定义字符集 匹配内容 .匹配任意字符,除了换行符\n \d匹配数字 \D匹配非数字 \w匹配字母或数 ...

  5. nginx访问目录是没加/的重定向控制

    static 模块提供了root与alias功能:发现目标是目录时:但URI末尾未加/时:会返回301重定向:重定向后会加/ 指令 Syntax: server_name_in_redirect on ...

  6. nginx 的precontent阶段的ngx_http_try_files_module模块与mirrors模块介绍

    指令介绍 Syntax: try_files file ... uri; try_files file ... =code; Default: — Context: server, location ...

  7. swoole 父子进程间通信

    <?php /** * 场景: * 监控订单表状态 父子进程通信 * 一个主进程 两个子进程实现 */ //设置主进程名 echo '主进程id:' . posix_getpid() . PHP ...

  8. python学习 第一章(说不定会有第零章呢)one day

    ------------恢复内容开始------------ 一.啥是python python是吉尔·范罗苏姆于1989年开发的一个新的脚本解释程序,是ABC语言的一种继承. 二.python的特点 ...

  9. 将图片转化为base64编码字符串

    pom依赖 <dependency> <groupId>org.ops4j.base</groupId> <artifactId>ops4j-base- ...

  10. 【PAT甲级】1028 List Sorting (25 分)

    题意: 输入一个正整数N(<=100000)和C(C属于{1,2,3}),接下来输入N行,每行包括学生的六位学号(习惯用string输入,因为可能有前导零),名字和成绩(正整数).输出排序后的信 ...