kmain - PabloVillagran/SO1Nino GitHub Wiki

kmain

Es el nombre del menú del proyecto, el cual ejecutara una serie de comando que permitirán la escritura y lectura del sistema operativo, por lo que tiene una variedad de funciones que se utilizaran para realizar la acción de calculadora, reiniciado y apagado del sistema operativo. Por lo que primero se declaro en el assembler para que inicial la determinada función del menú por el cual se tuvo que referencia por linken.id. entre ellas se encuentra la declaración de limpiar, dibujar, lectura del teclado, la declaración de opciones a realizar en un determinada acción.

Realiza un ciclo infinito que escucha el teclado e interpreta las instrucciones por comando hasta que se le indica lo contrario con el comando die.

;declaración y llamada del menú principal de boot.c en el assembler start:

;función principal

cli ;cambia una bandera interna para el bloqueo de interrupciones

mov esp, stack_space ;asigna puntero para pila de instrucciones

call kmain ;llama al kernel

je shutdown_success

Por lo que después se menciono el el archivo de boot.c con la estructura de:

void kmain(void){//declaración de una función que retorna null llamada kmain

/*declaración de las acciones*/

}

Declaración del menú Kmain

int kmain(void)

{

vm = (char*)0xb8000; // array de caracteres en pantalla

clear();//iniciarlizacion de la funcion llamada limpieza de la pantalla del monitor

debug = 0;

n = 1;

output = "Wooffer >";

//position = strlen(output);

draw();

initPos = position;

input = " ";

while(1){

if(inb(0x64) & 0x01){

scancode = inb(0x60); //puerto de recepcion de datos en teclado

char cbCode = charByCode(scancode);

if(cbCode!='\0')

{

if(cbCode==8){

`backSpace();//declaracion de la funcion espaciadora`

`cursor();`

}else if(cbCode == '\n'){

`//limpia cursor`

`vm[position*2] = ' ';//realiza un enter en la  pantalla`

`vm[position*2+1] = 0x01;`

`//captura y logica`

`int len = position - initPos;`

`position = initPos;`

`char in[len];`

`int k;`

`for(k = 0; k < len; k++){`

 `in[k] = vm[position*2];`

 `position++;`

`}`

`in[k] = '\0';`

`input = in;`

`if(n>24){`

`clear();`

   `n=1;`

`position = 0;`

`}`

`position = (80*n);`

`++n;`

`print(input);`

`position = (80*n);`

`++n;`

`char * inp = funBegins(input);`

`print(inp);//declaración de la función escritura en la pantalla del monitor`

`if(equals(inp, "REBOOT"))`

 `reboot();//llama la scrip llamado reboot() declarado en la parte superior y en assembler`

`if(equals(inp, "APAGAR"))`

 `break;//salto`



`//reset`

`vm[position*2] = ' ';`

`vm[position*2+1] = 0x01;`

`position = (80*n);`

`++n;`

`draw();`

`initPos = position;`

}else{

`printc(cbCode, position);`

`position++;`

`cursor();`

}

}

}

}

position++;

print("*DEAD*");

clear();

//INSERTAR LLAMADA PARA EL APAGADO DEL SISTEMA

//reboot();

return 0; }