Showing posts with label LINUX. Show all posts
Showing posts with label LINUX. Show all posts

Sunday, April 12, 2015

Mount external hard drive with write permissions

This post has been created to keep a track of this very usual issue that I encountered recently. There are many discussions around it already but I thought that adding a very simple article with a few explanations couldn't harm. So here it is.

Linux permissions do not apply to VFAT external drives


When auto-mounted, you may see with a simple ls -la that the mounted partition is not accessible with write permission. No matter how many chmod you do, the result will remain the same : no write access. Don't worry, this is a normal behavior as the FAT32 filesystem do not support linux permissions.

Forget auto-mount


To resolve this issue, you should reconsider it. The permissions do not apply to the partition but they do to the mount point. It means that you'll have to tell linux to grant write permissions at mounting time.

Unmount your disk

umount /dev/sda1

Now mount it back with the following options

mkdir /mnt/mydisk
mount -t vfat /dev/sda1 /mnt/mydisk -o umask=0

It should now work as expected. The key option is umask which is the opposite mask to the one you give to chmod. 0 means that all users have all rights (Note: keeping it like this may be dangerous)

Automatically mount the disk at startup


This is done by editing the /etc/fstab file. Simply add the following line to it

UUID="BF12-2F81" /mnt/mydisk vfat  defaults,uid=me,gid=mylinux,umask=0    0    0

The UUID is the unique identifier of your disk (you can get it by running blkid in a console).
As you can see, I have added uid (user) and gid (group) options to allow one specific user to have write access on my disk.

A few reminders


If you're used to have your disk mounted on  /media and you're wondering why /mnt is often used, here is the explanation :

/media is usually used for auto-mounted disks
/mnt is the one that should be used when manually mounted

Saturday, May 11, 2013

Compile the Linux Kernel (part1)

Compile the Linux Kernel (part1)



Les distributions classiques fournissent des noyaux binaires pré-compilés, soit sous forme d’archives RPM dans le cas des distributions Red Hat, soit sous forme d’archives DEB dans le cas de la distribution DEBIAN.

L’utilisation de Linux dans un environnement industriel embarqué obligera à adapter le noyau à l’environnement matériel.

Il peut arriver que certains pilotes de périphériques ne soient par fournis sur l’archive officielle du noyau Linux.

Le noyau est tout simplement le programme qui gère les interactions entre le matériel et les autres programmes. C'est lui qui amorce le système d'exploitation.

Une chose que beaucoup de personnes ne comprennent pas est que le noyau est un programme comme les autres, vous pouvez parfaitement avoir plusieurs noyaux et utiliser celui de votre choix.

Pourquoi compiler son noyau ? Les noyaux fournis par défaut dans votre distribution /Linux sont des noyaux capables de tourner sur un maximum de machines et de matériels. Ils sont donc souvent plus lourds, mais la différence de rapidité est en général assez faible. En fait les vraies raisons de compiler son propre noyau sont les suivantes :

  1. Comprendre comment fonctionne le noyau Linux.
  2. Faire fonctionner un matériel qui n'est pas pris en charge par votre noyau actuel.
  3. Appliquer un correctif.
  4. Vous voulez utiliser une distribution qui oblige de compiler votre noyau.

La compilation du noyau est longue et demande beaucoup d'attention sous peine de ne plus pouvoir démarrer sa machine. Si vous n'avez pas le temps de lire beaucoup de documentation et si vous n'êtes pas prêt à galérer sérieusement, alors inutile de vous fatiguer pour rien.
Ce qui nous intéresse ici est la compilation de noyau destiné à l'embarqué et particulièrement aux architectures ARM.

Il est possible d'émuler la plateforme ARM sur votre poste de travail Linux pour tester les kernel compilés avec Qemu.

List all installed package on your Ubuntu system:
serge#> dpkg –get-selections
Install the ARM toochain:
serge#> sudo apt-get install gcc-arm-linux-gnueabi
Check the proper installation of the package :
serge#> dpkg --get-selections | grep arm

Télecharger un emulateur ARM (QEMU) pour tester vos kernel (en attendant le matériel).

List all available package with the name qemu to download :
serge#> apt-cache search qemu
serge#> sudo apt-get install qemu
serge#> sudo apt-get install qemu-kvm-extras


Pour Information, le noyau est identifié par un triplet version.révision.patch, exemple 2.4.13
Les révisions paires identifient des noyaux stables. En toute rigueur, ce sont les seuls qu’il faut utiliser dans le cas de produits industriels. Les révisions impaires sont des noyaux de développement. La fréquence de diffusion de ces noyaux peut être très élevée, parfois un par semaine ou plus. Leur utilisation n’est absolument pas recommandée pour des applications industrielles.

Pour commencer, récupérer la dernière version du noyau 3.8.9 depuis :

Créer un répertoire de travail en local et copier l'archive téléchargée dans ce nouveau répertoire:

serge#> cd /home/serge
serge#> mkdir kernel_compilation
serge#> cp ./Downloads/linux-3.8.9.tar.xz ./kernel_compilation/
serge#> cd kernel_compilation/
serge#> ls -lrt

Décompresser l'archive dans le répertoire kernel_compilation :
serge#> tar -xvf linux-3.8.9.tar.xz

Voici une brève description des fichiers et sous-répertoires de l’arborescence du noyau :



arch contient le code source spécifique des architectures matérielles comme x86, ppc, alpha ou m68k.

Documentation contient des fichiers de documentation au format.

drivers contient l’arborescence des divers pilotes de périphériques.

fs contient le code source des différents systèmes de fichiers, ou file-systems supportés par le noyau. Nous pouvons citer par exemple ext2, vfat ou iso9660.

include contient les fichiers d’en-tête C nécessaires à la compilation du noyau mais également au développement d’applications.

init contient le fichier principal main.c, contenant la fonction principale main(), du noyau Linux.

ipc contient le code source de la version des IPC System V du noyau Linux.

kernel contient le code source des fonctions majeures du noyau comme la gestion des tâches ou des processus.

mm contient les fonctions de gestion de la mémoire ou memory-management.

net contient le code source des différents protocoles réseau supportés par le noyau Linux. Nous pouvons citer ipv4, ipv6 ou x25.

scripts contient le code source des outils de configuration du noyau.

Makefile et Rules.make sont les fichiers utilisés par la commande make lors de la compilation du noyau.

sound contient dans le cas du noyau 2.6 les pilotes ALSA (Advanced Linux Sound Archicture) désormais intégrés en standard aux sources du noyau.

Télécharger Git, le svn de Linux pour faire de la gestion de configuration :
serge#> apt-cache search git
serge#> sudo apt-get install git


L'adresse du repository Git de travail est la suivante: https://linux389pi@bitbucket.org/linux389pi/linux389pi.git
L'adresse du repository officiel de la Rasperry est:
https://github.com/raspberrypi/linux

Clôner le répertoire de travail en local depuis le repository Git (équivalent svn checkout):
serge#> git clone https://linux389pi@bitbucket.org/linux389pi/linux389pi.git

Au cas où, faire un pull ou fetch pour récupérer les derniers fichiers du repository (equivalent à svn update):
serge#> cd ~/kernel_compilation/linux389pi/arch/arm/configs
serge#> git pull origin

Go to the configuration folder to check the default configuration :
serge#> cd /home/serge/kernel_compilation/linux389pi/arch/arm/configs

Check the presence of the Rasperry Pi configuration file
bcmrpi_deconfig

Define your local environment before compilation:
serge#> export ARCH=arm
serge#> export CROSS_COMPILE=arm-linux-gnueabi-
serge#> alias make='make -j8'
Comment: The number coming after the “j” letter is obtained by doing: 2*<number of CPUs>

You can get the number of CPU by checking the file:
cat /proc/cpuinfo
Configure the kernel from the root of your working directory:
serge#> cd ~/kernel_compilation/linux389pi
serge#> make bcmrpi_defconfig
After entering the command, a .config file should be generated.
Build the kernel from the root of your working directory:
serge#> cd ~/kernel_compilation/linux389pi
serge#> make
If building the kernel produces compilation errors, fix the errors and perform a clean before rebuilding again with the command:
serge#> make mrproper

Correcting the build errors by applying a patchfile to the vanilla kernel

The vanilla kernel version is not adapted to compile for an ARM architecture, that is why we encountered compiling errors. In order to fix these errors, we are going to apply a patchfile to the vanilla version.

First, Go to the main directory
cd kernel_compilation/
Rename the directory you downloaded from your central repository:
mv linux389pi linux_vanilla_kernel
Go inside the Official Raspberry Pi directory you downloaded rom the official website:
cd rpi-3.8.y/
Initialize a new local git repository on this directory:
git init
git add .
Commit all the subdirectories
git commit -m "added : rpi-3.8.y sources"
Add a new local repository from the Pi repository and fetch:
git remote add vanilla ../linux_vanilla_kernel/
git fetch vanilla
Generate the patch file based on the deltas between vanilla kernel version and the official Rasperry Pi version:
git diff --no-prefix vanilla/master HEAD > patchfile
Move the patchfile to the vanilla kernel directory:
mv patchfile ../linux_vanilla_kernel/
Apply the patchfile to the vanilla version
patch -p0 < patchfile
Rebuild the kernel:
make mrproper
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
alias make='make -j8'
make bcmrpi_defconfig
make

Check that no errors occurred.

Linux init process

As we have seen before, the usual boot sequence of a Linux-based platform consists of several steps :


The init process :
  • completes the boot procedure
  • have the process ID '1'
  • starts the system processes (as described in /etc/inittab)
  • is not part of the kernel, it belongs to the user space ( /sbin/init )
  • never dies : it handles the operating system's life cycle (restart, shutdown,..)
There are many alternatives for the init process, it is usually installed with one of the following startup programs :

  • sysvinit : linux traditional init program
  • upstart : used by most of the linux distributions
  • systemd : Fedora
  • busybox : for small embedded systems
When built, these projects generate an init process and a set of common tools like telinit or initctl.

Run level

At boot, init checks the inittab configuration file for the runlevel parameter. This value goes from 0 to 6 and a specific set of actions is executed for each of them.


Depending on the default init level setting, the system will execute the programs from one of the following folders :

  • Run level 0 : /etc/rc.d/rc0.d
  • Run level 1 : /etc/rc.d/rc1.d
  • Run level 2 : /etc/rc.d/rc2.d
  • Run level 3 : /etc/rc.d/rc3.d
  • Run level 4 : /etc/rc.d/rc4.d
  • Run level 5 : /etc/rc.d/rc5.d
  • Run level 6 : /etc/rc.d/rc6.d
In these directories, the program names start with either S or K followed with a sequence number and the program name.
  • The programs starting with an S are executed on system Start while the programs starting with a K are executed on system Kill. 
  • The sequence number indicates when the program has the be executed.
For example, S12syslog has to be started before S80sendmail.

Saturday, April 20, 2013

Embedded Linux (part 2)


Méthodologie de création d'un système Linux embarqué



La structure du système est calquée sur les autres systèmes Unix libres ou propriétaires à savoir :

• un noyau ou kernel réalisant les fonctions essentielles comme la gestion des tâches et de la mémoire, ainsi que l’interfaçage entre le matériel et les applicatifs grâce entre autres aux pilotes de périphériques ou en anglais device drivers ;

• une bibliothèque principale appelée libc ou glibc (GNU libc) sous Linux et contenant
les fonctions de base utilisées par les applicatifs ;

• les applicatifs eux-mêmes, appelés également commandes, soit livrés en standard avec
le système ou bien développés pour des besoins spécifiques.


À ces éléments standards il faut ajouter un programme de démarrage ou bootstrap comme LILO (LInux LOader). À la différence des autres composants du système, le programme de démarrage ou chargeur est très dépendant du matériel utilisé.
Le schéma de démarrage d’un système Linux est relativement simple et on peut le décomposer comme suit :

1. Chargement du système par LILO ou un programme équivalent, comme GRUB.

2. Chargement du noyau Linux. Le chargement s’accompagne de l’initialisation des périphériques matériels indispensables au démarrage, et donc au chargement des pilotes de périphériques associés. Le noyau Linux tente également de charger sa partition principale ou root partition sur laquelle il ira chercher les éléments nécessaires à la suite du lancement du système.

3. Lorsque le noyau Linux est chargé, il exécute un programme d’initialisation qui, par défaut, correspond à la commande /sbin/init. Cependant, on peut indiquer facilement au noyau de passer la main à un autre programme.

4. Dans le cas de l’utilisation du programme init standard, ce dernier explore le fichier de configuration /etc/inittab qui contient le chemin d’accès à un script de démarrage, comme ceci :
# System initialization (runs when system boots).
si:S:sysinit:/etc/rc.d/rc.d/rc.sysinit
Le script en question poursuit l’initialisation du système.

1.Le noyau LINUX

Le noyau est l’élément principal du système, d'abord parce que ce noyau fut initialement conçu par Linus Torvalds, créateur du système Linux et de composants provenant en majorité du projet GNU de Richard Stallman. Ensuite parce que la structure monolithique du noyau en fait l’interface unique entre le système et le matériel dans la quasi-totalité des cas de figure.

1.1. Structure globale du noyau

Dans le cas de Linux, le noyau est un fichier exécutable, monolithique ou presque, chargé d’assurer les fonctions essentielles du système comme la gestion des tâches, ou scheduling, la gestion de la mémoire et le pilotage des périphériques que ceux-ci soient réellement des périphériques matériels ou bien qu’ils soient des périphériques virtuels.
Dans une distribution Linux classique, le noyau est physiquement représenté par un fichier localisé sur le répertoire /boot :

