-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
369 lines (311 loc) · 14.1 KB
/
Makefile
File metadata and controls
369 lines (311 loc) · 14.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
# Makefile - ALOS Kernel (x86-64)
# Cross-compiler: utilisez x86_64-elf-gcc si disponible, sinon gcc natif
# Pour installer le cross-compiler: voir https://wiki.osdev.org/GCC_Cross-Compiler
# Détection automatique du cross-compiler
CROSS_PREFIX ?= $(shell which x86_64-elf-gcc >/dev/null 2>&1 && echo "x86_64-elf-" || echo "")
CC = $(CROSS_PREFIX)gcc
AS = nasm
LD = $(CROSS_PREFIX)ld
# CFLAGS pour x86-64:
# -m64 : Génère du code 64-bit
# -march=x86-64 : Architecture x86-64 de base
# -mcmodel=kernel : Adresses kernel dans les 2 Go supérieurs
# -mno-red-zone : CRITIQUE - Désactive la red zone (incompatible avec les interruptions)
# -mno-sse -mno-sse2 -mno-mmx : Désactive les instructions SIMD (évite Invalid Opcode)
# -fno-stack-protector : Pas de protection de pile (pas de libc)
# -fno-pic -fno-pie : Pas de code position-independent
CFLAGS = -std=gnu99 -ffreestanding -O2 -g -Wall -Wextra \
-m64 -march=x86-64 -mcmodel=kernel \
-mno-red-zone -mno-sse -mno-sse2 -mno-mmx \
-fno-stack-protector -fno-pic -fno-pie
ASFLAGS = -f elf64 -g
LDFLAGS = -nostdlib -z max-page-size=0x1000
# ===========================================
# Structure du projet:
# src/
# ├── arch/x86/ - Code spécifique x86
# ├── kernel/ - Cœur du kernel
# ├── mm/ - Memory Management
# ├── drivers/ - Pilotes matériels
# │ └── net/ - Pilotes réseau
# ├── net/ - Stack réseau (OSI)
# │ ├── l2/ - Layer 2 (Data Link)
# │ ├── l3/ - Layer 3 (Network)
# │ └── core/ - Infrastructure
# └── include/ - Headers partagés
# ===========================================
# Architecture (x86_64)
# Note: boot.s est remplacé par le protocole Limine
ARCH_SRC = src/arch/x86_64/gdt.c src/arch/x86_64/idt.c src/arch/x86_64/interrupts.s src/arch/x86_64/switch.s src/arch/x86_64/tss.c src/arch/x86_64/usermode.c src/arch/x86_64/cpu.c
ARCH_OBJ = src/arch/x86_64/gdt.o src/arch/x86_64/idt.o src/arch/x86_64/interrupts.o src/arch/x86_64/switch.o src/arch/x86_64/tss.o src/arch/x86_64/usermode.o src/arch/x86_64/cpu.o
# Kernel core
KERNEL_SRC = src/kernel/kernel.c src/kernel/console.c src/kernel/fb_console.c src/kernel/keyboard.c src/kernel/keymap.c src/kernel/timer.c src/kernel/klog.c src/kernel/process.c src/kernel/thread.c src/kernel/sync.c src/kernel/workqueue.c src/kernel/syscall.c src/kernel/elf.c src/kernel/mouse.c src/kernel/input.c src/kernel/string.c
KERNEL_OBJ = src/kernel/kernel.o src/kernel/console.o src/kernel/fb_console.o src/kernel/keyboard.o src/kernel/keymap.o src/kernel/timer.o src/kernel/klog.o src/kernel/process.o src/kernel/thread.o src/kernel/sync.o src/kernel/workqueue.o src/kernel/syscall.o src/kernel/elf.o src/kernel/mouse.o src/kernel/input.o src/kernel/string.o
# MMIO subsystem
MMIO_SRC = src/kernel/mmio/mmio.c src/kernel/mmio/pci_mmio.c
MMIO_OBJ = src/kernel/mmio/mmio.o src/kernel/mmio/pci_mmio.o
# Memory management
MM_SRC = src/mm/pmm.c src/mm/kheap.c src/mm/vmm.c
MM_OBJ = src/mm/pmm.o src/mm/kheap.o src/mm/vmm.o
# Drivers
DRIVERS_SRC = src/drivers/pci.c src/drivers/ata.c src/drivers/net/pcnet.c src/drivers/net/virtio_net.c src/drivers/net/e1000e.c src/drivers/virtio/virtio_mmio.c src/drivers/virtio/virtio_transport.c src/drivers/virtio/virtio_pci_modern.c
DRIVERS_OBJ = src/drivers/pci.o src/drivers/ata.o src/drivers/net/pcnet.o src/drivers/net/virtio_net.o src/drivers/net/e1000e.o src/drivers/virtio/virtio_mmio.o src/drivers/virtio/virtio_transport.o src/drivers/virtio/virtio_pci_modern.o
# Network stack (par couche OSI)
NET_L2_SRC = src/net/l2/ethernet.c src/net/l2/arp.c
NET_L2_OBJ = src/net/l2/ethernet.o src/net/l2/arp.o
NET_L3_SRC = src/net/l3/ipv4.c src/net/l3/icmp.c src/net/l3/route.c
NET_L3_OBJ = src/net/l3/ipv4.o src/net/l3/icmp.o src/net/l3/route.o
NET_L4_SRC = src/net/l4/udp.c src/net/l4/dhcp.c src/net/l4/dns.c src/net/l4/tcp.c src/net/l4/http.c src/net/l4/httpd.c
NET_L4_OBJ = src/net/l4/udp.o src/net/l4/dhcp.o src/net/l4/dns.o src/net/l4/tcp.o src/net/l4/http.o src/net/l4/httpd.o
NET_CORE_SRC = src/net/core/net.c src/net/core/netdev.c
NET_CORE_OBJ = src/net/core/net.o src/net/core/netdev.o
# Filesystem (VFS + drivers)
FS_SRC = src/fs/vfs.c src/fs/ext2.c
FS_OBJ = src/fs/vfs.o src/fs/ext2.o
# Shell
SHELL_SRC = src/shell/shell.c src/shell/commands.c
SHELL_OBJ = src/shell/shell.o src/shell/commands.o
# Configuration
CONFIG_SRC = src/config/config.c
CONFIG_OBJ = src/config/config.o
# Configuration
CONFIG_SRC = src/config/config.c
CONFIG_OBJ = src/config/config.o
# Tous les objets
OBJ = $(ARCH_OBJ) $(KERNEL_OBJ) $(MMIO_OBJ) $(MM_OBJ) $(DRIVERS_OBJ) $(FS_OBJ) $(NET_L2_OBJ) $(NET_L3_OBJ) $(NET_L4_OBJ) $(NET_CORE_OBJ) $(LIB_OBJ) $(SHELL_OBJ) $(CONFIG_OBJ)
# Cible finale - Kernel ELF 64-bit
alos.elf: $(OBJ)
$(LD) -T src/arch/x86_64/linker.ld -o alos.elf $(LDFLAGS) $(OBJ)
@echo "Build success! Run 'make iso' to create bootable image."
# ===========================================
# Limine Bootloader (binaires pré-compilés)
# ===========================================
LIMINE_DIR = limine
# Télécharger les binaires Limine pré-compilés
$(LIMINE_DIR)/limine:
@echo "=== Downloading Limine bootloader (v10.x binary release) ==="
@if [ -d "$(LIMINE_DIR)" ]; then \
echo "Updating existing Limine..."; \
cd $(LIMINE_DIR) && git pull; \
else \
git clone https://codeberg.org/Limine/Limine.git $(LIMINE_DIR) --branch=v10.x-binary --depth=1; \
fi
@echo "=== Building Limine utility ==="
$(MAKE) -C $(LIMINE_DIR)
# Cible pour forcer le re-téléchargement de Limine
limine-update:
rm -rf $(LIMINE_DIR)
$(MAKE) $(LIMINE_DIR)/limine
# Créer une image ISO bootable avec Limine
iso: alos.elf $(LIMINE_DIR)/limine disk.img
@echo "=== Creating bootable ISO ==="
@mkdir -p iso_root/boot/limine iso_root/EFI/BOOT
cp -v alos.elf iso_root/boot/
cp -v limine.conf iso_root/boot/limine/
cp -v $(LIMINE_DIR)/limine-bios.sys iso_root/boot/limine/
cp -v $(LIMINE_DIR)/limine-bios-cd.bin iso_root/boot/limine/
cp -v $(LIMINE_DIR)/limine-uefi-cd.bin iso_root/boot/limine/
cp -v $(LIMINE_DIR)/BOOTX64.EFI iso_root/EFI/BOOT/
@if [ -f "$(LIMINE_DIR)/BOOTIA32.EFI" ]; then \
cp -v $(LIMINE_DIR)/BOOTIA32.EFI iso_root/EFI/BOOT/; \
fi
xorriso -as mkisofs -R -r -J -b boot/limine/limine-bios-cd.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot boot/limine/limine-uefi-cd.bin \
-efi-boot-part --efi-boot-image --protective-msdos-label \
iso_root -o alos.iso
./$(LIMINE_DIR)/limine bios-install alos.iso
@echo "=== ISO created: alos.iso ==="
# ===========================================
# Règles de compilation par module
# ===========================================
# Architecture x86_64
src/arch/x86_64/interrupts.o: src/arch/x86_64/interrupts.s
$(AS) $(ASFLAGS) $< -o $@
src/arch/x86_64/switch.o: src/arch/x86_64/switch.s
$(AS) $(ASFLAGS) $< -o $@
src/arch/x86_64/%.o: src/arch/x86_64/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Kernel
src/kernel/%.o: src/kernel/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Memory Management
src/mm/%.o: src/mm/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Drivers
src/drivers/%.o: src/drivers/%.c
$(CC) -c $< -o $@ $(CFLAGS)
src/drivers/net/%.o: src/drivers/net/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Network stack
src/net/l2/%.o: src/net/l2/%.c
$(CC) -c $< -o $@ $(CFLAGS)
src/net/l3/%.o: src/net/l3/%.c
$(CC) -c $< -o $@ $(CFLAGS)
src/net/l4/%.o: src/net/l4/%.c
$(CC) -c $< -o $@ $(CFLAGS)
src/net/core/%.o: src/net/core/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Filesystem
src/fs/%.o: src/fs/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Shell
src/shell/%.o: src/shell/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Configuration
src/config/%.o: src/config/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# MMIO subsystem
src/kernel/mmio/%.o: src/kernel/mmio/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# VirtIO drivers
src/drivers/virtio/%.o: src/drivers/virtio/%.c
$(CC) -c $< -o $@ $(CFLAGS)
# Nettoyage (garde Limine)
clean:
rm -f src/arch/x86_64/*.o src/kernel/*.o src/kernel/mmio/*.o src/mm/*.o
rm -f src/drivers/*.o src/drivers/net/*.o src/drivers/virtio/*.o
rm -f src/net/l2/*.o src/net/l3/*.o src/net/l4/*.o src/net/core/*.o
rm -f src/fs/*.o src/shell/*.o src/config/*.o
rm -f alos.elf alos.iso
rm -rf iso_root
# Nettoyage complet (inclut Limine)
distclean: clean
rm -rf $(LIMINE_DIR)
# Test rapide avec QEMU x86-64 (avec carte réseau virtio connectée en mode user)
# SLIRP network: 10.0.2.0/24, gateway 10.0.2.2, DHCP range 10.0.2.15-10.0.2.31
run: run-vbox
run-vbox: iso
@echo "=== Starting VirtualBox ==="
@# Arrêter la VM si elle tourne pour pouvoir modifier les paramètres
@VBoxManage controlvm "ALOS" poweroff 2>/dev/null || true
@sleep 1
@if ! VBoxManage list vms | grep -q "\"ALOS\""; then \
echo "Creating VM 'ALOS'..."; \
VBoxManage createvm --name "ALOS" --ostype "Other_64" --register; \
VBoxManage modifyvm "ALOS" --memory 1024 --vram 16 --graphicscontroller vmsvga; \
VBoxManage storagectl "ALOS" --name "IDE Controller" --add ide; \
fi
@echo "Configuring serial port..."
@VBoxManage modifyvm "ALOS" --uart1 0x3F8 4 --uartmode1 file $(CURDIR)/serial.log
@VBoxManage storageattach "ALOS" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium $(CURDIR)/alos.iso --forceunmount 2>/dev/null || \
VBoxManage storageattach "ALOS" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium $(CURDIR)/alos.iso
@rm -f serial.log
@touch serial.log
VBoxManage startvm "ALOS"
@echo ""
@echo "=== Serial logs: tail -f serial.log ==="
@sleep 2 && tail -f serial.log
run-qemu: iso
rm -f serial.log
qemu-system-amd64 -cdrom alos.iso -m 4096M \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE_4M.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS_4M.fd \
-boot d -netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15,hostfwd=tcp::8080-:80 \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk \
-device bochs-display \
-serial stdio \
-no-reboot \
-no-shutdown
# Run QEMU avec accélération GPU optimisée (RECOMMANDÉ pour GUI)
run-qemu-fast: iso
@echo "=== Starting QEMU with GPU acceleration ==="
rm -f serial.log
qemu-system-x86_64 -cdrom alos.iso -m 4096M \
-accel kvm -cpu host -smp 2 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE_4M.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS_4M.fd \
-boot d -netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15,hostfwd=tcp::8080-:80 \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk \
-device virtio-vga-gl -display sdl,gl=on \
-serial file:serial.log \
-no-reboot \
-no-shutdown
@echo ""
@echo "=== Performance tips ==="
@echo " - virtio-vga-gl: GPU accéléré (au lieu de bochs-display)"
@echo " - KVM: Accélération matérielle CPU"
@echo " - SDL+OpenGL: Rendu accéléré"
@echo " - Serial log: tail -f serial.log"
# Run QEMU fast sans KVM (pour machines virtuelles ou non-Linux)
run-qemu-fast-no-kvm: iso
@echo "=== Starting QEMU with GPU acceleration (no KVM) ==="
rm -f serial.log
qemu-system-x86_64 -cdrom alos.iso -m 4096M \
-cpu qemu64 -smp 2 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE_4M.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS_4M.fd \
-boot d -netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15,hostfwd=tcp::8080-:80 \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk \
-device virtio-vga-gl -display sdl,gl=on \
-serial file:serial.log \
-no-reboot \
-no-shutdown
# Run avec capture de paquets (pour Wireshark)
run-pcap: iso
qemu-system-x86_64 -cdrom alos.iso -m 1024M \
-netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15 \
-device virtio-net-pci,netdev=net0 \
-object filter-dump,id=dump0,netdev=net0,file=alos-network.pcap
@echo "Capture sauvée dans alos-network.pcap"
# Run avec TAP (paquets visibles sur l'hôte via Wireshark sur tap0)
# Prérequis: sudo ip tuntap add dev tap0 mode tap user $USER && sudo ip link set tap0 up
run-tap: iso
qemu-system-x86_64 -cdrom alos.iso -m 1024M \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk
# Run avec vmnet-shared (macOS uniquement - même réseau que l'hôte)
# Nécessite: brew install qemu (version avec vmnet support)
# Note: Peut nécessiter sudo ou des permissions spéciales
run-vmnet: iso
sudo qemu-system-x86_64 -cdrom alos.iso -m 2048M \
-netdev vmnet-shared,id=net0 \
-device virtio-net-pci,netdev=net0 \
-d int,cpu_reset -no-reboot \
-drive file=disk.img,format=raw,index=0,media=disk
# Run avec socket multicast (pour debug local sans réseau externe)
run-socket: iso
qemu-system-x86_64 -cdrom alos.iso -m 1024M \
-netdev socket,id=net0,mcast=230.0.0.1:1234 \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk
# Run avec UEFI (meilleur support framebuffer)
run-uefi: iso
qemu-system-x86_64 -cdrom alos.iso -m 256M \
-bios /usr/share/ovmf/OVMF.fd \
-netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15 \
-device virtio-net-pci,netdev=net0 \
-drive file=disk.img,format=raw,index=0,media=disk \
-serial stdio
# Userland build
userland:
$(MAKE) -C src/userland
# Staging directory for disk image (fs_root)
fs_root: disk_structure userland
@echo "=== Preparing filesystem root ==="
@rm -rf fs_root
@mkdir -p fs_root
@cp -r disk_structure/* fs_root/
@mkdir -p fs_root/bin
@cp -v src/userland/threads-test fs_root/bin/
@cp -v src/userland/gui_app fs_root/bin/gui
# Créer une image de disque à partir de fs_root
disk.img: fs_root
@echo "=== Creating disk image from fs_root ==="
@rm -f disk.img
@# Créer un fichier vide de 64MB
@dd if=/dev/zero of=disk.img bs=1M count=64 status=none
@# Formater en ext2 et copier le contenu de fs_root
@# -F forces to run on a file
@# -d copies content from directory
@mkfs.ext2 -F -d fs_root disk.img
@chmod 644 disk.img
@echo "=== Disk image created: disk.img (EXT2) ==="
# Debug avec QEMU (attend GDB sur port 1234)
debug: iso
qemu-system-x86_64 -cdrom alos.iso -m 1024M -netdev user,id=net0 -device virtio-net-pci,netdev=net0 -s -S &
@echo "QEMU lancé. Connectez GDB avec: target remote localhost:1234"