As you might already be aware, some very clever Windows users and tinkerers have managed to run a full Windows 10 ARM64 desktop operating system on a Raspberry Pi 3 Model B/B+ with the help of some modified binaries. Yes, I am talking about the full-fledged 64-bit desktop operating system found preinstalled on many laptop and desktop computers today. I decided to put this to the test and in the coming sections I will share my experiences and thoughts. This will most likely become a multi-part series of posts. Thus, this one will only focus on setting up the system and performing some basic tests.
The first question that probably comes to your mind at this point is, “Why on earth would someone want to install such big and clunky operating system on a low-end device like the Raspberry Pi 3?” The short answer is: “Because we can and because we’re curious!” The long answer is a bit more complex.
For me personally, Windows 10 IoT Core does not quite satisfy my tinkering needs as does it Linux counterpart Raspbian. IoT Core, while awesome, is designed for single App usage and it requires a second computer for development, deployment and debugging. In an ideal world I like to have my development toolchains on the hardware I develop for and test everything locally. Then, I do final testing on a second system that is an exact replica of my development machine. Another issue I have with IoT Core is that I like to develop unmanaged native binaries using C++ or lower level languages and access the hardware directly. With IoT Core, I must instead use a VM to manage everything for me, using more RAM and slowing things down. UWP Apps are great, but they are not always the best solution, either. My final issue with IoT comes from working remotely and across platforms: everything in my case must be cross compiled for ARM64 on an x86 or x86_64 system, which in turn complicates the process and can cause additional issues or headaches.
Wouldn’t it be exciting if we could someday install a Microsoft supported Windows desktop operating system and Visual Studio Code and be able to tinker straight from a Raspberry Pi on the fly? I think that would be very exciting and I would most certainly not carry around my desktop computer in the wild.
In the upcoming sections we will explore this possibility and find out if it’s even remotely viable to run a 64-bit Windows desktop operating system on a Raspberry Pi.
For our test to work, we need a second computer to download all the required binaries and set up the bootable system drive. Here are my most relevant system specs.
My laptop (Asus ZenBook UX305)
• OS: Windows 10 Pro v1809
• CPU: Intel Core m3-6Y30
• RAM: 8GB
• Storage: 120GB SATA SSD
• Networking: WLAN 5GHz 802.11ac
• SD-card reader
Raspberry Pi 3 Model B
• SoC: Broadcom BCM2837
• CPU: 4× ARM Cortex-A53 @1.2GHz
• GPU: Broadcom Video Core IV @250MHz
• RAM: 1GB LPDDR2 @900MHz
• Storage: 32GB Samsung Pro µSD-card UHS-1 (R/W@90/80MB/s)
• Networking: LAN 10/100Mbit, WLAN 2.4GHz 802.11n
• A power supply that can produce 2.5A stable at 5V to avoid data corruption and crashes
• Samsung µSD to SD adapter or USB to µSD adapter
• Keyboard: Logitech K800 Wireless
• Mouse: Logitech M505 Wireless
• Receiver: Logitech Unifying, connected to both mouse and keyboard
• Monitor: Samsung SyncMaster P2470HD @1080p
• Display Cable: HDMI
• A cooler with a fan to keep the Raspberry Pi from overheating
Since I will share my full experience and the method I used, this also becomes a tutorial on how to set everything up. If you want to follow along and experiment with this yourself, you do it completely at your own risk. Under no circumstances should I, the people hosting this site, the people who created the binaries and the modified firmware nor Microsoft be held responsible for any damage this could do to your SBC or other hardware. Microsoft does not officially support running Windows 10 ARM64 on a Raspberry Pi 3, so please do not flood Microsoft support forums with possible issues. All the information needed to set up a working system appears in this article. If you run into issues, please read the article again. Maybe you missed a step the first time? Now that we have defined the rules, let’s start this experiment!
This is a high-level overview of what we will do next.
1. Download Windows UUP binaries
2. Convert the Windows binaries into an ISO file
3. Download the Windows into an ARM deployer tool
4. Remove any existing partitions from the µSD-card
5. Deploy everything onto the µSD-card
6. Boot the Raspberry Pi from the µSD-card the first time
7. Configure the firmware before booting into Windows
8. Set up a local user account and complete OOBE
9. Let the system complete its post install tasks and settle down
10. Test some built-in software
11. Test Reboot time/delay
12. Draw a conclusion
Downloading the software
This part includes 3 steps. Acquiring Windows binaries download and conversion scripts. We will download Windows 10 Pro EN-US ARM64 v1803 Windows Insider build 17134.1 base image download and conversion scripts using UUP-Dump. Version 1809 and later Insider Builds are already available but, in my experience, 1809 was unstable but 1803 caused no issues. Thus, we pick 1803.
Here are the steps to take on your computer:
1. Using a web browser, navigate to https://uupdump.ml
2. In the search box, type insider 17134.1 arm64 and press ENTER
3. Click on Windows 10 Insider Preview 17134.1 (rs4_release) arm64
4. From Language dropdown select English (United States) and press Next
5. From Editions dropdown, select Windows 10 Pro and press Next
6. Click on Download using aria2 and convert (this will download the scripts)
7. You will end up with a file 17134.1_arm64_en-us_561e1a0f_convert.zip
8. Move the file to C:\WoA (this will be our working directory so create the folder if necessary)
Downloading the Windows binaries and converting to ISO
The following steps will download all Windows base binaries for v1803, upgrade it to the latest cumulative update if applicable, and create an ISO-image/install media. Depending on the hardware, this might take a very long time.
1. Extract 17134.1_arm64_en-us_561e1a0f_convert.zip to C:\WoA\1803
2. Open Command Prompt as Administrator
3. Type CD C:\WoA\1803 and press Enter
4. Type aria2_download_windows.cmd and press Enter
After a long wait, you will end up with a file C:\WoA\1803\ 17134.1.180410-1804.RS4_RELEASE_CLIENTPRO_OEMRET_ARM64FRE_EN-US.ISO. Creation of the ISO-image succeeded!
Preparing the µSD-card
The following steps require at least .NET framework version 4.6.1 and access to install.wim, found in the ISO-image. Using the latest Windows 10 release (version 1803 or 1809) is advisable. To keep things simple, next you must download a deployment tool. There currently exist two community created tools, WOA Deployer for Raspberry Pi and Windows on Raspberry imager. These instructions will use the easier one which automatically downloads all currently available drivers and the latest modified UEFI firmware, partitions the µSD-card, deploys the firmware plus Windows image and finally injects the drivers.
1. Using your favorite web-browser, head over to https://github.com/WOA-Project/WOA-Deployer-Rpi/releases/tag/v2.1.0
2. Download WOA.Deployer.zip to C:\WoA
3. Extract the content to C:\WoA\WOADeployer
4. Insert an empty µSD-card to your card reader using an µSD to SD adapter
5. If the µSD-card has any partitions, delete them by running diskpart from an elevated Command Prompt.
6. Mount the ISO-image
7. Navigate to C:\WoA\WOADeployer and launch WoaDeployer.exe as Administrator
8. ! WARNING ! Because this is experimental software, pay close attention to the following step or you might overwrite your system drive and render it unusable. ! WARNING !
Select the SD-Card in the Drive Selection section. In my case it is Disk 2.
9. In the Windows Image section press Browse and navigate to the mounted DVD and then find and select the install.wim file. In my case this is F:\sources\install.wim
10. Press Deploy
11. Read the confirmation prompt and if everything looks to be in order, press OK
12. Read the TrueTask USB EULA and press Accept
13. When Windows prompts you that you must format your disk, just press Cancel
14. Done! Eject the SD-card safely to avoid data corruption.
Booting the Pi for the first time
Now it’s time to boot your RPi for the first time. There are a few configuration steps we need to take before continuing into Windows. NOTE do NOT insert a network cable at this stage. We will explore networking in another article. Now we only want to focus on making the core OS work.
1. Insert the µSD-card into your RPi
2. Connect Mouse and keyboard to the USB ports
3. Connect power cable
4. When you see the Raspberry Pi splash screen, press ESC
5. Now you are greeted with the UEFI firmware
6. As you can see, the CPU clock speed is at 600MHz, so first step is to go and change that to 1.2GHz for better performance, because currently Windows can not adjust the frequency on demand. Head over to Device Manager -> Raspberry Pi Configuration -> Chipset Configuration and set Frequency to MAX
7. Press F10 followed by Y to save the changes
8. Navigate back to the first screen and go to Boot Maintenance Manager -> Boot Options -> Change boot order.
9. Press ENTER while the list of boot options is selected
10. Using your arrow keys select Broadcom SDHOST and press + to move it on top.
11. Press ENTER, F10 and Y to save the configuration.
12. Head back to the first screen and select reset and press ENTER. The RPi will reboot.
13. During the RPi splash screen, press ESC to enter the UEFI again.
14. Verify that the frequency is set to 1.2GHz. If not, do the above steps again.
15. Navigate down to continue, and press ENTER.
16. Now Windows will boot.
Booting into Windows for the first time
This will take a very long time to complete ,so be patient. But eventually you will be greeted with the OOBE screens. If for some reason you experience BSODs, then head over to the UEFI and select the Arasan SDCI host, instead of Broadcom. Don’t forget to change the boot order also. Using Arasan will be a lot slower, but much more compatible. On Windows 1803, I had no issues, but on 1809 I got random BSODs and I could never complete Windows Setup nor boot Windows while the Broadcom host was enabled.
Alright, so now let’s configure Windows. We want to enable as little features as possible.
1. Select your preferred region (I chose Finland)
2. Select your preferred keyboard layout (I chose Finnish)
3. Configure additional keyboards if you prefer (I chose Skip)
4. When asked to connect to a network, press Skip for now (because we do not want networking at this stage)
5. Accept the EULA
6. Enter a username (I chose Pi)
7. Enter a password (I chose Raspberry)
8. Confirm your password
9. Configure the security questions (I chose something random that works for me)
10. Select Don’t use speech recognition
11. Do not let MS use your location
12. Do not let Windows find your device
13. Only send Basic diagnostic data to MS
14. Do not let Windows improve Inking and Typing
15. Do not let Windows give you tailored experiences
16. Do not let Apps use advertising ID
Now Windows will make the final configurations, which will take a lot longer than “several minutes”. You will eventually even see a slide that says it is taking longer than expected.
Voila! We have a desktop. But it’s very slow with almost constant 100% CPU usage and 100% Disk usage. Don’t worry, let Windows complete its post processing work. It will take some time but will eventually settle down.
Looking at Device Manager
As you can notice from the screenshot above, some devices do not yet work, but most of them do and they work surprisingly well. We are still missing WiFi and BT drivers, so no wireless communication available. Connecting to the internet works indifferently well using the wired connection. The VideoCore IV GPU drivers are also completely missing. Currently, Windows is running a generic display driver which does not even show up in Device Manager. For the same reason HDMI audio will not work, but the 3.5 audio jack will gladly produce some noise for us. There are also two System Devices that do not start properly. This is most likely caused by the experimental UEFI, because these devices work on Windows IoT for Raspberry Pi. The only difference is that here we have 64-bit drivers compiled from the publicly available source repository and on IoT they are compiled into 32-bit. The current driver status can be checked at https://discourse.pi64.win/t/status-of-the-arm64-device-drivers-as-of-12-feb-2019/38
Testing some software
First thing I tried, was launching my favorite text editor, Notepad. Wow, to my surprise it launched in a blink of an eye! What about WordPad? Ok, clearly that took a bit longer with about 5s delay. Next up on my list was my favorite image editor Paint. I got about a 3 second delay.
What about some UWP apps? I tried Calculator next. First time it launched in about 6-8 seconds, but the next time I tried, it was almost instantaneous. Next, I tried Paint 3D. First launch took about 25 seconds before it was ready to be used. The second try took only 15 seconds. Clearly an improvement because of caching.
Testing reboot time
We clearly are limited by a µSD-card with very high read and write latencies, but I decided to test how long it takes to do a full reboot loop. Here are the results:
Shutdown portion took about 1.5 minutes, startup to login screen about 2 minutes and for the system to show the desktop and settle down and become usable it took around 3.5 minutes. While not that bad, there is clearly room for improvements here.
I am quite impressed with how well everything works so far. What I am even more impressed with is how little RAM the Windows 10 ARM64 version 1803 uses. I saw usage as low as 320MB RAM, which is nothing for a 64-bit operating system, considering how many services run in the background. CPU usage was 0-4% at idle, which mostly was caused by Task Manager. Disk usage hovered between 0-1%. Both usages were more often 0% than anything else.
Next, I will explore options to make Windows faster using an SSD, remove extra graphical bling, and disable services so Windows uses even less resources and should feel snappier. I will also connect to the internet and install some software. Hopefully, I can share even more exciting findings in an upcoming article, so stay tuned for more.