serge@serge-Aspire-4830TG:/boot$ ls -lrt
total 46484
-rw------- 1 root root 2320733 Oct 9 2012 System.map-3.5.0-17-generic
-rw-r--r-- 1 root root 154429 Oct 9 2012 config-3.5.0-17-generic
-rw-r--r-- 1 root root 853738 Oct 9 2012 abi-3.5.0-17-generic
-rw-r--r-- 1 root root 5171760 Oct 17 19:08 vmlinuz-3.5.0-17-generic
-rw-r--r-- 1 root root 178944 Jan 3 23:47 memtest86+_multiboot.bin
-rw-r--r-- 1 root root 176764 Jan 3 23:47 memtest86+.bin
-rw------- 1 root root 5169520 Mar 25 21:29 vmlinuz-3.5.0-27-generic
-rw------- 1 root root 2320304 Mar 25 21:29 System.map-3.5.0-27-generic
-rw-r--r-- 1 root root 154652 Mar 25 21:29 config-3.5.0-27-generic
-rw-r--r-- 1 root root 860818 Mar 25 21:29 abi-3.5.0-27-generic
-rw-r--r-- 1 root root 15066322 Apr 16 21:16 initrd.img-3.5.0-17-generic
drwxr-xr-x 5 root root 4096 Apr 16 21:29 grub
-rw-r--r-- 1 root root 15142645 Apr 16 21:30 initrd.img-3.5.0-27-generic


Le nom du noyau est libre mais il est généralement suffixé en fonction de la version du noyau, ici 3.5.0 et de l’extra-version choisie par celui qui a généré ce noyau, soit 17 dans le cas présent.
Nous verrons que l’extra-version est définie dans le fichier Makefile de l’arborescence des sources du noyau.
Le noyau Linux utilise également un fichier nommé System.map qui contient des informations sur des adresses internes du noyau. Ces informations sont utiles à la gestion des modules décrits ci-après. Le fichier System.map est également présent sur le répertoire /boot. En toute rigueur, il est lié à la version complète du noyau généré, y compris l’extra-version, car il est généré lors de la compilation du noyau.

1.2. Les modules chargeables du noyau

Dans les cas d’applications classiques de Linux, le noyau utilise le plus souvent des modules qui peuvent être dynamiquement chargés et déchargés en fonction des besoins du système.
Ces modules peuvent être des pilotes de périphériques matériels, comme des cartes d’extension, ou bien liés à un support générique de plus haut niveau comme le support SCSI. L’utilisation des modules permet d’optimiser la mémoire du système à un instant donné car un pilote non utilisé pourra être déchargé, libérant ainsi sa mémoire.
De même, l’utilisation des modules permettra d’ajouter dynamiquement des périphériques sans redémarrer le système.

Dans le cas d’un noyau embarqué, on pourra cependant se poser la question quant à l’utilisation des modules sachant que ceux-ci nécessitent la validation d’options spécifiques lors de la compilation du noyau, ce qui augmente légèrement sa taille. De même, la hiérarchie des modules nécessite la mise en place du répertoire /lib/modules, ce qui augmente le nombre de fichiers, la complexité du système et aussi légèrement l’espace occupé par ce dernier.

Le choix de l’utilisation ou non des modules sera laissé à la charge de l’intégrateur du système en fonction de ses besoins.
serge@serge-Aspire-4830TG:/boot$ ls -l /lib/modules
total 8
drwxr-xr-x 4 root root 4096 Oct 17 17:00 3.5.0-17-generic
drwxr-xr-x 4 root root 4096 Apr 16 21:28 3.5.0-27-generic

À chaque sous-répertoire correspond une version du noyau. Dans le cas présent, les
modules utilisés par le noyau seront localisés dans le répertoire 3.5.0-17.
serge@serge-Aspire-4830TG:/lib/modules$ ls -l 3.5.0-17-generic
total 4640
lrwxrwxrwx 1 root root 39 Nov 14 23:08 build -> /usr/src/linux-headers-3.5.0-17-generic
drwxr-xr-x 2 root root 4096 Oct 17 16:58 initrd
drwxr-xr-x 10 root root 4096 Oct 17 16:59 kernel
-rw-r--r-- 1 root root 739381 Oct 17 17:00 modules.alias
-rw-r--r-- 1 root root 719847 Oct 17 17:00 modules.alias.bin
-rw-r--r-- 1 root root 6027 Oct 9 2012 modules.builtin
-rw-r--r-- 1 root root 7365 Oct 17 17:00 modules.builtin.bin
-rw-r--r-- 1 root root 69 Oct 17 17:00 modules.ccwmap
-rw-r--r-- 1 root root 351471 Oct 17 17:00 modules.dep
-rw-r--r-- 1 root root 518442 Oct 17 17:00 modules.dep.bin
-rw-r--r-- 1 root root 214 Oct 17 17:00 modules.devname
-rw-r--r-- 1 root root 889 Oct 17 17:00 modules.ieee1394map
-rw-r--r-- 1 root root 295 Oct 17 17:00 modules.inputmap
-rw-r--r-- 1 root root 21817 Oct 17 17:00 modules.isapnpmap
-rw-r--r-- 1 root root 2486 Oct 17 17:00 modules.ofmap
-rw-r--r-- 1 root root 144391 Oct 9 2012 modules.order
-rw-r--r-- 1 root root 471479 Oct 17 17:00 modules.pcimap
-rw-r--r-- 1 root root 1765 Oct 17 17:00 modules.seriomap
-rw-r--r-- 1 root root 131 Oct 17 17:00 modules.softdep
-rw-r--r-- 1 root root 285690 Oct 17 17:00 modules.symbols
-rw-r--r-- 1 root root 363056 Oct 17 17:00 modules.symbols.bin
-rw-r--r-- 1 root root 1063926 Oct 17 17:00 modules.usbmap

Les modules sont répartis dans des sous-répertoires selon une classification fonctionnelle.
La liste ci-après permet de visualiser les modules correspondant à des pilotes réseau :
serge@serge-Aspire-4830TG:/lib/modules/3.5.0-17-generic$ ls -l /lib/modules/3.5.0-17-generic/kernel/drivers/net | head
total 244
drwxr-xr-x 2 root root 4096 Oct 17 16:59 appletalk
drwxr-xr-x 2 root root 4096 Oct 17 16:59 arcnet
drwxr-xr-x 2 root root 4096 Oct 17 16:58 bonding
drwxr-xr-x 2 root root 4096 Oct 17 16:59 caif
drwxr-xr-x 7 root root 4096 Oct 17 16:59 can
drwxr-xr-x 2 root root 4096 Oct 17 16:59 dsa
-rw-r--r-- 1 root root 7464 Oct 9 2012 dummy.ko
-rw-r--r-- 1 root root 9280 Oct 9 2012 eql.ko
drwxr-xr-x 46 root root 4096 Oct 17 16:59 ethernet

