1

-

2

Je ne suis pas qualifié mais je pense qu'il n'y a pas de possibilité d'avoir une memory map d'un système comme celui-ci.
Tu peux avoir un nombre de périphériques arbitraire, donc je ne pense pas que tout soit déjà câblé, sinon ça restreindrait les possibilités d'évolutions (d'ailleurs, même sans parler d'évolution, je vois difficilement comment ça peut être possible).

Si tu trouves des infos, poste-les ici, ça m'intéresse aussi, ce genre de trucs smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

-

4

Oui je pense qu'il y a des ports de base standards.
Cependant, mon post est totalement inutile puisque je n'apporte aucune info cheeky
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

Pour la mémoire : utilise le mode 'flat', ça mappe la mémoire comme sur les motorola 680x0 (4 Go linéaire, introduit à partir du 386 pour copier le bus 32 bits du 68020) - http://www.ddci.com/art_10040.shtml ou http://www.alrj.org/docs/hardware/flat-rm.php

Pour la vidéo : utilise vesa 3, pareil, avec introduction de la mémoire vidéo en linéaire (sans bank de 64 Ko, et support des écrans multiples, ...) - http://www.vesa.org/vbe3.pdf

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

6

Orion_ le pc a deux espaces d'adressage (et deux jeux de bus) indépendants :
- d'une part l'adressage mémoire, classique, avec son bus d'adresse et de données
- d'autre part le bus d'entrées/sorties, que tu accèdes avec les instructions in et out.

D'autre part les ports d'entrées sorties sont assez variables selon le système, même si il y en a qui sont plus ou moins standard. Le mieux c'est encore que tu trouves le contrôleur PCI et que tu configures toi-même le mappage des périphériques en mémoire et leurs ports d'entrées/sorties, ou alors si la vitesse n'est pas trop importante, tu peux appeler les fonctions du BIOS (regarde les tables d'interruptions).



Pour le mode réel, c'est historique. A l'origine le système avait un espace d'adressage de 1Mo (20 bits), mais était un système 16 bits. D'où l'utilisation de deux registres (le recoupement tous les 16 octets n'était peut-être pas spécialement malin, mais bon).

