Skip to content

Commit adf2aab

Browse files
committed
Start work on ext2 filesystem prober
0 parents  commit adf2aab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+8912
-0
lines changed

.cargo/config.toml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[unstable]
2+
build-std = ["core", "compiler_builtins", "alloc"]
3+
build-std-features = ["compiler-builtins-mem"]
4+
5+
[build]
6+
target = "kernel/arch/x86_64/x86_64.json"

.editorconfig

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# EditorConfig is awesome: https://EditorConfig.org
2+
3+
# top-most EditorConfig file
4+
root = true
5+
6+
[*]
7+
indent_style = space
8+
indent_size = 2
9+
end_of_line = lf
10+
charset = utf-8
11+
trim_trailing_whitespace = false
12+
insert_final_newline = false

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/target
2+
Cargo.lock
3+
loopback_dev
4+
/isotmp
5+
build/kernel.elf
6+
build/os.img
7+
build/kernel.sym
8+
virtio-net.pcap

.gitmodules

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[submodule "extern/limine"]
2+
path = extern/limine
3+
url = https://github.com/limine-bootloader/limine.git
4+
branch = v2.0-branch

.vscode/settings.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"rust-analyzer.cargo.target": "kernel/arch/x86_64/x86_64.json",
3+
"rust-analyzer.checkOnSave.allTargets": false
4+
}

Cargo.toml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[workspace]
2+
members = [
3+
"environment",
4+
"kernel",
5+
"utils",
6+
"log_filter",
7+
"extensions/api",
8+
"extensions/virtio",
9+
"extensions/virtio_net",
10+
"extensions/virtio_blk",
11+
]
12+
13+
[profile.release]
14+
opt-level = 3
15+
codegen-units = 1
16+
lto = true
17+
debug = 1
18+
debug-assertions = false
19+
overflow-checks = false
20+
21+
[profile.dev]
22+
opt-level = 0
23+
codegen-units = 1
24+
lto = true
25+
debug = 1
26+
debug-assertions = false
27+
overflow-checks = false

Justfile

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
target := "x86_64"
2+
mem := "512M"
3+
4+
img := "os.img"
5+
drive := "if=none,id=dsk0,format=raw,file=build/" + img
6+
# drive := "id=dsk0,format=raw,file=build/" + img
7+
8+
virtio-net := "virtio-net,netdev=net0,disable-legacy=on,disable-modern=off"
9+
dev := "user,id=net0"
10+
pcap := "filter-dump,id=filter0,netdev=net0,file=virtio-net.pcap"
11+
12+
virtio-blk := "virtio-blk-pci,drive=dsk0,disable-legacy=on,disable-modern=off"
13+
14+
# + " -device " + virtio-net
15+
16+
# qemu-args := " -serial stdio" + " -m " + mem + " -drive " + drive + " -no-reboot -d cpu_reset -s" + " -netdev " + dev + " -object " + pcap + " -device " + virtio-blk
17+
#
18+
qemu-args := " -serial stdio" + " -m " + mem + " -drive " + drive + " -no-reboot -d cpu_reset -s" + " -device " + virtio-net + " -netdev " + dev + " -object " + pcap + " -device " + virtio-blk
19+
20+
limine := "extern/limine/build/bin"
21+
22+
clean:
23+
cargo clean
24+
rm -f build/*
25+
sudo umount -R isotmp/ | cat
26+
sudo rm -rf isotmp/
27+
rm -f loopback_dev
28+
echo "Clean is complete"
29+
30+
build release:
31+
#!/usr/bin/env bash
32+
set -e
33+
if { [ release != "debug" ] && [ release != "release" ] ;} then \
34+
echo Unknown build mode \"{{release}}\";\
35+
exit 1; \
36+
fi;
37+
38+
cargo build {{ if release == "debug" { "" } else { "--release" } }} --target kernel/arch/x86_64/x86_64.json
39+
cp target/{{target}}/{{release}}/kernel build/kernel.elf
40+
41+
nm build/kernel.elf | rustfilt | awk '{ $2=""; print $0 }' > build/kernel.sym
42+
python3 ./embed-symbol-table.py build/kernel.sym build/kernel.elf
43+
44+
image name:
45+
#!/usr/bin/env sh
46+
set -e
47+
path="build/{{name}}"
48+
49+
dd if=/dev/zero of=$path bs=1M count=64
50+
parted -s $path mklabel gpt
51+
parted -s $path mkpart primary 2048s 100%
52+
sudo losetup -Pf --show $path >loopback_dev
53+
mkdir -p isotmp
54+
sudo partprobe $(cat loopback_dev)
55+
sudo mkfs.ext2 $(cat loopback_dev)p1
56+
sudo mount $(cat loopback_dev)p1 isotmp/
57+
sudo cp -Rf build/kernel.elf isotmp/
58+
sudo cp -Rf root/* isotmp/
59+
sudo cp -Rf {{limine}}/limine.sys isotmp/
60+
sync
61+
sudo umount isotmp/
62+
sudo losetup -d $(cat loopback_dev)
63+
./{{limine}}/limine-install $path
64+
echo "HDD is complete"
65+
66+
limine:
67+
#!/usr/bin/env bash
68+
pushd ./extern/limine
69+
make
70+
popd
71+
72+
run release="debug": (build release) (image img)
73+
qemu-system-{{target}} -cpu Haswell {{qemu-args}}
74+
75+
kvm release="debug": (build release) (image img)
76+
sudo qemu-system-{{target}} -enable-kvm -cpu host {{qemu-args}}

build/.gitkeep

Whitespace-only changes.

embed-symbol-table.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env python3
2+
import argparse
3+
import sys
4+
import struct
5+
6+
START_MAKER = b"__SYMBOL_TABLE_START__"
7+
END_MAKER = b"__SYMBOL_TABLE_END__"
8+
SYMBOL_TABLE_MAGIC = 0xbeefbeef
9+
SYMBOL_MAX_LEN = 55
10+
11+
12+
def main():
13+
parser = argparse.ArgumentParser()
14+
parser.add_argument("symbols_file")
15+
parser.add_argument("executable")
16+
args = parser.parse_args()
17+
18+
# Locate the symbol table in the executable.
19+
image = open(args.executable, "rb").read()
20+
offset = image.find(START_MAKER)
21+
offset_end = image.find(END_MAKER)
22+
if offset < 0 or offset_end < 0:
23+
sys.exit("embed-symbol-table.py: failed to locate the symbol table")
24+
if image.find(START_MAKER, offset + 1) >= 0:
25+
print(hex(offset), hex(image.find(START_MAKER, offset + 1)))
26+
sys.exit(
27+
"embed-symbol-table.py: found multiple empty symbol tables (perhaps because "
28+
+ "START_MAKER is not sufficiently long to be unique?)")
29+
30+
# Parse the nm output and extract symbol names and theier addresses.
31+
symbols = {}
32+
for line in open(args.symbols_file).read().strip().split("\n"):
33+
cols = line.split(" ", 1)
34+
try:
35+
addr = int(cols[0], 16)
36+
except ValueError:
37+
continue
38+
name = cols[1]
39+
symbols[addr] = name
40+
41+
symbols = sorted(symbols.items(), key=lambda s: s[0])
42+
43+
# Build a symbol table.
44+
symbol_table = struct.pack("<IIQ", SYMBOL_TABLE_MAGIC, len(symbols), 0)
45+
for addr, name in symbols:
46+
if len(name) <= SYMBOL_MAX_LEN:
47+
truncated_name = name[:55]
48+
else:
49+
prefix_len = SYMBOL_MAX_LEN // 2
50+
suffix_len = SYMBOL_MAX_LEN - len("...") - prefix_len
51+
truncated_name = name[:prefix_len] + "..." + name[-suffix_len:]
52+
assert len(truncated_name) == SYMBOL_MAX_LEN
53+
symbol_table += struct.pack("<Q56s", addr,
54+
bytes(truncated_name, "ascii"))
55+
56+
max_size = offset_end - offset
57+
if len(symbol_table) > max_size:
58+
sys.exit(
59+
f"embed-symbol-table.py: Too many symbols; please expand the symbol table area (max_size={max_size / 1024}KiB, created={len(symbol_table) / 1024}KiB)"
60+
)
61+
62+
# Embed the symbol table.
63+
image = image[:offset] + symbol_table + image[offset + len(symbol_table):]
64+
open(args.executable, "wb").write(image)
65+
66+
67+
if __name__ == "__main__":
68+
main()

environment/Cargo.toml

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[package]
2+
name = "environment"
3+
description = "A runtime environment for the kernel"
4+
version = "0.0.1"
5+
authors = ["chronium <[email protected]>"]
6+
edition = "2021"
7+
8+
[lib]
9+
name = "environment"
10+
path = "lib.rs"
11+
12+
[dependencies]
13+
log = "0.4.14"
14+
x86 = "0.43.0"
15+
vte = "0.10.1"
16+
spin = "0.9.2"
17+
cfg-if = "1.0.0"
18+
bitflags = "1.3.2"
19+
atomic_refcell = "0.1.8"
20+
21+
buddy_system_allocator = { version = "0.8.0", features = ["const_fn"] }
22+
arrayvec = { version = "0.7.2", default-features = false }
23+
24+
utils = { path = "../utils", features = ["no_std"] }
25+
log_filter = { path = "../log_filter" }

0 commit comments

Comments
 (0)