serge@serge-Aspire-4830TG:/lib/modules/3.5.0-17-generic/kernel/net/wireless$ ls -lrt
total 268
-rw-r--r-- 1 root root 9608 Oct 9 2012 lib80211.ko
-rw-r--r-- 1 root root 6760 Oct 9 2012 lib80211_crypt_wep.ko
-rw-r--r-- 1 root root 12672 Oct 9 2012 lib80211_crypt_tkip.ko
-rw-r--r-- 1 root root 8328 Oct 9 2012 lib80211_crypt_ccmp.ko
-rw-r--r-- 1 root root 225020 Oct 9 2012 cfg80211.ko

Le fichier modules.dep contient les dépendances entre les modules sous la forme d’une
simple liste contenant une définition de dépendance par ligne. Cette liste est générée au
démarrage du système par la commande depmod -a.

On doit également utiliser cette commande chaque fois que l’on ajoute un nouveau
module à l’arborescence des modules. Un extrait de la liste est présenté ci-après :

/lib/modules/2.4.7-10/kernel/fs/vfat/vfat.o:
/lib/modules/2.4.7-10/kernel/fs/fat/fat.o
La ligne ci-après montre que le module vfat.o nécessite la présence du module fat.o.

Bien que les modules soient normalement chargés de manière automatique par le système, nous allons décrire en quelques lignes les principales commandes de manipulation des modules, et ce afin de donner un bon aperçu des opérations possibles sur les modules.
Remarque
Les modules sont manipulés grâce à un paquetage nommé modutils. En cas d’utilisation du noyau 2.6, il est nécessaire d’utiliser une version récente du paquetage (module-init-tools-3.0 ou supérieur) disponible en téléchargement avec les sources du noyau. Ces dernières versions sont compatibles 2.4 et 2.6.

On peut forcer le chargement d’un module en utilisant la commande insmod. Prenons l’exemple d’un module hello.o sans dépendance avec aucun autre module.
On peut charger ce module au moyen de la commande :
root#> insmod hello.o

On peut aussi ajouter ce module à l’arborescence des modules standards en effectuant :
root#> cp hello.o /lib/modules/2.4.7-10/kernel/drivers/char/lib/modules/2.4.7-1/kernel/driver/char
root#> depmod -a


puis charger ce module avec la commande :
root#> insmod hello Using /lib/modules/2.4.7-10/kernel/drivers/char/hello.o

Notez qu’il est nécessaire d’être super-utilisateur pour charger un module.
Dans le cas où le module est installé dans l’arborescence, on ne spécifie pas le suffixe. La trace du chargement effectif du module est visible dans le fichier des messages du noyau(dmesg). On peut également vérifier sa présence en utilisant la commande lsmod:

root#> dmesg | tail -1
Hello world!
root#> lsmod
Module  
Size Used by
hello     292   0 (unused)


Lors du chargement du module, il est possible de spécifier des paramètres par la ligne de commande :
root#> insmod bttv card=39

Les paramètres peuvent être spécifiés dans le fichier /etc/modules.conf afin d’être utilisés automatiquement lors du chargement du module. Dans le cas du noyau 2-6, on utilise le fichier /etc/conf.modules :
alias eth0 3c59x
options i2c-algo-bit bit_test=1
options bttv card=39


La commande alias permet de faire une association automatique entre un nom de module générique et le nom de module effectif. Dans le cas présent, le module 3c59x sera chargé lors de l’initialisation de l’interface réseau Ethernet qui nécessite le module générique eth0. Après chaque modification du fichier, on doit utiliser la commande /sbin/depmod -a.
Pour décharger le module, on utilise la commande rmmod :
root#> rmmod hello
root#> dmesg | tail -1
Goodbye cruel world!


Remarque
Dans le cas de modules dépendant d’autres modules, on ne peut cependant pas utiliser la commande
insmod.

Le système de fichier /proc

Pour communiquer avec l’espace utilisateur, le noyau Linux utilise un concept emprunté à Unix System V : le système de fichier /proc. À la différence des systèmes de fichiers classiques qui sont associés à des périphériques réels, le système de fichier /proc est virtuel. Sa structure de système de fichier en fait une représentation facile pour manipuler des paramètres du noyau Linux. On peut en effet utiliser les commandes standards de manipulation des fichiers classiques, ainsi que la redirection des entrées/sorties très utilisée sous Linux.

On peut aussi:

lister les modules charger dans le kernel:
root#> cat /proc/modules

visualiser la mémoire disponible:
root#> cat /proc/meminfo

visualiser les systèmes de fichiers supportés par le noyau:
root#> cat /proc/filesystems

visualiser la version du noyau:
root#> cat /proc/version

visualiser le type de processeur utilisé:
root#> cat /proc/cpuinfo

De même, les valeurs numériques présentes dans /proc représentent les zones d’information des processus courant, chaque valeur correspondant au PID du processus en question. Ces sous-répertoires contiennent les informations propres au processus en question :

