热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

QemuARMEmulator使用参数

这种方式在QEMU启动方法中最常见和最直接,启动参数形式如下:qemu-system-arm-kernelzImage-initrdrootfs.cramfs-append“init/linuxrc”每次zImage和rootfs修改后首先build出来,直接作为参数传入QEMU,方便快捷。此方式原理是,QEMU内置了

这种方式在QEMU启动方法中最常见和最直接,启动参数形式如下:

qemu-system-arm -kernel zImage -initrd rootfs.cramfs -append “init=/linuxrc”

每次zImagerootfs修改后首先build出来,直接作为参数传入QEMU,方便快捷。

此方式原理是,QEMU内置了一个很精简的bootloader,作用类似于u-boot。zImagerootfs和传递给kernel的参数(append后字串)直接被QEMU加载进虚拟机内存的相对位置,并从kernel第一条语句开始执行。

kernel成功引导后就会挂载rootfs,并从文件系统的/linuxrc脚本开始执行初始化动作。

此方式有局限性,原因在rootfs.cramfs为只读的文件系统,如果调用/linuxrc有创建文件夹或拷贝动作就会无法完成(这也许可以通过mount一个可读写设备解决)。

这种方式与第一种相比,文件系统的挂载位置和方式发生了改变,因为可以指定NFS为可读可写的,使用体验上比第一种进了一大步。

NFS需要网络支持,也就是QEMU的虚拟网卡支持,启动参数如下:

qemu-system-arm -kernel zImage -append "cOnsole=ttyS0 root=/dev/nfs nfsroot=/root/nfs rw  init=/linuxrc ip=dhcp nousb" -rtc base=localtime -serial stdio

用户不写-net的情况下,QEMU默认会追加上“-net nic -net user”。

-net nic表示为虚拟机创建一个虚拟网卡

-net user表示QEMU使用user模式,什么是user模式,请见-net章节。

然后大家注意到给kernel的传参,差异点着重在蓝色部分:

root=/dev/nfs指定根文件系统的挂载点,是在QEMU Guest OS上的位置

nfsroot=127.0.0.1:/root/nfs是指NFS在网络上的位置

ip=dhcp指定QEMU Guest OS的ip分配方式

总的引导过程就是,kernel引导完成就会通过寻找网关为Guest OS分配ip,然后与NFS建立连接,再把根文件系统挂载起来。

这种方式的好处是可以在host OS方便地修改根文件系统的内容,不用重新启动kernel。

但要注意前提,要使用NFS方式挂载rootfs,那就要先启动NFS服务,并定制好rootfs内容。

启动NFS服务过程举例:

1.         修改/etc/export文件,增加一行“/root/nfs/ *(rw,insecure,sync,no_root_squash)”

注意insecure很重要,保证本地访问NFS

*表示允许任何ip地址访问NFS

rw指NFS盘可读可写

sync指同步写入到磁盘上

no_root_squash指root用户访问则给予root权限

2.         使用命令$exportfs ?av

使用命令$service nfs restart

如果使用本地NFS,那么只要配置好本地服务即可;如果是使用远程NFS,那么先确认你有网络,然后确认GuestOS能分到ip,最后网络模式参数要修改。-net user改为“-net tap...”,具体怎样改见-net章节。

这是最不用操心kernel传参的一种使用方式,为什么说最不用操心呢?因为你需要传参给kernel的东西已经都被uboot准备好了。

这同时也是最接近真实FPGA板启动过程的方式,启动参数如下:

-pflash bootstrap.bin -mtdblock firmware -serial stdio -m 32M

当你要运行qemu的时候,拿出已经build好的bootstrap.bin和firmware即可。注意firmware必须是nand build方式产生的。

bootstrap放在nor flash(-pflash)里,firmware放在nand flash(-mtdblock)里,可以注意到上面传参方式的差别。

firmware里面包含3部分:u-boot、kernel和rootfs,另外还有一个空白空间,每个部分占用一个逻辑分区。

启动过程如下:

1.         bootstrap.bin会被加载到memory的0地址,并开始运行

2.         bootstrap从nand里面取出u-boot放到memory并运行

3.         u-boot为kernel设置好传入参数和环境变量,将kernel从nand取出,加载到内存并运行。

4.         kernel从nand挂载rootfs,完成初始化动作

5.         rootfs脚本将nand空白分区挂载到etc目录,完成启动。

此方式与前一种启动方式相比,好处是省掉了bootstrap,启动时也无需读取加载u-boot,这样省掉了不少启动时间。

坏处是要自己配kernel启动参数,其实也不是难事,怎样配见下表。

-kernel zImage -serial stdio -mtdblock firmware -append "cOnsole=ttyS0 init=/linuxrc root=/dev/mtdblock4" -net nic,macaddr=00:14:78:00:01:03 -old-param

为什么这里就要配kernel启动参数,而前一种启动方法不用呢?

因为前一种方法,u-boot启动后帮你配好了启动参数再启动的kernel。

相当于前一种方法是bootstrap+uboot+kernel+rootfs

这一种方法是qemu bootloader+kernel+rootfs,所以bootloader要代劳u-boot了。

u-boot怎样传参,我们就怎样传参给kernel。这里有几个要注意的:

1.         root=/dev/mtdblock4 rootfs在nand的第4个分区,那么挂载点要变一下咯~

2.         -old-param uboot使用旧式方法传参,也就是将参数排到内存的固定地址(0x100),那么我们也照办。

3.         -net nic,macaddr=00:14:78:00:01:03 u-boot通过serial_low和serial_high环境变量传给kernel mac地址,所以我们对qemu代码的boot过程做了一点小修改,将mac地址参数值存放到serial_low和serial_high的对应位置。(注意:使用了-old-param,这个参数才会有效)

