Hlavní navigace

Co před námi tají /proc (6)

2. 8. 2001
Doba čtení: 5 minut

Sdílet

Pro tentokrát máme resty z minula, takže dojedem, co jsme nestihli a pak se uvidí co dál. Opět tedy budeme mluvit o periferiích a to o jejich ovládání přes porty a mapovanou paměť.

Opět dle tradice výpis základního adresáře /proc. Tečka před názvem znamená, že jsme daný soubor/adresář již probrali:

  .840     .devices      kcore    modules     stat     ide/
  .842     .dma          kmsg     mounts      swaps    irq/
  .847     .execdomains  ksyms    mtrr        uptime   net/
  .848     .filesystems  loadavg  partitions  version  nv/
  .apm     .interrupts   locks    pci         bus/     sys/
  .cmdline  iomem        meminfo  self@       driver/  sysvipc/
  .cpuinfo  ioports      misc     slabinfo    fs/      tty/
iomem

Nejprve nebytný výpis pro ukázku:

00000000-0009fbff : System RAM
0009fc00-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-0ffeffff : System RAM
  00100000-001c646f : Kernel code
  001c6470-0020953f : Kernel data
0fff0000-0fff2fff : ACPI Non-volatile Storage
0fff3000-0fffffff : ACPI Tables
d0000000-d7ffffff : PCI Bus #01
  d0000000-d7ffffff : nVidia Corporation NV11
d8000000-dbffffff : VIA Tech., Inc. VT82C693A/694x [Apollo PRO133x]
dc000000-ddffffff : PCI Bus #01
  dc000000-dcffffff : nVidia Corporation NV11
de000000-de0000ff : Realtek Semiconductor Co., Ltd. RTL-8139
  de000000-de0000ff : 8139too
fec00000-fec00fff : reserved
fee00000-fee00fff : reserved
ffff0000-ffffffff : reserved

V prvním sloupci je příslušná oblast paměti (adresového prostoru) a v druhém je řečeno, kdo oblast využívá.

V/V paměť je první ze dvou možných způsobů ovládání periferií. Představte si adresový prostor (v našem případě – architektura Intel x86 – jde o 32 bitů), do kterého jsou mapovány paměťové prvky periferních zařízení. Může jít jednak o stavové a příznakové registry a nebo třeba o vyrovnávací paměti. Důležité je, že ačkoliv vše vypadá jako přístupy do fyzické paměti RAM, ve skutečnosti se jedná o sběrnicovou komunikaci s daným periferním zařízením. S (operační) pamětí RAM to nemá nic společného. Před použitím této paměti je třeba ji ovšem namapovat do LAP. To znamená provést nastavení transformace mezi logickým (virtuálním) adresovým prostorem aplikace/jádra a sběrnicovými adresami pro dané periferní zařízení. Potom je možno (na architektuře Intel x86) použít k přístupu obyčejné ukazatele. Pro čtení a zápis do takových oblastí je ovšem stále vhodné použít speciální funkce a ne běžné dereferencování. To zaručí vyšší přenositelnost mezi jednotlivými architekturami procesorů a sběrnic. Na Intelu jsou odpovídající funkce pro čtení a zápis (read[b|w|l] a write[b|w|l]) pouze „prázdnými“ makry. Detaily viz soubor …/include/arch-i386/io.h.

Následující tabulka ukazuje rozdělení adresového prostoru s velikostmi a hranicemi jednotlivých úseků:

Tabulka č. 156
název horní hranice velikost
System RAM 639 KB 639 KB
reserverd 640 KB 1 KB
Video RAM area 768 KB 128 KB
Video ROM 800 KB 32 KB
System ROM 1024 KB 64 KB
System RAM 256 MB 255 MB
Kernel code  – 1817 KB
Kernel data  – 268 KB
ACPI storage 256 MB 12 KB
ACPI tables 256 MB 52 KB
PCI Bus #1 (NV) 3.25 GB 128 MB
VIA Tech. 3.44 GB 64 MB
PCI Bus #1 (NV) 3.44 GB 32 MB
Realtek 8139 3.47 GB 256 B
reserved 4 GB

