forked from AbleOS/ableos
repbuild: generate disk image with limine
This commit is contained in:
parent
643db212ef
commit
346d3a9166
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,6 +1,8 @@
|
|||
userland/root_fs/mnt/
|
||||
target/
|
||||
.gdb_history
|
||||
!*/.gitkeep
|
||||
__pycache__/
|
||||
debug.log
|
||||
/disk/
|
||||
/limine/
|
||||
/disk.img
|
||||
|
|
|
@ -8,7 +8,6 @@ build-std-features = ["compiler-builtins-mem"]
|
|||
|
||||
[target.'cfg(target_arch = "x86_64")']
|
||||
rustflags = ["-C", "target-feature=+rdrand"]
|
||||
runner = "bootimage runner"
|
||||
|
||||
[target.riscv64gc-unknown-none-elf]
|
||||
rustflags = "-C link-arg=-Tableos/src/arch/riscv/virt.lds"
|
||||
|
|
|
@ -8,52 +8,6 @@ version = "0.1.1"
|
|||
panic = "abort"
|
||||
|
||||
[package.metadata.bootimage]
|
||||
run-command = [
|
||||
"qemu-system-x86_64",
|
||||
|
||||
"-device",
|
||||
"piix4-ide,id=ide",
|
||||
|
||||
"-drive",
|
||||
"file={},format=raw,if=none,id=disk",
|
||||
|
||||
"-device",
|
||||
"ide-hd,drive=disk,bus=ide.0"
|
||||
]
|
||||
run-args = [
|
||||
# "--nodefaults",
|
||||
"-cpu",
|
||||
"Broadwell-v3",
|
||||
"-m",
|
||||
"4G",
|
||||
"-serial",
|
||||
"stdio",
|
||||
"-smp",
|
||||
"cores=2",
|
||||
|
||||
|
||||
"-soundhw",
|
||||
"pcspk",
|
||||
|
||||
|
||||
# "-device",
|
||||
# "VGA",
|
||||
# "-device",
|
||||
# "virtio-gpu-pci",
|
||||
|
||||
"-device",
|
||||
"vmware-svga",
|
||||
|
||||
"-device",
|
||||
"sb16",
|
||||
|
||||
|
||||
# "-machine", "pcspk-audiodev=0",
|
||||
|
||||
# "-qmp",
|
||||
# "unix:../qmp-sock,server,nowait",
|
||||
]
|
||||
|
||||
test-args = [
|
||||
"-device",
|
||||
"isa-debug-exit,iobase=0xf4,iosize=0x04",
|
||||
|
|
4
base/README.md
Normal file
4
base/README.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Base Root Filesystem
|
||||
|
||||
This is the base root filesystem for ableOS. It's used by tepbuild while
|
||||
building the disk image.
|
17
base/boot/limine.cfg
Normal file
17
base/boot/limine.cfg
Normal file
|
@ -0,0 +1,17 @@
|
|||
${ABLEOS_KERNEL}=boot:///boot/kernel
|
||||
# TODO: Make a boot background image for ableOS
|
||||
# ${WALLPAPER_PATH}=boot:///boot/bg.bmp
|
||||
|
||||
DEFAULT_ENTRY=1
|
||||
TIMEOUT=3
|
||||
VERBOSE=yes
|
||||
|
||||
# Terminal related settings
|
||||
# TERM_WALLPAPER=${WALLPAPER_PATH}
|
||||
TERM_BACKDROP=008080
|
||||
|
||||
:ableOS
|
||||
COMMENT=Default ableOS boot entry.
|
||||
PROTOCOL=limine
|
||||
KERNEL_PATH=${ABLEOS_KERNEL}
|
||||
KERNEL_CMDLINE=
|
BIN
base/home/able/bins/aos_test.wasm
Executable file
BIN
base/home/able/bins/aos_test.wasm
Executable file
Binary file not shown.
BIN
base/home/able/bins/weealloc_test.wasm
Executable file
BIN
base/home/able/bins/weealloc_test.wasm
Executable file
Binary file not shown.
252
base/home/able/configs/qwerty.keymap
Normal file
252
base/home/able/configs/qwerty.keymap
Normal file
|
@ -0,0 +1,252 @@
|
|||
# Able doesn't have a full keyboard
|
||||
0-NONE
|
||||
1-
|
||||
2-
|
||||
3-BACKSPACE
|
||||
4-
|
||||
5-
|
||||
6-
|
||||
7-
|
||||
8-
|
||||
9-TAB
|
||||
10-
|
||||
11-
|
||||
12-
|
||||
13-ENTER
|
||||
14-
|
||||
15-
|
||||
16-SHIFT
|
||||
17-CONTROL
|
||||
18-ALT
|
||||
19-PAUSE
|
||||
20-CAPS_LOCK
|
||||
21-
|
||||
22-
|
||||
23-
|
||||
24-
|
||||
25-
|
||||
26-
|
||||
27-
|
||||
28-
|
||||
29-
|
||||
30-
|
||||
31-
|
||||
32-SPACE
|
||||
33-PAGE_UP
|
||||
34-PAGE_DOWN
|
||||
35-END
|
||||
36-HOME
|
||||
37-ARROW_LEFT
|
||||
38-ARROW_UP
|
||||
39-ARROW_RIGHT
|
||||
40-ARROW_DOWN
|
||||
41-
|
||||
42-
|
||||
43-
|
||||
44-
|
||||
45-INSERT
|
||||
46-DELETE
|
||||
47-
|
||||
48-0
|
||||
49-1
|
||||
50-2
|
||||
51-3
|
||||
52-4
|
||||
53-5
|
||||
54-6
|
||||
55-7
|
||||
56-8
|
||||
57-9
|
||||
58-
|
||||
59-SEMICOLON
|
||||
60-
|
||||
61-EQUAL
|
||||
62-
|
||||
63-
|
||||
64-
|
||||
65-a
|
||||
66-b
|
||||
67-c
|
||||
68-d
|
||||
69-e
|
||||
70-f
|
||||
71-g
|
||||
72-h
|
||||
73-i
|
||||
74-j
|
||||
75-k
|
||||
76-l
|
||||
77-m
|
||||
78-n
|
||||
79-o
|
||||
80-p
|
||||
81-q
|
||||
82-r
|
||||
83-s
|
||||
84-t
|
||||
85-u
|
||||
86-v
|
||||
87-w
|
||||
88-x
|
||||
89-y
|
||||
90-z
|
||||
91-
|
||||
92-
|
||||
93-
|
||||
94-
|
||||
95-
|
||||
96-
|
||||
97-
|
||||
98-
|
||||
99-
|
||||
100-
|
||||
101-
|
||||
102-
|
||||
103-
|
||||
106-
|
||||
107-
|
||||
108-
|
||||
109-
|
||||
110-
|
||||
111-
|
||||
112-FUNCTION_1
|
||||
113-FUNCTION_2
|
||||
114-FUNCTION_3
|
||||
115-FUNCTION_4
|
||||
116-FUNCTION_5
|
||||
117-FUNCTION_6
|
||||
118-FUNCTION_7
|
||||
119-FUNCTION_8
|
||||
120-FUNCTION_9
|
||||
121-FUNCTION_10
|
||||
122-FUNCTION_11
|
||||
123-FUNCTION_12
|
||||
124-
|
||||
125-
|
||||
126-
|
||||
127-
|
||||
128-
|
||||
129-
|
||||
130-
|
||||
131-
|
||||
132-
|
||||
134-
|
||||
135-
|
||||
136-
|
||||
137-
|
||||
138-
|
||||
139-
|
||||
140-
|
||||
141-
|
||||
142-
|
||||
143-
|
||||
145-SCROLL_LOCK
|
||||
146-
|
||||
147-
|
||||
148-
|
||||
149-
|
||||
150-
|
||||
151-
|
||||
152-
|
||||
153-
|
||||
154-
|
||||
155-
|
||||
156-
|
||||
157-
|
||||
158-
|
||||
159-
|
||||
160-
|
||||
161-
|
||||
162-
|
||||
163-
|
||||
164-
|
||||
165-
|
||||
166-
|
||||
167-
|
||||
168-
|
||||
169-
|
||||
170-
|
||||
171-
|
||||
172-
|
||||
173-MINUS
|
||||
174-
|
||||
175-
|
||||
176-
|
||||
177-
|
||||
178-
|
||||
179-
|
||||
180-
|
||||
181-
|
||||
182-
|
||||
183-
|
||||
184-
|
||||
185-
|
||||
186-
|
||||
187-
|
||||
188-COMMA
|
||||
189-
|
||||
190-PERIOD
|
||||
191-FORWARD_SLASH
|
||||
192-GRAVE
|
||||
193-
|
||||
194-
|
||||
195-
|
||||
196-
|
||||
197-
|
||||
198-
|
||||
199-
|
||||
200-
|
||||
201-
|
||||
202-
|
||||
203-
|
||||
204-
|
||||
205-
|
||||
206-
|
||||
207-
|
||||
208-
|
||||
209-
|
||||
210-
|
||||
211-
|
||||
212-
|
||||
213-
|
||||
214-
|
||||
215-
|
||||
216-
|
||||
218-
|
||||
219-BRACKET_LEFT
|
||||
220-BACK_SLASH
|
||||
221-BRACKET_RIGHT
|
||||
222-QUOTE
|
||||
223-
|
||||
224-
|
||||
225-
|
||||
226-
|
||||
227-
|
||||
228-
|
||||
229-
|
||||
230-
|
||||
231-
|
||||
232-
|
||||
233-
|
||||
234-
|
||||
235-
|
||||
236-
|
||||
237-
|
||||
238-
|
||||
239-
|
||||
240-
|
||||
241-
|
||||
242-
|
||||
243-
|
||||
244-
|
||||
245-
|
||||
246-
|
||||
247-
|
||||
248-
|
||||
249-
|
||||
250-
|
||||
251-
|
||||
252-
|
||||
253-
|
||||
254-
|
||||
255-
|
4
base/home/able/kernel.md
Normal file
4
base/home/able/kernel.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
Hi there :>$RED$
|
||||
hi
|
||||
$GREEN$
|
||||
hi 3
|
14
base/home/able/layout.txt
Normal file
14
base/home/able/layout.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
boot/
|
||||
├─ kernel.img
|
||||
home/
|
||||
├─ able/
|
||||
│ ├─ bins/
|
||||
│ ├─ config/
|
||||
│ │ ├─ able_edit/
|
||||
│ │ │ ├─ config.toml
|
||||
│ ├─ irl_pic.png
|
||||
│ ├─ password.txt
|
||||
system/
|
||||
├─ bins/
|
||||
├─ configs/
|
||||
│ ├─ kernel.toml
|
|
@ -5,7 +5,7 @@
|
|||
* SPDX-License-Identifier: MPL-2.0
|
||||
*/
|
||||
|
||||
use std::{fs, process::Command};
|
||||
use std::{fs::{self, File}, process::Command};
|
||||
|
||||
use colored::*;
|
||||
|
||||
|
@ -15,6 +15,7 @@ struct Options {
|
|||
}
|
||||
|
||||
enum Subcommand {
|
||||
BuildImage,
|
||||
Doc,
|
||||
Help,
|
||||
Run,
|
||||
|
@ -27,6 +28,7 @@ enum Subcommand {
|
|||
impl Subcommand {
|
||||
fn from_str<S: AsRef<str>>(str: S) -> Subcommand {
|
||||
match str.as_ref() {
|
||||
"build-image" => Subcommand::BuildImage,
|
||||
"doc" => Subcommand::Doc,
|
||||
"help" => Subcommand::Help,
|
||||
"run" | "r" => Subcommand::Run,
|
||||
|
@ -48,6 +50,142 @@ fn main() {
|
|||
let options = options();
|
||||
|
||||
match options.subcommand {
|
||||
Subcommand::BuildImage => {
|
||||
let machine_text = options.arguments.get(0).cloned().unwrap_or_default();
|
||||
|
||||
match machine(machine_text) {
|
||||
MachineType::X86_64 => {
|
||||
// Cleanup
|
||||
// NOTE: we are not unwrapping these, as we don't want this to fail if they
|
||||
// don't exist yet, probably not the best idea tho.
|
||||
// FIXME: figure out a better way to ignore errors about these not existing
|
||||
#[allow(unused_must_use)]
|
||||
{
|
||||
fs::remove_dir_all("./limine");
|
||||
fs::remove_dir_all("./disk");
|
||||
fs::remove_file("./disk.img");
|
||||
}
|
||||
|
||||
// Build ableOS in release mode
|
||||
Command::new("cargo")
|
||||
.args(["build", "--release"])
|
||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// Create disk directory
|
||||
fs::create_dir("./disk").unwrap();
|
||||
|
||||
// Clone limine 3.X binaries
|
||||
Command::new("git")
|
||||
.arg("clone")
|
||||
.arg("https://github.com/limine-bootloader/limine.git")
|
||||
.arg("--branch=v3.0-branch-binary")
|
||||
.arg("--depth=1")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Building limine".bold());
|
||||
Command::new("make")
|
||||
.args(["-C", "limine"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Allocating new disk image".bold());
|
||||
Command::new("dd")
|
||||
.args(["if=/dev/zero", "of=disk.img", "count=1", "bs=256MiB"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Partitioning disk image".bold());
|
||||
Command::new("sudo")
|
||||
.args(["sfdisk", "disk.img"])
|
||||
.stdin(File::open("./sfdisk-config").unwrap())
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// Setup loopback device for disk.img, with partitions
|
||||
// FIXME: don't assume that /dev/loop0 is empty
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-P", "/dev/loop0", "disk.img"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Creating ext2 filesystem on /dev/loop0p1".bold());
|
||||
Command::new("sudo")
|
||||
.arg("mkfs.ext2")
|
||||
.arg("/dev/loop0p1")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Mounting filesystem".bold());
|
||||
Command::new("sudo")
|
||||
.arg("mount")
|
||||
.args(["/dev/loop0p1", "./disk"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// copy ./base/* over to ./disk
|
||||
Command::new("sudo")
|
||||
.args(["sh", "-c"])
|
||||
.arg("cp -r ./base/* ./disk")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// copy ./limine/limine.sys over to ./disk/boot
|
||||
Command::new("sudo")
|
||||
.arg("cp")
|
||||
.args(["./limine/limine.sys", "./disk/boot"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// copy the kernel over to ./disk/boot/kernel
|
||||
Command::new("sudo")
|
||||
.arg("cp")
|
||||
.arg("./target/x86_64-ableos/release/ableos")
|
||||
.arg("./disk/boot/kernel")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// TODO: build the userspace programs and copy them over
|
||||
|
||||
// unmount the fs
|
||||
Command::new("sudo")
|
||||
.arg("umount")
|
||||
.arg("./disk")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// remove the loopback device
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-d", "/dev/loop0"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
println!("{}", "Deploying limine".bold());
|
||||
Command::new("./limine/limine-deploy")
|
||||
.arg("./disk.img")
|
||||
.status()
|
||||
.unwrap();
|
||||
}
|
||||
MachineType::Unknown(unknown) => {
|
||||
eprintln!(
|
||||
"{}: unknown machine type `{}`",
|
||||
"error".red().bold(),
|
||||
unknown.bold(),
|
||||
);
|
||||
eprintln!("expected one of x86_64, riscv64 or aarch64");
|
||||
}
|
||||
_ => {
|
||||
eprintln!(
|
||||
"{}: build-image not implemented for this machine type",
|
||||
"error".red().bold(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Subcommand::Test => {
|
||||
Command::new("cargo")
|
||||
.args(["test", "--target=json_targets/x86_64-ableos.json"])
|
||||
|
@ -100,18 +238,137 @@ fn main() {
|
|||
|
||||
match machine(machine_text) {
|
||||
MachineType::X86_64 if debug => {
|
||||
// Build ableOS
|
||||
Command::new("cargo")
|
||||
.args(["run", "--", "-S", "-gdb", "tcp:9000"])
|
||||
.arg("build")
|
||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// Setup loopback device for disk.img, with partitions
|
||||
// FIXME: don't do ths if running without changes
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-P", "/dev/loop0", "disk.img"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// mount the root fs to ./disk
|
||||
Command::new("sudo")
|
||||
.arg("mount")
|
||||
.args(["/dev/loop0p1", "./disk"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// copy the kernel over to ./disk/boot/kernel
|
||||
Command::new("sudo")
|
||||
.arg("cp")
|
||||
.arg("./target/x86_64-ableos/debug/ableos")
|
||||
.arg("./disk/boot/kernel")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// unmount the root fs
|
||||
Command::new("sudo")
|
||||
.arg("umount")
|
||||
.arg("./disk")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// remove loopback device
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-d", "/dev/loop0"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// run qemu with "-S", "-gdb", "tcp:9000"
|
||||
Command::new("qemu-system-x86_64")
|
||||
.args(["-device", "piix4-ide,id=ide"])
|
||||
.arg("-drive")
|
||||
.arg("file=./disk.img,format=raw,if=none,id=disk")
|
||||
.args(["-device", "ide-hd,drive=disk,bus=ide.0"])
|
||||
// .arg("--nodefaults")
|
||||
.args(["-cpu", "Broadwell-v3"])
|
||||
.args(["-m", "4G"])
|
||||
.args(["-serial", "stdio"])
|
||||
.args(["-smp", "cores=2"])
|
||||
.args(["-soundhw", "pcspk"])
|
||||
// .args(["-device", "VGA"])
|
||||
// .args(["-device", "virtio-gpu-pci"])
|
||||
.args(["-device", "vmware-svga"])
|
||||
.args(["-device", "sb16"])
|
||||
// .args(["-machine", "pcspk-audiodev=0"])
|
||||
// .args(["-qmp", "unix:../qmp-sock,server,nowait"])
|
||||
.args(["-S", "-gdb", "tcp:9000"])
|
||||
.status()
|
||||
.unwrap();
|
||||
}
|
||||
MachineType::X86_64 => {
|
||||
// Build ableOS
|
||||
Command::new("cargo")
|
||||
.args(["run", "--release"])
|
||||
.args(["build", "--release"])
|
||||
.current_dir(fs::canonicalize("./ableos").unwrap())
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// Setup loopback device for disk.img, with partitions
|
||||
// FIXME: don't do ths if running without changes
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-P", "/dev/loop0", "disk.img"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// mount the root fs to ./disk
|
||||
Command::new("sudo")
|
||||
.arg("mount")
|
||||
.args(["/dev/loop0p1", "./disk"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// copy the kernel over to ./disk/boot/kernel
|
||||
Command::new("sudo")
|
||||
.arg("cp")
|
||||
.arg("./target/x86_64-ableos/release/ableos")
|
||||
.arg("./disk/boot/kernel")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// unmount the root fs
|
||||
Command::new("sudo")
|
||||
.arg("umount")
|
||||
.arg("./disk")
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// remove loopback device
|
||||
Command::new("sudo")
|
||||
.arg("losetup")
|
||||
.args(["-d", "/dev/loop0"])
|
||||
.status()
|
||||
.unwrap();
|
||||
|
||||
// run qemu
|
||||
Command::new("qemu-system-x86_64")
|
||||
.args(["-device", "piix4-ide,id=ide"])
|
||||
.arg("-drive")
|
||||
.arg("file=./disk.img,format=raw,if=none,id=disk")
|
||||
.args(["-device", "ide-hd,drive=disk,bus=ide.0"])
|
||||
// .arg("--nodefaults")
|
||||
.args(["-cpu", "Broadwell-v3"])
|
||||
.args(["-m", "4G"])
|
||||
.args(["-serial", "stdio"])
|
||||
.args(["-smp", "cores=2"])
|
||||
.args(["-soundhw", "pcspk"])
|
||||
// .args(["-device", "VGA"])
|
||||
// .args(["-device", "virtio-gpu-pci"])
|
||||
.args(["-device", "vmware-svga"])
|
||||
.args(["-device", "sb16"])
|
||||
// .args(["-machine", "pcspk-audiodev=0"])
|
||||
// .args(["-qmp", "unix:../qmp-sock,server,nowait"])
|
||||
.status()
|
||||
.unwrap();
|
||||
}
|
||||
MachineType::RiscV64 if debug => {
|
||||
eprintln!(
|
||||
|
|
1
sfdisk-config
Normal file
1
sfdisk-config
Normal file
|
@ -0,0 +1 @@
|
|||
,,,-
|
Loading…
Reference in a new issue