IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Table APIC not found


Sujet :

Assembleur

  1. #1
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut Table APIC not found
    Bonsoir,
    Inspiré du tutoriel de Mickael Chourdakis, j'essaie de résoudre un problème qui me fais taper sur le mur depuis toute la soirée.

    Après avoir chargé la GDT/IDT, l'A20, etc... J'arrive à trouver mon LocalAPIC à l'adresse 0xFEC00000 ou 0xFEE00000. Jusqu'à là, tout vas bien!
    Mais je n'arrive pas à trouver la table APIC!!! Je comprend pas !! (pc:Sony Vaio VPCEJ)

    A la fin de mon code ci-dessous, la condition "cmp edx, 0" edx est toujours égale à zéro! J'ai testé sur un autre PC (Lenovo B590) pour être sur mais c'est pareil...

    Si quelqu'un peut m'éclairer avant que je fasses connaissance de mon voisin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    		; Debut de la guerre 
    		cli
    		mov ax,DATA16
    		mov ds,ax
    		mov ax,STACK16
    		mov ss,ax
    		mov sp,stack16_end
    		sti
     
    		; Sauvegarder l'IDT
    		sidt fword [ds:RealIDT]
     
    		; Sauvegarder la PSP
    		mov ax,es
    		mov [cs:OrgPSP],ax
     
     
    		; Configurer la GDT
    		call CODE16:IDTInitF
    		call CODE16:IDTInit64f
     
     
    		; Activer l'A20
    		push cs
    		call EnableA20
     
     
    		; Mode Unreal
    		CLI
    		call FAR CODE16:EnterUnreal 		
    		STI
     
     
    		; Configurer les interruptions
    		push cs
    		call SetupInterrupts
     
     
    		; Preparer l'ACPI
    		push cs
    		call GetMyApic16f
    		mov [ds:MainCPUAPIC],bl
     
     
    		push cs
    		call FillACPI
    		mov eax,'APIC'
    		push cs
    		call FindACPITable
     
    ; ============================================================
    ; ============================================================
     
    ; **************** Fonction GetMyApic16f ****************
    		GetMyApic16f:
    			push eax
    			push ecx
    			push edx
    			mov eax,1
    			cpuid
    			and ebx,0xff000000
    			shr ebx,24
    			pop edx
    			pop ecx
    			pop eax
    			retf
     
    ; **************** Fonction FillACPI ***************
    		FillACPI:
    			PUSHAD
    			push es
    			mov es,[fs:040eh]
    			xor edi,edi
    			mov di,[es:0]
    			pop es
    			mov edi, 0x000E0000
     
    		; Rechercher l'apic...
    		.s:
    			cmp edi, 0x000FFFFF 
    			jge .APICNONTrouve
    			mov eax,[fs:edi]
    			add edi,4
    			mov edx,[fs:edi]
    			add edi,4
    			cmp eax,0x20445352
    			jnz .s
    			cmp edx,0x20525450
    			jnz .s
    			jmp .APICTrouve
     
    		; Si on trouve pas l'APIC
    		.APICNONTrouve:
    			POPAD
    			RETF
     
    		; Si l'APIC est trouve (EDI)
    		.APICTrouve:
    			sub edi,8
    			mov esi,edi
    			; 36 bytes for ACPI 2
    			mov ecx,36
    			push cs
    			call ChecksumValid
    			cmp eax,1
    			jnz .APICNONTrouve
    			mov eax,[fs:edi + 24]
    			mov dword [ds:XsdtAddress],eax
    			mov eax,[fs:edi + 28]
    			mov dword [ds:XsdtAddress + 4],eax
    			mov edi,dword [ds:XsdtAddress]
    			mov eax,[fs:edi]
    			cmp eax, 'XSDT'			; Valid?
    			jnz .APICNONTrouve	
    			POPAD
     
    			; APIC trouve! ICI CA MARCHE !!!!
     
    			RETF
     
     
     
    ; **************** Fonction FindACPITable ****************
     
    		FindACPITable:
     
    		; On recherche la Table APIC
    		push edi
    		push ebx
    		push edx
    		mov edi,dword [ds:XsdtAddress]
     
    		.l1:
    		mov ebx,[fs:edi]
    		mov edx,[fs:edi + 4]
    		cmp edx,0
    		jnz .TableTrouve
    		; Table non trouve... :( PROBLEME ICI !!!!!!!!!!!!!! 
     
     
    		; Table trouve!
    		.TableTrouve
    		; ...
    		; ...
    Si vous voulez les sous-programmes, dîtes le moi je suis fatigué j'ai du zaper pleins de choses

    Cordialement
    Bonne soirée
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  2. #2
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    a quoi correspondent les segment DS et FS? est ce qu'ils sont correctement initialisé?

  3. #3
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut
    Bonjour

    DS correspond à DATA16 qui lui est la macro suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    macro linear reg,trg,seg = DATA16
    {
    	mov reg,seg
    	shl reg,4
    	add reg,trg
    }
    XsdtAddress réserve un DQ de 8 octets contenant 0

    N'étant pas le concepteur du code, je suppose que FS correspond à 10h d'après la fonction EnterUnreal
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  4. #4
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    je m'interroge sur le "enterunreal" est ce que c'est du mode protégé? ou du flat mode réel? j'y jeterait bien un oeil...

    si c'est bien du mode protégé alors il m faut voir la partie du code qui initialise la gdt

    a part ça je ne vais pas être d'une grande utilité, je me suis contenté du PIC simple pour la gestion des irq sur mon hobby OS, l'APIC servant surtout aux système multiprocesseurs

  5. #5
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut
    J'ai fort impression qu'il s'agit du mode réel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    	EnterUnreal:
    		PUSHAD
    		PUSH DS
    		MOV AX,DATA16	
    		MOV DS,AX
    		linear eax,0,CODE16
    		mov     [ds:code16_descriptorUNR.b0_15],ax ; store it in the dscr
    		shr     eax,8
    		mov     [ds:code16_descriptorUNR.b16_23],ah
    		XOR eax,eax
    		mov     [ds:data32_descriptorUNR.b0_15],ax ; store it in the dscr
    		mov     [ds:data32_descriptorUNR.b16_23],ah
    		; Set gdt ptr
    		linear eax,dummy_descriptorUNR
    		mov     [gdt_ptrUNR],eax
    		mov bx,gdt_startUNR
    		lgdt [ds:bx]
    		mov eax,cr0
    		or al,1
    		mov cr0,eax 
    		JMP $+2
    		mov ax,10h
    		mov fs,ax
    		mov ds,ax
    		mov     eax,cr0         
    		and     al,not 1        
    		mov     cr0,eax         
    		POP DS
    		xor ax,ax
    		mov fs,ax
    		POPAD	
    		RETF
    Et ce qui correspond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    ; GDT Protected
    pm_sel_mycode32 = 0x08
    pm_sel_mycode16 = 0x10
    pm_sel_mydata32 = 0x18
    pm_sel_mydata16 = 0x20
    pm_sel_rcode32 = 0x28
    pm_sel_rcode16 = 0x30
    pm_sel_rdata32 = 0x38
    pm_sel_rdata16 = 0x40
    pm_sel_rcode64 = 0x48
    pm_sel_rdata64 = 0x50
     
    ; Full GDT
    gdt_start dw gdt_size
    gdt_ptr dd 0
    dummy_descriptor GDT_STR 0,0,0,0,0,0
    mycode32_descriptor  GDT_STR 0ffffh,0,0,9ah,0cfh,0 ; 4GB 32-bit code
    mycode16_descriptor  GDT_STR 0ffffh,0,0,9ah,0,0    ; 64k 16-bit code
    mydata32_descriptor  GDT_STR 0ffffh,0,0,92h,0cfh,0 ; 4GB 32-bit data
    mydata16_descriptor  GDT_STR 0ffffh,0,0,92h,0,0    ; 64k 16-bit data
    rcode32_descriptor  GDT_STR 0ffffh,0,0,9ah,0cfh,0 ; 4GB 32-bit code
    rcode16_descriptor  GDT_STR 0ffffh,0,0,9ah,0,0    ; 64k 16-bit code
    rdata32_descriptor  GDT_STR 0ffffh,0,0,92h,0cfh,0 ; 4GB 32-bit data
    rdata16_descriptor  GDT_STR 0ffffh,0,0,92h,0,0    ; 64k 16-bit data
    code64_descriptor  GDT_STR 0ffffh,0,0,9ah,0afh,0 ; 16TB 64-bit code, 08cfh access = 01001111b = Big,64bit (0), 1111 more size
    data64_descriptor  GDT_STR 0ffffh,0,0,92h,0afh,0 ; 16TB 64-bit data, 08cfh access = 10001111b = Big,64bit (0), 1111 more size
    gdt_size = $-(dummy_descriptor)
     
     
     
    ; Unreal mode GDT
    gdt_startUNR dw gdt_sizeUNR
    gdt_ptrUNR dd 0
    dummy_descriptorUNR GDT_STR 0,0,0,0,0,0
    code16_descriptorUNR  GDT_STR 0ffffh,0,0,9ah,0,0
    data32_descriptorUNR  GDT_STR 0ffffh,0,0,92h,0cfh,0
    gdt_sizeUNR = $-(dummy_descriptorUNR)
    a part ça je ne vais pas être d'une grande utilité, je me suis contenté du PIC simple pour la gestion des irq sur mon hobby OS, l'APIC servant surtout aux système multiprocesseurs
    Il s'agit de ton projet ?

    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  6. #6
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    bon visiblement il s'agit de flat real mode, un mode non officiel de fonctionnement des processeur, il s'agit d'une astuce qui perment d'avoir accès aux 4Gb de la ram du processeur en mode réel, en pratique il consiste a passer brièvement en mode protégé pour modifier la limite accesible des segments de données pour la passer de 64Ko a 4Go et revenir au mode réel (la limite des segment n'étant modifiable qu'en mode protégé).

    tres pratique en apparence il permet d'avoir accès aux fonctions bios mais hélas pas du tout adapté si on veux faire un système multitache avec un minimum de protection (en flat real mode les application ont les mêmes droit que le noyau)

    ici visiblement fs pointe sur la totalité de la ram, donc fs:edi pointe sur l'adresse physique edi, ce qui ne m'avance pas trop sur la compréhension de tont problème. j'ai aussi l'impression qu'il y as une confusion entre l'APIC et l'ACPI dans ton code, vu que les deux terme sont utillisé dans les sources que tu nous a présenté, alors ma question est: qu'est ce que tu souhait faire? configurer les IRQ ou gerer l'alim de ton pc?

    non cet hobby os n'est pas le mien, "hobby os" est un terme générique qui designe ceux réalisé par des gens sur leur temp libre ("hobby os" pourait être traduie par "système d'exploitation passe temps" en français) pour le moment le miens n'as pas de nom (et n'auras pas de système fenêtré non plus)

  7. #7
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup pour ton éclaircissement!
    Pour expliquer mon but, c'est de pouvoir utiliser le multi-core depuis l'APIC, j'en ai beaucoup appris grâce aux tutoriels (anglais) de Michael Chourdakis je suis content d'en avoir appris plus sur le fonctionnement et avec beaucoup d'humour dans son code!. Pensant pouvoir me débrouiller tout seul, par ambition, j'ai tenté de faire mon propre code qui charge la gdt, initialise les segments etc.. ne voyant pas si ça fonctionne explicitement, j'ai tenté d'éveillé les CPUs et envoyer ma première trame pour que eux me renvoient une valeur, et c'est à ce moment là où j'ai bloqué par ce que ça ne marchais jamais j'ai tout arrêté et du coup je "recommence" partir d'un code de base à cette article. Qui va me permettre de par exemple, rediriger mes interruption (21h dos dans ce cas) dans une autre interruption depuis un autre thread. Ce code s'installe comme un TSR en plaçant son adresse dans sa table d'interruption. J'ai compilé son programme, l'exécuté sous FreeDos sans l'A20 du gestionnaire de mémoire (étant déjà intégré), ne voyant que ça ne fonctionne pas, j'ai débogué son code toute une après midi pour finalement trouver que edx (pointant de fs:edi + 4) est, et sera toujours égale à zéro, et c'est pareil avec 3 de mes PC (Lenovo, Sony Vaio, MSI) et cette condition stoppe le programme normalement via une interruption dos.
    Concrètement mon but c'est d'utiliser le multi-core pour chacun de mes interruptions/IRQ pour mes threads pour une question de performance.


    Ah d'accord, je ne connaissais pas ce terme d'hobby OS, je trouvais étrange comme nom
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  8. #8
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    XSDT est une composante de l'ACPI (Advanced Configuration and Power Interface) selonhttp://wiki.osdev.org/XSDT je ne voie pas trop a quoi ça peu te servir ici, surtout si tu cherche a utilliser le APIC (Advanced Programmable Interrupt Controller)

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/06/2016, 11h45
  2. table externe - file not found
    Par juin29 dans le forum Oracle
    Réponses: 9
    Dernier message: 07/12/2010, 11h52
  3. [ODBC] Lier deux tables - field not found
    Par dufeu.celine dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/11/2010, 07h12
  4. [iReport et les vues]Table "times" not found
    Par _Xavier_ dans le forum iReport
    Réponses: 0
    Dernier message: 17/07/2009, 17h31
  5. Réponses: 1
    Dernier message: 19/02/2009, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo