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.
37 lines
1.7 KiB
Markdown
37 lines
1.7 KiB
Markdown
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! :-)
|