Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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 Diff line number Diff line
# This creates the demonstration utility "lguest" which runs a Linux guest.

# 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
CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include
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
# 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; }' > $@
all: lguest

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

File changed.

Preview size limit exceeded, changes collapsed.

+31 −41
Original line number 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
minimum of complexity.  Nonetheless, it should have sufficient
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:

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

Running Lguest:

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

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

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

  and I recommend:
  CONFIG_HZ=100 ("Timer frequency")[2]
  "General setup":
     "Prompt for development and/or incomplete code/drivers" = Y
        (CONFIG_EXPERIMENTAL=y)

  "Processor type and features":
     "Paravirtualized guest support" = Y
        "Lguest guest support" = Y
     "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"
  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
	  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.

- 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:
    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
       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
       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.

    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.

- 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
  the same network.  This file is created if it does not exist.

Lguest I/O model:

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.
There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest

Using an irq value of 0 unbinds the dma buffers.

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!
Good luck!
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 Diff line number Diff line
@@ -227,28 +227,40 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
	  If in doubt, say "Y".

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

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"

config VMI
	bool "VMI Paravirt-ops support"
	depends on PARAVIRT
	bool "VMI Guest support"
	select PARAVIRT
	depends on !(X86_VISWS || X86_VOYAGER)
	help
	  VMI provides a paravirtualized interface to the VMware ESX server
	  (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
	  provided by the hypervisor.

source "arch/x86/lguest/Kconfig"

endif

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

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

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

Loading