Quand le pc est passé au 32 bits, avec un espace d'adressage de 4Go, on a gardé le concept segmentembarrassedffset pour la compatibilité. On a donc choisit de créer deux modes d'exécution différents :
- le mode réel, qui garde l'ancienne sématique
- le mode protégé, qui utilise un adressage 32 bits et avec une segmentation de la mémoire (donc on a gardé le registre de segment du coup, même si on s'en sert plus du tout comme avant (d'ailleurs pour la plupart des développeurs c'est transparent)).

Note : les deux modes ne peuvent pas fonctionner en même temps, alors on a créé un troisième environnement d'exécution, appelé le mode virtuel je crois (vm86), qui simule le mode réel dans un environnement protégé geré par l'os (c'est ce que windows utilise pour faire tourner les applications dos).

7

-

8

Ah j'oubliais de répondre aux autres question :
comment utiliser le bios en mode protegé ? (i.e comment repasser temporairement en mode reel pour l'executer)
On ne fait pas comme ça. T'as deux possiblités, pour chaque groupe de fonctionnalités du bios :
1 - le bios fournit un point d'entrée en mode protégé. Gagné, tu l'utilises.
2 - le bios ne fournit pas de point d'entrée. dtc faut faire sans.
mov eax, 0x00001337 mov [eax],0x42
C'est inexact. En fait là ce que tu fais c'est "mov ds:[eax],0x42". Mais l'assembleur complète tout seul, parce que de toutes façons sous un os en mode protégé tu utilises rarement un autre segment.
est-ce qu'on peu afficher un pixel a l'ecran sans avoir a se faire chier avec les bankswitching ?
Ben si t'utilises que les fonctions vesa standard faudra forcément que tu travailles avec une fenetre et que tu la déplaces. Pour faire mieux, il faut mapper la mémoire vidéo. Pour ça faut que tu gères correctement le contrôleur pci, c'est lui qui fait ça.
y'a bien des standards la dessus non ?
- Pour le standard ide/atapi c'est le t13 qui gère ça.
- Pour le PCI, c'est le pcisig, mais faut raquer pour avoir accès à la spec, et c'est pas donné. Je suis pas chez moi là, mais j'ai quelques documents sur le sujet (chez moi sad ), faudra que je les retrouve.

9

-

10

Ben la ram est toujours mappée de façon continue à partir de l'adresse 0, avec les 400 (décimal ou hex je me rappelle jamais) premiers octets réservés pour la compatibilité par le bios.
Autres trucs à savoir sur le mapping :
- le bios est généralement mappé à la fin de l'espace d'adressage (0xFF...... à 0xFFFFFFFF)
- avec certaines vieilles cartes vidéo, écrire des données dans la plage 0x000A0000 - 0x000BFFF peut causer problème.
- si tu fais du dma avec des périphériques, il y a bcp de périphériques incapables d'accéder à la mémoire au dessus de l'adresse 16Mo
- j'ai pas d'autre idée là tout de suite.

Et pour la gestion de la mémoire, si tu veux faire un truc intéressant et à peu près efficace, fais de la pagination wink

11

Pour la gestion memoire, c'est un des exercice les plus difficile qui soit, dans le sens où ta RAM n'a pas le 'droit' d'être fragmentée comme un disque dur. Si tu veux travailler sur une image, il faut que le bloc mémoire soit contigu ! Il existe des thèses entières sur le sujet. Pour ce qui est des sources d'allocateurs de mémoire, y'a déjà le plus connu, celui de Doug Lea : http://gee.cs.oswego.edu/dl/html/malloc.html (ou ptmalloc, une version modifiée http://www.malloc.de/en/)

Sinon, il existe d'autre allocateurs, comme celui de Fluid Studios par exemple : http://www.fluidstudios.com/pub/FluidStudios/MemoryManagers/Fluid_Studios_Memory_Manager.zip

Si ces deux allocateurs peuvent déjà t'aider, n'oublie pas qu'ils sont codés en C (c'est à dire en faisant abstraction de la segmentation mémoire typique des x86) ! Si tu veux faire une conversion en ASM, utilise donc le mode 'flat', ça t'éviteras les noeuds au cerveau...

Un mot de code concernant les allocateurs : hoard (memory allocator) ! Avec cet indice, je te souhaite pas mal d'amusements !

Kochise

PS : Tu verras, faire un OS, c'est pas une partie de plaisir, ça touche à des domaines très très variés !
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

12

-

13

avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

14

Tu peux écrire à partir de 0x00000400. Avec un trou de 0x000A0000 à 0x000BFFFF.
Fait gaffe de pas t'écraser toi-même en mémoire (je crois que le secteur de boot, toi a priori, est chargé en 0x00007C00, mais je vais aller vérifier pour pas te dire une connerie).

Edit: Ah et euh oui, kochise : un os n'alloue pas la mémoire comme ça. Il utilise la pagination pour justement pouvoir fragmenter la mémoire, et l'allouer par bloc (4ko les blocs sur x86).

15

Tiens si ça t'intéresse, voici un petit bout de code qui passe en mode protégé. J'ai dû le tester à une époque (la même que celle où j'ai écrit le texte qui va autour cheeky ), mais c'était il y a longtemps, donc à voir.
Le mode protégé demande avant d'être activé de préparer une table de descripteurs, dont
nous parlerons au chapitre suivant. Pour l'instant, on supposera que tout est prêt pour
activer le mode protégé. Regardez ce code :

; L'exemple ne gère pas les interruptions, donc on les désactive
    cli

; Chargement de la table des segments
    lgdt [gdtr]

;Ici, on active le mode protégé (bit PE)
    mov eax,cr0
    or al,01h
    mov cr0,eax

; Seulement, on n'est pas encore en mode protégé, car le processeur dispose d'un cache qui mémorise les
; informations sur le segment de code. Il faut donc recharger ce cache, en rechargeant cs :
    jmp CODE_SEGMENT:protege ;CODE_SEGMENT : voir plus loin
protege:

; Voilà, on est en mode protégé. Mais les autres registres de segment doivent être chargés avec des
; valeurs valides, sinon, ils fonctionnent encore comme en mode réel.
    mov eax,STACK_SEGMENT
    mov ss,eax
    mov esp,0FFFFFFFFh ;Ou 0000FFFFh si mode protg 16bits
    mov eax,DATA_SEGMENT
    mov ds,eax ;... avec tous les registres utiliss dans le programme


;------------------------------
gdtr:
    dw gdtend - gdt - 1
    dd gdt

gdt:
    dd 0,0 ;La première entrée est réservée et doit être nulle

CODE_SEGMENT equ 0008h ;Index = 1, TI=0, RPL=0
    dw 0010h ;Limit : 00010 x 4K - 1 = 0000FFFFh
    dw 0000h ;Base : 00000000h
    db 00h
    db 10011011b ;P R A
    db 11000000b ;G DB
    db 00h

STACK_SEGMENT equ 0010h ;Index = 2, TI=0, RPL=0
    dw FFF0h ;Limit : FFFF0 x 4K = FFFF0000h
    dw 0000h ;Base : 00000000h
    db 00h
    db 10010111b ;P E W A (une pile croît vers le bas)
    db 11001111b ;G DB
    db 00h ;Ce segment s'étend de l'adresse physique
        ; 00010000h  à l'adresse 00020000h et accepte des offsets de FFFF0000h à FFFFFFFFh

DATA_SEGMENT equ 0018h ;Index = 3, TI=0, RPL=0
    dw FFFFh ;Limit : 0FFFF x 1 = 0000FFFFh
    dw 0000h ;Base : 00000000h
    db 00h
    db 10010011b ;P W A
    db 01000000b ;DB
    db 00h
gdtend:

Voilà, à titre indicatif (je le mets parce que en recherchant les infos que j'ai sur le sujet je suis retombé dessus happy ).

[edit: ah je vois un pb : la limite pour le segment de pile est un peu grande, si t'as pas 4Go re RAM cheeky ]
[edit2: après examen, je crois que ce code passe en mode protégé flat, puisque il définit tous les segment avec un offset de 0 par rapport au début de la mémoire]
[edit3: copy-paster error]

16

-

17

Le mieux pour la vidéo c'est de gérer le pci (le strict minimum, hein) et de mapper le buffer écran en mémoire. Après tu peux dessiner dessus comme sur TI.
Sinon pour ce qui est de l'accès au bios en mode protégé, attends je vais fouiller dans mes archives...

18

Hmmm... Pourtant, il me semble que Windows 95 soit capable d'accéder aux disques durs en mode réel ("mode de compatibilité MS-DOS"). Ça rame à fond, mais ça marche.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

19

J'ai retrouvé un truc intéressant. Attends, je l'uploade...voilà
Page 6 y'a un mot sur le linear framebuffer.
Page 21, ça explique comment obtenir le point d'entrée des fonctions VESA du bios pour le mode protégé. Et si tu lis, juste après t'as aussi comment on fait pour l'appeler, ce même point d'entrée.

20

spectras
: Edit: Ah et euh oui, kochise : un os n'alloue pas la mémoire comme ça. Il utilise la pagination pour justement pouvoir fragmenter la mémoire, et l'allouer par bloc (4ko les blocs sur x86).


Ah oui mais attend, la granularité de l'OS, c'est comme les clusters sur disque dur, et ça dépend du reglage de l'allocateur. On utilise bien un allocateur de mémoire, la PMMU quand à elle sert à faire de la pagination dans le sens 'protection hardware' et générer une erreur de page si un processus écrit là où il n'est pas sensé écrire.

Mais l'arbitre de la mémoire, celui qui va allouer au processus tant et tant de mémoire, l'alignement, la granularité, etc... c'est bien un allocateur comme celui de Doug Lea. D'ailleurs, celui-ci surclasse le malloc du compilateur C si t'inclus malloc.c dans ton projet.

Le hoarding, c'est un allocateur de mémoire pour multi-processeur à mémoire partagée. Et c'est pas le/s processeur/s qui s'en occupent, la pagination mémoire n'est là que pour assurer la protection des blocs alloués par l'allocateur (d'où un allocateur digne de ce nom doit aussi gèrer la PMMU).

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

21

Ah oui, petit oubli, un allocateur de mémoire avec PMMU gère aussi régulièrement la mémoire virtuelle. L'allocateur sait que l'on à 256 Mo de mémoire physique, et la PMMU se charge de générer une exception quand on va au-dela, mais plutôt que de pèter une erreur à la con, s'occupe de faire du swapping dans un fichier d'échange (le fameux pagefile.sys de Windows)...
spectras :
J'ai retrouvé un truc intéressant. Attends, je l'uploade...voilà


Voir mon post de 16H14 : http://www.vesa.org/vbe3.pdf

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

22

Kochise, les systèmes d'exploitation qui savent ce qu'ils fassent (Linux par exemple) sont très bien capables de fragmenter la RAM et d'utiliser la MMU pour coller le tout!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

23

Ah oui mais attend, la granularité de l'OS, c'est comme les clusters sur disque dur, et ça dépend du reglage de l'allocateur.
Non. La taille des pages est fixe et dépend du processeur. En l'occurence sur ix86 le processeur gère deux tailles : 4ko et 4Mo (un bit à changer dans le cr0 ou le cr1).
On utilise bien un allocateur de mémoire
L'allocation de mémoire du système d'exploitation aux applications se résume à une liste chaînée des pages inutilisées. C'est tout. Les liens que tu as mis n'ont rien à voir, ils concernent la gestion de la mémoire sans pagination justement (par exemple dans une application, ou sur un système d'exploitation très simpliste).
la PMMU quand à elle sert à faire de la pagination dans le sens 'protection hardware' et générer une erreur de page si un processus écrit là où il n'est pas sensé écrire
C'est l'un des rôles, mais en fait c'est un effet de bord. La pagination a pour but de permettre justement la fragmentation de la mémoire, en établissant un mapping spécifique à chaque processus, faisant correspondre les adresses qu'il utilises à l'adresse réelle de la mémoire physique. La détection d'un accès erroné (Page Fault) n'est qu'un effet de bord de cette traduction, qui se produit quand justement il n'y a pas d'adresse réelle correspondant à l'adresse virtuelle demandée.
Mais l'arbitre de la mémoire, celui qui va allouer au processus tant et tant de mémoire, l'alignement, la granularité, etc... c'est bien un allocateur comme celui de Doug Lea. D'ailleurs, celui-ci surclasse le malloc du compilateur C si t'inclus malloc.c dans ton projet.
La gestion de la mémoire dans le processus est spécifique au processus, le système d'exploitation ne s'en mèle pas, il se contente juste de répondre à des ^H^H^H la requête de modification de l'espace dispo pour le processus (appel système brk() sous linux).
Voir mon post de 16H14
Au temps pour moi.

24

-

25

Bah pour le fun perso je jouerais bien avec le mécanisme de pagination. Mais bon en même temps on a presque tous ici des notions assez bizarres du fun, du point de vue du commun des mortels zen.

26

Petits, mais déjà impressionants (il m'en faut peu) :

http://pascal.sources.ru/graph/gui-r3.htm (GUI)
http://blake.prohosting.com/osc1/ (UNIX KERNEL)

Kochise

PS : Ca aide - http://flatassembler.net/
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

27

Concernant la taille de la RAM physique présente, y'avais une page très interressante, mais GeoCities à la facheuse tendance de désactiver certains sites soit disant 'inactifs' : http://www.geocities.com/SiliconValley/Lakes/7220/memtest.html

Peu être qu'un jour il rouvrira, donc essayez l'adresse de temps en temps, et s'il rouvre, copiez immédiatement la page, voire le site 7220 !

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

28

-

29

Pour l'instant le truc que j'ai le plus utilisé dans les secteurs de boot que j'ai bidouillés, c'en est un qui charge le secteur de boot depuis le disque dur et lui passe le relai (à mettre sur les disquettes non bootable, pour éliminer ce "invalid system disk" qui fait chier mad).

Le truc c'est que autant j'aime bien lire les docs et comprendre comment ça marche, autant je n'ai ni le temps ni la motivation pour me lancer dans qqc de plus gros qu'une "proof of concept".

30

Un peu plus haut, j'ai cité GUI-R3 et OSC1 (les deux ensembles peuvent déjà former un véritable OS), mais comme Orion l'a justement remarqué, il faut ensuite dialoguer avec le hard. Pour les ports standarts, un petit passage sur http://www.programmersheaven.com devrait faire l'affaire (port série, parallèle et ps2). Concernant les ports PCI et USB, voici deux liens sympa :

PCI : http://members.datafast.net.au/dft0802/
USB : http://www.wingmanteam.com/usbsnoopy/

Concernant la FAT (disquette et disque-dur), un bon point de départ est http://en.wikipedia.org/wiki/FAT32 ! Pour les périphériques IDE et SCSI, spectras à déjà noté le t13 pour l'IDE. Je rappelle donc les URL :

IDE : http://www.t13.org/
SCSI : http://www.t10.org/
ATAPI : http://www.ata-atapi.com/

Pour l'accès AGP/PCI pour la vidéo, je conseil donc le VESA pour passer par le BIOS, ce qui évite les problèmes d'accès directs aux cartes graphiques. Sinon, on peut toujours écrire son propre driver hardware à partir de VBE :

VESA : http://www.vesa.org/
VBE : http://www.talula.demon.co.uk/freebe/ (sauvegardez le site, on ne sait jamais)

Pour dessiner quelque chose à l'écran, y'a SDL ou ALLEGRO :

SDL : http://www.libsdl.org/
ALLEGRO : http://www.talula.demon.co.uk/allegro/

Pour terminer, quelques OS sympas, avec code source :

SOLAR : http://www.hostileencounter.com/os/os_down_source.htm
ALPACA : http://www.cis.rit.edu/~sdlpci/Software/alpaca/ (Z80, c'est presque pareil qu'Intel - 8080)
DRDOS : http://stud3.tuwien.ac.at/~e0225895/drdos/drdown.htm (le DOS ultime de Digital Research Inc, puis Caldera)
FREEDOS : http://www.freedos.org/
ACEOS : http://aceos.netfirms.com/
KORBIT : http://www.nondot.org/~sabre/
LITTLEOS : http://littleos.free.fr/ (en français)
GAZOS : http://gazos.sourceforge.net/
ALEXEIOS : http://alexfru.narod.ru/
UCOS-II : http://www.ucos-ii.com/contents/products/ucos-ii/ports-intel.html

Mais je crois que le meilleur de tous pour Orion sera sans aucun doute :

NSIS 80386 : http://www.wku.edu/~barceed/

Kochise

PS : Les bonus à étudier attentivement...

OSKIT : http://www.cs.utah.edu/flux/oskit/ (voir aussi la base http://www.cs.utah.edu/flux/ )
BLUEPARROTS : http://www.blueparrots.com/ (blue2.html, blue3.html et blue4.html surtout) ( http://www.newkingstreet.com/ : utile pour récupérer le site de Blue Parrots)

avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/