V tabulce je vidět nejprve pozůstalost z dob DOSu – rozdělení začátku paměťového prostoru (640 KB). Dále je vidět vyhrazená paměť pro video adaptér – dnes opět historie. Po doplnění na 1 MB je vidět vlastní kód jádra spolu s jeho datovými strukturami. Oblast system RAM je vlastně dostupná (fyzická) operační paměť RAM bez prvního megabajtu (historie). Následuje několik kilo informací pro ACPI (Advanced Configuration and Power Interface) a pak přijde to hlavní. Dvě z instalovaných PCI/AGP zařízení (síťovka a grafika) jsou vidět ve výpise spolu s oblastmi paměti, které využívají. Také prostředky základní desky (VIA chipset) mají vyčleněny své části paměťového prostoru. Celý rozsah paměťového prostoru je potom 4 GB (232).

ioports

0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
0376-0376 : ide1
03c0-03df : vga+
03f6-03f6 : ide0
0cf8-0cff : PCI conf1
5000-500f : VIA Technologies, Inc. VT82C686 [Apollo Super ACPI]
6000-607f : VIA Technologies, Inc. VT82C686 [Apollo Super ACPI]
c000-c00f : VIA Technologies, Inc. Bus Master IDE
  c000-c007 : ide0
  c008-c00f : ide1
c400-c41f : VIA Technologies, Inc. UHCI USB
c800-c81f : VIA Technologies, Inc. UHCI USB (#2)
cc00-ccff : Realtek Semiconductor Co., Ltd. RTL-8139
  cc00-ccff : 8139too
d000-d03f : ESS Technology ES1969 Solo-1 Audiodrive
  d000-d00f : ESS Solo1
d400-d40f : ESS Technology ES1969 Solo-1 Audiodrive
  d404-d40f : ESS Solo1
d800-d80f : ESS Technology ES1969 Solo-1 Audiodrive
  d800-d80f : ESS Solo1
dc00-dc03 : ESS Technology ES1969 Solo-1 Audiodrive
  dc00-dc03 : ESS Solo1
e000-e003 : ESS Technology ES1969 Solo-1 Audiodrive
  e000-e003 : ESS Solo1

Zde opět první sloupec udává použitý rozsah adres portů a druhý název zařízení, které tento rozsah používá.

V/V (Vstupně/Výstupní) Porty jsou druhý způsob jak ovládat periferie. Z historického hlediska je starší a vznikl na počítačích s malým adresovým prostorem – tedy s úzkou adresovou sběrnicí. Příkladem budiž archeologické vykopávky Intel 8086 a podobné (nejlépe ještě omezené operačními systémy jako MS DOS). Tam byl 16ti bitový adresový prostor zatraceně malý na to aby se jím plýtvalo a tak byla snaha řešit komunikace s periferiemi jinou cestou. Výsledkem byly porty. Jedná se opět o další (tentokrát zcela samostatný) adresový prostor, který se ovládá speciálními instrukcemi procesoru. Těmi jsou instrukce typu inb, outb a podobné včetně jejich řetězcových verzí. Hlavní nevýhodou (kromě zbytečné složitosti při dvou oddělených přístupech) bylo omezení této množiny instrukcí. Proto pozdější architektury navržené rovnou pro 32 a více bitů (procesory Alpha od Digitalu) tento způsob vůbec nepodporovaly a v případě Linuxu je nabízen pouze jako mezivrstva emulující chování přes V/V paměť.

Při programování není třeba provádět mapování paměti – jedná se o oddělený adresový prostor a opět existují funkce pro přenos dat z a do adaptéru. Porty jsou rozděleny podle velikosti přenášené jednotky a proto existují modifikace základní funkce in[b|w|l] a stejně tak i out[b|w|l]. Linux poskytuje i rozhraní na řetězcové (a rychlejší) formy pomocí funkcí insb a outsb.

Na architekturách, které porty nabízejí, se využívají, i když spíše ze setrvačnosti a pro prostředky s jednoduchým nebo omezeným přenosem dat. Můžeme je tak najít ve spojitosti s ovládáním DMA kanálů, ACPI, USB sběrnic a případně zvukové karty. Některé periferie kombinují použití obou metod jak je vidět třeba na síťové kartě Realtek RTL-8139.

Vzhledem k tomu, že se ukazuje, že mám skutečně o něco více volného času, tak po domluvě s redakcí zvyšujeme tempo (alespoň dočasně) na (zhruba) dva články za týden. To by mohlo znamenat, že se dostaneme do půlky výpisu ještě před Vánocemi :).

Byl pro vás článek přínosný?