FR 2883390 A1 20060922 FR 0502561 A 20050315 GESTION DU PLACEMENT DE STRUCTURE DE DONNEES EN MEMOIRE BASEE SUR UN LANGAGE DE PROGRAMMATION DEDIE La présente invention concerne, de manière générale, le domaine de la gestion mémoire dans les systèmes informatiques et:, plus particulièrement, concerne la gestion du placement de structures de données en mémoire dans les systèmes embarqués tels que les appareils électroniques portables dotés d'un microcontrôleur réunissant un processeur et des mémoires de différents types. A l'heure actuelle, l'organisation du contenu d'une mémoire est essentiellement basée sur des structures de données (fichiers, objets...), représentant une organisation des données élémentaires d'un code informatique dans une structure logique particulière. Ces structures de données sont prévues pour être allouées en mémoire, c'est-à-dire qu'une zone mémoire dans une mémoire physique du système est réservée pour stocker chaque structure de données, lors du chargement, de l'installation et de l'exécution du code en mémoire par l'environnement d'exécution. Cette phase d'allocation des données en mémoire est plus particulièrement mise en oeuvre par un composant logiciel appelé gestionnaire de mémoire du système. Un gestionnaire de mémoire est ainsi prévu pour gérer la ressource mémoire du système lors de l'exécution d'un programme, en allouant des zones de mémoire aux structures de données, en déplaçant éventuellement ces structures de données d'une zone mémoire vers une autre ou encore en effaçant les structures de données qui ne sont plus utilisées par le programme. La difficulté à prendre en compte lors du développement d'un gestionnaire de mémoire est de définir une stratégie en terme de placement de données en mémoire qui soit adaptée au mieux aux caractéristiques de la mémoire du système et aux données à placer en mémoire. Le schéma actuellement respecté dans la plupart des systèmes informatiques est le suivant. On dispose d'une mémoire de travail de type RAM dans laquelle un programme s'exécute, en rendant persistant des données dans une mémoire persistante, typiquement un disque dur. Dans ce contexte où l'exécution des programmes s'effectue entièrement en RAM, le problème du placement des structures de données entre différents types de mémoire ne se pose pas. Cependant, si l'on considère les systèmes embarqués, par exemple de type cartes à puce, la gestion du placement en mémoire doit être prise en compte. En effet, les systèmes embarqués, du fait de leur portabilité, sont contraints en mémoire et, en particulier, disposent de très faibles capacités en mémoire vive de type RAM. Aussi, dans les systèmes embarqués, la RAM ne peut être utilisée seule en tant que mémoire de travail par les applications du système, comme cela est le cas par exemple dans les PC (Personal computer) où la capacité en mémoire RAM est normalement suffisante pour supporter la plupart des applications. Les systèmes embarqués comprennent alors plusieurs types de ressources mémoires, qui présentent des propriétés différentes. Typiquement, ces systèmes embarquent de la mémoire morte de type ROM, qui ne peut être écrite qu'une seule fois et dans laquelle des instructions et des données préenregistrées sont accessibles seulement en lecture, de la mémoire non volatile de type EEPROM ou Flash EEPROM, dans laquelle des données peuvent être lues et écrites, et de la mémoire vive de type RAM. Ces mémoires ne sont pas égales tant du point de vue des performances, que de la taille qu'elles occupent ou encore de leur mode d'accès. L'hétérogénéité des mémoires du système impliquent par conséquent des décisions à prendre quant au placement des structures de données en mémoire plus complexes de la part du gestionnaire de mémoire embarqué du système. Par ailleurs, la ROM étant une mémoire à lecture seule, elle ne peut être programmée qu'une seule fois durant la phase de configuration du système. Notamment, une image mémoire du programme à charger dans la ROM est produite hors-carte sous forme d'un fichier écrit en langage C, appelé rom.c, par l'intermédiaire d'un outil logiciel appelé romizer, contenant les structures de données du code à charger dans la ROM lors de son initialisation. De plus, ce fichier indique où les structures de données doivent être placées dans les différentes mémoires disponibles (RAM, ROM, EEPROM...) par le gestionnaire de mémoire embarqué du système, au démarrage de celui-ci lors de l'exécution du code en ROM. Cette phase de romization implémentée par le romizer, permet donc de définir quelles seront les structures de données à graver en ROM, et de déclarer quelles structures de données seront à placer dans l'une ou l'autre des mémoires disponibles lors du démarrage à l'exécution du code dans la ROM. Il est à noter que cette phase est basée sur une description du système tel qu'il était au moment où la romization a été effectuée. Que ce soit le romizer ou le gestionnaire de mémoire, ces deux composants logiciels sont donc tous deux amenés à faire de la gestion mémoire et plus particulièrement, à appliquer des règles de placement des structures de données entre les différentes mémoires du système, l'ensemble de ces règles constituant alors une politique de placement des structures de données en mémoire. Ces règles sont en fait écrites dans le code d'implémentation du romizer et du gestionnaire de mémoire. Elles ne sont donc pas exprimées en tant que telles, mais découlent plutôt des besoins explicites du programmeur, qu'il traduit dans le code logiciel du gestionnaire de mémoire ou du romizer selon une stratégie considérée comme étant optimale. Or, la politique de placement des structures de données en mémoire dans un système est susceptible d'évoluer au cours du cycle de vie du système, par exemple en vue d'adapter une meilleure stratégie. Egalement, dans n'importe quel système informatique, l'utilisation de la mémoire n'est pas la même selon l'application visée. Cela est d'autant plus vrai dans les systèmes embarqués, car les applications mises en place sur ces systèmes sont typiquement dédiées à un usage plus ou moins particulier. Ainsi, 2883390 5 certaines applications peuvent nécessiter d'allouer plus ou moins de structures de données et donc impliquent des règles spécifiques de placement de leurs structures de données en mémoire, qui peuvent alors ne pas être supportées par le gestionnaire de mémoire du système tel qu'il a été implémenté. Par ailleurs, les règles de placement en mémoire telles que définies dans le code du romizer ou du gestionnaire de mémoire ne sont pas adaptables à tous les types de microcontrôleur et il est nécessaire d'adapter ces règles en fonction d'un microcontrôleur donné, dont la configuration mémoire fait que de nouvelles mises en correspondance des structures de données en mémoire doivent être appliquées, suivant que par exemple ces structures sont accédées souvent ou non en écriture ou en lecture. On a donc plusieurs facteurs d'évolution des règles de placement des structures de données en mémoire. Soit, on trouve une meilleure stratégie pour les définir, soit ces règles doivent s'adapter en fonction des applications qui tournent sur le système, soit on cherche à les adapter à un nouveau type de microcontrôleur. Si les règles de placement d'une structure de données en mémoire évoluent, il devient alors nécessaire de revoir et d'adapter le programme du composant logiciel concerné par la gestion de ces structures de données en mémoire. Or, actuellement, il n'existe aucun autre moyen que de réécrire à la main le programme de ce composant, puis de le tester à nouveau pour qu'il corresponde aux nouvelles règles de placement des structures de données en mémoire. Bien que cette opération est complexe et laborieuse, aucune technique n'a encore été développée visant à s'affranchir d'une telle étape de réécriture du code d'un gestionnaire de mémoire, à chaque fois que ce dernier doit s'adapter à des changements des règles de placement en mémoire des structures de données. Ce besoin ne s'est même jamais manifesté. En effet, comme on l'a vu, dans le contexte des systèmes informatiques où l'exécution des programmes s'effectue entièrement en RAM, le problème du placement des structures de données en mémoire ne se pose pas. Par ailleurs, concernant le monde de l'embarqué, jusqu'alors, on imposait des spécifications décrivant des règles générales de placement en mémoire très simples, que les développeurs d'applications embarquées devaient alors s'efforcer de suivre. C'est donc aux applications de s'adapter à la gestion de la configuration mémoire du système plutôt que l'inverse. Dans ce contexte, le fait. de réécrire le code du gestionnaire de mémoire est considéré comme la façon la plus simple d'adapter ce dernier à d'éventuelles évolutions des règles de placement des données en mémoire. L'invention vise justement à proposer un procédé permettant d'adapter, sans qu'il soit nécessaire de le réécrire à la main, le programme d'un gestionnaire de mémoire d'un système informatique à de nouvelles règles de placement des structures de données entre les différentes mémoires du système, ou entre différentes zones prédéfinies d'une mémoire du système, de sorte que la gestion de la mémoire du système puisse être configurable très simplement en fonction d'éventuelles évolutions de la politique de placement des structures de données en mémoire. L'invention a ainsi pour objet un procédé de gestion du placement de structures de données en mémoire dans un système informatique, caractérisé en ce qu'il comprend une étape de déclaration d'un ensemble de règles de placement desdites structures de données en mémoire par l'intermédiaire d'un langage de programmation dédié à cet effet. De préférence, le langage de programmation dédié est un langage déclaratif, basé sur le langage XML. Selon un mode de réalisation, le procédé selon l'invention comprend la génération d'au moins une partie du code d'implémentation d'un gestionnaire de mémoire du système à partir de l'ensemble de règles de placement déclarées en langage de programmation dédié. Selon un autre mode de réalisation, ledit ensemble de règles déclarées en langage de programmation dédié est utilisé pour configurer au moins une partie d'un gestionnaire de mémoire du système. Avantageusement, la configuration du gestionnaire de mémoire consiste à faire coopérer ledit gestionnaire de mémoire avec un fichier de configuration comprenant une version interprétable par ledit gestionnaire de mémoire des règles de placement déclarées en langage de programmation dédié. Selon un autre mode de réalisation, ledit ensemble de règles déclarées en langage de programmation dédié est utilisé pour générer des moyens de détermination du placement de structures de données en mémoire, aptes à coopérer avec un gestionnaire de mémoire du système pour recevoir de ce dernier une demande de détermination de placement d'une structure de données en mémoire et pour calculer ledit placement en fonction de ladite structure de données et desdites règles. L'invention concerne encore un appareil électronique portable, doté de moyens de traitement de données comprenant un microprocesseur et des mémoires, caractérisé en ce qu'il comprend un gestionnaire de mémoire configurable et un fichier de configuration dudit gestionnaire de mémoire, ledit fichier comprenant une version interprétable par ledit gestionnaire de mémoire d'un ensemble de règles de placement de structures de données en mémoire déclarées dans un langage de programmation dédié à cet effet. De préférence, cet appareil est une carte à puce. Dans le contexte de l'invention et dans la description qui suit, le terme gestionnaire de mémoire doit être compris dans son acceptation générique et vise en fait tout composant logiciel apte à s'occuper de la gestion de structures de données en mémoire, qui agit soit à l'exécution d'un programme (type allocateur, ramasse-miettes...), soit en amont lors de la configuration du système (type romizer). D'autres caractéristiques et avantages de la présente invention apparaîtront plus clairement à la lecture de la description suivante donnée à titre d'exemple illustratif et non limitatif et faite en référence aux figures annexées dans lesquelles: - la figure 1 illustre l'utilisation d'un fichier de déclaration de règles de placement en langage dédié selon l'invention, pour la génération d'un code d'implémentation adapté d'un gestionnaire de mémoire du système; - la figure 2 illustre un mode de réalisation selon lequel une version interprétable du fichier de déclaration est installé sur une carte à puce en vue de la configuration du gestionnaire de mémoire du système. La présente invention repose sur la conception d'un langage DSL (abréviation pour Domain Specific Langage ) pour définir une politique de placement des structures de données en mémoire. Dans le contexte de l'invention, l'approche DSL vise donc à proposer un langage de programmation dédié à cet effet. Le langage dédié selon l'invention est un langage déclaratif, qui repose par exemple sur le langage XML (extensible Markup Language). Il est alors utilisé pour exprimer en tant que telles un ensemble de règles de placement de structures de données en mémoire, qui sont avantageusement indépendantes du code dans lequel le gestionnaire de mémoire du système est écrit. Ces règles pourront être exprimées très facilement dans la mesure où le langage informatique sur lequel est basée l'invention est justement dédié à l'expression de telles règles. Ces règles zones mémoires concernant les taille, etc.) particulières liées aux applications du système. pourront être exprimées en fonction de prédéfinies, de propriétés complexes structures de données à placer (type, ou encore en fonction d'exigences Il est donc possible de décrire facilement, via des fichiers XML, des règles de gestion de placement en mémoire et de constituer ainsi à partir de chaque description une bibliothèque de règles définissant une politique de placement globale des structures de données en mémoire pour le système. Un exemple de règle décrite selon le principe de l'invention est présenté ci-dessous, concernant le placement initial d'une structure de données dans un contexte de programmation en langage orienté objet: la règle ci-dessus indique ainsi que tous les champs de la classe MyClassl qui sont déclarés static 20 25 30 final et que le champ MyField de la même classe doivent être placés en EEPROM par le gestionnaire de mémoire, de type romizer dans cet exemple. Un autre exemple où la gestion du placement de structures de données en mémoire peut être définie selon les principes de l'invention concerne le processus dit de ramasse-miette, qui a pour objet de récupérer de la mémoire dans la RAM en parcourant la mémoire pour identifier quelles sont les structures de données à conserver et à supprimer. Ainsi, la déclaration en langage dédié selon l'invention d'une règle typique de déplacement durant le processus de ramasse-miette est donnée ci-dessous. Elle indique qu'un objet en RAM de type StringBuffer de taille entre 10 et 15 octets sera déplacée vers l'EEPROM si la RAM est au minimum aux trois quarts pleine mais que l'EEPROM n'est occupée qu'à 50%. De telles règles de placement en langage dédié selon l'invention pourront donc être définies et adaptées très facilement et pourront ainsi être examinées par le ramasse-miette pour le rendre plus performant, voire pourront être utilisées pour générer le ramasse-miettes. Si les exemples donnés ci-dessus concernent davantage la déclaration de règles de placement en mémoire pour la gestion mémoire dans le monde de l'embarqué, l'invention peut néanmoins être avantageusement appliquée à la gestion mémoire dans les systèmes informatiques non embarqués, comprenant une mémoire de travail unique d.e type RAM dans laquelle le programme s'exécute. Notamment, des règles de placement de structures de données en mémoire peuvent être déclarées en utilisant le langage dédié selon l'invention, dans le but d.e définir une politique de gestion du placement entre prédéfinies de la RAM. Par exemple, on peut définir le ramasse-miettes ne doit pas minimiser le temps de parcours ramasse-miettes. Dans ce cas, différentes zones une zone de la RAM où intervenir de façon à de la mémoire par le on peut déclarer une règle selon laquelle les structures de données qui sont utilisées par le programme pendant toute sa durée d'exécution, devront être allouées dans ladite zone de la RAM où le ramasse-miettes n'intervient pas. La déclaration de règles selon l'invention permet donc d'optimiser le fonctionnement du gestionnaire de 30 mémoire du système, en l'adaptant à la politique de placement définie par la déclaration des règles en langage dédié. Comme illustré en figure 1, le langage dédié DSL est en effet utilisé pour générer un code d'implémentation adapté du gestionnaire de mémoire et du romizer, ou au moins une partie de ce code. Plus précisément, un fichier de déclaration 10, dans lequel sont déclarées les règles de placement des structures de données en mémoire en langage DSL, est fourni en entrée à un module logiciel 20, qui va utiliser la représentation en langage déclaratif des règles de placement fournies par le fichier 10, pour générer le code 30, ou une partie de ce code, du gestionnaire de mémoire ou du romizer, ce code pouvant être exprimé suivant les besoins en langage C, java, etc. Pour ce faire, le module logiciel 20 de génération est pourvu de toute la logique fonctionnelle lui permettant, à partir d'une règle définie dans le fichier de déclaration, de déduire le comportement que doit avoir le programme du gestionnaire de mémoire à l'exécution. Ce comportement est alors traduit par des moyens spécifiques en C, Java ou autre. Grâce au langage DSL mis en oeuvre par l'invention dédié à la déclaration de règles de placement en mémoire, le module logiciel 20 génère exactement le programme qui correspond à la politique de placement définie. Dans une variante, la déclaration d'un ensemble de règles de placement en mémoire selon l'invention peut être utilisée en vue de la configuration du gestionnaire de mémoire du système ou d'une partie au moins du gestionnaire de mémoire, l'autre partie pouvant par exemple avoir été générée comme expliqué précédemment. La figure 2 illustre un tel mode de réalisation dans le cadre d'un système embarqué de type carte à puce 40, dotée de moyens de traitement de données 50 comprenant un microprocesseur et des mémoires. Selon ce mode de réalisation, le gestionnaire de mémoire 60 du système se présente, au moins en partie, sous la forme d'un code générique prévu pour assurer la gestion mémoire du système, en coopération avec un fichier de configuration 70 installé dans la carte, comprenant une version interprétable par le gestionnaire de mémoire du fichier de déclaration des règles de placement en mémoire en langage dédié. Ainsi, chaque fois que le gestionnaire de mémoire aura à gérer le placement d'une structure de données en mémoire, il lira le fichier de configuration 70 pour déduire son comportement de l'interprétation des règles qui y sont déclarées. Le fichier de configuration peut ainsi être avantageusement mis à jour dans la carte, afin de le faire évoluer pour adapter la politique de gestion du placement de données en mémoire sur carte. Dans un autre variante, on utilise le DSL selon l'invention, dédié à la déclaration de règles de placement en mémoire, pour générer des moyens de détermination du placement de structures de données en mémoire, appelés placeur de mémoire. Le placeur de mémoire comprend une interface pour communiquer avec le gestionnaire de mémoire du système, lequel est prévu pour délèguer au placeur le calcul du placement en mémoire d'une structure de données via une fonction d'interrogation du placeur. Le placeur, généré conformément aux règles de placement définies par l'intermédiaire du langage dédié selon l'invention, prend donc en paramètre la structure de données concernée et indique alors au gestionnaire où placer la structure de données en mémoire en fonction de ladite structure et des règles prédéfinies. Le fait de déclarer les règles de placement de structures de données en mémoire par l'intermédiaire d'un langage dédié permet donc d'avoir des règles indépendantes du code du gestionnaire de mémoire du système, ce qui est optimal en termes de gestion mémoire. De plus, les règles ne sont plus figées, mais peuvent être adaptées très facilement en fonction des applications, du microcontrôleur etc., pour définir une nouvelle politique de placement. REVENDICATIONS 1. Procédé de gestion du placement de structures de données en mémoire dans un système informatique, caractérisé en ce qu'il comprend une étape de déclaration (10) d'un ensemble de règles de placement desdites structures de données en mémoire par l'intermédiaire d'un langage de programmation dédié à cet effet. 2. Procédé selon la revendication 2, caractérisé en ce que le langage de programmation dédié est un langage déclaratif, basé sur le langage XML. 3. Procédé selon la revendication 1 ou 2, caractérisé en ce qu'il comprend la génération (20) d'au moins une partie du code d'implémentation (30) d'un gestionnaire de mémoire (60) du système à partir de l'ensemble de règles de placement déclarées en langage de programmation dédié. 4. Procédé selon l'une quelconque des revendications 1 à 3, caractérisé en ce que ledit ensemble de règles déclarées en langage de programmation dédié est utilisé pour configurer au moins une partie d'un gestionnaire de mémoire (60) du système. 5. Procédé selon la revendication 4, caractérisé en ce que la configuration du gestionnaire de mémoire (60) consiste à faire coopérer ledit gestionnaire de mémoire avec un fichier de configuration (70) comprenant une version interprétable par ledit gestionnaire de mémoire des règles de placement déclarées en langage de programmation dédié. 6. Procédé selon la revendication 1 ou 2, caractérisé en ce que ledit ensemble de règles déclarées en langage de programmation dédié est utilisé pour générer des moyens de détermination du placement de structures de données en mémoire, aptes à coopérer avec un gestionnaire de mémoire du système pour recevoir de ce dernier une demande de détermination de placement d'une structure de données en mémoire et pour calculer ledit placement en fonction de ladite structure de données et desdites règles. 7. Appareil électronique portable (40), doté de moyens de traitement (50) de données comprenant un microprocesseur et des mémoires, caractérisé en ce qu'il comprend un gestionnaire de mémoire (60) configurable et un fichier de configuration (70) dudit gestionnaire de mémoire, ledit fichier comprenant une version interprétable par ledit gestionnaire de mémoire d'un ensemble de règles de placement de structures de données en mémoire déclarées dans un langage de programmation dédié à cet effet. 8. Appareil selon la revendication 6, caractérisé en ce que cet appareil est une carte à puce.