Developer FAQ
The website FAQ have questions/answers for newcomers and end-users, while this FAQ will cover organization/technical questions/answers of developers/testers, feel free to suggest new questions.
(If all else fails, join us on Chat)
- General Questions
- What is the correct way to update the build system?
- How can I verify if my build system is up-to-date?
- How can I test my changes on real hardware?
- How can I write a driver?
- How can I port a program?
- How can I debug?
- How can I insert files to the QEMU image?
- How can I change my build variant?
- How can I increase the filesystem size of my QEMU image?
- How can I change the CPU architecture of my build system?
- I only made a small change to my program. What's the quickest way to test it in QEMU?
- How can I install the packages needed by recipes without a new download of the build system?
- How can I cross-compile to ARM from a x86-64 computer?
- Why does Redox have Assembly code?
- Troubleshooting Questions
- Porting Questions
- Scheme Questions
- What is a scheme?
- When does a regular program need to use a scheme?
- When would I write a program to implement a scheme?
- How do I use a scheme for sandboxing a program?
- How can I see all user-space schemes?
- How can I see all kernel schemes?
- What is the difference between kernel and user-space schemes?
- User-Space Questions
- Kernel Questions
- GitLab Questions
- I have a project/program with breaking changes but my merge request was not accepted, can I maintain the project in a separated repository on the Redox GitLab?
- I have a merge request with many commits, should I squash them after merge?
- Should I delete my branch after merge?
- How can I have an anonymous account?
General Questions
What is the correct way to update the build system?
- Read this page.
How can I verify if my build system is up-to-date?
- After the
make pull
command, run thegit rev-parse HEAD
command on the build system folders to see if they match the latest commit hash on GitLab.
How can I test my changes on real hardware?
- Make sure your build system is up-to-date and use the
make live
command to create a bootable image of your changes.
How can I write a driver?
- Read this README.
How can I port a program?
- Read this page.
How can I debug?
- Read this section.
How can I insert files to the QEMU image?
- Read this section.
How can I change my build variant?
- Insert the
CONFIG_NAME?=your-config-name
environment variable to your.config
file, read this section for more details.
How can I increase the filesystem size of my QEMU image?
- Change the
filesystem_size
field of your build configuration (config/ARCH/your-config.toml
) and runmake image
, read this section for more details.
How can I change the CPU architecture of my build system?
- Insert the
ARCH?=your-arch-code
environment variable on your.config
file and runmake all
, read this section for more details.
I only made a small change to my program. What's the quickest way to test it in QEMU?
- If you already added the program recipe to your configuration file, run:
make r.recipe-name image qemu
How can I install the packages needed by recipes without a new download of the build system?
- Download the
bootstrap.sh
script and run:
./bootstrap.sh -d
How can I cross-compile to ARM from a x86-64 computer?
- Insert the
ARCH?=aarch64
environment variable on your.config
file and runmake all
.
Why does Redox have Assembly code?
Assembly is the core of low-level because it's a CPU-specific language and deal with things that aren't possible or feasible to do in high-level languages like Rust.
Sometimes required or preferred for accessing hardware, or for carefully optimized hot spots.
Reasons to use Assembly instead of Rust:
- Deal with low-level things (those that can't be handled by Rust)
- Writing constant time algorithms for cryptography
- Optimizations
Places where Assembly is used:
- kernel - interrupt and system call entry routines, context switching, special CPU instructions and registers.
- drivers - port IO need special instructions (x86_64).
- relibc - some parts of the C runtime.
Troubleshooting Questions
Scripts
I can't download the bootstrap scripts, how can I fix this?
- Verify if you have
curl
installed or download the script from your browser.
I tried to run the bootstrap.sh and podman_bootstrap.sh scripts but got an error, how to fix this?
- Verify if you have the GNU Bash shell installed on your system.
Build System
I called "make all" but it show a "rustup can't be found" message, how can I fix this?
- Run this command:
source ~/.cargo/env
(If you installed Rustup before the first bootstrap.sh
run, this error doesn't happen)
I tried all troubleshooting methods but my build system is still broken, how can I fix that?
- If
make clean pull all
doesn't work, run thebootstrap.sh
again to download a fresh build system or install Pop OS!, Ubuntu or Debian.
Recipes
I had a compilation error with a recipe, how can I fix that?
- Read this section.
I tried all methods of the "Troubleshooting the Build" page and my recipe doesn't build, what can I do?
- It happens because your system has an environment problem or missing packages, remove the recipe from your build configuration file to workaround this.
All recipes follow this syntax - recipe = {}
below the [packages]
section, the configuration files is placed at - config/your-arch
.
When I run make r.recipe I get a syntax error, how can I fix that?
- Verify if your
recipe.toml
has some typo.
QEMU
How can I kill a frozen QEMU process after a kernel panic?
- Read this section.
Porting Questions
How to determine the dependencies of some program?
- Read this section.
How can I configure the build system of the recipe?
- Read this category.
How can I search for functions on relibc?
- Read this section.
Scheme Questions
What is a scheme?
- Read this page.
When does a regular program need to use a scheme?
- Most schemes are used internally by the system or by relibc, you don't need to access them directly. One exception is the pseudoterminal for your command window, which is accessed using the value of
$TTY
, which might have a value of e.g. "pty:18". Some low-level graphics programming might require you to access your display, which might have a value of e.g. "display:3".
When would I write a program to implement a scheme?
- If you are implementing a service daemon or a device driver, you will need to implement a scheme.
How do I use a scheme for sandboxing a program?
- The contain program provides a partial implementation of Sandboxing using schemes and namespaces.
How can I see all user-space schemes?
- Read this section.
How can I see all kernel schemes?
- Read this section.
What is the difference between kernel and user-space schemes?
- Read this section.
User-Space Questions
How does a user-space daemon provide file-like services?
- When a regular program calls open, read, write, etc. on a file-like resource, the kernel translates that to a message of type syscall::data::Packet, describing the file operation, and makes it available for reading on the appropriate daemon's scheme file descriptor. See this section for more information.
Kernel Questions
Which CPU architectures the kernel support?
- i686 with limitations
- x86_64
- ARM64 with limitations
How the system calls are used by user-space daemons?
- All user-space daemons use the system calls through relibc like any normal program.
GitLab Questions
I have a project/program with breaking changes but my merge request was not accepted, can I maintain the project in a separated repository on the Redox GitLab?
- Yes.
I have a merge request with many commits, should I squash them after merge?
- Yes.
Should I delete my branch after merge?
- Yes.
How can I have an anonymous account?
- During the account creation process you should add a fake name on the "First Name" and "Last Name" fields and change it later after your account approval (single name field is supported).