通过前面的操作,我们已经可以创建一个带有我们自己的PCI的watchdog外设qemu 虚拟机了。

目的:

1. 了解我们的外设情况。

2. 为在guest中开发我们自己的linux PCI驱动程序做准备。

查看我们的watchdog设备

考虑到ubuntu对于 spice的支持不好。我们采用VNC显示。

-vnc 127.0.0.1:21 -vga cirrus -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline

启动qemu

$ sudo x86_64-softmmu/qemu-system-x86_64 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -device cstl-watchdog -device virtio-blk-pci,scsi=off,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/home/shhfeng/iso/image/ubuntu.12.04.img,if=none,id=drive-virtio-disk0,format=qcow2,cache=none  -net bridge,br=virbr2,helper=/home/shhfeng/qemu/debug/qemu-bridge-helper -net nic,model=virtio  -vnc 127.0.0.1:21 -vga cirrus -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline

在qemu的monitor中查看watchdog的信息:

(qemu) info qtree

 (qemu) info qtree
bus: main-system-bus
type System
dev: hpet, id ""
gpio-in
gpio-out
timers = (0x3)
msi = false
hpet-intcap = (0x4)
irq
mmio 00000000fed00000/
dev: kvm-ioapic, id ""
gpio-in
gsi_base = ()
irq
mmio 00000000fec00000/
dev: i440FX-pcihost, id ""
pci-hole64-size = ( EiB)
short_root_bus = ()
irq
bus: pci.
type PCI
dev: cstl-watchdog, id ""
expiration-ticks = (0xa)
addr = 05.0
romfile = ""
rombar = (0x1)
multifunction = false
command_serr_enable = true
class Class , addr :05.0, pci id 1af4: (sub 1af4:)
bar : i/o at 0xc070 [0xc07f]
dev: virtio-blk-pci, id "virtio-disk0"
class = ()
ioeventfd = true
vectors = (0x2)
indirect_desc = true
event_idx = true
drive = "drive-virtio-disk0"
logical_block_size = (0x200)
physical_block_size = (0x200)
min_io_size = ()
opt_io_size = ()
bootindex = (0x2)
discard_granularity = (0xffffffff)
cyls = ()
heads = ()
secs = ()
serial = ""
config-wce = true
scsi = false
x-iothread = ""
addr = 04.0
romfile = ""
rombar = (0x1)
multifunction = false
command_serr_enable = true
class SCSI controller, addr :04.0, pci id 1af4: (sub 1af4:)
bar : i/o at 0xc000 [0xc03f]
bar : mem at 0xfebd2000 [0xfebd2fff]
bus: virtio-bus
type virtio-pci-bus
dev: virtio-blk-device, id ""
drive = "drive-virtio-disk0"
logical_block_size = (0x200)
physical_block_size = (0x200)
min_io_size = ()
opt_io_size = ()
bootindex = (0x2)
discard_granularity = (0xffffffff)
cyls = (0x3fff)
heads = (0x10)
secs = (0x3f)
serial = ""
config-wce = true
scsi = false
x-iothread = ""
dev: PIIX4_PM, id ""
smb_io_base = (0xb100)
disable_s3 = ()
disable_s4 = ()
s4_val = (0x2)
acpi-pci-hotplug-with-bridge-support = true
addr = 01.3
romfile = ""
rombar = (0x1)
multifunction = false
command_serr_enable = true
class Bridge, addr :01.3, pci id : (sub 1af4:)
bus: i2c
type i2c-bus
dev: smbus-eeprom, id ""
address = (0x57)
dev: smbus-eeprom, id ""
address = (0x56)
dev: smbus-eeprom, id ""
address = (0x55)
dev: smbus-eeprom, id ""
address = (0x54)
dev: smbus-eeprom, id ""
address = (0x53)
dev: smbus-eeprom, id ""
address = (0x52)
dev: smbus-eeprom, id ""
address = (0x51)
dev: smbus-eeprom, id ""
address = (0x50)
dev: piix3-ide, id ""
addr = 01.1
romfile = ""
rombar = (0x1)
multifunction = false
command_serr_enable = true
class IDE controller, addr :01.1, pci id : (sub 1af4:)
bar : i/o at 0xc060 [0xc06f]
bus: ide.
type IDE
dev: ide-cd, id "ide0-1-0"
drive = "drive-ide0-1-0"
logical_block_size = (0x200)
physical_block_size = (0x200)
min_io_size = ()
opt_io_size = ()
bootindex = (0x1)
discard_granularity = (0x200)
ver = "1.7.90"
wwn = ()
serial = "QM00003"
model = ""
unit = ()
bus: ide.
type IDE
dev: virtio-net-pci, id ""
ioeventfd = false
vectors = (0x3)
indirect_desc = true
event_idx = true
any_layout = true
csum = false
guest_csum = false
gso = true
guest_tso4 = false
guest_tso6 = false
guest_ecn = false
guest_ufo = false
host_tso4 = false
host_tso6 = false
host_ecn = false
host_ufo = false
mrg_rxbuf = true
status = true
ctrl_vq = true
ctrl_rx = true
ctrl_vlan = true
ctrl_rx_extra = true
ctrl_mac_addr = true
ctrl_guest_offloads = true
mq = false
mac = "52:54:00:12:34:56"
vlan =
netdev = "hub0port1"
bootindex = - (0xffffffffffffffff)
x-txtimer = (0x249f0)
x-txburst = (0x100)
tx = ""
addr = 03.0
romfile = "efi-virtio.rom"
rombar = (0x1)
multifunction = false
command_serr_enable = true
class Ethernet controller, addr :03.0, pci id 1af4: (sub 1af4:)
bar : i/o at 0xc040 [0xc05f]
bar : mem at 0xfebd1000 [0xfebd1fff]
bar : mem at 0xffffffffffffffff [0x3fffe]
bus: virtio-bus
type virtio-pci-bus
dev: virtio-net-device, id ""
mac = "52:54:00:12:34:56"
vlan =
netdev = "hub0port1"
bootindex = - (0xffffffffffffffff)
x-txtimer = (0x249f0)
x-txburst = (0x100)
tx = ""
dev: cirrus-vga, id ""
vgamem_mb = (0x8)
addr = 02.0
romfile = "vgabios-cirrus.bin"
rombar = (0x1)
multifunction = false
command_serr_enable = true
class VGA controller, addr :02.0, pci id :00b8 (sub 1af4:)
bar : mem at 0xfc000000 [0xfdffffff]
bar : mem at 0xfebd0000 [0xfebd0fff]
bar : mem at 0xffffffffffffffff [0xfffe]
dev: PIIX3, id ""
addr = 01.0
romfile = ""
rombar = (0x1)
multifunction = true
command_serr_enable = true
class ISA bridge, addr :01.0, pci id : (sub 1af4:)
bus: isa.
type ISA
dev: isa-fdc, id ""
iobase = (0x3f0)
irq = (0x6)
dma = (0x2)
driveA = "floppy0"
driveB = ""
bootindexA = - (0xffffffffffffffff)
bootindexB = - (0xffffffffffffffff)
check_media_rate = true
isa irq
dev: port92, id ""
dev: vmmouse, id ""
dev: vmport, id ""
dev: i8042, id ""
isa irqs ,
dev: isa-parallel, id ""
index = ()
iobase = (0x378)
irq = (0x7)
chardev = "parallel0"
isa irq
dev: isa-serial, id ""
index = ()
iobase = (0x3f8)
irq = (0x4)
chardev = "serial0"
wakeup = ()
isa irq
dev: isa-pcspk, id ""
iobase = (0x61)
dev: kvm-pit, id ""
gpio-in
iobase = (0x40)
lost_tick_policy = "delay"
dev: mc146818rtc, id ""
base_year = ()
lost_tick_policy = "discard"
dev: kvm-i8259, id ""
iobase = (0xa0)
elcr_addr = (0x4d1)
elcr_mask = (0xde)
master = false
dev: kvm-i8259, id ""
iobase = (0x20)
elcr_addr = (0x4d0)
elcr_mask = (0xf8)
master = true
dev: i440FX, id ""
addr = 00.0
romfile = ""
rombar = (0x1)
multifunction = false
command_serr_enable = true
class Host bridge, addr :00.0, pci id : (sub 1af4:)
dev: fw_cfg, id ""
ctl_iobase = (0x510)
data_iobase = (0x511)
irq
mmio ffffffffffffffff/
mmio ffffffffffffffff/
dev: kvmclock, id ""
irq
dev: kvmvapic, id ""
irq
dev: icc-bridge, id ""
irq
mmio 00000000fee00000/
bus: icc
type icc-bus
dev: kvm-apic, id ""
id = ()
vapic = true
dev: qemu64-x86_64-cpu, id ""
pmu = false
hv-spinlocks = - (0xffffffffffffffff)
hv-relaxed = false
hv-vapic = false
hv-time = false
check = false
enforce = false

