There are two parts to networking within QEMU:
- The virtual network device that is provided to the guest (e.g. a PCI network card).
- The network backend that interacts with the emulated NIC (e.g. puts packets onto the host's network).
#include <linux/module.h> | |
#include <linux/kernel.h> | |
#include <linux/device.h> | |
#include <linux/init.h> | |
#include <linux/fs.h> | |
#include <linux/mm.h> | |
#include <asm/uaccess.h> | |
#define MAX_SIZE (PAGE_SIZE * 2) /* max size mmaped to userspace */ | |
#define DEVICE_NAME "mchar" |
# Borrowed from: | |
# https://github.com/silven/go-example/blob/master/Makefile | |
# https://vic.demuzere.be/articles/golang-makefile-crosscompile/ | |
BINARY = superdo | |
VET_REPORT = vet.report | |
TEST_REPORT = tests.xml | |
GOARCH = amd64 | |
VERSION?=? |
// https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/ | |
// http://www.kegel.com/poller/ | |
/** Todo | |
* - [ ] Split i/o and logic | |
* - [ ] Unit test logic | |
* - [ ] Logging | |
* - [ ] Continuous integration | |
* - [ ] Linux | |
* - [ ] Windows |
// Package main demonstrates a problem with sockets. | |
// run it with: | |
// | |
// go build | |
// ./test 127.0.0.1:1234 | |
// | |
// Nevermind, found the problem (using select wrong) | |
// | |
package main |
Latency Comparison Numbers (~2012) | |
---------------------------------- | |
L1 cache reference 0.5 ns | |
Branch mispredict 5 ns | |
L2 cache reference 7 ns 14x L1 cache | |
Mutex lock/unlock 25 ns | |
Main memory reference 100 ns 20x L2 cache, 200x L1 cache | |
Compress 1K bytes with Zippy 3,000 ns 3 us | |
Send 1K bytes over 1 Gbps network 10,000 ns 10 us | |
Read 4K randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD |
import fcntl | |
import os | |
import struct | |
import subprocess | |
# Some constants used to ioctl the device file. I got them by a simple C | |
# program. | |
TUNSETIFF = 0x400454ca | |
TUNSETOWNER = TUNSETIFF + 2 |