rustOSTECNO LK7k
AÇIK GELİŞTİRME KAYDITECNO POVA CURVE 2 5G / LK7k
KAYNAK

Telefon girişi yazıldı; yükleme henüz sertifikalı değil.

QEMU virt açılışı duruyor. LK7k için ayrı bir AArch64 imajı üç stok UART portunu yoklayıp DTB, bellek ve PSCI raporunu yazacak şekilde derlendi. Dinamik rezervasyonlar çözülmediği için bu imaj telefona yazılmadı.

DURUM / KOD VE MİMARİ
Sürüyor
HEDEF CİHAZTECNO LK7k
ÇALIŞMA BİÇİMİLK7k giriş imajı
rustOS_
DilRust + AArch64 assembly
LK7k imajılk7k-Image
YerleşimBloke
Telefona yazma0
İÇERİK

Bu başlıkta neredeyiz?

04 KAYIT
KERNEL

Ortak açılış sözleşmesi

boot.S EL2 ise EL1h'e iner, BSS'i temizler, FP/SIMD erişimini ve EL1 vektör tablosunu kurar. QEMU ve LK7k ortak giriş koduna kartlarına özgü Image başlık alanlarını verir; konsol kart modülünden gelir.

LK7K

Telefon giriş imajı

Stok kernel başlığı ve vendor_boot yükleme alanına göre rustos-lk7k, 0x40000000 aday adresine bağlanır. Üç mediatek,mt6577-uart portunu yoklayacak giriş derlendi; dinamik rezervasyonlar nedeniyle yerleşim hâlâ reddediliyor.

PROB

Gözlenebilir reset tanılayıcısı

Ayrı rustos-lk7k-probe imajı FDT ve PSCI'yi denetleyip beş saniye sonra sistem reseti ister. QEMU QMP guest-reset olayı doğrulandı; imzasız Android v4 adayı telefona gönderilmedi.

KAPI

Yerleşim kanıtı olmadan boot yok

check_placement, adresi bilinmeyen üç reserved-memory isteği varken Ok dönmez. Kilitli bootloader ve farklı vbmeta blob'u dururken fastboot veya flash çalıştırılmaz.

KAYNAK KARTLARI

Açılış kodu, satır aralığıyla

05 KESİT

Kartlar depodaki dosyadan derleme sırasında okunur. Her kesitin SHA-256 değeri o metne aittir. QEMU virt çıktısı kanıttır; LK7k imajı üretilmiştir ve telefona yazılmamıştır.

01 · GİRİŞ

EL2’den EL1’e ve istisna vektörü

QEMU’da çalıştıL19–L61

src/boot.S::_start

0:
    mov x19, x0
    mrs x1, CurrentEL
    cmp x1, #8
    b.ne 1f

    /* Enter non-secure AArch64 EL1h if QEMU starts us in EL2. */
    movz x1, #0x8000, lsl #16
    msr hcr_el2, x1
    movz x1, #0x3c5
    msr spsr_el2, x1
    adr x1, 2f
    msr elr_el2, x1
    isb
    eret

1:
    cmp x1, #4
    b.ne 3f
2:
    msr spsel, #1
    adrp x2, __bss_start
    add x2, x2, :lo12:__bss_start
    adrp x3, __bss_end
    add x3, x3, :lo12:__bss_end
4:
    cmp x2, x3
    b.hs 5f
    str xzr, [x2], #8
    b 4b
5:
    adrp x1, __stack_top
    add x1, x1, :lo12:__stack_top
    mov sp, x1
    /* LLVM may use FP/SIMD for ordinary Rust aggregate copies. */
    movz x1, #0x30, lsl #16
    msr cpacr_el1, x1
    adrp x1, exception_vectors
    add x1, x1, :lo12:exception_vectors
    msr vbar_el1, x1
    isb
    mov x0, x19
    bl kernel_main
kesit SHA-256: 041d0b056717e89e19eb63d4cb41f484c3132d0f4450a4e2667fdb325d3ef043dosya SHA-256: 2895fb51f35a255c414295776a2ebb1cdfd3b3f65cc6b612932e6fb91a1ade74
02 · TELEFON

LK7k çekirdek girişi

İmaj üretildi, yüklenmediL18–L36

src/lk7k_main.rs::kernel_main

