You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1.7 KiB

Oktatóanyag 02 - Többmagos C

Próbáljunk valami összetettebbet, mit szóltok? Összetettebb alatt azt értem, hogy most is megállítjuk a CPU magokat, akárcsak az első oktatóanyagban, de most az egyik magot C-ből!

Start

Most már meg kell különböztetnünk a magokat. Ehhez kiolvassuk a mpidr_el1 rendszer regisztert. Ha nem nulla, akkor a korábbi végtelen ciklus következik. Ha nulla, akkor meg fogunk hívni egy C eljárást. De ehhez előbb be állítanunk egy megfelelő vermet, ki kell nulláznunk a bss szegmenst mielőtt kiadhatnánk az ugrás parancsot. Hozzáadtam néhány Assembly sort, amik mindezt elvégzik. Arra az esetre, ha a C eljárás visszatérne (nem szabadna), ugyanarra a végtelen ciklusra ugrunk, mint amit a többi CPU mag is épp végrehajt.

Makefile

Egy kisit trükkösebb lett. Hozzáadtam parancsokat a C fordításhoz, de akkor már általánosan. Mostantól ugyanazt a Makefile-t használhatjuk minden oktatóanyaghoz, függetlenül attól, hány C forrásfájlunk van, és a továbbiakban nem is szerepeltetem.

Linker script

Hasonlóan, a linker szkript is bonyolultabbá vált, mivel a C-hez adat és bss szekciókra is szükség van. Hozzáadtam továbbá egy számolást a bss szegmens méretének megállapítására, így egyszerűen hivatkozhatunk rá Assembly-ben, és nem kell ott molyolni vele.

Fontos, hogy a text szegmens az Assembly kóddal kezdődjön, mivel ez elé raktuk a vermet, ezért kell a KEEP(). Íly módon mind a betöltési címünk 0x80000, akárcsak a _start cimke címe és a verem teteje.

Main

Végezetül, az első C kódunk. Csak egy végtelen ciklus, de akkor is! :-)