// Bootstrap processor starts running C code here. int main(int memsize) { mpinit(); // collect info about this machine lapicinit(mpbcpu()); ksegment(); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port cprintf("cpus %p cpu %p\n", cpus, cpu); cprintf("\ncpu%d: starting xv6\n\n", cpu->id); cprintf("mem: %d kb\n", memsize); kinit(memsize); // physical memory allocator pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table iinit(); // inode cache ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer pageinit(); // enable paging userinit(); // first user process bootothers(); // start other processors // Finish setting up this processor in mpmain. mpmain(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { monitor_clear (); // Print basic system information. cprintf ("Ensidia\n\n"); cprintf ("Copyright (c) 2013-2014 Fotis Koutoulakis\n"); cprintf ("Based on xv6 by Russ Cox et al, at MIT CSAIL\n"); kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); seginit(); // set up segments cprintf("\ncpu%d: starting xng kernel\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table iinit(); // inode cache ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process // Finish setting up this processor in mpmain. mpmain(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { unsigned char FB[]="MESSAGE WRITTEN THROUGH FRAMEBUFFER!!"; fb_init(); // initialize framebuffer device (2015.11.02) cprintf("\nUsing Framebuffer still presents some problems :(\n\n"); cprintf("\nSuggestion: review the way it is used in console.c\n\n"); fb_write(FB, sizeof(FB)); // Framebuffer maybe could be used before this moment (2015.11.02) see_mylock(MYLOCK); kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); seginit(); // set up segments cprintf("\ncpu%d: starting xv6\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process // Finish setting up this processor in mpmain. mpmain(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator // kmem. freelist added cprintf("%x \n", end); kvmalloc(); // kernel page table #ifdef CONFIG_MULTI_PROCESS mpinit(); // collect info about this machine #endif lapicinit(); seginit(); // set up segments picinit(); // interrupt controller: Programmable Interrupt Controller #ifdef CONFIG_MULTI_PROCESS ioapicinit(); // another interrupt controller #endif consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table iinit(); // inode cache ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer #ifdef CONFIG_MULTI_PROCESS startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() #endif userinit(); // first user process // Finish setting up this processor in mpmain. mpmain(); }
/*int main(void){*/ void kmain(void){ // vga_init(); // puts((uint8_t*)"Hello kernel world!\n"); /*do some work here, like initialize timer or paging*/ kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); // gdt_descriptor(); // puts((uint8_t*)"GDT initialized...\n"); // idt_descriptor(); // puts((uint8_t*)"IDT initialized...\n"); // cprintf("IDT initialized...\n"); seginit(); // set up segments cprintf("\ncpu%d: starting xv6\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process // Finish setting up this processor in mpmain. mpmain(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // detect other processors lapicinit(); // interrupt controller seginit(); // segment descriptors cprintf("\ncpu%d: starting xv6\n\n", cpunum()); picinit(); // another interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // console hardware uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process mpmain(); // finish this processor's setup init_semaphores_on_boot(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(mpbcpu()); seginit(); // set up segments cprintf("\ncpu%d: starting xv6\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table iinit(); // inode cache ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors (must come before kinit) kinit(); // initialize memory allocator userinit(); // first user process (must come after kinit) // Finish setting up this processor in mpmain. mpmain(); }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); seginit(); // set up segments cprintf("\ncpu%d: starting xv6\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table ideinit(); // disk if(!ismp) timerinit(); // uniprocessor timer startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process mpmain(); }
int main(void) { _delay_ms(500); uint8_t data_buf[8]; ioinit(); uartinit(); can_init(0); pwm16Init2(); adcInit(1); st_cmd_t rpm_msg; counter0Init(); _delay_ms(500); sei(); sendtekst("\n\rUnicorn Gearnode v1.0 \n\r"); //rpm_msg.pt_data = rpm_response_buffer; //rpm_msg.status = 0; //can_update_rx_msg(&rpm_msg, rpm_msgid, 8); can_update_rx_msg(&rpm_msg, gear_msgid, 8); Can_sei(); Can_set_tx_int(); Can_set_rx_int(); while(1) { _delay_ms(100); data_buf[0] = GearNeutral; data_buf[1] = GEARNEUTRALMEAS; data_buf[2] = 0; can_send_non_blocking(gear_msgid, data_buf, 3); data_buf[0] = GearEst; data_buf[1] = 0; data_buf[2] = GearEst_val; can_send_non_blocking(rpm_msgid, data_buf, 3); /* gearUp(); gearUp(); gearUp(); gearUp(); gearDown(); gearDown(); gearDown(); gearDown(); */ } return 0; }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); seginit(); // set up segments cprintf("\ncpu%d: starting xv6\n\n", cpu->id); picinit(); // interrupt controller ioapicinit(); // another interrupt controller consoleinit(); // I/O devices & their interrupts uartinit(); // serial port initGraphMode(); initDom(); tryOnce(); toggleOn(); pinit(); // process table toggleOn(); tvinit(); // trap vectors toggleOn(); binit(); // buffer cache toggleOn(); fileinit(); // file table toggleOn(); iinit(); // inode cache toggleOn(); ideinit(); // disk toggleOn(); if(!ismp) timerinit(); // uniprocessor timer toggleOn(); startothers(); // start other processors toggleOn(); kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() toggleOn(); txt_initLock(); mouseEnable(); initProcessMsgMap(); userinit(); // first user process toggleOn(); endToggle(); // Finish setting up this processor in mpmain. mpmain(); }
int init(void){ DDRC=0xff; PORTC=0; DDRB=0; // USE B PINS FOR READING INPUT uartinit(12); TCCR0A=(1<<WGM01); TCCR0B=(1<<CS01)|(1<<CS00); TCNT0=0; OCR0A=15; TIMSK0=(1<<OCIE0A); sei(); return 0; }
int main(){ int flag = 0; t_mb *mb; long width, height; struct t_gpio gp; gpioinit(gp); enableok(gp); uartinit(gp); struct t_mb mb; mailboxinit(gp); //mb->data = *($1000); mb->data[0] = 8*4; mb->data[1] = 0; mb->data[2] = $40003; mb->data[3] = 8; mb->data[4] = 0; mb->data[5] = 0; mb->data[6] = 0; mb->data[7] = 0; mailboxwrite(mb, 8, $1000); width = mb->data[5]; height = mb->data[6]; okon(gp); /*frameBufferinit(); frameBufferfill(); while(flag) { uart_puts("resolution"); uart_puts(to_hex(width)); uart_puts("|"); uart_puts(to_hex(height)); uart_puts("end resolution"); frameBufferdebug(); }*/ return 0; }
// Os procedimentos de inicialização começam a executar o // código .C a partir daqui. // Aloca uma pilha real e troca para ela, primeiro fazendo // algumas configurações necessárias par o alocador de memória funcionar. int main(void) { kinit1(end, P2V(4*1024*1024)); // alocador de páginas de memória física kvmalloc(); // tabela de páginas do kernel mpinit(); // detecta outros processadores lapicinit(); // controlador de interrupções seginit(); // descritores de segmentos picinit(); // desabilita pic ioapicinit(); // outro controlador de interrupções consoleinit(); // console hardware uartinit(); // porta serial pinit(); // tabela de processos tvinit(); // vetores trap binit(); // buffer cache fileinit(); // tabela de arquivo ideinit(); // disco startothers(); // inicia outros processadores kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // deve vir após startothers() userinit(); // primeiro processo no modo usuário mpmain(); // encerra esta configuração de processadores }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator kvmalloc(); // kernel page table mpinit(); // detect other processors lapicinit(); // interrupt controller seginit(); // segment descriptors picinit(); // disable pic ioapicinit(); // another interrupt controller consoleinit(); // console hardware uartinit(); // serial port pinit(); // process table shminit(); // shared memory tvinit(); // trap vectors binit(); // buffer cache fileinit(); // file table ideinit(); // disk startothers(); // start other processors kinit2(P2V(4*1024*1024), P2V(PHYSTOP)); // must come after startothers() userinit(); // first user process mpmain(); // finish this processor's setup }
/**************************************************************************** MAIN APPLICATION ENTRY POINT ****************************************************************************/ int main(void) { // Queue creation - will be used for communication between the stack and other tasks xQueue = xQueueCreate(3, sizeof (int)); xSemFrontEnd = xSemaphoreCreateMutex(); // Initialize application specific hardware HWInit(HWDEFAULT); // Initializing the UART for the debug #if defined (STACK_USE_UART) uartinit(1,19200); uarton(1); uartwrite(1, "Flyport starting..."); #endif // RTOS starting if (xSemFrontEnd != NULL) { // Creates the task to handle all TCPIP functions xTaskCreate(TCPIPTask, (signed char*) "TCP", STACK_SIZE_TCPIP, NULL, tskIDLE_PRIORITY + 1, &hTCPIPTask); // Start of the RTOS scheduler, this function should never return vTaskStartScheduler(); } #if defined (STACK_USE_UART) UARTWrite(1, "Unexpected end of program...\r\n"); #endif while(1); return -1; }
int main (void) { int tmp,i,res; CLKPR = 0x80; CLKPR = 0x00; // Clock prescaler Reset /*-----------------------------------------------------------------* *------------------------- Gear buttoms setup---------------------* *-----------------------------------------------------------------*/ DDRC&=~(1<<PC7); // Neutral PORTC |= (1<<PC7); // Neutral pull-up DDRE&=~(1<<PE6); // Knap1 DDRE&=~(1<<PE7); // Knap2 /* Buttoms interrupt */ EICRB |= (1<<ISC71|1<<ISC70|1<<ISC61|1<<ISC60); /* Rising edge */ EIMSK |= (1<<INT7 | 1<<INT6); uint8_t test_rx[8]; int8_t data; char streng[10]; // Recieve buffer st_cmd_t msg; // Init CAN, UART, I/O init(); uartinit(); sendtekst("UART initialized\n\r"); TWI_init(); sendtekst("TWI initialized\n\r"); sei(); /* Interrupt enable */ sendtekst("Interrupt enabled\n\r"); /*-----------------------------------------------------------------* *----------------------------Display setup -----------------------* *-----------------------------------------------------------------*/ /* Set blink rates */ set_blink_rate(LED0_7_ADDR, LED_BLINK1, 20, 100); set_blink_rate(LED0_7_ADDR, LED_BLINK2, 0, RPM_LED_DUTYCYCLE*2.56); set_blink_rate(LED8_15_ADDR, LED_BLINK1, (1.0/RPM16_RATE)*252, RPM16_DUTYCYCLE*2.56); set_blink_rate(LED8_15_ADDR, LED_BLINK2, 0, RPM_LED_DUTYCYCLE*2.56); set_blink_rate(SEG_ADDR, LED_BLINK1, 20, 100); set_blink_rate(SEG_ADDR, LED_BLINK2, 0, SEG_DUTYCYCLE*2.56); set_blink_rate(LED_BUTTONS_ADDR, LED_BLINK1, 20, 100); set_blink_rate(LED_BUTTONS_ADDR, LED_BLINK2, 0, SEG_DUTYCYCLE*2.56); /*-----------------------------------------------------------------* *----------------------------CAN interrupt setup -----------------* *-----------------------------------------------------------------*/ Can_sei(); /* Enable general can interrupt */ Can_set_tx_int(); /* Enable can tx interrupt */ Can_set_rx_int(); /* Enable can rx interrupt */ /* * Kode til hurtig test af can */ sendtekst("Config 3 mailboxes for rpm_msgid...\n\r"); msg.id.std = rpm_msgid; msg.dlc = 8; res = can_config_rx_mailbox(&msg, 3); if (res == CAN_CMD_ACCEPTED) { sendtekst("SUCCESS\n\r"); } else { sendtekst("FAIL\n\r"); } // --- Init variables /* Init user led 0 & 1 */ DDRB |= (1<<PB6 | 1<<PB5); PORTB |= (1<<PB6 | 1<<PB5); sendtekst("Beep\n\r"); display_test(); params.GearEst = 0; char dataout[] = {gear,0}; while (1) { _delay_ms(20); /* Display selected parameter */ if (mode == RPM_MODE) { set_rpm(params.rpm, LED_ON); } else if (mode == VOLTAGE_MODE) { set_voltage(params.batteryV, LED_ON); } else if (mode == WATER_TEMP_MODE) { set_water_temp(params.waterTemp, LED_ON); } // Geat buttons to CAN dataout[1] = 0; /* Format buttom states for sending */ dataout[1] |= (params.GearButDown*GEARDOWNBUT | GEARUPBUT*params.GearButUp | params.GearButNeutral*GEARNEUBUT); /* Send buttom states */ if(dataout[1] != 0) { // Hack, sender gearskiftesignal et par gange, sådan at det går igennem // Symptombehandling, sygdommen skal kureres... if (dataout[1] & (GEARDOWNBUT) == GEARDOWNBUT) indi_leds_state |= (LED_BLINK2<<LED_BUTTON_1); if (dataout[1] & (GEARUPBUT) == GEARUPBUT) indi_leds_state |= (LED_BLINK2<<LED_BUTTON_1); set_leds(LED_BUTTONS_ADDR, indi_leds_state); for(j=0;j<1;j++){ can_send_non_blocking(gear_msgid, dataout, 2); _delay_ms(5); } indi_leds_state &= ~(LED_BLINK2<<LED_BUTTON_2); indi_leds_state &= ~(LED_BLINK2<<LED_BUTTON_1); set_leds(LED_BUTTONS_ADDR, indi_leds_state); } /* Clear buttom states */ params.GearButDown = 0; params.GearButUp = 0; params.GearButNeutral = 0; /* Display bottons code */ buttons_state = get_buttons(LED_BUTTONS_ADDR) & (BUTTON1 | BUTTON2); if (buttons_state == 2) { indi_leds_state |= (LED_BLINK2<<LED_BUTTON_1); indi_leds_state &= ~(LED_BLINK2<<LED_BUTTON_2); mode = VOLTAGE_MODE; } else if (buttons_state == 1) { indi_leds_state |= (LED_BLINK2<<LED_BUTTON_2); indi_leds_state &= ~(LED_BLINK2<<LED_BUTTON_1); mode = WATER_TEMP_MODE; } else if (buttons_state == 0) { indi_leds_state |= (LED_BLINK2<<LED_BUTTON_1 | LED_BLINK2<<LED_BUTTON_2); } else { indi_leds_state &= ~(LED_BLINK2<<LED_BUTTON_1 | LED_BLINK2<<LED_BUTTON_2); mode = RPM_MODE; } /* Indicator for water temp */ if (params.waterTemp <= WATER_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI1); indi_leds_state &= ~(LED_BLINK2<<LED_INDI4); } else if (params.waterTemp > WATER_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI4); indi_leds_state &= ~(LED_BLINK2<<LED_INDI1); } /* Indicator for batt ok */ if (params.batteryV <= VOLTAGE_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI2); indi_leds_state &= ~(LED_BLINK2<<LED_INDI5); } else if (params.batteryV > VOLTAGE_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI5); indi_leds_state &= ~(LED_BLINK2<<LED_INDI2); } /* Indicator for oil pressure ok */ if (params.oilPressure <= OILPRESS_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI3); indi_leds_state &= ~(LED_BLINK2<<LED_INDI6); } else if (params.oilPressure > OILPRESS_OK) { indi_leds_state |= (LED_BLINK2<<LED_INDI6); indi_leds_state &= ~(LED_BLINK2<<LED_INDI3); } /* Indicator for Gear */ if (params.GearNeutral < 0) { SEG_N(LED_ON); } else { if (params.GearEst > 6) { SEG_OFF(); } else { switch (params.GearEst) { case 0: SEG_N(LED_ON); break; case 1: SEG_1(LED_ON); break; case 2: SEG_2(LED_ON); break; case 3: SEG_3(LED_ON); break; case 4: SEG_4(LED_ON); break; case 5: SEG_5(LED_ON); break; case 6: SEG_6(LED_ON); break; default: break; } } } /* if (params.GearNeutral == 0) { SEG_OFF(); } else if (params.GearNeutral > 0) { SEG_N(LED_BLINK2); } */ /* Set indicator leds */ set_leds(LED_BUTTONS_ADDR, indi_leds_state); /* itoa(params.batteryV, streng, 10);*/ /* sendtekst(streng);*/ /* sendtekst("\n\r"); */ PORTB ^= (1<<PB6); } return 0; }
int main(void) { ioinit(); uartinit(); pwm8Init(); //pwm16Init(); adcInit(0); counter0Init(); pcintInit(); hbroEnable(1); sei(); gearPosTargetUp = GEARPOSMAX; gearPosTargetDown = GEARPOSMIN; while (1) { gearPosTargetUp = GEARPOSMAX; gearPosTargetDown = GEARPOSMIN; gearRetning = 0; if((PINB & 0x01) == 0x00) // Gear Kontakt GEAROP { _delay_ms(5); if((PINB & 0x01) == 0x00) // Stadig trykket ? (væk med støj) { if((PINB & 0x04) == 0x00) gearPosTargetUp = GEARPOSNEUTRALUP; else gearPosTargetUp = GEARPOSMAX; gearRetning = GEAROP; softwareTrig; _delay_ms(300); // Vent til gearskift er ca done } } if((PINB & 0x02) == 0x00) // Gear Kontakt GEARNED { _delay_ms(5); if((PINB & 0x02) == 0x00) { if((PINB & 0x04) == 0x00) gearPosTargetDown = GEARPOSNEUTRALDOWN; else gearPosTargetDown = GEARPOSMIN; gearRetning = GEARNED; softwareTrig; _delay_ms(300); } } // Venter pa at begge kontakter er sluppet igen while((PINB & 0b00000011) != 0b00000011){} } return 0; }
// Bootstrap processor starts running C code here. // Allocate a real stack and switch to it, first // doing some setup required for memory allocator to work. int main(void) { monitor_clear(); xylos_logo(); kinit1(end, P2V(4 * 1024 * 1024)); // phys page allocator, 16MB for kernel kvmalloc(); // kernel page table mpinit(); // collect info about this machine lapicinit(); seginit(); // set up segments cprintf("Initializing interrupts... "); init_generic_irq_table(); picinit(); // interrupt controller ioapicinit(); // another interrupt controller cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); cprintf("Initializing console and serial... "); consoleinit(); // I/O devices & their interrupts uartinit(); // serial port cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); cprintf("Setting up swap space disk... "); swapinit(); cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); cprintf("Initializing tasking... "); pinit(); // process table tvinit(); // trap vectors binit(); // buffer cache cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); cprintf("Initializing pipe IPC... "); init_pipe_ipc_system(); if(pipe_ipc_sanitycheck() == 0) { cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); } cprintf("Initializing direct IPC... "); init_direct_ipc_table(); if(direct_ipc_sanitycheck() == 0) { cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); } cprintf("Mounting root filesystem... "); fileinit(); // file table ideinit(); // disk cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); if(!ismp) { cprintf("Starting up uniprocessor CPU... "); timerinit(); // uniprocessor timer cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); } if(ismp) { if(ncpu > 1) { cprintf("Starting up %d CPU cores... ", ncpu); } else { cprintf("Starting up %d CPU core... ", ncpu); } } startothers(); // start other processors kinit2(P2V(4 * 1024 * 1024), P2V(PHYSTOP)); // 16MB to PHYSTOP [234MB] if(ismp) { cprintf_color(COLOR_BLACK, COLOR_LIGHT_GREEN, false, "done\n"); } // detects and starts km drivers auto_enable_nic(); // first user process userinit(); // Finish setting up this processor in mpmain. mpmain(); }