serge@serge-Aspire-4830TG:/proc$ ls -l /proc/3962
ls: cannot read symbolic link /proc/3962/cwd: Permission denied
ls: cannot read symbolic link /proc/3962/root: Permission denied
ls: cannot read symbolic link /proc/3962/exe: Permission denied
total 0
dr-xr-xr-x 2 root root 0 Apr 20 13:36 attr
-rw-r--r-- 1 root root 0 Apr 20 13:36 autogroup
-r-------- 1 root root 0 Apr 20 13:36 auxv
-r--r--r-- 1 root root 0 Apr 20 13:36 cgroup
--w------- 1 root root 0 Apr 20 13:36 clear_refs
-r--r--r-- 1 root root 0 Apr 20 13:36 cmdline
-rw-r--r-- 1 root root 0 Apr 20 13:36 comm
-rw-r--r-- 1 root root 0 Apr 20 13:36 coredump_filter
-r--r--r-- 1 root root 0 Apr 20 13:36 cpuset
lrwxrwxrwx 1 root root 0 Apr 20 13:36 cwd
-r-------- 1 root root 0 Apr 20 13:36 environ
lrwxrwxrwx 1 root root 0 Apr 20 13:36 exe
dr-x------ 2 root root 0 Apr 20 13:36 fd
dr-x------ 2 root root 0 Apr 20 13:36 fdinfo
-r-------- 1 root root 0 Apr 20 13:36 io
-r--r--r-- 1 root root 0 Apr 20 13:36 latency
-r--r--r-- 1 root root 0 Apr 20 13:36 limits
-rw-r--r-- 1 root root 0 Apr 20 13:36 loginuid
dr-x------ 2 root root 0 Apr 20 13:36 map_files
-r--r--r-- 1 root root 0 Apr 20 13:36 maps
-rw------- 1 root root 0 Apr 20 13:36 mem
-r--r--r-- 1 root root 0 Apr 20 13:36 mountinfo
-r--r--r-- 1 root root 0 Apr 20 13:36 mounts
-r-------- 1 root root 0 Apr 20 13:36 mountstats
dr-xr-xr-x 5 root root 0 Apr 20 13:36 net
dr-x--x--x 2 root root 0 Apr 20 13:36 ns
-rw-r--r-- 1 root root 0 Apr 20 13:36 oom_adj
-r--r--r-- 1 root root 0 Apr 20 13:36 oom_score
-rw-r--r-- 1 root root 0 Apr 20 13:36 oom_score_adj
-r--r--r-- 1 root root 0 Apr 20 13:36 pagemap
-r--r--r-- 1 root root 0 Apr 20 13:36 personality
lrwxrwxrwx 1 root root 0 Apr 20 13:36 root
-rw-r--r-- 1 root root 0 Apr 20 13:36 sched
-r--r--r-- 1 root root 0 Apr 20 13:36 schedstat
-r--r--r-- 1 root root 0 Apr 20 13:36 sessionid
-r--r--r-- 1 root root 0 Apr 20 13:36 smaps
-r--r--r-- 1 root root 0 Apr 20 13:36 stack
-r--r--r-- 1 root root 0 Apr 20 13:36 stat
-r--r--r-- 1 root root 0 Apr 20 13:36 statm
-r--r--r-- 1 root root 0 Apr 20 13:36 status
-r--r--r-- 1 root root 0 Apr 20 13:36 syscall
dr-xr-xr-x 3 root root 0 Apr 20 13:36 task
-r--r--r-- 1 root root 0 Apr 20 13:36 wchan


Par exemple, le fichier status contient des informations sur l’état du processus en question.
Le système de fichier /proc est également utilisable en écriture, ce qui permet de
modifier dynamiquement le comportement du noyau Linux sans aucune compilation.

Un exemple classique est la validation d’option comme par le transfert de paquets IP (IP forwarding). On peut connaître la valeur de l’option d’IP forwarding en faisant :
root#> cat /proc/sys/net/ipv4/ip_forward
1

Le système retourne la valeur 1, ce qui signifie que l’IP forwarding est validé. On peut l’inhiber en faisant simplement :
root#> echo 0 > /proc/sys/net/ipv4/ip_forward

Une description complète du pseudo-système de fichiers /proc est disponible dans le répertoire de documentation des sources du noyau Linux, soit :
root#> more usr/src/linux-2.4/Documentation/filesystems/proc.txt
pour les noyaux 2.4 et 2.6.

###########################################################

Bibliographie

  • Linux embarqué (2e edition - Eyrolles)
  • wikipédia

Friday, April 19, 2013

LINUX commands related to kernel

dmesg

The dmesg command can be used to examine or control the kernel ring buffer. 
Ring buffer
A ring buffer is a cyclic data structure similar to a normal buffer having a fixed size but it is managed in such a way that the newest entries are recorded, and if required, only the oldest entries are removed to keep the size of the buffer constant. Just think about a ring as if it reaches the end point it will start from the beginning.
The kernel Ring buffer
Also called the Kernel Log Buffer, it is a kind of Ring Buffer which contains messages related to the kernel and its different modules. For example it prints messages when any new kernel module is loaded or when a new file-system is registered in the kernel etc. The Linux kernel outputs these messages which are of great help in debugging and troubleshooting although it contains a great amount of noise. These messages are further classified into log levels depending upon the severity of the message.
The Log Level of Kernel Messages.
LOG_EMERG system is unusable
LOG_ALERT action must be taken immediately
LOG_CRIT critical conditions
LOG_ERR error conditions
LOG_WARNING warning conditions
LOG_NOTICE normal, but significant, condition
LOG_INFO informational message
LOG_DEBUG debug-level message

 ---------------------------------------------------------------------------------------------------------------------------------

uname -r

print the kernel release.

 ---------------------------------------------------------------------------------------------------------------------------------

rpm -q kernel (RedHat/CentOS)

dpkg --list | grep linux-image (Ubuntu, debian)

list all installed kernel and its version.

 ---------------------------------------------------------------------------------------------------------------------------------

lsmod

show the status of modules in the Linux Kernel.

---------------------------------------------------------------------------------------------------------------------------------

ldd

print shared library dependencies of a binary

---------------------------------------------------------------------------------------------------------------------------------

Thursday, April 18, 2013

Embedded LINUX (part 1)

Linux embarqué

===========

Préambule


La lecture de cet article nécessite des notions de programmation en langage C et en langage de script Unix (Bourne Shell), ainsi que quelques connaissances générales en informatique industrielle.
Les sources complets des exemples présentés sont disponibles en téléchargement sur le site d’accompagnement du livre à l’adresse:
http://www.editions-eyrolles.com.

Au niveau des exemples de réalisation, j'ai porté un
regard particulier sur la Freebox développée par Free SA. Le célèbre terminal de connexion
multimédia du premier opérateur Internet français est à ce jour un exemple d’innovation,
d’autant que c’est un pur produit de l’Hexagone.


Due to its low cost and ease of customization, Linux has been shipped in many consumer devices. Devices covering PDAs (like the Sharp Zaurus family), TomTom GPS navigation devices, residential gateways like the Linksys WRT54G series or smartphones: the Motorola exz series, the Openmoko handsets, the Nokia N900 and Nokia N9 cell phones were all using the Linux kernel. Nowadays the operating system that dominates the cell phone market is the Android operating system which is based on a modified Linux kernel along with a custom user space. The first device shipping with the Android operating system was the HTC Dream, which was released on 22 October 2008.

On machine control systems, industrial automation, and medical instruments Linux has also been used extensively. The website LinuxForDevices has many examples of such devices shipping with an embedded Linux as the operating system.

Introduction


Linux est un système d’exploitation multitâche de la famille Unix.
Linux est conforme à la norme Posix, ce qui signifie que les programmes développés sous Linux peuvent être recompilés facilement sur d’autres systèmes d’exploitation compatibles Posix.
Le système d’exploitation Linux est libre, le code source des différents composants du système est disponible gratuitement sur le réseau Internet(sous licence GPL).

Dans les cas les plus classiques d’utilisation de Linux, il est cependant possible de n’utiliser que des composants libres comme le serveur HTTP Apache, les langages de programmation Perl, PHP ou Python, ou bien les systèmes de base de données MySQL et PostgreSQL pour ne citer que les plus connus.
Linux est aujourd'hui bien implanté dans le monde des serveurs.

Systèmes embarqués - généralités