#[no_mangle]
extern "C" fn kernel_main(dtb_address: usize) -> ! {
    let image = Span {
        start: core::ptr::addr_of!(__image_start) as u64,
        size: (core::ptr::addr_of!(__image_end) as usize
            - core::ptr::addr_of!(__image_start) as usize) as u64,
    };
    // Placement against dynamic reservations is still unresolved. This entry
    // reports that fact; it does not treat the link address as certified.
    bootlog::report(
        &mut open_early_uart(),
        "RustOS/LK7k phone entry",
        dtb_address,
        image,
    );
    loop {
        unsafe { asm!("wfe", options(nomem, nostack)) };
    }
}
kesit SHA-256: bd1d04ac7de08bf91b804cb2bb2e7dcf9ade0c7b9d7cd8cf2381118e66a84aeddosya SHA-256: eeb3a434a0d3e9ced437ffa9b015ed1fda8f5de73090e22d3bde2ef90483f5a3
03 · UART

Üç stok portun erken yoklaması

Host testi geçtiL53–L93

src/board/lk7k.rs::open_early_uart

/// Physical 16550-style port. Logical register numbers are shifted for MTK.
#[cfg(target_arch = "aarch64")]
#[derive(Clone, Copy)]
pub struct MmioPort {
    pub base: usize,
}

#[cfg(target_arch = "aarch64")]
impl RegisterIo for MmioPort {
    fn read8(&mut self, offset: usize) -> u8 {
        unsafe { core::ptr::read_volatile(register_address(self.base, offset) as *const u8) }
    }
    fn write8(&mut self, offset: usize, value: u8) {
        unsafe {
            core::ptr::write_volatile(register_address(self.base, offset) as *mut u8, value);
        }
    }
}

/// Probe the three stock ports and keep the first one that accepts a byte.
#[cfg(target_arch = "aarch64")]
pub fn open_early_uart() -> super::SerialWriter<PolledTx<MmioPort>> {
    for &base in &UART_BASES {
        let mut probe = PolledTx {
            io: MmioPort { base },
            poll_limit: 32,
        };
        if probe.putc(b'\r').is_ok() {
            return super::SerialWriter(PolledTx {
                io: MmioPort { base },
                poll_limit: 8_000,
            });
        }
    }
    super::SerialWriter(PolledTx {
        io: MmioPort {
            base: UART_BASES[0],
        },
        poll_limit: 32,
    })
}
kesit SHA-256: 28e417e1bd105b4429fcd01286cebcdb97a76c525a20b7d4b42ce5a1cca22154dosya SHA-256: e97176f524a17046c0af5dc452c28623fa194877c0e11956167469a813fd33de
04 · KAPI

Dinamik rezervasyon yerleşimi reddeder

Stok ağaçta blokeL215–L240

src/memory.rs::Map::check_placement

    /// Require explicit proof of dynamic allocations before claiming a safe placement.
    pub fn check_placement(&self, image: Span, dtb: Span) -> Result<(), Error> {
        for candidate in [image, dtb] {
            if candidate.size == 0 || candidate.end().is_none() {
                return Err(Error::InvalidRegion);
            }
            if !self.ram[..self.ram_count]
                .iter()
                .any(|r| r.contains(candidate))
            {
                return Err(Error::OutsideRam);
            }
            if self.reserved[..self.reserved_count]
                .iter()
                .any(|r| r.overlaps(candidate))
            {
                return Err(Error::ReservedOverlap);
            }
        }
        if image.overlaps(dtb) {
            return Err(Error::ReservedOverlap);
        }
        if self.dynamic_requests != 0 {
            return Err(Error::DynamicReservationsUnresolved);
        }
        Ok(())
kesit SHA-256: 9248cc6364f8a896e6d276fbaba49f7566590dcc2360359637e91bfde2e76ae5dosya SHA-256: d2cafd14856aed26fb5bc905774523317b84f49e964be8f1d11ee4af1e8d28f3
SONRAKİ ADIMLAR

Bir sonraki doğrulama

Her adım gözlenebilir bir sonuca bağlanacak.

  • Bootloader'ın çözdüğü rezervasyon adreslerini öğren
  • Hangi UART'ın saat ve pin ile ayakta olduğunu kanıtla
  • Kilit, yuva _b ve geri dönüş kararı olmadan imajı yükleme