可以找到我们的watchdog设备:

dev: cstl-watchdog, id ""
        expiration-ticks = 10 (0xa)
        addr = 05.0
        romfile = ""
        rombar = 1 (0x1)
        multifunction = false
        command_serr_enable = true
        class Class 0880, addr 00:05.0, pci id 1af4:0101 (sub 1af4:1100)
        bar 0: i/o at 0xc090 [0xc09f]
有些激动。

在guest中查看watchdog的信息。

$ lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 Ethernet controller: Red Hat, Inc Virtio network device
00:05.0 System peripheral: Red Hat, Inc Device 0101 (rev 01)
00:06.0 SCSI storage controller: Red Hat, Inc Virtio block device

可以看到我们的device设备, Red Hat, Inc Device 0101 (rev 01),这个我们的代码中定义的是一致的。

static void cwd_class_init(ObjectClass *klass, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(klass);
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);

    k->init = cwd_realize;
    k->exit = cwd_unrealize;
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
    k->device_id = 0x0101;
    k->revision = 0x01;
    k->class_id = PCI_CLASS_SYSTEM_OTHER;
    dc->reset = cwd_reset;
    dc->vmsd = &vmstate_cwd;
    dc->props = cwd_properties;
}

在guest中,查看watchdog的配置寄存器