Un logiciel embarqué (embedded software en anglais) est un programme utilisé dans un équipement industriel ou un bien de consommation.
L’équipement est valorisé uniquement par son aspect fonctionnel et un bon
logiciel intégré le sera à un tel point qu’on finira par l’oublier.
Les concepteurs de logiciels embarqués sont rarement des informaticiens purs, plus souvent des êtres hybrides entachés de neurones d’électroniciens.
Dans la majorité des cas, un tel logiciel n’utilise pas les interfaces classiques clavier/souris propres à la micro-informatique.
S’ils existent, les périphériques d’affichage sont souvent limités à des panneaux de petite taille de type LCD (Liquid Crystal Display), et les périphériques d’entrée à quelques boutons poussoirs ou autres composants inhabituels dans l’informatique traditionnelle.
Attention un logiciel embarqué doit être optimisé:
"Software becomes slower faster than hardware becomes faster".

Alors que la micro-informatique a débuté avec 1 kilo-octet de mémoire vive et un système sur 8 Ko de ROM, il n’est pas rare aujourd’hui de voir des adolescents
pester contre le PIII de l’année précédente qui n’affiche pas assez vite les formes plantureuses de Lara Croft.
L’exemple le plus flagrant de cette course à la consommation est bien entendu les différentes moutures du système Microsoft Windows et les applications associées pour lesquelles chaque version est systématiquement accompagnée d’une augmentation de taille, compensée bien sûr par l’achat de quelques giga-octets de disque dur ou d’une barrette de mémoire supplémentaire.

Nous avons pour l’instant parlé de logiciel embarqué alors qu’il est fréquent d’entendre la terminologie de système embarqué. Cette terminologie désigne le plus souvent un système d’exploitation, version complexe et multi-usage du concept de logiciel.

Avantages

Les avantages de l’utilisation d’un système d’exploitation sont les suivants :

• Comme dans le cas du développement de logiciel classique, il affranchit le développeur de l’applicatif embarqué d’un travail d’adaptation très proche du matériel, ce qui permet de diminuer le temps de développement et donc les coûts. L’écriture du support de standards du marché comme les bus PCI ou USB est extrêmement lourde en cas de non-utilisation d’un système d’exploitation.
• Si le système d’exploitation utilisé est suffisamment répandu, il permet aux applications industrielles et embarquées de bénéficier des mêmes avancées technologiques que les applications classiques. C’est ainsi qu’il est aujourd’hui possible d’utiliser dans des systèmes réduits des protocoles de communication hérités de l’informatique classique et du multimédia.
L’utilisation d’un système d’exploitation qui inclut un support natif et largement
débogué de ces protocoles est alors un bien meilleur choix car le support d’un protocole se réduira le plus souvent à l’ajout d’un module ou d’un programme externe déjà testé, comparé aux nombreuses heures de mise au point nécessaires à la mise en place d’une version « maison ».
Remarque:
HTTP est le protocole utilisé pour le transfert des données multimédias entre un serveur web et un poste client équipé d’un navigateur ou browser. Plus ancien, le protocole FTP est lui réservé au simple transfert de fichier.
L’utilisation dans l’embarqué de ces protocoles standards en remplacement de protocoles propriétaires facilite l’interopérabilité des systèmes.

• Les systèmes d’exploitation fournissent en général un environnement de développement facilitant la mise au point des programmes dans un contexte beaucoup plus accueillant et performant que le système cible – celui sur lequel est censé tourner le programme définitif.
Un exemple industriel célèbre est celui de la PlayStation2 de SONY. Les développeurs de jeux ne pouvant disposer de la console définitive immédiatement, ils utilisèrent un environnement de développement basé sur Red Hat Linux permettant de simuler le fonctionnement de la console sur des stations de travail.

Inconvénients

Le principal inconvénient de l’utilisation d’un véritable système d’exploitation proche d’un système classique est la taille mémoire nécessaire. Il est bien évident que, si l’espace disponible est réduit à quelques centaines d’octets pour accomplir une tâche rudimentaire, un vrai système d’exploitation ne s’imposera pas.

Champs d'application

