Está en la página 1de 18

ESCOLA POLITCNICA DA UNIVERSIDADE DE SO PAULO

Departamento de Engenharia de Computao e Sistemas Digitais

PCS2042 Sistemas Operacionais

Projeto 1
Familiarizao com o Minix

Grupo 2
Bruno Umeda Grisi
Carolina Dorta
Davi Assahira

Professor: Jorge Kinoshita

ndice
1.

OBJETIVO .................................................................................................................................. 3

2.

APLICATIVO NA LINGUAGEM C .................................................................................... 3

2.1. DESCRIO ................................................................................................................................ 3


2.2. CHAMADAS AO SISTEMA ............................................................................................................ 3
2.2.1. Definio ................................................................................................................................ 3
2.2.2. Funcionamento ....................................................................................................................... 3
2.2.3. Stat(path, buf) ......................................................................................................................... 3
2.3. DESENVOLVIMENTO DO PROGRAMA ......................................................................................... 4
2.4. PROGRAMA.................................................................................................................................. 5
2.5. SIMULAO ................................................................................................................................ 7
3.
3.1.
3.2.
3.3.
3.4.
4.
4.1.
4.2.
5.

MODIFICAO DA STAT(PATH, BUF) ........................................................................ 8


DESCRIO ................................................................................................................................ 8
DESENVOLVIMENTO DO PROGRAMA ......................................................................................... 8
PROGRAMA.................................................................................................................................. 8
SIMULAO ................................................................................................................................ 9
MATERIAL COMPLEMENTAR ......................................................................................... 10
ANEXO A CDIGO FONTE DO PROGRAMA APLICATIVO..................................................... 10
ANEXO B CDIGO FONTE DA SYSTEM CALL MODIFICADA ............................................... 17
BIBLIOGRAFIA ..................................................................................................................... 18

1. Objetivo
Este primeiro projeto objetiva conhecer a estrutura e o funcionamento
do sistema operacional Minix, desenvolvendo programas na linguagem de
programao C que utilizam as chamadas ao sistema.
Outro objetivo dessa atividade compartilhar com os demais alunos da
turma o que foi pesquisado e aprendido, ao mesmo tempo em que se
aprofunda com as apresentaes expostas.
Dessa forma, possvel consolidar a teoria da disciplina, aplicando
exerccios prticos elaborados que estendem o estudo e o interesse ao
aprendizado.

2. Aplicativo na Linguagem C
2.1. Descrio
Foi proposto o desenvolvimento de um programa a ser executado no
Minix capaz de imprimir os nomes e as datas dos arquivos localizados no
diretrio corrente.

2.2. Chamadas ao sistema


2.2.1.

Definio

Chamada ao sistema ou system call uma solicitao feita por


qualquer programa arbitrrio ao sistema operacional para a execuo de
tarefas que esse programa no possui as permisses necessrias para
executar em seu fluxo de operao.

2.2.2.

Funcionamento

A princpio, o sistema, no modo usurio, ao encontrar uma system call


no programa do usurio em execuo, armazena na pilha as informaes
necessrias para o retorno ao programa. Em seguida, inicia-se o
procedimento da biblioteca, armazenando o cdigo da system call em um
registrador. Depois, executa-se uma instruo TRAP para passar do modo
usurio (privilgios restritos) ao modo ncleo (privilgios maiores) que
possibilita o processo de identificao da chamada ao sistema pelo cdigo
do ncleo e de despacho para o tratamento de sua execuo propriamente
dita. Terminado esse tratamento, o controle retorna ao procedimento da
biblioteca no espao do usurio na instruo seguinte instruo TRAP. Por
fim, retorna-se ao programa do usurio que limpa a pilha, liberando-o para
continuar sua execuo.

2.2.3.

Stat(path, buf)

A funo dessa system call obter informaes sobre o arquivo


definido por path e escrev-lo na rea apontada pelo argumento buf. O
argumento path aponta ao parthname que nomeia o arquivo. Nesta system
call, no necessrio que o arquivo nomeado possua as permisses de
leitura, escrita e execuo. O argumento buf um ponteiro para a estrutura

de dados stat, conforme definida no cdigo fonte do Minix, em que


armazenada a informao referente ao arquivo. Aps executada a system
call, o sistema apresenta essa informao gravada correspondente ao
arquivo nomeado.
A estrutura de dados stat apresenta os seguintes atributos:
dev_t st_dev;

/* dispositivo residido pelo inode */

ino_t st_ino;

/* nmero inode */

mode_t st_mode;

/* modo do arquivo */

nlink_t st_nlink;

/* nmero de links para o arquivo */

uid_t st_uid;

/* id do usurio proprietrio do arquivo */

gid_t st_gid;

/* id do grupo proprietrio do arquivo */

dev_t st_rdev;

/* tipo de dispositivo, para inode que dispositivo */

off_t st_size;

/* tamanho total do arquivo */

time_t st_atime;

/* tempo do ultimo acesso */

time_t st_mtime;

/* tempo da ltima modificao de data */

time_t st_ctime;

/* tempo da ltima mudana de estado do arquivo */

Da mesma forma como em muitas chamadas ao sistema, a system call


stat utiliza o icode que contm todas as informaes referentes a um
arquivo para obter uma referncia ao arquivo no SO.

2.3. Desenvolvimento do Programa


Foi proposto o desenvolvimento de um programa capaz de imprimir os
nomes e as datas dos arquivos localizados no diretrio corrente.
O desenvolvimento do programa pedido s foi possvel aps a
realizao de um estudo do cdigo fonte do Minix e, especialmente, das
chamadas ao sistema que seriam utilizadas no programa.
Percebemos que, embora haja restries de acesso configuradas pelo
prprio SO, necessria bastante cautela na manipulao do cdigo, uma
vez que possvel alterar processos importantes do sistema.

2.4. Programa
O programa foi feito da seguinte forma:
Primeiramente, h uma estrutura eachfile, que contm as informaes
nome e data/hora do arquivo. Ela construda depois do acesso ao inode
para a obteno das informaes do arquivo.
Deve-se lembrar que, quando, nesse texto, citamos arquivo, na
verdade, estamos citando uma estrutura que pode ser um arquivo em si ou
ento um diretrio, que nada mais que um arquivo que contm
referncias entre nomes (nomes de seus arquivos) e inodes.
Na teoria de sistemas operacionais, um inode (ou index node, ou ainda
n-i) uma estrutura de dados constituinte de um sistema de arquivos (SA)
que segue a semntica Unix. O inode armazena informaes sobre arquivos,
tais como o usurio de acesso, permisses e a localizao do mesmo (p.ex.,
blocos alocados num volume de disco).
Sendo assim, o fluxo do programa se resume em:

1. Ler o nome do diretrio


Para ler o nome do diretorio foi utilizada a funo ParseParameters, que
obtm o diretrio atual - caso no haja parmetros ou ento algum
diretrio referenciado no comando e copia seu nome para dirname

2. Contar quantos arquivos h nesse diretrio


Para isso utilizamos a funo GetQuantityOfFiles, que possui uma estrutura
DIR (uma estrutura de diretrio) e faz uso de rotinas de diretrio tais como:
a.
desse
puder
struct

Opendir(): Abre o diretrio e retorna um ponteiro para a stream


diretrio. Esta rotina retorna um ponteiro nulo se o diretrio no
ser aberto ou se no foi possvel alocar memoria suficiente para a
DIR.

b. Readdir(): L uma entrada do diretrio e como uma apontador


para a estrutura contendo o campo d_name, um vetor de caracteres
contendo o nmero da entrada, que termina com um valor nulo. Esta
funo retorna null se no h mais entradas ou se ocorreu um erro.
c. Closedir(): Fecha o diretrio. Esta funo retorna 0 caso haja
sucesso, -1 se houver erro.
Alm disso, h nesta funo a struct dirent *entry. Uma struct dirent uma
estrutura de dados definida em dirent.h, uma referencia que est localizada
no cabealho da biblioteca C do Minix. L h operaes que facilitam a
manipulao de diretrios. Nessa estrutura h as seguintes propriedades:
a. off_t d_off - no existente em todas as implementaes
b. unsigned short d_namlen - comprimento do nome em d_name
c.

unsigned short d_reclen

d. ino_t d_ino - numero serial do arquivo

e. char d_name[] - nome do arquivo (no excede o tamanho


NAME_MAX)

3. Reservar um espao em memria que corresponda ao tamanho de uma


estrutura eachfile multiplicado pela quantidade de arquivos encontrados;
Isso feito atravs de malloc. Foi implementado da seguinte forma:
files = malloc(GetQuantityOfFiles(directory_name) * sizeof(struct eachfile))
A funo GetQuantityOfFiles(directory_name)
anterior.

a explicada no item

4. Obter as informaes dos arquivos do diretrio e coloc-las em uma


coleo de estruturas eachfile;
Isto foi feito a partir da funo GetFiles. Esta funo recebe o nome do
diretrio e estruturas eachfile para serem construdas
com os parmetros dos arquivos do diretrio. Ela tambm possui uma
estrutura DIR e uma estrutura dirent para a manipulao de diretrios e
seus contedos. Ela tambm faz uso das rotinas de diretrio opendir(),
readdir() e closedir() para ler os arquivos e colocar seus nomes e data/hora
nas estruturas eachfile. Para setar as estruturas eachfile esta funo faz uso
de outra, a MakeOneFile.
A funo MakeOneFile constri o caminho do arquivo a partir da funo
ConstructPath e utiliza esse caminho na system call stat(). Quando stat()
recebe este caminho como parmetro, capaz de consultar o inode
correspondente para obteno de informaes do arquivo. Caso tenha sido
possvel realizar a system call stat(), sabemos que o arquivo vlido e
podemos setar a estrutura eachfile. Isso feito a partir de dois comandos:
a. strcpy(file->name, entry->d_name)
Este comando copia para o name de eachfile a informao d_name da
estrutura dirent entry.
b. file->datetime = stbuf.st_mtime
Este comando copia para o datetime de eachfile a informao
st_mtime que foi obtida no inode, que corresponde data da ltima
modificao do arquivo

5. Ordenar esses arquivos por data/hora;


Isso foi feito a partir da funo OrderFiles, que ordena as estruturas
eachtime no vetor de acordo com o parmetro datetime.

6. Imprimir as informaes.
Isto foi feito a partir da funo PrintFiles, que simplesmente imprime as
informaes name e datetime dos arquivos do diretrio na tela. A nica
peculiaridade desta funo o uso de ctime() da biblioteca time.h, que

formata uma data/hora em Www Mmm dd hh:mm:ss yyyy, onde Www


referente ao dia da semana da data em questo.

O cdigo fonte do programa desenvolvido encontra-se no Anexo A.

2.5.Simulao
A simulao do programa pode ser visualizada nas figuras a seguir.
Comando ls l:

Programa implementado:

3. Modificao da Stat(path, buf)


3.1. Descrio
Este exerccio consiste na alterao de uma chamada ao sistema que
foi utilizada no programa anterior de forma a imprimir uma mensagem toda
vez que ela for chamada.

3.2. Desenvolvimento do Programa


A dificuldade neste exerccio fazer o sistema reconhecer as
modificaes realizadas no cdigo executado pela system call, j que o SO
apresenta um mecanismo que mantm a imagem atual no sistema mesmo
aps alterado o seu cdigo.
Acessamos o diretrio que contm o cdigo fonte que executa a
system call stat(), localizado no seguinte path /usr/src/servers/fs. E
modificamos o cdigo com o auxlio do editor de texto elle a fim de ser
impressa uma mensagem toda vez que a system call for executada.
Em seguida, compilamos os servers do Minix (path: /usr/src/servers)
por meio dos comandos make image e make install.
preciso criar uma nova imagem de boot para combinar os arquivos
bin do Minix e habilitar a mudana realizada, executando os comandos
make hdboot e make install no path /usr/src/tools. Ao trmino desta ltima
operao, o sistema apresentar o nome da imagem de boot criada. Como
precisaremos deste nome mais para frente, anote-o.
Agora, fazemos um shutdown no Minix que disponibilizar a seleo de
uma nova imagem. Utilizando o nome da imagem anotado, associa-se a
imagem criada ao sistema: d0p0s0> image=/boot/image/nome_da_imagem.
Por fim, executa-se um boot e o sistema reconhecer as mudanas feitas na
system call.

3.3.Programa
O implementao do programa bem simples. Resume-se apenas a
uma linha de cdigo:
printf(Mensagem a ser impressa a cada chamada.\n);
O cdigo fonte do programa desenvolvido encontra-se no Anexo B.

3.4.Simulao
A simulao do programa pode ser visualizada na figura a seguir.

4. Material Complementar
4.1. Anexo A Cdigo Fonte do Programa Aplicativo
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>

void MakeOneFile(char
struct eachfile *file);
void
*path);

ConstructPath(char

*directory_name,

struct

*directory_name,

char

dirent

*entry,

*file_name,

char

int GetQuantityOfFiles(char *directory_name);


int GetFiles(char *directory_name, struct eachfile *files);
void OrderFiles(int quantity, struct eachfile *files);
void
ParseParameters(int
*directory_name);

argc,

char

*argv[],

char

void PrintFiles(int quantity, struct eachfile *files);

/*estrutura que ser utilizada para a manipulaao dos dados dos


arquivos.
contm um nome e uma data/hora, que ser a data/hora da ultima
modificaao realizada*/
struct eachfile
{
char name[255];
time_t datetime;
};

/*
MakeOneFile
Retorno: nao h
Parametros: o nome
arquivo e uma estrutura

do

diretorio,

uma

estrutura

dirent

para

eachfile que contem o nome e datetime do arquivo.


Descricao: esta funcao receba a estrutura dirent que j contem os
dados do arquivo

que foram obtidos ao ler o diretrio e monta a estrutura eachfile,


com o nome do arquivo
e a data.
*/
void MakeOneFile(char
struct eachfile *file)

*directory_name,

struct

dirent

*entry,

{
/* A estrutura stat retornada pelas funcoes fstat() e stat().
Ela contm as informaoes detalhadas de um arquivo.
A informaao retornada depende do tipo de arquivo e/ou arquivo
de sistema.*/
struct stat stbuf;
char path[255];

/*funcao que constroi o caminho do arquivo*/


ConstructPath(directory_name, entry->d_name, path);

/*A

funo

dessa

system

call

obter

informaes

sobre

arquivo
definido por path e escrev-lo na rea apontada pelo argumento
buf.
O argumento path aponta ao parthname que nomeia o arquivo.*/
if (stat(path, &stbuf) == 0)
{
/*copia entry->d_name para file->name
lembrando que
pelo inode*/

d_name o nome do arquivo que foi obtido

strcpy(file->name, entry->d_name);
/*o datetime de nosso eachfile recebe st_mtime do inode, que
a data/hora da ultima modificaao*/
file->datetime = stbuf.st_mtime;
}
else
{
printf("nao foi possivel obter o status do arquivo");
exit(1);
}
}

/*
ConstructPath
Retorno: nao h

Parametros: o nome do diretorio, o nome do arquivo e o caminho a


ser montado
Descricao: esta funcao recebe o nome do diretorio e um nome de
arquivo e os utiliza
para construir um caminho, usando a funcao strcat().
*/
void
*path)

ConstructPath(char

*directory_name,

char

*file_name,

char

{
/*strcpy() copia a string em C apontada pela fonte para o array
apontado
pelo destino, incluindo o caractere nulo de fim*/
strcpy(path, directory_name);
/*strcat() junta uma copia da string
string de destino.

de origem para com a

O caractere nulo no fim do destino sobrescrito com o primeiro


caractere
da string de origem, e um novo caractere nulo posto ao fim da
nova string
formada pela concatenaao da origem com o destino*/
strcat(path, "/");
strcat(path, file_name);
}

/*
GetQuantityOfFiles
Retorno: quantidade de arquivos em um diretorio (int)
Parametros: o nome do diretorio (um vetor de chars)
Descricao: esta funcao recebe um nome e o utiliza para abrir um
diretorio
atravs
closedir().

das

rotinas

de

diretorio

opendir(),

readdir()

*/
int GetQuantityOfFiles(char *directory_name)
{
int quantity = 0;
struct dirent *entry;
DIR *directory;

/*Opendir() abre
stream desse diretorio.

diretorio

retorna

um

ponteiro

para

Esta rotina retorna um ponteiro nulo se o diretorio nao puder


ser aberto

ou se nao foi possivel alocar mamoria suficiente para a struct


DIR.*/
directory = opendir(directory_name);

do
{
/*Readdir() le
apontador para a estrutura

uma

entrada

contendo o campo d_name,


numero da entrada,

do

diretorio

como

uma

um vetor de caracteres contendo o

que termina com um valor nulo. esta funcao retorna null se


nao h mais entradas ou se
ocorreu um erro*/
entry = readdir(directory);
quantity ++;
}while(!(entry == (struct dirent *) NULL));

/*Closedir() fecha o diretorio


esta funcao retorn 0 caso haja sucesso, -1 se houver erro.*/
closedir(directory);

return quantity;
}

/*
GetFiles
Retorno: numero de arquivos
Parametros: o nome do diretorio, e structs eachfile que serao
preenchidas
Descricao: esta funcao recebe o nome do diretorio e estruturas
eachfile para serem construidas
com os parametros dos arquivos do diretorio
*/
int GetFiles(char *directory_name, struct eachfile *files)
{
/*o tipo/estrutura DIR representa um diretorio*/
DIR *dir;
int i;

/*struct dirent - uma estrutura com os seguintes membros:


* off_t d_off - nao extatientes em todas as implementacoes
* unsigned short d_namlen - comprimento do nome em d_name

* unsigned short d_reclen


* ino_t d_ino - numero serial do arquivo
* char d_name[] - nome do arquivo (nao excede o tamanho
NAME_MAX)
*/
struct dirent *entry;

/*Opendir() abre
stream desse diretorio.

diretorio

retorna

um

ponteiro

para

Esta rotina retorna um ponteiro nulo se o diretorio nao puder


ser aberto
ou se nao foi possivel alocar mamoria suficiente para a struct
DIR.*/
dir = opendir(directory_name);

i = 0;
do
{
/* le um arquivo e poe toda
dirent entry*/

sua estrutura na estrutura

entry = readdir(dir);

/*esta funcao seta no vetor files[] um arquivo referenciado


pela estrutura
dirent
directory_name*/

entry

que

foi

obtida

no

diretorio

com

nome

MakeOneFile(directory_name, entry, &files[i++]);

/* faz esse loop at a estrutura dirent entry nao for nula.


O cast feito pra comparaao de nulo com estrutura*/
}while(!(entry == (struct dirent *) NULL));

/*fecha o diretorio*/
closedir(dir);

return i;
}

/*
OrderFiles
Retorno: nao h
Parametros: a quantidade de arquivos, estruturas eachfile com os
parametros

datetime atravs das quais os arquivos serao ordenados


Descricao: esta funcao usa o metodo de ordenaao ____ para ordenar
as estruturas
no vetor de acordo com o parametro datetime.*/
void OrderFiles(int quantity, struct eachfile *files)
{
int i, j;
/*estrutura temporria auxiliar ao mtodo*/
struct eachfile tmp;

for(i = quantity - 1; i > 0; i--)


for(j = 0; j < i; j++)
if(files[j].datetime < files[j+1].datetime)
{
tmp = files[j];
files[j] = files[j+1];
files[j+1] = tmp;
}
}

/*
ParseParameters
Retorno: nao h
Parametros: a quantidade de arquivos, estruturas eachfile com os
parametros
datetime atravs das quais os arquivos serao ordenados
Descricao: esta funcao usa o metodo de ordenaao ____ para ordenar
as estruturas
no vetor de acordo com o parametro datetime.*/
void ParseParameters(int argc, char *argv[], char *directory_name)
{
switch(argc)
{
case 1: strcpy(directory_name, "."); break;
case 2: strcpy(directory_name, argv[1]); break;
default:
break;
}
}

/*
PrintFiles

printf("Numero

errado

de

parametros");

exit(1);

Retorno: nao h
Parametros: a quantidade de arquivos, estruturas eachfile com os
parametros
name e dattime que serao impressos
Descricao: esta
arquivos na tela*/

funcao

imprime

os

dados

nome

datetime

dos

void PrintFiles(int quantity, struct eachfile *files)


{
int i;

printf("\nGRUPO 2\n");
printf("\nIntegrantes: Bruno Grisi");
printf("\n

Carolina Dorta");

printf("\n

Davi Assahira");

printf("\nInicio do programa\n\n");

for(i = 0; i < quantity; i++)


{
printf("Nome do arquivo: %-15s", files[i].name);
printf("Data: %s", ctime(&files[i].datetime));
}

printf("\nFim\n");

int main(int argc, char *argv[])


{
int quantity;
char directory_name[255];
struct eachfile *files;

ParseParameters(argc, argv, directory_name);


files
=
malloc(GetQuantityOfFiles(directory_name)
sizeof(struct eachfile));
quantity = GetFiles(directory_name, files);
OrderFiles(quantity, files);
PrintFiles(quantity, files);
}

4.2. Anexo B Cdigo Fonte da System Call Modificada

5. Bibliografia
1. http://www.minix-vmd.org/pub/Minixvmd/1.7.0/wwwman/man3/directory.3.html
2. http://www.cplusplus.com/reference/clibrary/cstring/strcpy.html
3. http://en.wikipedia.org/wiki/Dirent.h
4. http://souptonuts.sourceforge.net/code/dir.c.html
5. http://www.mkssoftware.com/docs/man5/struct_stat.5.asp
6. http://en.wikipedia.org/wiki/Time.h
7. http://www.dmoz.org/Computers/Algorithms/Sorting_and_Searching/
8. http://www.cis.syr.edu/~wedu/seed/Documentation/Minix3/How_to_add_syste
m_call.pdf

También podría gustarte