- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
How to acess hardware registers in a MMU software?
I am trying to make a program that uses the mutex hardware here is my code.. i am kinda lost tbh# include <ctype.h># include <errno.h># include <signal.h># include <stdio.h># include <string.h># include <sys/types.h># include <sys/time.h> /* struct timeval */# include <sys/resource.h> /* getrusage() */# include <stdlib.h> /* malloc(3) */# include <unistd.h># include <fcntl.h># include <sys/mman.h># include <linux/kernel.h># include <asm/io.h>
# define MUTEX_ADDRESS 0x80000028# define RESET_ADDRESS 0x80000029
/*Lembrar de usar o bit 31 ligado ao acessar o mutex (como você pode ver, o
endereço começa com 8, ou seja, bit 31 ligado). Isto é para evitar que os
processadores façam cache desta memória de controle do mutex.
Não esquece de dar uma olhadinha no pdf que explica o mutex, pra entender o
que eu fiz.
Outro detalhe - o CPUID está fixo neste caso ("eu" sou a CPU zero, a outra
CPU (processador com hal) é o de número 1).
*/
int MutexTryLock(void);
void MutexUnlock(void);
int main(void){
printf("oi\n");
return 0;
}
int MutexTryLock(void)
{
/*--------------------------------------------------------------------------
DESC.: Tenta bloquear, para uso exclusivo, o mutex.
SAÍDA: true: sucesso no bloqueio, false: a outra CPU já bloqueou.
--------------------------------------------------------------------------*/
/* Escreve em mutex register, CPUID = 0, VALUE = 1.*/
outl(0x00000001, MUTEX_ADDRESS);
/*Lê em mutex register para verificar se a escrita foi efetivada.
Caso positivo, o bloqueio foi realizado com sucesso. Caso contrário, a outra CPU
já está com o bloqueio em ação.*/
if (inl(MUTEX_ADDRESS) == 0x00000001) return 1;
return 0;
}
void MutexUnlock(void)
{
/*--------------------------------------------------------------------------
DESC.: Desbloqueia o mutex.
--------------------------------------------------------------------------*/
/* Reset.*/
outl(0x00000001, RESET_ADDRESS);
/* Unlock.*/
outl(0x00000000, MUTEX_ADDRESS);
}
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page