D’un point de vue technique, le champ d’application peut être grossièrement divisé en deux grandes familles :
• le contrôle de processus sans contrainte ou à faible contrainte temps réel (on pourra envisager l’utilisation d’un système d’exploitation dérivé d’un système classique comme Linux. L’adaptation se situera principalement au niveau du développement de pilotes de périphériques et de l’optimisation du système en taille ou en performances.

• le contrôle de processus avec contrainte temps réel. Les contraintes matérielles nécessiteront l’utilisation de composants spécialisés, soit un logiciel spécifique, soit un système d’exploitation dit temps réel (Real Time Operating System ou RTOS).

Typologie des systèmes embarqués


Un système d’exploitation classique comme Unix, Linux ou Windows utilise la notion de temps partagé, par opposition au temps réel. Dans ce type de système, le but de l’ordonnanceur est de donner à l’utilisateur une impression de confort d’utilisation tout en assurant que toutes les tâches demandées sont finalement exécutées. Ce type d’approche entraîne une grande complexité dans la structure même de l’ordonnanceur qui doit tenir compte de notions comme la régulation de la charge du système ou la date depuis laquelle une tâche donnée est en cours d’exécution.

La notion de priorité entre les tâches est peu prise en compte, car l’ordonnanceur a pour but premier le partage équitable du temps entre les différentes tâches du système. Notez que sur les différentes versions d’Unix dont Linux, la commande nice permet de modifier la priorité de la tâche lors du lancement.
Ensuite, les différentes tâches doivent accéder à des ressources dites partagées, ce qui entraîne des incertitudes temporelles. Si une des tâches effectue une écriture sur le disque dur, ce dernier n’est plus disponible pour les autres tâches à un instant donné et le délai de disponibilité du périphérique n’est pas prévisible.

Rappel:
La gestion des ressources partagées entre différentes tâches se fera grâce à des composants appelés sémaphores.

En outre, la gestion des entrées/sorties peut générer des temps morts, car une tâche peut être bloquée en attente d’accès à un élément d’entrée/sortie.
La gestion des interruptions reçues par une tâche n’est pas optimisée. Le temps de latence – soit le temps écoulé entre la réception de l’interruption et son traitement – n’est pas garanti par le système. Par comparaison, le temps de latence dans le cas d’un système temps réel est souvent inférieur à 100us.
Enfin, l’utilisation du mécanisme de mémoire virtuelle peut entraîner des fluctuations dans les temps d’exécution des tâches.
Rappel:
La mémoire virtuelle permet au système de disposer d’une quantité de mémoire, supérieure à la quantité de mémoire vive réellement disponible. Le système pourra pour cela utiliser des espaces dédiés sur la mémoire de masse afin de simuler une mémoire virtuelle. L’inconvénient en sera bien sûr une forte dégradation des performances.
Toutes ces limitations font que le temps de réponse d’un système classique n’est pas garanti.

Un système est dit temps réel lorsqu’il est soumis à des contraintes de temps et qu’il y répond dans un intervalle acceptable.
On pourra diviser les systèmes temps réel en deux catégories :
• Les systèmes dits à contraintes souples ou molles (soft real time). Ces systèmes acceptent des variations dans le traitement des données de l’ordre de la demi-seconde (ou 500 ms) ou la seconde. On peut citer l’exemple des systèmes multimédias : si quelques images ne sont pas affichées, cela ne met pas en péril le fonctionnement correct de l’ensemble du système. Ces systèmes se rapprochent fortement des systèmes d’exploitation classiques à temps partagé.
• Les systèmes dits à contraintes dures (hard real time) pour lesquels une gestion stricte du temps est nécessaire pour conserver l’intégrité du service rendu. On citera en guise d’exemples les contrôles de processus industriels sensibles comme la régulation des centrales nucléaires ou les systèmes embarqués utilisés dans l’aéronautique.

Commutation de contexte

Le noyau (kernel) est le composant principal d’un système d’exploitation multitâche moderne. Dans un tel système, chaque tâche (ou processus) est décomposée en threads (processus léger ou tâche légère) ; ce sont des éléments de programmes, chacun étant capable d’exécuter une portion de code dans un même espace d’adressage. Chaque thread est caractérisé par un contexte local contenant la priorité du thread, ses variables locales ou l’état de ses registres. Le passage d’un thread à un autre est appelé changement de contexte (context switch). Ce changement de contexte sera plus rapide sur un thread que sur un processus car les threads d’un processus évoluent dans le même espace d’adressage, ce qui permet le partage des données entre les threads d’un même processus.
Dans certains cas, un processus ne sera composé que d’un seul thread et le changement de contexte s’effectuera sur le processus lui-même.

Remarque:
Dans le cas du système Linux, le même appel système clone() est utilisé pour créer un processus ou un thread. La primitive fork() de création de processus correspond en fait à clone(0, SIGCLD|COPYVM).

Dans le cas d’un système temps réel, le noyau est dit préemptif, c’est-à-dire qu’un thread peut être interrompu par l’ordonnanceur en fonction du niveau de sa priorité, et ce afin de permettre l’exécution d’un thread de plus haut niveau de priorité. On peut ainsi affecter les plus hauts niveaux de priorité à des tâches dites critiques par rapport à l’environnement réel contrôlé par le système. La vérification des contextes à commuter est réalisée de manière régulière par l’ordonnanceur en fonction de l’horloge logicielle interne du système, ou tick système.
Dans le cas d’un noyau non préemptif, un thread sera interrompu uniquement dans le cas d’un appel au noyau ou d’une interruption externe. La notion de priorité étant très peu utilisée (excepté avec la commande nice dans le cas de Linux), c’est le noyau qui décide ou non de commuter le thread actif en fonction d’un algorithme complexe.

Extensions Posix

Posix est l’acronyme de Portable Operating System Interface ou interface portable pour les systèmes d’exploitation.
Un programme qui est destiné à un système d’exploitation qui respecte Posix doit pouvoir être adapté à moindre frais sous n’importe quel autre système Posix.
En théorie, le portage d’une application d’un système Posix vers un autre doit se résumer à une compilation des sources du programme.

Empreinte mémoire

Par définition, l’empreinte est la taille mémoire occupée par le système. Même si ce n’est pas une obligation, les systèmes embarqués ont en général une faible empreinte, et ce afin d’optimiser le système tant au niveau des coûts que de la sécurité de fonctionnement. La réduction de l’empreinte mémoire est la tâche principale d’un développeur de système embarqué car elle a un impact économique énorme sur l’industrialisation finale du produit.
Il faut faire la différence entre l’empreinte mémoire du système d’exploitation et celle des données.
Dans certains cas, on pourra par sécurité avoir un système d’exploitation réduit à quelques (Mo) sur une mémoire morte et dans d'autres cas un disque dur de plusieurs dizaines ou centaines de (Go) destiné à recevoir les données.

Langages utilisés


Les langages C et C++ restent aujourd’hui le choix favori des développeurs en partie à cause des liens privilégiés du langage C avec les standards Posix et les systèmes de type Unix. Historiquement, le langage C est également un langage permettant une programmation relativement proche du matériel, donc bien adaptée au logiciel embarqué.
La contrainte principale étant le plus souvent l’empreinte mémoire, la programmation en langage C nécessite d’utiliser le compilateur de la manière la plus efficace possible, et ce en utilisant au maximum les options d’optimisation adaptées au matériel.
Dans le cas du compilateur GNU gcc (GNU C Compiler), on notera en particulier les options suivantes
-O3, -O2, -O3, selon le niveau d’optimisation, et -Os qui permet d’optimiser le code afin de minimiser sa taille.
Des options spécifiques au processeur utilisé comme -m386 ou -mpentium permettront également d’adapter le code au matériel utilisé.
Dans le cas de l’utilisation de systèmes de type Unix (UNIX-like), on pourra également employer d’autres langages de programmation ou langages de scripts en particulier le shell-script, langage de script d’Unix (ou Bourne shell), qui associé à d’autres commandes pourra se révéler très utile dans l’écriture de procédures système. Le résultat sera le plus souvent plus facile à maintenir qu’un programme écrit en langage C et surtout ne nécessitera pas de recompilation avant exécution sur un autre système de type Unix.
D’autres produits encore plus réduits, comme BusyBox permettent d’intégrer des versions simplifiées d’un bon nombre de commandes Unix dans seulement 150 kilo-octets.
D’autres langages de scripts célèbres dans le monde Unix comme Perl, Tcl/Tk ou Python sont eux assez peu utilisés dans les environnements embarqués de par l’espace mémoire nécessaire à leur installation et à leur fonctionnement.

Les langages les plus répandus dans le monde de l’embarqué sont le C, le C++ et l’assembleur.
L’empreinte mémoire d’un système embarqué peut varier de 64 Mo à 0,1 Mo. On parle alors de système profondément enfoui.

Tour d’horizon des systèmes existants



Rappel:
Un environnement de compilation croisé permet de développer pour le système cible sur une autre machine
dans un environnement plus confortable. On peut citer par exemple la disponibilité sous Linux d’un environnement de développement pour PalmOS, basé sur le compilateur GNU gcc.

  • VxWorks et pSOS 
VxWorks est aujourd’hui le noyau temps réel le plus utilisé dans l’industrie. VxWorks inclut en natif un support TCP/IP et une interfacede programmation intégrant les sockets. Le gros inconvénient de ces deux systèmes est le coût important des licences. Il est également nécessaire d’utiliser un environnement de compilation croisé.
  • QNX
QNX est un noyau temps réel de type Unix très intéressant. Il est parfaitement conforme à Posix, permet de développer directement sur la plate-forme cible et intègre l’environnement graphique Photon.
QNX peut être utilisé gratuitement pour des applications non commerciales. Il peut occuper une très faible empreinte mémoire et, de ce fait, peut être utilisé dans des environnements très réduits comme les téléphones portables GSM Timeport de chez Motorola.
  • Windows CE, μC/OS et μC/OS II, etc...

Linux comme système embarqué



Les trois points suivants de la définition du logiciel Open Source sont fondamentaux dans le cas du logiciel embarqué :
• redistribution sans royalties ;
• disponibilité du code source ;
• possibilité de réaliser un développement dérivé de ce code source.

La disponibilité du code source est encore plus fondamentale car elle est la base de la conception d’un logiciel de qualité et surtout maintenable dans le temps.
La documentation des logiciels Open Source largement répandus comme Linux est souvent de très bonne qualité car elle a pu bénéficier d’un gros travail collaboratif.

Fiabilité
Le fameux kernel panic (erreur fatale du noyau) tant redouté par les développeurs est un animal rare, presque autant que le Yéti ou le monstre du LochNess. Une erreur de ce type s’explique toujours par un problème matériel ou une erreur de programmation dans un pilote de périphérique. Ces derniers travaillant dans un espace privilégié appelé « espace noyau » (kernel space ou kernel level), ils sont les seuls à pouvoir provoquer ce type d’erreur.
Les autres applications travaillent dans l’espace dit utilisateur (user space ou user level) et n’ont pas les droits nécessaires à la génération de ce type d’erreur.
La fiabilité de Linux est démontrable au moyen de la commande uptime qui permet d’afficher le temps d’activité du système depuis le dernier redémarrage. La couche TCP/IP de Linux, au cœur de nombreuses applications embarquées communicantes, est également d’une grande fiabilité.
Faible cout:
Linux est non seulement exempt de royalties mais les outils de développement sont également disponibles sous GPL. Le seul effort financier nécessaire à l’adoption de Linux se situe sur la formation – souvent indispensable – et le support technique.
Performance:
De nombreux tests comparatifs (benchmarks) entre Linux et d’autres systèmes concurrents comme Windows NT on démontré la supériorité de Linux.
Portabilité et adaptabilité:
Linux est aujourd’hui porté sur un très grand nombre de processeurs et d’architectures matérielles, y compris des processeurs de faible puissance, comme le démontre le projet μClinux. Même si le processeur ou l’architecture que vous désirez utiliser ne figurent pas dans la liste des portages actuels, l’énorme base de connaissance disponible facilitera le travail et vous pourrez souvent vous inspirer de travaux déjà réalisés.
La structure modulaire de Linux héritée de l’architecture Unix est également un de ses gros avantages. La structure du système est stricte et clairement définie, et il sera aisé de le configurer de manière à trouver une correspondance exacte avec les besoins requis.
Ouverture:
Linux cohabite facilement avec d'autres OS installés sur la même machine comme Windows, alors que le contraire n'est pas forcément vrai.

Choix matériels pour un système Linux embarqué

 

Le concept du MMU

Linux a été initialement développé sur la base du mécanisme de mémoire protégée du processeur Intel 80386. Ce mécanisme, qui repose sur un composant matériel appelé MMU (Memory Management Unit), permet à un processus de ne jamais écraser l’espace mémoire d’un autre processus. La MMU autorise la conversion entre les adresses physiques – adresses effectivement utilisées dans la machine – et les adresses logiques – adresses vues par le
processus et allouées par le système d’exploitation.
Si un processus tente de sortir par erreur de l’espace mémoire qui lui est accordé, la MMU détecte l’erreur et stoppe le programme en générant une erreur de « violation de segmentation » (segmentation violation ou SIGSEGV). De ce fait, un programme tournant sous Linux dans l’espace dit « utilisateur » – par opposition à l’espace « noyau » – ne peut jamais « planter » le système.
Les versions courantes du noyau Linux sont prévues pour fonctionner sur des processeurs avec MMU, ce qui concerne la majorité des processeurs utilisés dans la micro-informatique classique et aussi dans un bon nombre d’applications embarquées. En revanche, ces processeurs sont en général plus gourmands en ressources matérielles, et certaines applications dites « profondément enfouies » (deeply embedded) ne pourront utiliser que des processeurs dépourvus de MMU.
Il existe bien entendu des systèmes d’exploitation dédiés à ces micro-contrôleurs – μC/OS en est un très bon exemple – mais ceux-ci sont en général bien plus limités que Linux au niveau des protocoles standards et de l’interopérabilité avec le monde extérieur.

μClinux: Linux sans MMU

Un portage du noyau Linux est cependant disponible pour les processeurs dépourvus de MMU : μClinux – pour Micro-C Linux (Linux pour micro-contrôleurs) mais à prononcer You see Linux (http://www.uclinux.org). Le portage est initialement basé sur la version 2.0.38 du noyau Linux mais des versions basées sur les noyaux 2.4 et 2.6 sont également disponibles.
L’API du système est identique au vrai noyau Linux bien que μClinux utilise une libC – bibliothèque de base de programmation – différente de la glibc de la version standard de Linux. La motivation est toujours la même : le gain d’espace, lorsqu’on sait que les versions récentes de la glibc ont une taille largement supérieure au méga-octet. La principale limitation de μClinux par rapport à Linux est l’absence de protection de mémoire entre les processus mais également avec le noyau. De ce fait, une application erronée pourra facilement « planter » le système.

Les system on Chip

A system on a chip or system on chip (SoC or SOC) is an integrated circuit (IC) that integrates all components of a computer or other electronic system into a single chip. It may contain digital, analog, mixed-signal, and often radiofrequency functions—all on a single chip substrate.
A typical application is in the area of embedded systems.

The contrast with a microcontroller is one of degree. Microcontrollers typically have under 100 kB of RAM (often just a few kilobytes) and often really are single-chip-systems, whereas the term SoC is typically used with more powerful processors, capable of running software such as the desktop versions of Windows and Linux, which need external memory chips (flash, RAM) to be useful, and which are used with various external peripherals. In short, for larger systems, the term system on a chip is hyperbole, indicating technical direction more than reality: increasing chip integration to reduce manufacturing costs and to enable smaller systems. Many interesting systems are too complex to fit on just one chip built with a process optimized for just one of the system's tasks.

For instance, the Samsung Galaxy S II has a 1.2 GHz dual core ARM Cortex-A9 processor(équivalent microcontrolleur) that uses Samsung's own 'Exynos 4210' System on a chip (SoC).

###########################################################

Bibliographie
  • Linux embarqué (2e edition - Eyrolles)
  • wikipédia


 
biz.