A Go unikernel running on x86 bare metal
github.com
github.com
I can see the lure on top of an hypervisor. You already have an actual kernel running which you can use it to administer the machine. Why pay the performance price of a full kernel in your vm if you are only going to run one application ?
On bare metal however, you will probably need to bundle a ton of things if you don't want to end up with an unmanageable device. That leaves the performance gain of compiling everything together or actually disposable devices (maybe for embedded?) as potential use cases I can envision. Is there more ?
I'm not the author, but running on bare metal is more fun than running in a hypervisor. And removing layers from your stack lets you see what the cost and value of the layers are. I've only done bootstrapping on x86 and 8-bit processors (which is just set your reset vector), but x86 has a lot of isoterric setup stuff, and learning about the magic is interesting, if not totally useful.
Also, some runtime environments have a lot of manageability within; probably less than an OS, but maybe enough. Not sure about Go.
Using virtualization provides a simple common layer, so host operating system can deal with drivers and guest operating system can deal with more interesting things.
Things like kernel malloc to setup pages and what not, mapping the device address, allocating interrupts, DMA (maybe), PCI, logging, maybe locking, basic c library stuff (memcpy etc). Some of those, you can probably just stub out, but some if it you have to do (badly or not). Some of that you probably need or want to build anyway.
It's a fair bit of work, but if you want to support a lot of hardware, it's probably less work than porting a bunch of drivers.
Depending on the unikernel design though, you can significantly reduce user/kernel context switches beyond what you can with a tuned general purpose OS, potentially to the point of always sitting in ring 0. How much difference that makes, of course depends on your application and the quality of your various kernels.
https://en.wikipedia.org/wiki/IBM_CP-40
I wonder how long it'll take the rest of the world to achieve that.
As an example if you have image inferencing project you might have a compute stick co-processor plugged in one slot and a camera in another. You might have a webapp as one application and ffmpeg in another. No reason not to isolate them as individual unikernels. Also, there's the case that one software team might have written one of those apps and a different team wrote the other.
I see it is only x86 right now.
I suspect this would require incorporation of some rPi-specific drivers, so it's a hard sell. Nevertheless this is perhaps more possible for rPi than for any other type of device because it's a well defined hardware target with a fixed BoM with no major part changes through the supported lifetime. I would support a kickstarter aiming to produce this for Pi.
tl;dr: a unikernel means there's no standard OS other than the runtime execution environment specifically just for Golang in this instance; which means it should be much faster and much more lean (at the price of not having standard tools like SSH and all)
To add to others points and your own which may not be as obvious to some but my background stems from the financial world and security has always been a problem, breach du jour. The way things are done now are nothing short of broken, PCI and more, and all the glue holding the shattered "window" panes together certainly doesn't lead to anything secure or even a "window" you can see through. I'm certain there are millions that will disagree, job security of course, but when one has maintained critical uptime services on M$ as long as I have one begins to question there must be a better way. Solve your own problems first I always say as I am currently architecting that path, the sixth time of my career actually but this occurrence is different entirely.
I didn't realize Go was a very common language in finance.
In short you are correct in using ONLY GO for absolutely EVERYTHING to reduce technical debt, ZERO TRUST architecture, automated everything and much much more. Might sound like hogwash to some but once more, if my past is an indication of my future as I love a challenge.
It is what you cannot see that matters most.
Though the distinction between "process" and "thread" gets very fuzzy when you have only a single address space.
OPS - https://ops.city can deploy to any public cloud and can run on openstack/kvm/vsphere as well.
&&
https://github.com/nanovms/ops-examples/tree/master/java
to get you started - i don't know any of our users that are using those in prod though atm