Largeur de bus processeur et compteur de trafic réseau

Bonjour,

J’ai actuellement mon routeur sur un Raspberry Pi 4 (noyau Linux Lookout 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux). Étant sur un système en 32 bits, je savais déjà que j’allais tomber sur le dépassement du compteur de trafic des interfaces. En gros, une fois à 4Gio, le compteur revient à zéro.

En fait, je m’y suis fait depuis le temps, mais, ce matin, en regardant les compteurs, je tombe sur ça dans le fichier /proc/net/dev :

Interface    |                            Receive                             |                         Transmit
             |       bytes  packets errs drop fifo frame compressed multicast |      bytes  packets errs drop fifo colls carrier compressed
lookout2nut:   34226569766 36797464    0    0    0     0          0         0   3301678118 25281399    0 1755    0     0       0          0

Du coup, je ne comprend pas pourquoi cette interface a pu aller au delà de 4Gio. Et si c’est le cas, ne serait-il pas possible que les autres interfaces puissent y aller aussi ?

Merci.

Hello,

Le fait qu’une architecture telle que la armv7l utilise éventuellement une taille de registre microprocesseur de 32 bits ne signifie pas que l’on ne puisse pas faire d’opération sur des nombres qui ne tiennent pas dans un seul registre.
Les additions et soustractions sur des entiers sont assez simples à implémenter.

D’ailleurs, parmi les types de nombres entiers proposés par le langage C, il y a un entier d’une taille de 64 bits. Vérifié à l’instant sur une Pi 4 :

$ ./sz
The size of an unsigned char is 8 bits
The size of an unsigned short int is 16 bits
The size of an unsigned int is 32 bits
The size of an unsigned long int is 32 bits
The size of an unsigned long long int is 64 bits

source :

#include <stdio.h>
#include <stdlib.h>

// https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Integer-Types
// gcc -o sz sz.c

int main()
{
    printf("The size of an unsigned char is %zu bits\n", sizeof(unsigned char) << 3);
    printf("The size of an unsigned short int is %zu bits\n", sizeof(unsigned short int) << 3);
    printf("The size of an unsigned int is %zu bits\n", sizeof(unsigned int) << 3);
    printf("The size of an unsigned long int is %zu bits\n", sizeof(unsigned long int) << 3);
    printf("The size of an unsigned long long int is %zu bits\n", sizeof(unsigned long long int) << 3);
}


AnonymousCoward

Oui, je sais, l’IPv6 fonctionne alors que les adresses font 128 bits.

Oui, je sais, mais il y a une différence flagrante entre pouvoir faire quelque chose et le faire.