Update SMP TODO

This commit is contained in:
Ciro Santilli
2015-11-11 15:10:36 +01:00
parent a41a4c1f18
commit 7ed9f2c0e7
4 changed files with 28 additions and 53 deletions

View File

@@ -13,7 +13,7 @@ QEMU ?= qemu-system-i386
RUN ?= bios_hello_world
TMP_EXT ?= .tmp
OUTS := $(foreach IN_EXT,$(NASM_EXT) $(GAS_EXT),$(patsubst %$(IN_EXT),%$(OUT_EXT),$(wildcard *$(IN_EXT))))
OUTS := $(sort $(foreach IN_EXT,$(NASM_EXT) $(GAS_EXT),$(patsubst %$(IN_EXT),%$(OUT_EXT),$(wildcard *$(IN_EXT)))))
RUN_FILE := $(RUN)$(OUT_EXT)
.PRECIOUS: %$(OBJ_EXT)
@@ -38,14 +38,14 @@ $(COMMON):
clean:
rm -fr *$(OBJ_EXT) *$(OUT_EXT) *$(TMP_EXT)
run: all
run: $(RUN_FILE)
$(QEMU) -drive 'file=$(RUN_FILE),format=raw' -smp 2
debug: all
debug: $(RUN_FILE)
$(QEMU) -hda '$(RUN_FILE)' -S -s &
gdb -x gdb.gdb
bochs: all
bochs: $(RUN_FILE)
# Supposes size is already multiples of 512.
# We force that with our linker script,
# and `grub-mkrescue` also seems to respect it as well.
@@ -59,7 +59,7 @@ bochs: all
BIG_IMG_DIR := big_img$(TMP_EXT)
BOOT_DIR := $(BIG_IMG_DIR)/boot
GRUB_DIR := $(BOOT_DIR)/grub
big-img: all
big$(OUT_EXT): all
rm -rf '$(BIG_IMG_DIR)'
mkdir -p '$(GRUB_DIR)'
for out in $(OUTS); do\
@@ -71,4 +71,4 @@ big-img: all
#mkdir -p '$(BOOT_DIR)/multiboot'
#printf "menuentry \"multiboot/hello-world\" {\n chainloader /boot/multiboot/hello-world.img\n}\n" >> '$(GRUB_DIR)/grub.cfg';\
#cp multiboot/hello-world/main.img '$(BOOT_DIR)/multiboot/hello-world.img'
grub-mkrescue -o 'big.img' '$(BIG_IMG_DIR)'
grub-mkrescue -o '$@' '$(BIG_IMG_DIR)'

10
TODO.md
View File

@@ -1,7 +1,13 @@
# TODO
-
http://stackoverflow.com/questions/1858640/how-can-i-create-a-sleep-function-in-16bit-masm-assembly-x86
- SMP sync
- MONITOR/MWAIT
- LOCK prefix
- MFENCE
- LFENCE
- SFENCE
- http://stackoverflow.com/a/33651438/895245
- cache:

26
smp.S
View File

@@ -3,25 +3,7 @@
Expected output: "SMP started"
TODO get working + answer all of:
- http://stackoverflow.com/questions/16364817/assessing-the-apic-and-creating-ipis-in-x86-assembly
Closest quesiton so far! Almost there!
Table 8-1. Broadcast INIT-SIPI-SIPI Sequence and Choice of Timeouts contains actual code!
TODO: how to sleep the right ammount of time?
- http://stackoverflow.com/questions/15091165/inter-processor-interrupt-usage
- http://stackoverflow.com/questions/1516530/assembly-and-multicore-cpus?lq=1
- http://stackoverflow.com/questions/1622388/running-code-on-different-processor-x86-assembly
- http://stackoverflow.com/questions/26452323/how-can-we-use-multi-core-and-cpu-on-assembly-boot-loader-x86
- http://stackoverflow.com/questions/2986931/the-way-cores-processes-and-threads-work-exactly?rq=1
- http://stackoverflow.com/questions/419486/multithreading-and-interrupts
- http://stackoverflow.com/questions/663958/how-to-control-which-core-a-process-runs-on
- http://stackoverflow.com/questions/714905/threads-in-x86-assembler-using-the-gnu-assember-as
- http://stackoverflow.com/questions/7308391/how-is-concurrency-done-in-intel-x86-assembly
- http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like
- http://stackoverflow.com/questions/28047092/by-which-instruction-the-secondary-core-is-triggered-while-starting-the-secondar?rq=1
- http://stackoverflow.com/questions/23962839/how-to-correctly-use-a-startup-ipi-to-start-an-application-processor?rq=1
- https://github.com/cirosantilli/oszur11-operating-system-examples/tree/1af6451852887fac3d7206d4d09714c181c81d1e/Chapter_07_Threads
The hard part is sleeping the right amount of time as required by Intel: this example uses the PIT.
*/
/* Must be a multiple of 0x1000. */
@@ -116,7 +98,11 @@ init:
xor %ax, %ax
mov %ax, %ds
movb $1, SPINLOCK_ADDRESS
/* TODO mandatory? Is lock prefix enough? */
/*
TODO mandatory?
- is lock prefix enough?
- is caching even on I think not because it is off
*/
wbinvd
hlt
.equ init_len, . - init

33
smp.md
View File

@@ -2,15 +2,9 @@
# Symmetric multiprocessing
At fist, a single processor starts.
Read this first: <http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like/33651438#33651438>
To start the others, the first processor must tell the APIC to send a few special interrupts to the other processors.
One of those interrupts says where the there processors start running their first instruction from.
- Intel docs: Volume 3, Chapter 8 "Multiple processor Management".
Does not seem standardized across to AMD.
- Does not seem standardized across to AMD.
On Intel goes through the APIC to generate an interrupt across processors:
@@ -20,8 +14,6 @@ One of those interrupts says where the there processors start running their firs
- <https://en.wikipedia.org/wiki/Inter-processor_interrupt>
- Linux kernel `arch/x86/kernel/smpboot.c`
- newer Intel processors have an L2 shared across cores:
- http://stackoverflow.com/questions/4802565/multiple-threads-and-cpu-cache
@@ -55,19 +47,10 @@ processors on the system bus as the BSP. The remaining processors are designated
message) from the BSP processor. Upon receiving a SIPI message, an AP executes the BIOS AP configuration code,
which ends with the AP being placed in halt state.
## AP
Bibliography:
Application processor: all processors except the boot one.
## ICR
## Interrupt command register
When we write to it, interrupts are sent.
It is memory mapped to `0xFEE0 0300`.
[Intel Manual Volume 3 System Programming Guide - 325384-056US September 2015](https://web.archive.org/web/20151025081259/http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf)
- 10.6 "ISSUING INTERPROCESSOR INTERRUPTS" documents its format
- Table 10-1 Local APIC Register Address Map documents where it is mapped to in memory
- http://stackoverflow.com/questions/16364817/assessing-the-apic-and-creating-ipis-in-x86-assembly
- http://stackoverflow.com/questions/980999/what-does-multicore-assembly-language-look-like
- http://stackoverflow.com/questions/1622388/running-code-on-different-processor-x86-assembly
- http://stackoverflow.com/questions/1516530/assembly-and-multicore-cpus?lq=1
- http://stackoverflow.com/questions/663958/how-to-control-which-core-a-process-runs-on