Uživatel:FroxDev/Btcode
Z 8.B8 wiki
< Uživatel:FroxDev
Verze z 23. 5. 2010, 18:36; 94.113.169.208 (diskuse)
Obsah
• 1 head.S • 1.1 entry point • 1.2 exception_matrix • • 2 setup.c • 2.1 init_arch • 2.2 setup_arch • • 3 traps.c • 3.1 flush_icache • 3.2 flush_dcache • • 4 main.c • 4.1 start_kernel • 4.2 uart1_init • 4.3 set_bridge_clock • • 5 misc.c • 5.1 prom_printf • 5.2 vsprintf • 5.3 SprintF • • 6 irq.c • 6.1 exception_init • 6.2 set_except_vector • 6.3 clear_cp0_status • 6.4 do_reserved • 6.5 init_IRQ • 6.6 request_IRQ • 6.7 setup_IRQ • 6.8 free_IRQ • 6.9 mask_IRQ • 6.10 unmask_IRQ • 6.11 ExceptionToIrq_setup • 6.12 change_cp0_status • • 7 monitor.c • 7.1 check_cpu_speed • 7.2 timer_interrupt • 7.3 timer_init • • head.S entry point • vloží do registru sp adresu na strukturu init_task_union, resp. na její poslední volné místo • vynuluje prostor pro statické proměnné bootloaderu, následovaný za code segmentem • zavolá init_arch() • exception_matrix • přečte registr CP0_CAUSE a podle kódu výjimky zavolá příslušný handler v poli exception_handlers • setup.c init_arch • v registru CP0_STATUS vypne mód 64bit a ostatní koprocesory, zapne pouze CP0 • zavolá start_kernel() • setup_arch • nastaví ST0_BEV v CP0_STATUS na 0 - bootstrap mode a zapne přerušení 0, 2, 3, 4, 5 ??ST0_BEV význam? • traps.c flush_icache • za zastavených přerušení nastaví druhý bit CP0_XCONTEXT na 0 a pak na 1 ?? efekt? • flush_dcache • za zastavených přerušení nastaví první bit CP0_XCONTEXT na 0 a pak na 1 ?? efekt? • main.c start_kernel • flush_icache() a flush_dcache() • setup_arch() • exception_init() • init_IRQ() • rtl_outl - GPIO F data - 0 • check_cpu_speed() - uloží do lokální proměnné • set_bridge_clock() na zjištěnou rychlost • rtl_outl - GPIO F data - 1 • cli - vypne všechna přerušení • uart1_init() na zjištenou rychlost • • uart1_init • rtl_outb - UART_LCR - 8bit words, no parity, one stop bit • rtl_outb - UART_DLM, UART_DLL - nastasvení baudrate v závislosti na rychlosti cpu • rtl_outb - UART_LCR, UART_FCR - vypnutí FIFO a reset, znovu nastavení 8bit words • prázdná smyčka, 4096 opakování • rtl_outb - UART_FCR, UART_MCR - vynulování, disable flow control • prom_printf() - oznámení načtení uart • set_bridge_clock • nastaví v registru BDGCR hodnoty dělení rychlosti jednotlivých sběrnic, v závislosti na rychlosti cpu a hodnoty 0xBD01010C ??význam? • misc.c prom_printf • vsprintf() - pouze předání argumentů, buffer je null • vsprintf • projde celý řetězec fmt pro každý znak, dokud není null • když přečtený znak není %, tak • když buffer není null, tak se do něj tento znak vloží • jinak se na daný znak volá putchar - serial_outc() • • jinak se pomocí zjednodušených algoritmů přečtou znaky a vyhodnotí, využívá funkci SprintF() • vrací počet vepsaných znaků • SprintF • vsprintf() - stejné argumenty • irq.c exception_init • clear_cp0_status - bit ST0_BEV • set_except_vector() - vepíše do všech vyjímkových handlerů (32) funkci do_reserved() • memcpy() - zkopíruje kód exception_matrix na adresu 0x80000080 - místo příjmu výjimky • flush_icache() • sti - zapíná přerušení • set_except_vector • vloží adresu na danou metodu na určený index pole exception_handlers - ovladače pro chytání jednotlivých výjimek • clear_cp0_status • na označené bity v masce uloží hodnotu 0 • do_reserved • prom_printf() - vypíše chybu a uvízne v nekonečném cyklu • init_IRQ • ExceptionToIrq_setup() • request_IRQ • ověří jestli číslo přerušení je menší než jejich počet - 64, jinak vrací -1 • vloží předané dev_id do předané struktury • setup_IRQ() na dané hodnoty • unmask_IRQ() na dané číslo přerušení • vrací hodnotu GIMR0 • setup_IRQ • save_and_cli • do pole irq_action nastaví na příslušný index přerušení zadanou strukturu • restore_flags • free_IRQ • mask_IRQ() • mask_IRQ • vypne bit přerušení v GIMR0 • unmask_IRQ • zapne přerušení daného čísla v GIMR0 - speciální registr pro konfiguraci přerušení • ExceptionToIrq_setup • change_cp0_status() - CP0_IM - vypíná přerušení • set_except_vector() - jako handler pro výjimky typu přerušení nastavuje IRQ_finder • change_cp0_status() - zapíná přerušení • change_cp0_status • podle masky aktualizuje hodnotu v registru CP0_STATUS • monitor.c check_cpu_speed • request_IRQ() - žádá o timer interrupt na strukturu irq_timer, kde je handler timer_interrupt() • timer_init() • algoritmicky spočítá, kolik instrukcí je provedeno v jednom 10ms bloku • vypne přerušení timeru (registry TCCNR, TCIR) • free_IRQ() - uvolní timer interrupt • vrací rychlost procesoru v MHz • timer_interrupt • inkrementuje jiffies • timer_init • zapne nultý časovač jako timer, nastaví data na 35B60, čili 10ms a zapne přerušení (registry TCCNR, TC0DATA, TCIR) •