Commit 0d681009 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-lguest: (45 commits)
  Use "struct boot_params" in example launcher
  Loading bzImage directly.
  Revert lguest magic and use hook in head.S
  Update lguest documentation to reflect the new virtual block device name.
  generalize lgread_u32/lgwrite_u32.
  Example launcher handle guests not being ready for input
  Update example launcher for virtio
  Lguest support for Virtio
  Remove old lguest I/O infrrasructure.
  Remove old lguest bus and drivers.
  Virtio helper routines for a descriptor ringbuffer implementation
  Module autoprobing support for virtio drivers.
  Virtio console driver
  Block driver using virtio.
  Net driver using virtio
  Virtio interface
  Boot with virtual == physical to get closer to native Linux.
  Allow guest to specify syscall vector to use.
  Rename "cr3" to "gpgdir" to avoid x86-specific naming.
  Pagetables to use normal kernel types
  ...
parents a98ce5c6 43d33b21
Loading
Loading
Loading
Loading
+3 −23
Original line number Original line Diff line number Diff line
# This creates the demonstration utility "lguest" which runs a Linux guest.
# This creates the demonstration utility "lguest" which runs a Linux guest.

CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include
# For those people that have a separate object dir, look there for .config
KBUILD_OUTPUT := ../..
ifdef O
  ifeq ("$(origin O)", "command line")
    KBUILD_OUTPUT := $(O)
  endif
endif
# We rely on CONFIG_PAGE_OFFSET to know where to put lguest binary.
include $(KBUILD_OUTPUT)/.config
LGUEST_GUEST_TOP := ($(CONFIG_PAGE_OFFSET) - 0x08000000)

CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -Wl,-T,lguest.lds
LDLIBS:=-lz
LDLIBS:=-lz
# Removing this works for some versions of ld.so (eg. Ubuntu Feisty) and
# not others (eg. FC7).
LDFLAGS+=-static
all: lguest.lds lguest


# The linker script on x86 is so complex the only way of creating one
all: lguest
# which will link our binary in the right place is to mangle the
# default one.
lguest.lds:
	$(LD) --verbose | awk '/^==========/ { PRINT=1; next; } /SIZEOF_HEADERS/ { gsub(/0x[0-9A-F]*/, "$(LGUEST_GUEST_TOP)") } { if (PRINT) print $$0; }' > $@


clean:
clean:
	rm -f lguest.lds lguest
	rm -f lguest
+882 −747

File changed.

Preview size limit exceeded, changes collapsed.

+31 −41
Original line number Original line Diff line number Diff line
@@ -6,7 +6,7 @@ Lguest is designed to be a minimal hypervisor for the Linux kernel, for
Linux developers and users to experiment with virtualization with the
Linux developers and users to experiment with virtualization with the
minimum of complexity.  Nonetheless, it should have sufficient
minimum of complexity.  Nonetheless, it should have sufficient
features to make it useful for specific tasks, and, of course, you are
features to make it useful for specific tasks, and, of course, you are
encouraged to fork and enhance it.
encouraged to fork and enhance it (see drivers/lguest/README).


Features:
Features:


@@ -23,19 +23,30 @@ Developer features:


Running Lguest:
Running Lguest:


- Lguest runs the same kernel as guest and host.  You can configure
- The easiest way to run lguest is to use same kernel as guest and host.
  them differently, but usually it's easiest not to.
  You can configure them differently, but usually it's easiest not to.


  You will need to configure your kernel with the following options:
  You will need to configure your kernel with the following options:


  CONFIG_HIGHMEM64G=n ("High Memory Support" "64GB")[1]
  "General setup":
  CONFIG_TUN=y/m ("Universal TUN/TAP device driver support")
     "Prompt for development and/or incomplete code/drivers" = Y
  CONFIG_EXPERIMENTAL=y ("Prompt for development and/or incomplete code/drivers")
        (CONFIG_EXPERIMENTAL=y)
  CONFIG_PARAVIRT=y ("Paravirtualization support (EXPERIMENTAL)")

  CONFIG_LGUEST=y/m ("Linux hypervisor example code")
  "Processor type and features":

     "Paravirtualized guest support" = Y
  and I recommend:
        "Lguest guest support" = Y
  CONFIG_HZ=100 ("Timer frequency")[2]
     "High Memory Support" = off/4GB
     "Alignment value to which kernel should be aligned" = 0x100000
        (CONFIG_PARAVIRT=y, CONFIG_LGUEST_GUEST=y, CONFIG_HIGHMEM64G=n and
         CONFIG_PHYSICAL_ALIGN=0x100000)

  "Device Drivers":
     "Network device support"
        "Universal TUN/TAP device driver support" = M/Y
           (CONFIG_TUN=m)
     "Virtualization"
        "Linux hypervisor example code" = M/Y
           (CONFIG_LGUEST=m)


- A tool called "lguest" is available in this directory: type "make"
- A tool called "lguest" is available in this directory: type "make"
  to build it.  If you didn't build your kernel in-tree, use "make
  to build it.  If you didn't build your kernel in-tree, use "make
@@ -51,14 +62,17 @@ Running Lguest:
	  dd if=/dev/zero of=rootfile bs=1M count=2048
	  dd if=/dev/zero of=rootfile bs=1M count=2048
	  qemu -cdrom image.iso -hda rootfile -net user -net nic -boot d
	  qemu -cdrom image.iso -hda rootfile -net user -net nic -boot d


  Make sure that you install a getty on /dev/hvc0 if you want to log in on the
  console!

- "modprobe lg" if you built it as a module.
- "modprobe lg" if you built it as a module.


- Run an lguest as root:
- Run an lguest as root:


      Documentation/lguest/lguest 64m vmlinux --tunnet=192.168.19.1 --block=rootfile root=/dev/lgba
      Documentation/lguest/lguest 64 vmlinux --tunnet=192.168.19.1 --block=rootfile root=/dev/vda


   Explanation:
   Explanation:
    64m: the amount of memory to use.
    64: the amount of memory to use, in MB.


    vmlinux: the kernel image found in the top of your build directory.  You
    vmlinux: the kernel image found in the top of your build directory.  You
       can also use a standard bzImage.
       can also use a standard bzImage.
@@ -66,10 +80,10 @@ Running Lguest:
    --tunnet=192.168.19.1: configures a "tap" device for networking with this
    --tunnet=192.168.19.1: configures a "tap" device for networking with this
       IP address.
       IP address.


    --block=rootfile: a file or block device which becomes /dev/lgba
    --block=rootfile: a file or block device which becomes /dev/vda
       inside the guest.
       inside the guest.


    root=/dev/lgba: this (and anything else on the command line) are
    root=/dev/vda: this (and anything else on the command line) are
       kernel boot parameters.
       kernel boot parameters.


- Configuring networking.  I usually have the host masquerade, using
- Configuring networking.  I usually have the host masquerade, using
@@ -99,31 +113,7 @@ Running Lguest:
  "--sharenet=<filename>": any two guests using the same file are on
  "--sharenet=<filename>": any two guests using the same file are on
  the same network.  This file is created if it does not exist.
  the same network.  This file is created if it does not exist.


Lguest I/O model:
There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest

Lguest uses a simplified DMA model plus shared memory for I/O.  Guests
can communicate with each other if they share underlying memory
(usually by the lguest program mmaping the same file), but they can
use any non-shared memory to communicate with the lguest process.

Guests can register DMA buffers at any key (must be a valid physical
address) using the LHCALL_BIND_DMA(key, dmabufs, num<<8|irq)
hypercall.  "dmabufs" is the physical address of an array of "num"
"struct lguest_dma": each contains a used_len, and an array of
physical addresses and lengths.  When a transfer occurs, the
"used_len" field of one of the buffers which has used_len 0 will be
set to the length transferred and the irq will fire.


Using an irq value of 0 unbinds the dma buffers.
Good luck!

To send DMA, the LHCALL_SEND_DMA(key, dma_physaddr) hypercall is used,
and the bytes used is written to the used_len field.  This can be 0 if
noone else has bound a DMA buffer to that key or some other error.
DMA buffers bound by the same guest are ignored.

Cheers!
Rusty Russell rusty@rustcorp.com.au.
Rusty Russell rusty@rustcorp.com.au.

[1] These are on various places on the TODO list, waiting for you to
    get annoyed enough at the limitation to fix it.
[2] Lguest is not yet tickless when idle.  See [1].
+22 −10
Original line number Original line Diff line number Diff line
@@ -227,28 +227,40 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
	  If in doubt, say "Y".
	  If in doubt, say "Y".


config PARAVIRT
config PARAVIRT
	bool "Paravirtualization support (EXPERIMENTAL)"
	bool
	depends on EXPERIMENTAL
	depends on !(X86_VISWS || X86_VOYAGER)
	depends on !(X86_VISWS || X86_VOYAGER)
	help
	help
	  Paravirtualization is a way of running multiple instances of
	  This changes the kernel so it can modify itself when it is run
	  Linux on the same machine, under a hypervisor.  This option
	  under a hypervisor, potentially improving performance significantly
	  changes the kernel so it can modify itself when it is run
	  over full virtualization.  However, when run without a hypervisor
	  under a hypervisor, improving performance significantly.
	  the kernel is theoretically slower and slightly larger.
	  However, when run without a hypervisor the kernel is

	  theoretically slower.  If in doubt, say N.
menuconfig PARAVIRT_GUEST
	bool "Paravirtualized guest support"
	help
	  Say Y here to get to see options related to running Linux under
	  various hypervisors.  This option alone does not add any kernel code.

	  If you say N, all options in this submenu will be skipped and disabled.

if PARAVIRT_GUEST


source "arch/x86/xen/Kconfig"
source "arch/x86/xen/Kconfig"


config VMI
config VMI
	bool "VMI Paravirt-ops support"
	bool "VMI Guest support"
	depends on PARAVIRT
	select PARAVIRT
	depends on !(X86_VISWS || X86_VOYAGER)
	help
	help
	  VMI provides a paravirtualized interface to the VMware ESX server
	  VMI provides a paravirtualized interface to the VMware ESX server
	  (it could be used by other hypervisors in theory too, but is not
	  (it could be used by other hypervisors in theory too, but is not
	  at the moment), by linking the kernel to a GPL-ed ROM module
	  at the moment), by linking the kernel to a GPL-ed ROM module
	  provided by the hypervisor.
	  provided by the hypervisor.


source "arch/x86/lguest/Kconfig"

endif

config ACPI_SRAT
config ACPI_SRAT
	bool
	bool
	default y
	default y
+3 −0
Original line number Original line Diff line number Diff line
@@ -99,6 +99,9 @@ core-$(CONFIG_X86_ES7000) := arch/x86/mach-es7000/
# Xen paravirtualization support
# Xen paravirtualization support
core-$(CONFIG_XEN)		+= arch/x86/xen/
core-$(CONFIG_XEN)		+= arch/x86/xen/


# lguest paravirtualization support
core-$(CONFIG_LGUEST_GUEST)	+= arch/x86/lguest/

# default subarch .h files
# default subarch .h files
mflags-y += -Iinclude/asm-x86/mach-default
mflags-y += -Iinclude/asm-x86/mach-default


Loading