Funçao: time e sleep nativamente

1. Funçao: time e sleep nativamente

???
gokernel

(usa Linux Mint)

Enviado em 16/07/2017 - 10:04h


Olá pessoal !

Estou implementando um Sistema Operacional do Zero usando ( C, Assembly ) ... estou precisando de 2 funções:

01: time();
02: sleep();

OBS: essas funções são independentes do OS.

PERGUNTA:
Alguém sabe como implementar isso ?

OBS: fiz a pergunta mas estou estudando/procurando como fazer nativamente ...
OBS2: hoje(domingo) a net aqui tá muito lenta para "garimpar".

Grato !



  


2. Re: Funçao: time e sleep nativamente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/07/2017 - 10:47h

Como você está fazendo o SO, então você terá de interagir com o hardware que faz a medição de tempo. Possivelmente terá de recorrer a um material de engenharia que diga como eles operam e com você se comunica com eles (ou então você lê o código dos device drivers desses dispositivos num Linux ou BSD da vida).


3. Re: Funçao: time e sleep nativamente

???
gokernel

(usa Linux Mint)

Enviado em 18/07/2017 - 10:48h

Parte da solução resolvida ;).

01: Testado no WINDOWS ... e quebrou o programa rsarsrsr.
02: Testado no DJGPP ... e funcionou OK.
03: Testado no meu OS ( gardenOS ) e funcionou perfeitamente ... falta implementar melhor OK.
04: Não testei ainda no LINUX ...

Fonte:
01: Código do MenuetOS
02: http://wiki.osdev.org/CMOS

E glória a Deus !

Testando ... 1 2 3

#include <stdio.h>

unsigned char sec;
int muda = 100;
int count;

void second (void)
{
asm ("cli"); // disable interrupts

asm ("mov $0, %al"); // 0 = second

asm ("outb %al, $0x70");

asm ("inb $0x71, %al");

asm ("sti"); // enable interrupts

asm ("mov %al, _sec"); // copy ( %al ) in var ( sec )
}

int main (void)
{

for (;;) {

second ();

if (muda != sec) {

// fechou (condicao acima )... proximo >>>
//
muda = sec;

// ... aqui funciona a CADA 1 SEGUNDO ... testado
//
printf ("count( %d ): %d\n", sec, count++);


}//: if (muda != sec)

}//: for()

return 0;
}



Só postei para compartilhar conhecimento ;)

Tentando implementar melhor ...


4. Re: Funçao: time e sleep nativamente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/07/2017 - 02:16h

É uma solução simples, se você não se importar em estragar a hora do seu computador, e em gastar energia com um loop em espera ocupada.

O que você está fazendo com o código acima é resetar os segundos do relógio de tempo real (RTC) da máquina, e então esperar esse mesmo relógio contar até 1. Ou seja, a cada segundo que você espera, você atrasa o RTC num tanto que pode variar no intervalo de [0,60) segundos em relação a um relógio normal. Pode funcionar (com precisão limitada, nunca melhor do que 1 segundo) para medir intervalos, mas ao custo de atrapalhar a capacidade de saber a hora corrente.

Você falou de time() e sleep(). O código que você mostrou é uma possível implementação de sleep(), mas que inviabiliza uma implementação confiável de time(). Até mesmo construir um relógio com ela fica pouco trivial. Veja.

while(1){
int h=time(NULL)%86400;
printf("Hora atual: %02d:%02d:%02d\n", h/3600, (h/60)%60, h%60);
sleep(1);
}


Com a implementação de sleep() que você mostrou, o programa acima vai exibir na primeira iteração um valor de hora qualquer, mas da segunda em diante vai repetir sempre a mesma hora com segundos marcando “01” (segundos voltam a zero, e depois incrementados para 1), inclusive voltando a hora para trás, em relação à mostrada na primeira iteração.

Quando eu falei sobre usar dispositivos de marcação de tempo, esperava que você usasse o PIT (chip 8253/8254) junto com PIC (chip 8259), APIC timer, instruções de TSC ou HPET.

Referências interessantes sobre essas coisas, inclusive com exemplos de código, existem em wiki.osdev.org. Por exemplo:

* http://wiki.osdev.org/I/O_Ports;
* http://wiki.osdev.org/PIT;
* http://wiki.osdev.org/APIC_timer;
* http://wiki.osdev.org/CMOS;
* http://wiki.osdev.org/Timer_Interrupt_Sources.


5. Re: Funçao: time e sleep nativamente

???
gokernel

(usa Linux Mint)

Enviado em 19/07/2017 - 11:04h


Olá "Paulo1205" !

Esse código que postei é para servir como base ... para implementar algo melhor ...

Aqui estou estudando mmmmmmmmuito(nas horas vagas) como criar um OS do zero e também estou aprendendo bastante.

Caramba! ... ao codar na criação de um OS do zero, faz muita falta a libC que tem que implementar na "unha".

O que tenho curiosidade em saber é:
Porque será que o meu código funciona normal no ( meu OS e no DJGPP ) e não funcionou no ( Windows, Linux ) ?

Valeu !



6. Re: Funçao: time e sleep nativamente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/07/2017 - 15:55h

gokernel escreveu:

Porque será que o meu código funciona normal no ( meu OS e no DJGPP ) e não funcionou no ( Windows, Linux ) ?


Uma possível explicação é que as instruções INP e OUTP são instruções privilegiadas. Se você não conseguir escalar privilégios, elas não vão funcionar.


7. Re: Funçao: time e sleep nativamente

???
gokernel

(usa Linux Mint)

Enviado em 19/07/2017 - 17:12h


E achei essa mina de conhecimentos:

https://github.com/cirosantilli/x86-bare-metal-examples/
https://github.com/cirosantilli/x86-assembly-cheat
https://github.com/tuhdo/sample-os

Esse link serve para mim como referência e talvez para outros interessados em OS.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts