B.4. Algumas Tarefas realizadas pelo Núcleo
B.4.1. Controlando o Hardware
O núcleo tem, em primeiro lugar, a tarefa de controlar as partes do hardware, detectando-os, ligando-os quando o computador é ligado, e assim por diante. Também os torna disponíveis para o software de alto nível com uma interface de programação simplificada, para que os aplicativos possam tirar proveito de dispositivos sem ter que se preocupar com detalhes como em qual slot de extensão a placa opcional está conectada. A interface de programação também fornece uma camada de abstração; isso permite que o software de videoconferência, por exemplo, use uma webcam independentemente da sua marca e modelo. O software pode apenas usar a interface Vídeo for Linux (V4L), e o núcleo traduz as chamadas de função desta interface para os comandos de hardware reais necessários pela webcam específica em uso.
O núcleo (kernel) exporta muitos detalhes sobre o hardware detectado através dos sistemas de arquivos virtuais /proc/
e /sys/
. Várias ferramentas resumem esses detalhes. Entre elas, o lspci
(no pacote pciutils) lista os dispositivos PCI, lsusb
(no pacote usbutils) lista os dispositivos USB e lspcmcia
(no pacote pcmciautils) lista os cartões PCMCIA. Estas ferramentas são muito úteis para a identificação do modelo exato de um dispositivo. Esta identificação permite também pesquisas mais precisas na web, que por sua vez, levam a documentos mais relevantes.
Exemplo B.1. Exemplo de informação provida pelo lspci
e lsusb
$
lspci
[...]
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (rev 05)
00:01.0 PCI bridge: Intel Corporation 6th-9th Gen Core Processor PCIe Controller (x16) (rev 05)
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
00:14.0 USB controller: Intel Corporation 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation 100 Series/C230 Series Chipset Family Thermal Subsystem (rev 31)
[...]
02:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTL8411B PCI Express Card Reader (rev 01)
03:00.1 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 12)
04:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
$
lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0bda:5621 Realtek Semiconductor Corp. HD WebCam
Bus 001 Device 002: ID 04ca:3016 Lite-On Technology Corp.
Bus 001 Device 018: ID 145f:01bc Trust GXT 155 Gaming Mouse
Bus 001 Device 004: ID 04f3:0c03 Elan Microelectronics Corp. ELAN:Fingerprint
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Estes programas têm uma opção -v
, que lista informações com muito mais detalhes (mas que geralmente não são necessárias). Finalmente, o comando lsdev
(no pacote procinfo) lista os recursos de comunicação usados pelos dispositivos.
As aplicações acessam frequentemente os dispositivos por meio de arquivos especiais criados dentro de
/dev/
(veja a barra lateral
DE VOLTA AO BÁSICO Permissão de acesso a dispositivos). Estes são arquivos especiais que representam as unidades de disco (por exemplo,
/dev/hda
e
/dev/sdc
), partições (
/dev/hda1
ou
/dev/sdc3
), mouses (
/dev/input/mouse0
), teclados (
/dev/input/event0
), placas de som (
/dev/snd/*
), portas seriais (
/dev/ttyS*
), e assim por diante.
B.4.2. Sistemas de Arquivos
Os sistemas de arquivos são um dos aspectos mais importantes do núcleo. Sistemas Unix agrupam todos os arquivos que armazenam em uma hierarquia única, que permite aos usuários (e aplicações) acessar os dados sabendo apenas a sua localização dentro dessa hierarquia.
O ponto de partida desta árvore hierárquica é chamado de raiz, /
. Este diretório pode conter subdiretórios nomeados. Por exemplo, o subdiretório home
do /
é chamado /home/
. Este subdiretório pode, por sua vez, conter outros subdiretórios, e assim por diante. Cada diretório também pode conter arquivos, onde os dados reais serão armazenados. Assim, o nome /home/rmas/Desktop/hello.txt
refere-se a um arquivo chamado hello.txt
armazenado em Desktop
, que é subdiretório de rmas
, que é subdiretório de home
, que está na raiz. O núcleo traduz entre este sistema de nomenclatura e o real armazenamento físico que fica no disco.
Ao contrário de outros sistemas, só há uma hierarquia deste tipo, e pode integrar dados de vários discos. Um desses discos é usado como a raiz, e os outros são "montados" em diretórios na hierarquia (o comando Unix é chamado mount
); esses outros discos estarão disponíveis sob estes "pontos de montagem". Isso permite o armazenamento do diretório home dos usuários (tradicionalmente armazenados dentro de /home/
) em um segundo disco rígido, que irá conter os diretórios rhertzog
e rmas
. Depois que o disco é montado em /home/
, esses diretórios estarão disponíveis em seus locais habituais e caminhos como /home/rmas/Desktop/hello.txt
continuarão funcionando.
Existem muitos formatos de sistemas de arquivo que correspondem a muitas formas de armazenamento físico de dados nos discos. Os mais conhecidos são o ext3 e o ext4, mas existem outros. Por exemplo, o vfat é o sistema que foi historicamente usado pelos sistemas operacionais DOS e Windows, que permite utilizar os discos rígidos tanto no Debian como no Windows. Em qualquer caso, um sistema de arquivos deve ser preparado em um disco antes que ele possa ser montado e esta operação é conhecida como "formatação". Comandos como mkfs.ext3
(onde mkfs
é MaKe FileSystem - criar sistema de arquivos) fazem a formatação. Estes comandos exigem, como um parâmetro, um arquivo de dispositivo que representa a partição a ser formatada (por exemplo, /dev/sda1
). Esta operação é destrutiva e só deve ser executado uma vez, exceto quando se queira limpar deliberadamente um sistema de arquivos e começar de novo.
Há também sistemas de arquivos de rede, como o
NFS, em que os dados não são armazenados em um disco local. Em vez disso, os dados são transmitidos através da rede para um servidor que os armazena e recupera sob demanda. A abstração de sistema de arquivos protege os usuários de se preocuparem com: arquivos permanecem acessíveis na sua forma hierárquica usual.
B.4.3. Funções Compartilhadas
Uma vez que uma quantidade das mesmas funções são usadas por todos os softwares, não faz sentido centralizá-las no kernel. Por exemplo, a gestão de sistemas de arquivos compartilhados permite que qualquer aplicativo simplesmente abra um arquivo pelo nome, sem precisar se preocupar onde o arquivo está armazenado fisicamente. O arquivo pode ser armazenado em diferentes partes em um disco rígido, ou dividido em vários discos rígidos, ou mesmo armazenado em um servidor de arquivos remoto. As funções de comunicação compartilhadas são usadas por aplicativos para troca de dados de forma independente da forma como os dados são transportados. Por exemplo, o transporte poderia ser sobre qualquer combinação de redes locais sem fio ou através de uma linha telefônica.
B.4.4. Gerenciamento de Processos
Um processo é uma instância em execução de um programa. Ele requer memória para armazenar tanto o próprio programa quanto seus dados operacionais. O núcleo é responsável por criar e acompanhá-los. Quando um programa é executado, o núcleo primeiro reserva alguma memória, em seguida carrega o código executável do sistema de arquivos para ele, e então começa a execução do código. Ele mantém informações sobre este processo, sendo a mais visível um número de identificação conhecido como pid (process identifier - identificador de processo).
Núcleos tipo Unix (incluindo o Linux), como a maioria dos outros sistemas operacionais modernos, são capazes de "multitarefa". Em outras palavras, eles permitem a execução de vários processos "ao mesmo tempo". Na verdade, há apenas um processo em execução em qualquer momento, mas o kernel divide o tempo em pequenas porções e executa um processo de cada vez. Uma vez que estas porções de tempo são muito curtas (com intervalo em milissegundos), cria-se a ilusão de processos em execução em paralelo, embora estejam, na verdade, somente ativo durante alguns intervalos de tempo e ociosos no resto do tempo. O trabalho do kernel é ajustar seus mecanismos de agendamento para manter essa ilusão, enquanto maximiza o desempenho do sistema global. Se as porções de tempo são muito longas, o aplicativo pode não parecer responsivo como desejado. Se são muito curtas, o sistema perde tempo trocando entre as tarefas com muita frequência. Estas decisões podem ser ajustadas pelas prioridades do processo. Os processos de alta prioridade serão executados por porções de tempo mais longas e mais frequentes do que os processos de baixa prioridade.
Claro que, o núcleo permite a execução de várias instâncias independentes do mesmo programa. Mas cada uma só pode acessar os seus próprios intervalos de tempo e memória. Assim seus dados se mantém independentes.
B.4.5. Gerenciamento de Direitos
Sistemas similares ao Unix também são multiusuário. Eles fornecem um sistema de gerenciamento de direitos que permite grupos e usuários separados; ele também permite controle sobre ações com base em permissões. O núcleo gerencia dados de cada processo, permitindo-lhe controlar as permissões. Na maioria das vezes, um processo é identificado pelo usuário que o iniciou. Esse processo só é capaz de agir de acordo com as permissões disponíveis para seu dono. Por exemplo, tentar abrir um arquivo requer que o núcleo verifique a identidade do processo em relação as permissões de acesso (para mais detalhes sobre este exemplo em particular, veja
Seção 9.3, “Gerenciando Direitos”).