顾名思义,后面跟kernel档。可以是zImage、uImage、Image、u-boot.elf、u-boot.bin。

5.2    -initrd

后面跟文件系统,支持的格式有很多如cramfs、jffs、cpio,能否挂载起来要看kernel支不支持。

5.3    -append

kernel的启动参数,后面最好用引号(”)引起来。常用的kernel参数如下:

1.         console:常与qemu的-serial搭配使用。常见取值有

a)         ttyS0:串口0

b)        ttyS1:串口1

c)         ttyAMA0:调试kernel的终端

d)        tty0:虚拟终端0

e)         tty1:虚拟终端1

2.         root,指定根文件系统的挂载点,常用取值有

a)         /dev/ram:文件系统在内存里

b)        /dev/ram0:文件系统在内存里

c)         /dev/nfs:NFS文件系统

d)        /dev/mtdblock*:文件系统在nand里。*的值看分区方式

3.         ramdisk_size=%dK

a)         ramdisk默认8192K,如果实际size大于8192则引导时会报出错误

b)        通过此参数来指定实际大小,与rootfs文件大小一致

4.         nfsroot

a)         是NFS文件系统才有用,用来指定NFS所在位置

b)        值的格式为:[IP]:/[FOLDER PATH]。eg.”nfsroot=172.21.2.76:/root/SONiX_NFS”,IP在root server确定时可以省略。

5.         rw

a)         文件系统读写权限,这里是可读可写

b)        其他可选值有ro

6.         init

a)         挂载根文件系统后第一个执行的程序或脚本

b)        常见的有/sbin/init,/linuxrc,/usr/init,因具体文件系统而异

7.         ip:值格式为

a)         [ip] : [boot/root server ip] : [gateway ip] : [netmask]。 eg.”ip=10.0.2.15:10.0.2.2:10.0.2.1:255.255.255.0”

b)        可以自动分配的话写为”ip=dhcp”即可

8.         nousb

a)         不启用usb功能

5.4    -old-param

设定kernel传参方式,目前是为了向kernel传入macaddr信息

5.5    -rtc

用于设定系统时间,格式如下

-rtc [base=utc|localtime|date][,clock=host|vm]

常用的是-rtc base=localtime

5.6    -serial dev

指定qemu内串口数据的输出方向,dev的取值:

stdio 标准IO

vc   虚拟终端

pty  伪tty

null  空设备

/dev/XXX 使用主机的tty,如/dev/ttyS0 /dev/parportN

filename 写入文件

通常我们取值stdio,这样就能够在控制台输出了。

5.7    -net

用于设定网络模式,一般有两种模式:user和tap

默认为user模式,缺省参数为”-net user -net nic”

网络选项:

5.7.1   -net nic[,vlan=n][,macaddr=addr]

用来设定虚拟网卡,

目前n的取值可以为0~7

addr形式为00:14:07:00:01:03,当局域网络限制mac时,此功能很有用

5.7.2   -net user[,vlan=n]

全部参数如下:

-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n]

         [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]

         [,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]]

用来设定guest os为user模式。

user模式其实是QEMU虚拟的NAT模式。原理图如下:

 

此模式下Host数据通过QEMU流入guest os时,host ip被解释为虚拟的ip。

默认情况下,local ip:10.0.2.15 host ip:10.0.2.2 DHCP server:10.0.2.15 DNS server:10.0.2.3

此模式只可实现Guest OS与Host OS的单向通信,即Guest OS可以访问Host OS的端口,但反过来就不行。怎样才能可以呢?

我们有如下参数可以配合user mode使用:

-redir [tcp|udp]:host-port:[guest-host]:guest-port

此法将连接到主机端口host-port的tcp或udp连接重定向到客户机端口guest-port上。guest-host未指定则默认值为10.0.2.15(DHCP默认地址)。

eg.

$qemu-system-arm -redir tcp :5555::23 [...]

$telnet localhost 5555

这样host就能够通过本机端口来访问qemu guest os的端口了。

但此法也有不便之处:只能静态映射端口,动态端口绑定就不给力了。

5.7.3   -net tap[,vlan=n][,fd=h][,ifname=name][,script=file] [,downscript=file]

用来设定guest OS为tap模式,在此模式下Guest OS能与任何网内机器互访。

此法需要host机配置网桥。原理图如下:

 

5.7.4   -net socket[,vlan=n]

全部参数如下:

-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,cOnnect=host:port]

                connect the vlan 'n' to another VLAN using a socket connection

-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]

                connect the vlan 'n' to multicast maddr and port

此模式用于两个或多个QEMU的VLan远程连接

5.8    -pflash

模拟nor flash设备卡,一般传入bootstrap.bin

5.9    ?mtdblock

模拟nand flash设备卡,一般传入烧写的firmware


推荐阅读
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
  • Linux 防火墙与端口管理必备命令
    在使用 Linux 系统进行服务部署和问题排查时,防火墙和端口管理是不可或缺的操作。本文将详细介绍如何查看防火墙状态、端口占用情况,以及如何开放和关闭端口,帮助初学者更好地掌握这些技能。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • Vi编辑器的工作模式有哪些?如何在不同模式间切换?
    Vi编辑器是Linux系统中常用的文本编辑工具,具备三种主要工作模式:命令模式、插入模式和底行模式。用户可以通过特定的按键组合在这些模式之间进行切换,以实现不同的编辑功能。例如,在命令模式下,用户可以执行移动光标、删除文本等操作;而在插入模式下,则可以输入或修改文本内容。底行模式则用于执行保存文件、退出编辑器等命令。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析
    首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ... [详细]
  • DNS服务一、概述1.全称:Domainnamesystem(域名系统)2.作用:1)正向解析: ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
author-avatar
陪-祥到最-後
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有