Buradaki _start aslında programın ilk çalışacağı nokta.
Linker'a "sen benim kodumu buradan başlat" diyoruz. ARM64 mimarisinde her
şey bu etiketten sonra şekilleniyor.
Interrupt'ları Kapatmak
İlk iş olarak interrupt'ları kapatıyoruz. Çünkü henüz hiçbir şey hazır değil. Ne memory mapping var, ne stack var, ne de driver'lar.
Gerçek dünya asenkron problemleri ile uğraşmamak için mesela bir IRQ gelse (keyboarda basıldı gibi), o kod nereye gidecek? O yüzden en temelden başlayıp: "Beni rahatsız etme kardeşim" diyerek bütün kesmeleri kapatıyoruz.
Beni hor görme kardeşim
sen altınsın, ben tunç muyum?
Aynı vardan
varolmuşuz,
sen gümüşsün, ben sac mıyım?
diyerek yolumuza devam ediyoruz.
Exception Level Tespiti
Burada mrs (Move from System Register) talimatı ile şu an hangi
Exception Level'de (EL0, EL1, EL2, EL3) olduğumuzu öğreniyoruz. ARM mimarisinde
bu seviyeler çok kritik:
- EL0: User mode (app'ler burada çalışır)
- EL1: Kernel mode (işletim sistemi çekirdeği)
- EL2: Hypervisor (sanallaştırma katmanı)
- EL3: Secure monitor (TrustZone, firmware işleri)
Bizim hedefimiz aslında EL1'de kernel'i başlatmak, ama donanım ve firmware'e göre sistem başka bir seviyede açılabilir.
Burada ufak bir bit maskesi yapıyoruz. CurrentEL register'ında daha fazla bilgi
var ama bizi ilgilendiren sadece [3:2] bitleri. Çünkü exception level 2 bitten okunuyor.
Yani 00, 01, 10, 11 gibi değerlerle
hangi seviyede olduğumuzu anlıyoruz.