15 ms·
A high-speed network driver written in C, Rust, Go, C#, Java
- AlEinstein 7y agoSurprisingly good performance for the C# implementation!
- acchow 7y agoAstonished to see it perform so much faster than Ocaml. I had to double-check to see that they compiled a native binary (ocamlopt) https://github.com/ixy-languages/ixy.ml/blob/master/app/dune#L7 https://github.com/ixy-languages/ixy.ml/blob/master/app/dune...
- baylisscg 7y agoMicrosoft has been tinkering with systems stuff in C# for years so I'm not surprised[1] 1 - https://en.wikipedia.org/wiki/Singularity_(operating_system) https://en.wikipedia.org/wiki/Singularity_(operating_system)
- jcranmer 7y agoFor me, that was the line that surprised me the most. The .NET VM has had a reputation as being a worse variant of the JVM, but it seems that now the tables have turned.
- fortran77 7y agoReally? To me it was always a runtime VM done right! The .net CLR is much more stable, leak-proof, and performant in my experience. I have .net services that run on servers for years without ever being restarted. Given that C# and "Rust" are neck and neck, I'd rather have a nice GC language to work with.
- thethirdone 7y agoGo and C# are pretty much neck and neck until the batch size gets large. Rust is always ahead of C#.
- littlestymaar 7y agoC and Rust are really close, but if you look at latency C# is still lagging behind (Go performs way better in that regard).
- kasey_junk 7y agoI’d guess (cause I’m lazy and don’t want to verify the code) that it’s because the CLR has much better unmanaged support. It’s a first class feature.
- Someone1234 7y agoIndeed. It was designed to interact with C APIs directly from day 1 and they've made it more powerful fairly recently with Span<T> and Memory<T> (essentially "safe pointers"). You can literally develop entire applications in unsafe mode, with C's level of unsafety. Nobody does, but you could.
- manigandham 7y agoWhere did you see that? I've never come across that reputation before, only that the JVM has more usage (in high-perf scenarios) because it was cross-platform and had a bigger community. .NET always had very good performance and the new .NET Core cross-platform framework and runtime is now consistently among the fastest in various performance benchmarks for all kinds of applications.
- manigandham 7y agoThe new cross-platform .NET Core framework and runtime has major performance upgrades in the last few years and the newest v3.0 release [1] in a few weeks will have even more including hardware intrinsics [2]. There are several optimizations I can see in the C# source to make this implementation even faster. 1. https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/ https://devblogs.microsoft.com/dotnet/performance-improvemen... 2. https://devblogs.microsoft.com/dotnet/hardware-intrinsics-in-net-core/ https://devblogs.microsoft.com/dotnet/hardware-intrinsics-in...
- BuckRogers 7y agoAs someone on Team C#, I bet my career on it after careful consideration and comparison with every other option I had on the table, I had the exact same thought. But it's Microsoft, in my opinion they know software better than anyone around. They cover a lot of ground and fail sometimes but overall I consistently have high expectations from them. I use their platform everyday. Good work, Microsoft!
- romanovcode 7y agoIf only the MS stigma would go away people would realise how amazing C# language is.
- OrangeMango 7y agoThe MS stigma isn't going to go away as long as MS insists on shipping telemetry with .Net core.
- BuckRogers 7y agoI agree, but to me that's an odd phenomenon. I didn't grow up with that stigma and not sure what age/group it affects more. I started on a Commodore, which used Commodore BASIC (based on Bill Gate's Microsoft BASIC). As far as business criticism against them, I view the underlying economic system that allows and perpetuates it as the culprit. Not a single entity like MS, Amazon, Oracle etc. I'm not a cherry-picker, not productive and it's not rational. Bad actors are smacked down and it would be all of them if they thought they could get away with it. I'm in favor of changing the business model, not harping on the "new bad guy" every few years. Today it seems to be Google. I think it's mostly a lack of insightfulness and thought that leads to cherry-picking bad guys when the system is structured in a way where unscrupulous behavior is worth risking. I could be wrong, maybe Microsoft is evil incarnate but at the level I operate on, I don't see it. But yes, no reason to not embrace the good parts from Microsoft, or anyone else. That's how I do it. I chose C# to stick with because I believe in what they're doing around it. Huge fan of Blazor, appreciate their focus on long-term support, their product integration, and their excellent tooling. The language is good, and I can get a job doing it anywhere in the country without being in a major metropolitan area. In some of these metrics, I personally don't think you can beat the C# ecosystem.
- fgonzag 7y agoUnsurprising if you've kept up with .net The new primitive types (spans) allow direct low level manipulation of memory slices. A NIC driver, at it's core, really only copies data to and from shared buffers, so it gets a tremendous benefit from this new type. C# recently getting new low level memory types definitely gave it the edge there, it does not reflect real world scenarios very accurately.
- creato 7y ago> C# recently getting new low level memory types definitely gave it the edge there, it does not reflect real world scenarios very accurately. In my experience, C# is by a large margin the most performant "managed" language vs. Java, Python.
- fgonzag 7y agoIf you go down to bytecode engineering you can create some seriously fast JVM code. But I agree that making .net go fast seems easier than getting the JVM to go fast (if anything because many of the standard libraries are anything but fast, and you have to go hunting for high performance ones or roll your own).
- GordonS 7y agoWas going to say much the same thing. I ported a C hash function to C# recently, and using the low-level feature that C# offers, performance was very close to the C version. C# is really nice to work with for this kind of thing. And - .NET Core 3.0 introduced support for hardware intrinsics, so I could probably bridge the gap if I spent some time on vectorisingthe C# code.
- chrisaycock 7y agoA specific finding from this research is on the front page: https://news.ycombinator.com/item?id=20944403 https://news.ycombinator.com/item?id=20944403 Rust was found to be slightly slower than C because of bounds checking, which the compiler keeps even in production builds.
- mlindner 7y agoExcept their answer is wrong, because Rust (LLVM rather) does eliminate bounds checks. They're comparing GCC vs LLVM here more than they are comparing C vs Rust. They should have compiled their C code in LLVM. Their implementation is littered with uses of "unsafe" which means its almost impossible for the compiler to eliminate the bounds checks.
- gameswithgo 7y agollvm cannot always eliminate bounds checking and gcc vs llvm does not explain all of the difference
- csande17 7y ago> Their implementation is littered with uses of "unsafe" which means its almost impossible for the compiler to eliminate the bounds checks. Does `unsafe` actually impede optimization in this way? I thought it just disabled certain type checks and error messages but didn't affect anything on the LLVM level.
- dbaupp 7y agoYou're essentially right. The grandparent may be meaning that they're using a lot of raw pointers (which requires unsafe), and raw pointers means less aliasing information, and so less precise optimisations. This can affect bounds checks, because a raw pointer could potentially alias the length field of a slice or vector, and so LLVM has to be conservative around writes to them.
- leshow 7y ago
- azhenley 7y agoThe fact that Go is slower than C# really amazes me! Not long ago I switched from C# to Go on a project for performance reasons, but maybe I need to go back.
- zeeboo 7y agoIt’s only slower at the highest batch sizes. I’d say their performance on throughput here is comparable, except the Go version has much better latencies (don’t be confused by the first graph like I was: that green line at the top is actually javascript).
- ummonk 7y agoThanks. I was looking at that and scratching my head as to why Go's latency was so bad here...
- apta 7y agoWhat made you come to the conclusion that golang was faster than C#? The hype and claims we see in blogs that are not backed up by anything? Both C# and Java are faster than golang.
- gouggoug 7y agoSaying "The hype and claims we see in blogs that are not backed up by anything?" followed by "Both C# and Java are faster than golang" without substantiating the claim is the pot calling the kettle black. If you do have links to share, however, please do.
- hermitdev 7y agoUsually where I see C# slow down is not because of the language, but because of over engineered "enterprisey" solutions that Java has a bad rep for e.g. having things like a FactoryProviderFactory type idioms. A lot of the projects I work on, for instance, heavily utilize dependency injection for no gain. There's only one implementation, theres no test mocks. Its just overengineered and obsfuscated for no reason. Coming from a predominantly C++ background, we eschew virtual wherever possible, favoring compile time polymorphism to runtime whenever possible, because we're cognizant of the overhead of the indirect dispact and likely loss of optimized opportunities to inline trivial calls. For sure, one can write C# or Java that can keep up, or even outperform C++ in some circumstances, but youre not going to do it with "enterprise" patterns hiding behind interfaces and factories and dependency injection.
- userbinator 7y agoCross-language comparisons are always interesting to look at; if I had the time, I'd really like to write one in Asm and see how it compares. I've written NIC drivers for some older chipsets, and IMHO it's not something that's particularly "algorithmic" in computation or could necessarily show off/exercise a programming language well; what's really measured here is probably an approximation to how fast these languages can copy memory, because that's ultimately what a NIC driver mostly does (besides waiting.) To send, you put the data in a buffer and tell the NIC to send it. To receive, the NIC tells you when it has received something, and you copy the data out. Nonetheless, the astonishingly bad performance of the Python version is surprising. Although I haven't looked at the source in any detail, I know that newer NICs do a lot more of the processing (e.g. checksums) that would've been done in the host software, so that would be another way in which the performance of the host software wouldn't be evident. One other thing I'd like to see is a chart of the binary sizes too (with and without all the runtime dependencies).
- ummonk 7y agoYeah, for real life applications as well, I shy away from Python for anything where performance might one day be an issue. Most languages can at least get within an order of magnitude of state of the art (at which point ergonomic considerations can matter more), but Python is just incredibly slow in practice.
- mr__y 7y ago>I shy away from Python for anything where performance might one day be an issue if there are only a few bottlenecks that have a significant impact on the performance you could rewrite only those parts to C/Rust. This might be a good aproach especially in a situation where performance is not an issue right now but might be in future. When it actually becomes an issue only the part that actually affects the performance could then be rewritten to C. Of course this approach doesn't always make much sense, but quite often there is a small part of the code that impacts the performance the most and only that part would need to be rewritten, while the rest of the code could still enjoy a language more productive to write in. Similarly a microservice(ish) architecture comes handy with this
- molyss 7y agoThat's a very interesting experiment in many levels. Haven't taken the time to look at the paper yet, but I'm curious of how you got your number of pps vs Gb/s in the README : "full bidirectional load at 20 Gbit/s with 64 byte packets (29.76 Mpps)". sounds like 20Gb/s should be closer to 40Mpps than to 30Mpps. Did you hit CPU limits on the packet generator, or am I missing some packet header overhead ? Did you try bigger that 64-byte packets ? I'm curious how various runtimes would handle that. And how long did you run the benchmarks ? I couldn't really figure it out from the github or the paper. Mostly wondering if java and other Gc'd language showed improvement or degradation over time. I could see the JITs kicking in, but I could also see the GCs causing latency spikes.
- benou 7y ago> am I missing some packet header overhead ? Yes: Ethernet adds 20 bytes: 8 byte preamble/start of frame delimiter + 12 byte interframe gap => the "on-the-wire" size is actually 84-bytes => 20Gbps/84-bytes = 29.76Mpps > Did you try bigger that 64-byte packets ? I'm curious how various runtimes would handle that. In typical forwarding, packet size does not impact forwaring that much until you hit some bandwidth limit (PCIe, DDR and/or L3 cache) because you only touch the packet header (typically the 1st 64-bytes cacheline in the packet). The data transfer itself will be done by NIC DMA.
- emmericp 7y agoPCIe bandwidth also decreases with increasing packet size as there's a lot of overhead per packet. Memory isn't used, it's all handled in cache, hitting main memory is super slow.
- yaantc 7y agoYou're only considering the MAC level size of 64 bytes but there is also the physical layer overhead, which pushes the effective size of a packet to 84 bytes (see [1]) with a 7 bytes preamble, a 1 byte start of frame delimiter and 12 bytes of inter-packets gap. If you use 84 bytes with 20 Gbps you get the 29.76 Mpps. [1] https://en.wikipedia.org/wiki/Ethernet_frame https://en.wikipedia.org/wiki/Ethernet_frame
- kerng 7y agoCool to see C# being up there close to C and before Golang. I haven't used C# much over the last year due to job change but always felt like one of the most mature languages out there. Now working in Go and it's a bit frustrating in comparison.
- tylerl 7y agoGo isn't designed to feel mature, it's designed to be boring and effective. It's designed to keep code complexity low even as the complexity of problems and solutions increases. It's designed to allow large teams of medium-skill programmers to consistently produce safe and effective solutions. The most precise description ive heard to date is: "Go is a get shit done language."
- dev_dull 7y agoI didn’t read the thesis for each implementation, but it would have been cool to see how long it took an engineer to write each network driver. I bet the Go version, while definitely not the fastest, was one of the fastest to finish.
- pjmlp 7y agoBasically it is designed for writing boilerplate libraries and code generators to cover up lack of language features, which even well known projects are forced to make use of (k8s). I bet a G2EE variant isn't too far away.
- chvid 7y agoSo why the difference in "language" speeds? You have some the results not quite following the conventional expectation. For example the Swift implementation is as slow as JavaScript. JavaScript is a lot faster than Python. Java is considerable slower than the usually very similar C#. The implementation is fairly complex; so it is a bit hard to see what is going on. But it must be possible to pin the big performance differences implied by the two graphs to something?
- johnlinvc 7y agoSeems like the Swift slowness comes from ARC. > Unfortunately, the performance analysis shows, that the retain and release introduce a big performance hit, with little information on why exactly so many calls are necessary. https://github.com/ixy-languages/ixy.swift/blob/master/performance/LanguageFeatures.md https://github.com/ixy-languages/ixy.swift/blob/master/perfo...
- jsiepkes 7y agoI find the performance of Java rather suspicious. It starts out fast for the smallest batch's sizes but then kind of falls flat for the rest.
- ygra 7y agoPython is interpreted bytecode. This means that for every small instruction on the bytecode there's a round trip to the Python interpreter that has to execute that instruction. This is faster than parsing and interpreting at the same time, such as shells often do, but it's still a lot slower than JIT compilers. Now, a just-in-time (JIT) compiler transforms the code into machine code at runtime. Usually from bytecode. Java, C# JavaScript all use this model predominantly these days. This takes a bit of work during runtime and you cannot afford too complicated optimizations that a C or C++ compiler would do, but it comes close (and for certain reasons is even better sometimes). So that's the main reason why JavaScript is faster than Python. Theres a Python JIT compiler, PyPy, that might close the gap, though. And for Python in particular there are also other options to improve speed somewhat, one of them involves converting the Python code to C. Not too idiomatic, usually, though. As for Java and C#, that's a point where it can sometimes show that C# has been designed to be a high-level language that can drop down to low levels if needed. C# has pointers and the ability to control memory layout of your data, if you need it. This turns off a lot of niceties and safeties that the language usually offers (you also need the unsafe keyword, which has that name for a reason), but can improve speed. Newer versions of C# increasingly added other features that allow you to safely write code that performs predictably fast. But even value types and reified generics go a long way of making things faster by default than being required to always use classes and the heap. Java on the other hand has few of those features where the develop is offered low-level control. It has one major advantage, though, in that its own JIT compiler is a lot more advanced and can do some crazy transformations and optimizations. One might argue that Java needs that much magic because you don't have much control at the language level to make things fast, so as far as performance goes between C# and Java this may be pretty much the tradeoff between complicated language and complicated JIT compiler. As for which benchmark shows Java being faster than C# depends a bit on how the code was written, but recently .NET has become a lot better as well and popular multi-language benchmarks show C# often faster than Java.
- kyrra 7y agoThere is discussion about C# and Java being faster than Go, but one interesting thing to note is that both C# and Java have to use C to interface with the kernel. Java: https://github.com/ixy-languages/ixy.java/blob/master/ixy/src/ixy/c/ixy.c https://github.com/ixy-languages/ixy.java/blob/master/ixy/sr... C#: https://github.com/ixy-languages/ixy.cs/blob/master/src/ixy_c/ixy.c https://github.com/ixy-languages/ixy.cs/blob/master/src/ixy_... Java needs a bit more C to make it work. C# only seems to need it for DMA access. But when you look at the Go code, they got away with being pure Go and using the syscall and unsafe package. So that's at least one plus for Go. (the main readme calls this out, but at least one thing worth mentioning here too). As a Java coder for my day-job, I do like the breakdown they have of the performance of the different GCs for their Java implementation. https://github.com/ixy-languages/ixy-languages/blob/master/Java-garbage-collectors.md https://github.com/ixy-languages/ixy-languages/blob/master/J...
- pjmlp 7y agoYou can perfectly do in same in C# just like they did with Go. We do it all the time in Windows low level coding within .NET, the reason why they didn't beats me, most likely not knowledgeable enough of .NET capabilities. As for Java, hopefully with projects Valhala, Panama and Metropolis Java will finally have the performance language features that should have been part of Java 1.0.
- voltagex_ 7y agoPage 15 of https://www.net.in.tum.de/fileadmin/bibtex/publications/papers/ixy-writing-user-space-network-drivers.pdf https://www.net.in.tum.de/fileadmin/bibtex/publications/pape.... They couldn't access mlock in .NET. The amount of C involved is tiny.
- pjmlp 7y agoThe document has 14 pages and the only information I see is the mlock description, nothing about how they were unable to use System.Runtime.InteropServices, unsafe and DllImport to make use of it.
- saurik 7y agoThat JavaScript and Swift have essentially the same performance here is extremely telling: there are essentially four performance regimes (five if you count Python, but clearly from the graphs you should not ;P), and what would really be interesting--and which this page isn't bothering to even examine?! :(--is what is causing each of these four regimes. I want to know what is so similar about C# and Go that is causing them to have about the same performance, and yet much more performance (at higher batch sizes) than the regime of Java/OCaml/Haskell (a group which can't be explained by their garbage collectors as one of the garbage collectors tested for Java was "don't collect garbage" and it had the same performance). It frankly makes me expect there to be some algorithmic difference between those two regimes that is causing the difference, and it has nothing to do with language/runtime/fundamental performance.
- bsder 7y agoFor Java it could be binary wrangling. You have to do some weird things to unpack binary blobs in Java due to the lack of unsigned types. So, for performance you have to wrangle things through native ByteBuffers correctly or you will get killed.
- Gibbon1 7y ago> want to know what is so similar about C# and Go that is causing them to have about the same performance. I looked at the C# thesis. I think with care the programmer was able to reduce the amount of heap allocations and memory copying enough that it's similar to the mix in the go driver. I think also the modern processors ability to execute multiple instructions/code paths in parallel tend to negate the advantage efficiently compiled languages like C and go. So cache misses, heap allocation, and garbage collection tend to dominate over raw numbers of instructions executed.
- masklinn 7y ago> I want to know what is so similar about C# and Go that is causing them to have about the same performance, and yet much more performance (at higher batch sizes) than the regime of Java/OCaml/Haskell […] and it has nothing to do with language/runtime/fundamental performance. The authors specifically call out the issue of avoiding heap allocations when asked about Java v C# (as they're pretty similar languages), noting that they couldn't get under ~20 bytes allocated per forwarded packet in Java. C# (and Go) would have much better facilities to work entirely out of the stack, avoid memory copies and reuse allocations in the main loop. I expect Haskell and OCaml have similar issues.
- yc12340 7y agoI am calling in question validity of this project as a benchmark. The author asserts, that "it's virtually impossible to write allocation-free idiomatic Java code, so we still allocate... 20 bytes on average per forwarded packet". This sounds questionable, — does that mean, that he actually performs a JVM memory allocation for _every_ packet?! Furthermore, the specifics of memory management look murky. One implementation uses "volatile" C writes [1] (simply storing data to memory). Another implementations of the same thing uses a full CPU memory barrier [2]. Which one is right? In my opinion, significant inconsistencies between implementations render any comparison between them invalid. And when a whole cross-language test suite is written by one person, you can be sure, that they don't really excel in many of those languages. This is why I like Benchmark Game — all benchmarks are submitted by users, so they are a lot closer to how a real-world decent programmers can solve the problem. Still not perfect, but at least that counts as an attempt. 1: https://github.com/ixy-languages/ixy.java/blob/fcad50339e5372d7cc1cc53d7a7360bec04aaebd/ixy/src/main/java/de/tum/in/net/ixy/ixgbe/IxgbeTxQueue.java https://github.com/ixy-languages/ixy.java/blob/fcad50339e537... 2: https://github.com/ixy-languages/ixy.java/blob/fcad50339e5372d7cc1cc53d7a7360bec04aaebd/ixy/src/ixy/c/ixy.c https://github.com/ixy-languages/ixy.java/blob/fcad50339e537...
- masklinn 7y ago> The author asserts, that "it's virtually impossible to write allocation-free idiomatic Java code, so we still allocate... 20 bytes on average per forwarded packet". This sounds questionable The code is public, I'm sure they'd be happy to have your insight and fix this issue, it doesn't seem like they were happy about it.
- emmericp 7y agoJava reaches 52% of C speed in the benchmark game ("fastest measurement at the largest workload" data set, geometric mean), we reach 38%. Seems like our implementation is within a reasonable range for something that's usually not done in Java. A full memory barrier is not required, but some languages only offer that. For example, go had the same problem. It's not a bottleneck because it goes to MMIO PCIe space which is super slow anyways (awaits a whole PCIe roundtrip). And no, it obviously wasn't written by only one person but a team of 10. No, we are not saying that we allocate for every packet. We say that we allocate 20 bytes on average per packet.
- nicky19890202 7y agoThis is good.
- tylerl 7y agoIf you can't see or interpret the graphs (mobile browser, etc.) here's a quick description of the relative performance in terms that might be useful even without the graphs. Bidirectional forwarding, Packets per second: Here, the batch size matters; small batches have a lower packet rate across the board. Each language has increasing throughput with increasing batch size up to some point, and then the chart goes flat. Python is by far the slowest, not even diverging from the zero line. C is consistently the fastest, but flattens out at 16-packet batch at 27Mpps. Rust is consistently about 10% slower than C until C flattens out, then Rust catches up at the 32-packet batch size, and both are flat at 27Mpps. Go is every so slightly faster than C# until the 16-packet batch size where they cross (at 19Mpps), then C# is consistently about 2Mpps faster than Go. At the 256-packet batch size, C# reaches 27Mpps, and Go 25Mpps. Java is faster than C# and Go at very low batch sizes, but at 4 packets per batch Java slows down (10Mpps), and quickly reaches its peak of 11 to 12 Mpps. OCaml and Haskell follow a similar curve, with Haskell consistently about 15% slower than Java, and Ocaml somewhere between the two. Finally, Swift and Javascript are indistinguishable from each other, both about half the speed of Haskell across the board. Latency, at 90, 99, 99.9, 99.99.. etc., percentile. 1Mpps: All have zero-ish latency at the 90 percentile point, then Javascript latency quickly jumps to 150us, then again at 99.99%ile jumps again to 300us. C# is the next to increase: at the 99%ile mark there's a steady increase till it hits 40us at 99.99%ile. Then a steady increase to about 60us. Haskell keeps it at about 10us until 99.99%ile, then a steady increase to about 60us, and a sudden spike at the end to 250us. Java latency remains low until 99.95%ile, then it quickly spikes up reaching a max of 325us. Next OCaml spikes at around 99.99%ile, reaching a max of about 170us. Next comes Swift, with a maximum of about 70us. Finally, C, Rust, and Go have the lowest latency. Rust and C are indistinguishable, and Go latency diverges to about 20% higher than the other two at the 99.999%ile mark, where it sways, eventually hitting around 25us while C and rust hit about 22us.
- gnode 7y agoThe Rust page also compares the performance of the Rust implementation using prefetching, which slightly outperforms C for some batch sizes. https://github.com/ixy-languages/ixy.rs#performance https://github.com/ixy-languages/ixy.rs#performance It would be a bit of a cheat, as it isn't portable, but it would be nice to see prefetching in the C implementation for the sake of comparison.
- Katzenjammer 7y agoRust comes off looking good here, which to me is no surprise. C#'s really good showing was a surprise to me though. Microsoft has done some impressive work.
- mister_hn 7y agoIt misses C++
- pjmlp 7y agoWhile C++ is way better than using C, it doesn't forbid "writing C with C++ compiler", does rendering useless all the safety features it offers, if one isn't allowed to tame the team via static analysis tooling.
- antoinealb 7y agoThe author of this project presented it last year at CCC, here is the video: https://media.ccc.de/v/35c3-9670-safe_and_secure_drivers_in_high-level_languages https://media.ccc.de/v/35c3-9670-safe_and_secure_drivers_in_...
- ksangeelee 7y agoThanks, that was interesting. If anyone is excited enough to try driving peripherals in userspace via hardware registers, I can recommend starting with a Raspberry Pi, since it has several well documented peripherals (UART, SPI, I2C, DMA, and of course lots of GPIO), and the techniques described in this talk are transferable. A search for 'raspberry pi mmap' will yield a lot of good starting points.
- non-entity 7y agoIs there a compelling reason to write high level user mode drivers like this over traditional kernel drivers? I remember finding this repo a few years back and being fascinated.
- steveklabnik 7y agoFrom the paper: https://www.net.in.tum.de/fileadmin/bibtex/publications/papers/the-case-for-writing-network-drivers-in-high-level-languages.pdf https://www.net.in.tum.de/fileadmin/bibtex/publications/pape... > Drivers are written in C or restricted subsets of C++ on all production-grade server, desktop, and mobile operating systems. They account for 66% of the code in Linux, but 39 out of 40 security bugs related to memory safety found in Linux in 2017 are located in drivers. These bugs could have been prevented by using high-level languages for drivers.
- pjmlp 7y agoTraditional monolithic kernel drivers are on their way out, specially given security concerns. https://developer.apple.com/videos/play/wwdc2019/702/ https://developer.apple.com/videos/play/wwdc2019/702/ https://source.android.com/devices/architecture/hal-types https://source.android.com/devices/architecture/hal-types https://docs.microsoft.com/en-us/windows-hardware/drivers/develop/getting-started-with-universal-drivers https://docs.microsoft.com/en-us/windows-hardware/drivers/de...
- non-entity 7y agoInteresting. I suppose the ability to (almost?) debug drivers like I would any other user-mode applications could be a big win.
- deleted 7y ago[deleted]
- Shorel 7y agoRust has definitely earned my respect. Someone add D lang to this test! I want to know!