$ lspci -x
00:05.0 System peripheral: Red Hat, Inc Device 0101 (rev 01)
00: f4 1a 01 01 03 01 00 00 01 00 80 08 00 00 00 00
10: 91 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 f4 1a 00 11
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

[虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(四)的更多相关文章

  1. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(九)

    目的 1. 使用verilog/vhdl设计一个PCI的watchdog设备. 2. 通过systemverilog 写testbench. 很久之前研究过AC97的verilog代码.但是很久没用v ...

  2. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(一)

    目的: 结合现在比较流行的技术,通过一个demo 展示一个全栈式设计的各种技能. 一个全栈式的工程师,应该能设计通过verilog/VHDL做logical设计.能写内核驱动,能架站. 要熟悉veri ...

  3. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(六)

    目的: 1. 为我们自己的watchdog写一个驱动 步骤: 通过之前的介绍,我们很容易猜想到写我们基于PCI的watchdog驱动,可以分2个步骤. 1. 探测加载PCI设备 这部分代码跟我们的设备 ...

  4. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(二)

    这篇文章的理解,需要一些专业知识了. 我们可以创建模拟自己的外设吗? 我们已经知道什么是qemu了,我们可以通过qmeu的提供的外设,DIY一个计算机了. 但是我们可能还不满足,我们可以自己制造一个外 ...

  5. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(八)

    目的: 1. 通过网页读取watchdog的信息 2. 通过网页设置watchdog 准备工作: 1. 选择一个web框架,选用 cherrypy $ sudo apt-get install pyt ...

  6. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(五)

    目的: 1. 了解PCI的基本知识,为完成watchdog的设备做准备. 准备知识: 简单的说,PCI 设备分3个空间. 配置空间,IO空间,内存地址空间. PCI设备厂家决定了外设是使用IO空间还是 ...

  7. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(七)

    目标: 1. 完成最终的设备驱动,增加具体的watchdog设备操作的代码. 测试代码: 代码最终实现见cwd_demo.c 代码只实现了read与write.  没有实现ioctl. 因此,我们可以 ...

  8. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(三)

    我们已经设计了一个基于qemu的watchdog了.下一步工作就是创建一个含有我们的watchdog的虚拟计算机器了. 准备工作: 1. 使用virt-manager或者virsh创建一个虚拟机器. ...

  9. 从零开始的全栈工程师——利用CSS3画一个正方体 ( css3 )

    transform属性 CSS3的变形(transform)属性让元素在一个坐标系统中变形.transform属性的基本语法如下: transform:none | <transform-fun ...

随机推荐

  1. php 字符串是否存在

    /** * 方法库-字符串是否存在 * @param string $str :字符或字符串 * @param string $string :字符串 * @return string 例子: $st ...

  2. 快速开启Safari的私密浏览(快捷键创建)

    正常使用Safari浏览器,都会保存你的浏览记录.搜索记录,包括你的浏览习惯,经常去哪些网站等等.这样的好处是可以帮助你更快速的进入自己需要的网站,节约很多时间. 但有些情况下,你还是会偏向于选择私密 ...

  3. android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效

    android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效    在之前的版本中都是在Man ...

  4. 【Daily】 2014-4-23

    KEEP GOING Think more product when face difference Check value null when insert/remove/update/add ch ...

  5. 查询无序列表中第K小元素

    当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素.这种方法的运行时间为O(n log(n)). 无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i. ...

  6. 网易云课堂_程序设计入门-C语言_第五周:函数_2完数

    2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...

  7. xshell使用命令总结

    这个工具主要是链接linux 并且可以从linux上面下载文件到本地 还有上传本地文件到linux上面 下载首先需要压缩打包命令为: tar -cf am_mailer.tar * sz am_mai ...

  8. C#反射的应用【转】

    摘要: 对于反射贫道也是很陌生的,所以趁现在有时间就把反射看了一下,记下笔记!!! 初始听说反射是可以动态的调用程序集,并从中来获取相应的方法和属性,感觉比较神奇,,, 反射的定义:反射(Reflec ...

  9. js生成随机数的方法实例总结 [收藏]

    js生成随机数的方法实例总结 js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任 ...

  10. 第四章SignalR自托管主机

    第四章SignalR自托管主机 SignalR服务器通常在IIS的Asp.Net应用程序上承载,但它也可以使用自托管库来作为自托管的主机来运行(就像控制台应用程序或Windows服务那样)与Signa ...