Welcome!
We hope you find this book useful. If you have bought it along with another Aleph One Product such as the LART development kit, or Aleph ARMLinux, then please take the time to read it so that you know what you have, where to start, how to install, and where to turn if you have problems.
ARMLinux for Developers would not have been possible without the work of many people. We would therefore like to particularly thank:
Jan-Derk Bakker, Eric Mouw, Marc Joosen and Johan Pouwelse of the LART project for LART, blob, help and vision;
Remote 12 Systems of London for LART part sourcing;
Chris Rutter for the GNU Toolchain chapter, the Debian Autobuilder and the http://www.armlinux.org/ facilities;
Brian Bray for the ARM Structured Alignment FAQ;
John G Dorsey for his description of installing ARMLinux on an Intel Assabet;
Russell King for the orginal ARM kernel port, continuing maintainance, and the http://www.arm.linux.org.uk/;
Stephen Harris, George Wright and Nathan Catlow for their Psion documentation;
Phil Blundell for work on and advice about the ARM Toolchain, and work on Debian and Bootfloppies;
Nicolas Pitre for his work on the kernel,and the JFlash utility;
Steve Wiseman for his work on JTAG;
Holly Gates for the JTAG dongle design;
and of course the many others who have worked on Debian ARM, the ARM kernel port and the people whose expertise we have tried to incorporate into this book.
We also acknowledge all Trademarks used in this book.
Although this guide is available in HTML and PDF formats to all users who buy the Aleph ARMLinux CDs, a printed version of the Guide can also be bought separately from Aleph One Limited.
Interested users should go to http://www.aleph1.co.uk/armlinux/thebook.html or <info@aleph1.co.uk> for further details.
This book tries to cover a range of hardware and aspects of ARMLinux. It assumes that you are at least a competent computer user, more likely an experienced developer, but perhaps not very familiar with GNU/Linux or the ARM and its development platforms.
There are many things that are specific to different items of hardware, and many things that are common across various devices. We have tried to avoid too much repetition, but we have also tried to make the text reasonably linear in the hardware chapters. This is inevitably a compromise. In general you should find that reading through the relevant hardware chapter will get you going, but will not go into much depth about why you are doing things and what other options there might be at each stage. We refer to other chapters that have more details on each aspect (using JFlash, patching the kernel, etc) throughout these texts. If you have feedback on the book we'd be very happy to have it, so as to improve future versions - see Chapter 13.
In a fast-moving field like this, this book will always be a work-in-progress. We give the current state of the art at the time of writing, but recognise that this will soon change. Thus we try to provide links to the places online where you can get the latest info. When you find things that are out of date, of just plain wrong, please tell us.
There will be future editions covering more devices and more subject areas. Things that will definately be in the next release are coverage of porting the kernel to a new ARM device, more information for developers using a Windows host PC rather than a Linux one, and more on debugging and simulation techniques.
If you have bought this book as part of our Aleph ARMLinux distribution then be aware that this follows the hallowed GNU/Linux principle of releasing early and often. The distribution is not yet finely tuned to the needs of various embedded devices. It has parts that are specific to small ARM devices, and parts which are generic, but assume a desktop environment. The specific part contains this document, kernels, utiltites and RAMdisks suitable for the devices covered in the book, pre-compiled x86/ARM toolchains, and current kernel source and ARM patches. The generic part form the bulk of the distribution and is essentially the standard Debian ARM distribution, containing a huge array of packages and all the corresponding sources. These are very useful, providing an enormous library of things that you can run on your ARM hardware, but the Debian installer is not yet set up to install to embedded systems. You need to make your own RAMdisks from the parts available to use these binaries. There are several projects underway to make this process easier, including CML2+OS from http://www.emdebian.org/ which is included. Future releases will have significant improvements in this area.
Have fun!
The fundamental requirement for a GNU/Linux system is a kernel and a filing system for it to execute things from.
The kernel is an autonomous piece of code that doesn't need any other files or libraries to get started, although without a root filing system it will simply stop after initialising the system as it no files to operate on.
The filing system can be loaded from a range of different hardware devices (hard disk, RAM, ROM, CD and NFS mount) and must be in a format that the kernel understands. For embedded systems it is often a RAMdisk. The kernel and RAMdisk both need to be loaded to correct places in memory and the kernel executed. This can be done in various ways, typically by loading over a serial connection or from local flash RAM.
In order to be able to load anything from anywhere some kind of bootloader must be present on the target hardware which knows how to load files and execute them. This can be installed in a physical fashion by inserting a pre-programmed ROM/EEPROM or flash chip, but is more usually installed using a JTAG port, which allows instructions to be executed from an external input, and thus an initial program loaded.
As there are so many possible boot scenarios we cannot describe them all in detail. We will describe only the most common (which are the most useful for typical situations) but also make the principles clear so you can do something more exotic if you need to.
Bootloaders are highly system-specific. Some ARM platforms share the same loaders, but on the whole you get a different one on every system. This can be a boot ROM like the NeTTrom in a Netwinder, or it can be the native OS like RISCOS in a RiscPC, or EPOC in a Psion5, or it can be a dedicated bootloader installed into Flash, like Angel or Blob in the LART and Assabet. If you are porting to a new ARM platform then you will need your own bootloader. You may well be able to base this on one of the existing GPLed ones, or you may already have something that can be modified to load ARMLinux instead of whatever the device used before.
When talking about bootloaders it is important to remember that if the target is not autonomous then the loader has two parts:
One part on the target to receive the kernel and RAMdisk; and
another on the host to send it.
There are two bootloaders commonly used with the LART and Assabet: Blob and Angel. Angel is part of ARM's Development toolkit, and can also be used as a debugger, but we use it with a companion program Angelboot instead. Angel is a simple loader that receives a kernel and RAMdisk over the serial port and loads them to specified addresses before running the kernel. Blob is a more complex program that can do the same as Angel but can also install a kernel and RAMdisk permanently in flash RAM so that the target can subsequently boot autonomously.
See Chapter 6 for details of configuring and using these programs. Brief typical use is covered in the install section for the relevant target device.
Getting the target side of the bootloader installed is normally done with the Jflash utility (both Windows and Linux versions exist). This drives the JTAG interface through the printer port of the host PC. The Linux version is called JFlash-linux. Note that this program is different for each target as it depends on knowing the exact hardware of the target, so JFlash-linux for Assabet and JFlash-linux for LART are different and you need to use the right one.
Table of devices and tools
| Device | JTAG | Boot loader(s) |
|---|---|---|
| LART | Jflash,Jflash-linux | Blob |
| Assabet | Jflash,JFlash-linux | Angel, blob |
| Psion5 | - | Arlo |
If the target has sufficient IO devices (eg screen and keyboard) then it can be used without a host. However, during initial development a host is normally used as a console (screen and keyboard), for compiling new code and for monitoring debug output.
There are several reasons why this is practical:
you will probably keep rebooting the target;
it will probably crash a lot if you are doing any low-level development, or the hardware's not quite debugged yet;
there may well not be space for the toolchain software on the target;
you will normally be more familiar with the host environment.
As the host is usually an x86 PC rather than another ARM-based machine this means that you will need to cross-compile software to run on the target processor. You can arrange to use an ARM machine as the host (eg an Acorn Risc PC, Netwinder, CATS board) but even here you usually need to separate the host and target environments as they will probably be using different kernel versions and perhaps library versions.
You can have either a GNU/Linux or a Windows box as the host. As you are working with Linux on the target it is useful in many ways to also have a Linux host - the toolchain is easier to set up, you can easily mount and try out your RAMdisks etc. Much of this book assumes that you have access to a GNU/Linux host. However we recognise that many developers wil have a Windows box on their desks and may not wish or be able to change just yet. The best solution is to the use the Cygnus unix-like environment for Windows which gives you the functionality you need. A chapter for this book, describing the necessary software and techniques, is in preparation for the next edition. In the meantime either use your skill and judgement, or get a GNU/Linux box too.
Getting a cross-compiler toolchain set up used to be very difficult, requiring much gurudom and attention to a host of details but with the precompiled toolchains on this CD it is very easy. Chapter 8 gives details of both the ready built toolchains you can install, and explains how to build a new one should you need something different from that which is provided.
The RAMdisk is a very useful kernel facility that lets you load the files you need on the system into RAM along with the kernel. It take the form of a compressed filesystem. The kernel automatically allocates RAM for it and uncompresses it, then mounts it as the root filing system.
Again, there are many variations possible on this theme, but the conventional setup is to format the RAMdisk as ext2, the normal Linux disk filesystem. For this to work you need to specify the correct kernel options: RAMdisk support (CONFIG_BLK_DEV_RAM, CONFIG_BLK_DEV_RAM_SIZE, CONFIG_BLK_DEV_INITRD) and support for the filesystem used (normally ext2 - CONFIG_EXT2_FS).
There are suitable example RAMdisks provided for the devices covered in this manual on the CD. There are also several available on-line, where developers have made their own available for others to use. We recommend that you use one of these to get started, however for many applications you will need to make your own. It's not difficult, and the process is described in the section called Making a RAMdisk in Chapter 7.
This chapter introduces the reader to the Linux Advanced Radio Terminal (LART) by describing hardware specifications and a range of relevant resources.
The LART is part of a project at the Technical University of Delft to do wearable computer research. The first aspect of this was building a suitable platform as nothing with the right combination of low-power, high-performance and low cost existed at the time. The result is offically the 'Linux Advanced Radio Terminal' but a look at the Canonical Abbreviation/Acronym List suggests this may be a contrived acronym.
Part of the design philosophy was that it could be built without expensive facilities and it was easy to add bits of hardware for your own purposes. This combined with its power/performance ratio makes it an excellent development tool. In practice buying the parts to make them yourself is a time-consuming and difficult process, so Aleph One and Remote12 Systems have made it available as an assembled tested development kit. We hope this document will get you going in LART/ARMLinux development quickly and reasonably painlessly.
Many users of this chapter will have bought the Aleph One LART development kit. If you haven't, the information here will still be useful but references to the supplied connectors and cables will need to be adjusted to whatever equipment you are using. The Aleph One kit comprises:
LART main board with blob bootloader installed;
This Guide to ARMLinux for Developers book on paper and CD ROM;
Aleph ARMLinux distribution for LART including suitable kernels, RAMdisks and tools for the LART, as well as all the Debian 2.2release2 packages in binary and source form on 5 CDs;
JTAG adaptor board;
Parallel extension cable;
Twin-headed serial cable;
Power cable.
This is everything you need to get going (apart from a host machine); we hope you enjoy developing on it.
(We no longer sell LART kits, but you may be interested in our Balloon Board Development Kit.)
The specifications for the LART mainboard are as follows:
220 MHz Digital SA-1100 StrongARM CPU;
32 MB EDO RAM;
4 MB Intel Fast boot block Flash memory;
power usage of less than 1W;
performance in excess of 200 MIPS.
The board can run standalone, booting an OS from Flash.
The 4MB Flash is sufficient for a:
bootloader;
compressed kernel;
compressed RAMdisk.
The LART accepts an input voltage of between 3.5 and 10 Volts, although it can be modified to accept up to 16V. The on-board DC-DC converters have an efficiency of between 90 and 95%.
Almost all signals from the SA-1100 are available on the external connectors.
The High-speed Connector is an SMD with 0.8mm pitch and offers:
access to the 32-bit data bus;
access to all 26 address lines;
high-speed peripherals with a data rate in excess of 400 MB/second.
The Low-speed Connector is actually three separate through-hole connectors with a 2mm pitch which:
export General Purpose (GP) I/O pins and most of the data/address buses to implement ISA or PCMCIA-based peripherals;
are ideal for connecting to low-speed devices.
Additional connectors include a:
reset connector;
voltage/current measurement point;
power connector;
JTAG connector.
The Kitchen Sink Board (KSB) provides the LART with a:
stereo 16-bit 44k1 audio output at line and headphone levels;
44-pin 2mm IDE/ATA interface;
connector for a single or quad Ethernet board;
two PS/2 connectors for keyboard and mouse;
mono audio I/O from an UCB1200;
connectors for POTS, IrDA, USB clients, video and touchscreens.
The Ethernet is a 10Base-T adaptor that connects through the Kitchen Sink Board.
The core of the board is a Crystal CS8900A Ethernet chip with :
facilities for a bootROM;
an 8-bit parallel output port.
Refer to the diagram and picture to familiarise yourself with the device. The view showing the StrongARM CPU and large inductors is the 'top' of the board throughout this document.
Power is supplied to the four pin connector in the top right. The supplied power lead is wired such that it doesn't matter which way round you plug it in - polarity will be correct. (The two central pins are +ve, the two outer -ve). The red LED next to the crystals in the lower left hand corner should glow when power is applied. At 5V, initial start-up current for a lone LART is ~160mA, dropping to ~80mA after a few seconds. Note that the supply voltage is between 4V and 10V. Some documents (including the LART website at the time of writing) give an upper limit of 16V but this will damage your LART! The LT1266 can take 20V nominal, but the design uses voltage doubling so the input voltage must remain below 10V unless the PSU is changed around (which can be quite easily done)
The serial connection is the 2x3 header. This supplies two simple serial ports (ground, data out, data in). The supplied cable should be plugged in so that the lip on the blue 2x3 connector points downwards. The white 9-pin-D connector is serial port 1; the blue 9-pin-D connector is serial port 2. Plug the white connector into your host computer.
If you need to re-flash the blob loader then you need to attach the JTAG dongle to the 1x8 header. The JTAG board should be attached so that the components on it are on top - i.e. components are on the same side as the StrongARM CPU on the LART.
It is possible to program flash memory through the SA-1100 JTAG interface. A utility to do this is provided. Aleph One supplied LARTs will already have had this done so you can skip to the next section.
In order to use the JTAG programmer, take the following steps:
connect the parallel cable to your computer's printer port;
connect the JTAG dongle to the cable;
connect the other end of the JTAG dongle to the LART, with the JTAG component side the same way up as the LART main board;
turn the LART on.
You can then issue the following command as root:
./Jflash-linux blob-1.0.7b
and you should see something like the following after which the LART will reset itself before running blob.
using printer port at 378 |
Output like this is typical of the 'JTAG reset problem':
error, failed to read device ID |
This is solved by putting a 100 OHM resistor between pins 6 (+3.3V) and 7 (nTRST) on the JTAG connector. nTRST will thereby be pulled to +3.3V so the JTAG bus won't be able to reset itself. This modification is already done on Aleph One supplied JTAG boards as they don't work without it. You can make other modifications to have the same effect (eg connect the JTAG reset pin to the MAX811 reset chip on the LART).
The only means of communicating with a bare LART is via its serial port. You should run a suitable piece of terminal software on your host. For a GNU/Linux host we recommend Minicom, which is very capable and easy to use.
In order to configure Minicom, take the following steps:
Run it with minicom -o to get to setup.
Set it to VT102, serial port ttyS0 (or ttyS1 if you are using that port) 9600baud 8N1 (8 data bits, No parity, 1 stop bit), no modem init string, no hardware handshaking.
Save that as lart config. Running Minicom as minicom lart will run it up with these options.
If you don't use Minicom for anything else then you can make these settings the overall default - Minicom calls it dfl - settings.
If you aren't sure which serial port you are using for the device, but your mouse or modem is in the other one then look at these thing to determine where the mouse or modem are plugged in:
/etc/gpm.conf will show what device gpm is using as your mouse
ls -l /dev/mouse is normally a link to the serial port your mouse is plugged into if you have a serial mouse
ls -l /dev/modem will give the same info for your modem.
If you don't have anything in either port then just try both with the following boot proceedure.
OK, now we're ready to go.
The reset pins are at the bottom left of the board, and a jumper is supplied to do a reset. The board will remain in reset as long as the two pins are connected. You may wish to attach a switch to these pins if you are resetting a lot!
On reset you should then see (from within your serial monitor) something like:
Consider yourself LARTed! |
Note: It always says Loading kernel/ramdisk whether or not a kernel and RAMdisk are actually present. It will just hang if it tries to boot a 'blank' kernel.
Blob version 1.0.8-pre2, |
Now press Enter within 10 seconds, otherwise it will go on to try and boot a kernel it doesn't yet have and will just hang. This should get you a blob prompt:
Autoboot aborted |
There are several pre-compiled kernels available on the CD and on-line. When you want to compile your own refer to the section called Compiling a Kernel in Chapter 7. The correct default config setting for LART is: make lart_config.
In order to upload kernels via the serial port to blob you need to put them in the correct format. Blob expects uucoded files. uuencode's syntax is:
uuencode {input filename} {name in uucoded file}>
output filename
so you uucode a kernel called zImage-2.4.1-rmk1-np2 like this:
uuencode zImage-2.4.1-rmk1-np2 zImage > zImage-2.4.1-rmk1-np2.uu
At the blob prompt enter 'download kernel' to upload a kernel. Blob will respond with:
Switching to 115200 baud |
Switch to 115200 like it tells you (otherwise the upload would take hours). If using Minicom this is done by ALT-O, select 'Serial port setup', then E for 'Bps/Par/Bits', I for '115200'. Then Enter,Enter,Escape to get back to the prompt.
You ought to be able to use Minicom's 'ASCII upload' at this stage, but it doesn't seem to work reliably with no flow control, so we recommend you use a second virtual terminal and do:
cat zImage-2.4.1-rmk1-np2.uu > /dev/ttyS0
which simply copies the uucoded kernel to your serial port. Switch back the Minicom virtual termainl and you should see a line of dots printed as the kernel loads.Once the upload is complete blob will print something like:
(Please switch your terminal back to 9600 baud) |
Switch your terminal back as directed and hit return to get a blob prompt. You can check the size of the uploaded kernel by typing 'status'.
Now you need to do the same proceedure again to upload a RAMdisk. The only difference is that the blob command is 'download ramdisk' instead, and obviously you use the filename for the (uucoded) RAMdisk.
Blob has the facility to save uploaded kernels and RAMdisks into its flash RAM. However at the time of writing it is not capable of writing to the flash it is itself running from so this function only works if you have a separate bit of flash memory containing blob to plug in. It needs modifying to be able to copy itself to SRAM first and then execute from there.
There are several kernels and RAMdisks supplied on the CD, and these will be updated along with the releases. We have found that a good set of software to use at the time of writing is: blob v1.0.7b, zImage-2.4.0-rmk5-np2, and either ramdisk-lart-glibc-2.1.2.gz (for a basic RAMdisk), or ramdisk-2.4.0-rmk5-np2.gz for a bigger one including an mp3 file (which needs a KSB to play).
So finally we are ready to go. At the blob prompt enter 'boot'. It says
Starting kernel... |
Uncompressing Linux........ |
A number of useful schematics for the mainboard, kitchen sink, ethernet board and JTAG programmer are available in PDF format on the CD and from the LART website. On the CD they are all in LART/Hardware/ and only the schematics for the version of hardware in production are present. If you want to see the older schematics then you'll need to go to the website.
Mainboard
CD: /hardware/LART/Lart-rev-4.pdf.
Web: Lart-rev-4.pdf.
Kitchen Sink Board (KSB)
Ethernet Board
JTAG
This chapter describes how to get your Assabet running ARMLinux.
The Assabet is an SA-1110 evaluation board which may be repackaged as a PDA. Notable features include:
The availability of programming utilities like the JTAG Programming Software V0.3 (for Windows) and Jflash-Linux (for Linux), and the bootloader Angelboot.
Neponset - a SA-1111 Development module with many additional interfaces.
Use of the 2.4 kernel series with support for the Assabet and Neponset via a patch chain.
The capacity to run MicroWindows although a backlight power source needs to be added on 'build phase 4' or earlier boards.
There is also support for Compact Flash on the Assabet and on PCMCIA support for the Neponset. In addition, the Socket LP-E CF + Card is now operative as is the IBM Microdrive.
Note: The behaviour of the hardware, bootloader and kernel can vary because of the presence of Neponset - the Microprocessor Development Module. Readers who intend to use Neponset with Assabet should therefore refer to the section called Install Neponset.
Carefully remove the Li-ion battery and LCD/touchscreen by releasing the fasteners on the board receptacles.
On Assabet (and Neponset), the bootloader can be installed by physically inserting the pre-programmed flash chips supplied with the kit.
Determine whether the board has a WindowsCE bootloader pre-installed by opening the StrataFlash sockets and examining the labels on each memory component. For precise details of the process of manipulating memories, refer to The Intel StrongARM SA-1110 Microprocessor Development Board Users' Guide section 2.3. (See the section called Useful Resources for the appropriate URL).
Remove all power from the board and remove the jumper from the master power clip if it is installed (this disconnects the battery power). Open Socket E11 (StrataFlash) by sliding the middle panel away from the notch before lifting the doors. Socket E12 can also be opened in a similar way. (E12 is directly opposite to E11 on the other side of the board).
The WindowsCE parts have a label which is similar to "WinCE E-Boot V3.0 L". Remove these parts with the suction part selector (similar to a pen supplied within a tube) and replace them with the parts which are labelled "Angel DB1110B 207D L".
Power, JTAG, RS232 and POTS connections are made through base station - a 14-pin header. Connect the serial cable to your development workstation which - on a SA-1110 - means that the header should be attached to serial port 1.
LED D4 should light up when the power is applied. Angel will then activate LED D8. After interrupt initialisation, Angel will strobe LED D9 four times. Supplementary information on the reset sequence can be obtained from DB1110_diag.txt which is bundled with Angel (http://developer.intel.com/design/strong/swsup/SA1110AngelKit.htm).
It is possible to attach the SA-1111 Development Module by using either of the 140-pin connectors which are found on the Assabet.
Make a record of the switchpack SW2 settings because these affect selection, bus speed and other important parameters. A comprehensive explanation of switch meanings can be found in the readme.txt which is included in the Angel distribution although a summary of switch meanings is provided in the following table.
Table 4-1. Switch Options for Switchpack SW2
| switch | off | on |
|---|---|---|
| SW2-1 | reserved | reserved |
| SW2-2 | reserved | reserved |
| SW2-3 | debug port is UART3 | debug port is UART1b (on Neponset) |
| SW2-4 | bus speed is 103MHz | bus speed is 51MHz (clamped to 51MHz if PLL==147MHz) |
| SW2-5 | flash device page mode enabled | flash device page mode disabled |
| SW2-6 | Angel fast boot mode | Angel debug mode (see DB1110_diag.txt) |
| SW2-7 | PLL==206MHz | PLL==147MHz |
| SW2-8 | boot from flash on Neponset | boot from flash on Assabet |
Note: All switches can be left in the off position except for the SW2-8 which can be left on.
Some copies of Neponset may contain a bug involving the on-board Philips UDA1341 audio codec. The bug involves the L3 MODE signal coming from the SA-1111 which is available from PWM1 - the dual-function pin. Phase 4 Neponset boards incorrectly route this signal to PWMO which prevents any configuration of the codec from software. However, this problem may be solved by unsoldering the jumper wire at J7 and moving it immediately adjacent to J4.
We recommend that you install the emdebian cross-development environment supplied. See the section called Emdebian in Chapter 8.
There are several pre-compiled kernels available on the CD and on-line. When you want to compile your own refer to the section called Compiling a Kernel in Chapter 7. The correct default config setting for Assabet is: make assabet_config, and if you are using Assabet and Neponset together than it is make neponset_config.
Power it up and connect to the serial port.
Get the Angelboot code. The precompiled version should work but you will need to be root.
Copy dot.angelrc and angelboot from Assabet/tools/angelboot on the CD your development directory and rename dot.angelrc to .angelrc. Then .angelrc becomes classified as a hidden file so your filer may hide it from you. You will however, need to edit .angelrc so that it has the following settings:
base 0xc0008000 |
Note: You should change device /dev/ttyS1 if your cable is plugged into ttyS0.
In order to configure Minicom, take the following steps:
Run it with minicom -o to get to setup.
Set it to VT102, serial port ttyS1 (matching the .angelrc file) 9600baud 8N1 (8 data bits, no parity, 1 stop bit), no modem init string, no hardware handshaking.
Save that as assabet config. Running Minicom as minicom assabet will run it up with these options.
If you don't use Minicom for anything else then you can make these settings the overall default - Minicom calls it dfl - settings.
OK. Now we are ready to go. Make sure the Assabet is powered, reset, that you have the 4 flashes on the orange LED and that the serial port is connected. Run:
./angelboot
This will read the config from .angelrc before uploading the kernel and RAMdisk images. You should see the upload indicated, followed by several lines of stars during the kernel upload, then dots during the RAMdisk upload. See the section called Angel and Angelboot in Chapter 6 for more details on how angelboot is configured.
If everything works OK you should see a penguin and a login prompt on the touchscreen which will disappear after a few minutes. Hitting Return in Minicom (start it if it hasn't already with minicom assabet) should get you to a root prompt from where you can login as root. You will not need a password.
daa-daa!
If your angelboot copy in strataflash becomes corrupt for any reason you can put angelboot back again by using the JTAG interface.
To use the JTAG interface, you will need:
To connect the custom 14-pin connector on the JTAG/serial/phone cable to the Assabet.
To connect the JTAG part (25-pin D connector) of the JTAG/serial/phone cable to your parallel port. Nothing else should be using the parallel port at the same time and you will need to be root as well.
To connect the power supply to the Assabet and power it up.
The Jflash-linux code (or Jflash - the Windows version). The pre-compiled binary suplied on the CD in Assabet/tools/Jflash/should work OK.
The binary of the bootloader which you will be putting in flash. Angel.bin is supplied with the Jflash distro.
To place the bootloader in flash, type:
./Jflash-linux angel.bin
When this process has finished, reset the Assabet and the LEDs should show everything is working OK.
A selection of useful RAMdisks is provided on the CD in Assabet/RAMdisks. These are the files that you upload using the 'otherfiles' entry in Angelboot.
See the section called Making a RAMdisk in Chapter 7 for details of making your own.
Using the ramdisk_ks RAMdisk it is possible to play a sound by issuing the following command:
cp <file> /dev/dsp
Where file is 44kHz stereo WAV file. Well, you can play any file you like this way, but it'll sound horrid if it's not a WAV file.
For PCMCIA to work you need kernel PCMCIA support compiled in and the cardmgr daemon in the RAMdisk and running. This is included on ramdisk_ks (2.5MB - expands to 6.8MB) which is on the CD. Use this RAMdisk if you want to use the CF slot on the Assabet.
To get a cf disk recognised, simply plug it in. You can then check it with the cat /proc/bus/pcmcia/00/stat command.
The disk can then be mounted in the following manner:
mount /dev/hda1 /mnt
Note: If you just pull disks out then things can get rather broken (and you may have to reset). You therefore need to umount the disk first.
You need to configure the card for your network environment in /etc/pcmcia/network.opts. You can then fill in IP and gateway details or simply use DHCP if it is available. Then, when you plug in the card, the eth0 interface is automatically created and the script is run to ifconfig the device. If you fill in an NFS mount in etc/fstab and specify the mount option in /etc/pcmcia/network.opts, the NFS mount is automatically done when you plug the card in and suddenly the network is available to you, making development and testing much easier.
It is possible to copy things off the CF disk in a situation where they won't fit onto the RAMdisk.
You can use the rest of the RAM (if some is free) by doing:
mke2fs /dev/ram1 (creates an ext2 filing system in ram)
mkdir /mnt/ram
mount /dev/ram1 /mnt/ram (mounts the ramdisk)
This defaults to creating an 8MB RAMdisk. Now you have 8Mb of 'disk' available to copy things into which will remain until you power down. You can just copy things out of /dev/hda1/<path>/<file> to /mnt/ram/<file> up to the size of the new RAMdisk.
Additional information can be obtained from:
The Intel StrongARM SA-1110 Microprocessor Development Board Users' Guide (http://developer.intel.com/design/strong/guides/278278.htm).
The Intel StrongARM SA-1110 Microprocessor Developers' Manual (http://developer.intel.com/design/strong/manuals/278278.htm).
The Institute for Complex Engineering (ICES) Technical Report (http://www.ices.edu).
This chapter describes how to install ARMLinux on your Psion 5 or Geofox One.
The Linux7k project is an effort to port the widely used Linux kernel to the Psion Series 5 and later pocket computers.
So far the team has ported the Linux 2.2.1 Kernel to the Series 5 and Geofox One and created Arlo and several initial RAMdisks (initrd) for the project. Work then stalled for a while as Psion were slow to release hardware information for later machines, but is now progressing again with the 2.4.1 kernel now booting on a Series 5mx.
Specs
4 or 8MBs.
CL-PS7110 ARM Processor 18 MHz.
640x240 (Half-VGA).
Monochrome Touch-Screen (16 shades).
Compact Flash™ (CF) Disks.
EPOC32 1.00 or 1.01.
Bootloader - The bootloader, Arlo does for EPOC what Loadlin does for DOS. It releases the memory from EPOC, places the kernel and initrd in the appropriate places in memory, and then boots the Linux kernel.
Kernel - The kernel has patches applied to it, which makes it compile for ARM based systems as well as having a few more patches for the Psion Hardware. The kernel port to the Series 5 is basically finished now.
Initrd - This is a virtual filing system image, which contains a miniature version of Linux. These can range in size but the more RAM used for the RAMdisk will leave less for the operating system. The kernel loads these images as the root partition.
You will need:
A backup of your Psion's disks (this is very important as everything in your C: drive will be lost; your D: drive should escape, but don't count on it.
The Psion installer;
Arlo for your model of Psion (5 or 5mx);
A glued kernel image;
A compressed initrd;
A paperclip or similar, thin, blunt item (to reboot your machine).
The easiest way to get the files onto your Psion is to use the transfer software for your host machine. This is PsiWin for Windows, Plp tools for GNU/Linux and PsiFS for RISCOS. Use this to transfer the necessary files onto the Psion's RAMdisk or CF through EPOC. For example, to copy the arlo.sis file onto the Psion's C: drive (RAMdisk) using plptools you type the following command:
rfsv write arlo.sis c:/arlo.sis
You need to install Arlo (the bootloader - equivalent to LILO) onto your Psion. To do this, extract arlo-0.51.tgz and copy the Arlo.sis file to your Psion, then copy INSTEXE.EXE and run it. This should change the icon for Arlo.sis which you can then run and it will install itself to either C: or D: as you select - it will work fine from either. You need to reinstall it each time you boot Linux. If you install it to a CF disk, you won't have to re-install each time - the section called Creating a Filesystem on your Compact Flash
You need a kernel for this project. I would recommend trying one of Werner's precompiled ones. A good one to try is stable-221-cb23-519-psi.gz.
Next, uncompress the glued kernel image with:
gunzip <glued image name>
and copy the glued-* and initrd-*.gz files to C:\ on the Psion as image and initrd.gz.
At this stage you are ready to boot into Linux. Double check you have good backups of your Psion and then double-click Arlo.exe. You will see:
Loading logical device Opening the channel Commands are: ... Option buffer at address XXX Memory description at address YYY > _
Now type:
l image
and you should see:
Opening file image Succeeded File size XXX Loading XXX bytes to address YYY Read XXX bytes No pages = ZZZ > _
Now type:
l initrd.gz
and you should see:
Opening file initrd.gz Succeeded File size XXX Loading XXX bytes to address YYY Read XXX bytes No pages = ZZZ > _
If you need to pass any other parameters into the kernel at this point (for example an alternative root filesystem) you need to type:
o root=/dev/hda2
A full description of kernel parameters can be found in /usr/src/linux/Documentation/kernel-parameters.txt.
Now type:
b
Your Psion should now boot into Linux!
If it does a double bleep and then puts up the EPOC logo, something has gone wrong. Try reinstalling Arlo (from the Arlo.sis and INSTEXE.EXE files).
Good question. Start by mounting /proc, it's satisfying and actually useful.
Type:
mount -t proc /proc /proc
You can then ls /proc if you want, good, eh?
You can also mount CF disks with:
mount -t msdos /dev/hda1 /mnt
You will get some errors when you first mount the disk and long filenames will produce errors when they are ls'd.
If you are feeling brave you could:
dmesg > /mnt/dmesg.txt
But you run a greater risk of trashing your CF disk.
If you want to boot your system off a CF disk, you need to repartition it. You will need a reasonably sized CF though (over 16MB).
First, you boot into initrds3.gz with a kernel that supports CF disks. When this has booted up, you need to execute fdisk /dev/hda. You can then repartition your system. Ideally you should make a 4-6MB Fat16 partition as /dev/hda1, and then assigning the rest for Linux (/dev/hda2). When you have done this, boot into EPOC and format the CF. Install Arlo, a kernel and an initrd in the root of this partition. Now you don't have to re-install Arlo every time you reboot.
To boot a CF based system, you need to pass the appropriate option into the kernel (see the section called Passing Additional Parameters into the Kernel), alternatively, you will need to use the rdev command to alter the flags in your homebrew kernel before you glue it.
To automatically boot Arlo (or in fact any EPOC program) you must create a \system\data\wsini.ini file on your CF FAT partition; it should contain the following line:
STARTUP d:\arlo.exe
This presumes you have the Arlo executable on the D: drive (compact flash) and the associated Arlo.
Type:
sync
sync
sync
Close the machine.
On the Psion:
Open the battery backup door and locate the small copper coloured circle near the battery, using a partly unfolded paperclip or similar, gently press in the copper coloured circle. Now close the backup battery door, and, while holding down both shift keys press the Esc/on key. The machine should bleep once and then display the Psion 5 splash screen, after a delay you will be back in the EPOC system.
On the Geofox: (info supplied by Hennie Strydom).
It is mostly identical to the Series 5, with the single exception that the reset switch is next to the speaker on the bottom of the Geofox.
You will need a cross compilation environment if you want to compile your own kernels, or if you want to compile your own applications for the system. To set it up, you will need the xdev package which is provided at http://linux-7110.sourceforge.net/. Uncompress this file in the / directory of your desktop Linux system. You then need to set your PATH to include /scratch/psion/xdev/bin. Check the xdev-0.README for full details.
Alternatively, you can create your own kernel, using the cross compilation environment described earlier. To compile a custom kernel, you will need to download the following files:
linux-2_2_1.tar.gz
patch-2_2_1-rmk2.gz
linux-2_2_2-philb-990208.gz
crash+burn-26_patch.gz
Assuming that you have downloaded these and copied them to $HOME/Linux7k, execute the following commands:
cd $HOME/Linux7k
gunzip linux-2_2_1.tar.gz
tar -xvf linux-2_2_1.tar
zcat patch-2_2_1-rmk2.gz | patch -p0
zcat linux-2_2_1-philb.gz | patch -p0
cd linux
zcat ../crash+burn-26_patch.gz | patch -p1
These commands have now patched the Linux kernel for use with the Psion Series 5.
You must now configure and compile the kernel. To configure it, execute:
make xconfig
Or, if you don't have X Windows, execute:
make menuconfig
When you have done this, execute this command to make the kernel:
make Image
This command will create a kernel image in arch/arm/boot/Image.
You must now glue the kernel, so that it can boot on the Psion. This basically adds the ARM bootstrap code onto the front of the kernel. To do this, execute the following commands:
cd ../
gunzip boot-13.tar.gz
tar -xvf boot-13.tar.gz
cd boot
make ./glue.pl ../linux/arch/arm/boot/Image > ../kernel_image
These commands will now make a glued kernel image in $HOME/Linux7k/kernel_image. You may now use this kernel image as your kernel.
There is a GDB stub available from the sourceforge ftp site written by Noel Cragg. The README details all you need to know.
To simulate the Psion 5 on your desktop with full debugging capability you can use the http://staticip.cx/~benw/linux7k by Ben Williamson, cool bit of kit.
The following web sites hold information about the linux-7110 project:
To be completed...
The <linux-7110-request@redhat.com> mailing list for information on how the project is progressing. To subscribe, write subscribe in the subject area of your email.
This is the easiest program to transfer files from your Linux desktop to the Psion, pretty much plug-n-play.
Included in the Arlo-0.51 distribution.
The Boot Loader Object (Blob) allows the user to:
initialise the hardware (CPU speed, memory, interrupts, RS232);
boot a Linux kernel and provide that kernel with a RAMdisk;
download a kernel or a RAMdisk to the target device;
write a freshly downloaded kernel or RAMdisk to the flash memory (see below for limitations).
Blob was originally written for the LART by Jan-Derk Bakker and Erik Mouw, but has also been modified to work on the Assabet by Jeff Sutherland and Chester and on the Intel Brutus SA-1100 evaluation platform by Erik Mouw, and on the PLEB Linux board by Adam Wiggins. You need to compile the correct version for the hardware you want to use it with as the hardware varies in important ways (processor, memory type and layout, debug serial port).
Assuming that you have already installed Blob then this is how you should use it. If you need to install the boot loader for your device read the chapter on that device or Chapter 2 for details.
connect a terminal (or a terminal emulator like miniterm or Seyon) to the target device's serial port;
use the appropriate settings for your device: usually 9600 8N1 or 115200 8N1; on the LART there is no hardware flow control so you'll need to turn that off too;
use the appropriate terminal emulation, usually VT100;
switch the target device on.
You should then see something like (this example is from a LART):
Consider yourself LARTed! |
Note that it always says Loading kernel/ramdisk whether or not a kernel and RAMdisk are actually present. It will just hang if it tries to boot a 'blank' kernel.
Blob version 1.0.8-pre2, |
If you didn't press Enter within 10 seconds, Blob will automatically start the Linux kernel:
Starting kernel ... |
However, if you press Enter, you will see the Blob prompt:
Autoboot aborted |
Blob comes with a selection of useful commands. Type help for a list or refer to Table 6-1.
Table 6-1. Blob Commands
| Command with Options | Explanation |
|---|---|
| boot [kernel options] | Boot Linux with kernel options |
| clock PPCR MDCNFG MDCAS0 MDCAS1 MDCAS2 | Experimental speed setting option - USE WITH CARE! |
| download {kernel|ramdisk} | Download kernel or RAMdisk image to RAM |
| flash {kernel|ramdisk} | Copy kernel or RAMdisk from RAM to flash |
| help | Get this help |
| reload {kernel|ramdisk} | Reload kernel or RAMdisk from flash to RAM |
| reset | Reset terminal |
| speed | Set download speed |
| status | Display current status |
Note that two versions of pre-compiled Blobs are provided on the CD and the LART website so most people will not need to compile Blob until you want to modify it or perhaps get a newer version. Should you need to, here are the details. First you need a suitable GNU toolchain:
A native ARM/StrongARM Linux system with gcc 2.95.2, and binutils 2.9.5.0.22 or better
Or any UNIX system with cross compiling binutils 2.9.5.0.22 (or better) and gcc 2.95.2 installed
GNU make (although some vendor supplied make utilities will do)
Next you need to get the software, then configure and compile it. The lastest version available at the time of writing is blob 1.0.8-pre2.tar.gz which is on the CD in /tools/blob/
This example assumes you will unpack it in /usr/src
cd /usr/src
tar -xzvf /cdrom/tools/blob/blob 1.0.8-pre2.tar.gz
cd blob-1.0.8-pre2
Now you need to specify the board for which you want to compile it, and whether you are cross-compiling or not, i.e. if you are compiling on a PC rather than a native ARM machine. There are currently four valid board names, choose from: 'assabet', 'brutus', 'lart', or 'pleb'. If the board name is omitted, lart will be choosen as a default. If you are modifying Blob itself then you should turn on the --enable-maintainer-mode flag. This will automatically regenerate Makefiles and configure scripts if you change the source files. You need autoconf (>= 2.13) and automake (>= 1.4) installed for this feature.
export CC=/path/to/cross/gcc
export OBJCOPY=/path/to/cross/objcopy
./configure --with-linux-prefix=/path/to/armlinux/source --with-board=boardname
So on our example host machine the correct runes are as follows (this machine needs to be told the host type, otherwise configure complains):
export CC=arm-linux-gcc
export OBJCOPY=arm-linux-objcopy
./configure --with-linux-prefix=/usr/src/arm-linux/linux/ --with-board=lart --host=i386
If things have worked you should get confirmation text like this:
Target board lart |
For a native ARM machine it's much simpler - all you should need is this:
./configure --with-board=lart
So, now you just make Blob with:
make
This will result in a blob-elf32 which is the full executable with headers and a stripped binary blob in the blob-1.0.8-pre2/src/ directory. The much smaller blob is the one you actually upload. blob-elf32 is useful for examining the code produced. The best way to upload Blob to you device is using the appropriate version of JFlash-linux.
In addition to the Blob-related resources which are available on our CD, you can find:
the Blob source and pre-compiled binaries http://www.lart.tudelft.nl/lartware/blob and on the CD.
Uploading can be achieved via the JTAG port using software such a Jflash and Jflash-linux. Usage for Windows or GNU/Linux host is essentially identical. The examples given here use GNU/Linux syntax.
In order to use the JTAG programmer, you need to connect the parallel port of your computer to the JTAG port of the device you want to program. The details of this vary from device to device - see the relevant install chapter. Ensure the device is powered up. Jflash and Jflash-linux both autosense for available parallel ports so it shouldn't matter where you plug it in.
You can then issue the following command as root:
./Jflash-linux blob-1.0.7b
and you should see something like the following (this example is using the blob-1.08-pre2 binary on the CD on a LART). After uploading the device will reset itself before running Blob.
using printer port at 378 |
Note: If something is wrong you will see error messages like the following:
error, failed to read device ID |
or
error, failed to read device ID |
or
error, failed to read device ID |
There are a number of possible causes. If you get all 1's then you maybe using the wrong parallel port, or the cable or dongle is not plugged in, or the device is not powered up. If you get all zeros then you may be using the wrong version of JFlash-linux, or (on a LART) you may be suffering from the 'JTAG reset problem', see the section called LART JTAG reset problem in Chapter 3. If you get random numbers some of the time and zeros the rest of the time then you are almost certainly using the wrong version of JFlash-linux.
Angel and Angelboot together make a simple but effective boot loader that can upload a kernel and RAMdisk to a target device from a host then run them. Angel is the code that lives on the device that gets started on boot and Angelboot is the program that runs on the host and manages the upload. Angel is in fact part of the ARM SDT and can be used as a debugger in that environment. Angelboot allows it to be used outside this environment.
The Windows Jflash code 'SA-1110 Development Board, JTAG Programming Software v0.3' to give it its full title, can be downloaded from: http://developer.intel.com/design/strong/swsup/SA1110Jflash.htm whilst Jflash-linux is obtainable from: ftp://ftp.netwinder.org/users/n/nico/SA1110Jflash.tgz.
Copy dot.angelrc and Angelboot from the CD to your development directory and rename dot.angelrc to .angelrc. .angelrc is now classified as a hidden file so your filer may hide it from you. You will however, need to edit .angelrc to match your device. so that it has the following settings:
This is an example for an Assabet board
base 0xc0008000 |
The meaning of these settings is as follows:
The base address is the address in target memory that the kernel is loaded to. The file loaded is zImage in the current directory;
entry is the address in target memory that gets jumped to when the loading is complete. For the kernel this is normally the same as the load address;
r0 is what will be in register r0 when the kernel is started - this is normally zero;
r1 is what will be in register r1 when the kernel is started - this is normally the architecture number for the device;
device is the device to use for the upload - normally a serial port such as /dev/ttyS0;
options are the serial port settings to use after the upload is complete - these should match your minicom settings;
baud is the serial speed to use for the upload;
otherfile is the name of a second file to upload - normally the RAMdisk;
otherbase is the address in target memory that otherfile is loaded to;
exec allows a command to be executed once the upload is completed - normally starting your serial communication program.
Make sure your device is ready and that the serial port is connected. Run:
./angelboot
Angelboot will run using the config in .angelrc. You should see the following:
Initialising execution environment. |
Downloading other image size 0x26935d to 0xc0800000 |
Obvisouly the sizes and number of lines of dots and stars vary with the size of the uploaded images and the target addresses are what you specify in .angelrc.
The device should now be running, booting the kernel and using the RAMdisk as the root filing system. If you specified an exec line to run your serial program then it will start and show you the kernel boot info and login prompt.
This is the process of modifying a set of files with a 'patch' file containing a list of differences between two sets of files. This is how changes to source code are normally distributed. Patch files are generated by the diff command. You need at least version 2.5 of patch for patching the kernel. Here we use patching the binutils source as an example.
A patch is normally downloaded as a gzipped patch file (denoted by it ending in .gz). If so, gunzip it:
gunzip binutils-patch.gz
You can now patch binutils. Go into your unpacked binutils source directory, and run patch with your downloaded patch file, with argument -p1:
cd /usr/src/binutils-version
patch -p1 < binutils-patch
If you aren't sure exactly how a patch should be applied then the --dry-run option is very useful. Adding this means that patch will do its work, giving all the usual output but no changes are made to the files. To check out the effects of the above patch command, for example, you do:
patch -p1 --dry-run < binutils-patch
You should see a plethora of messages like:
Hunk #1 succeeded at 112
After patching has finished, you can check whether things have worked by searching for files ending in .rej (rejected patches):
% find . -name '*.rej'
In theory, there should be none of these files; all of the patches should have succeeded. However, if there are one or two failed files, it doesn't necessarily mean it won't build especially if the failed files are documentation or have names like README or endings like .info or .texi.
If you have several of these files, however, it could indicate something seriously wrong, and that it won't build. Check that the version of the source the patch is intended to be applied to matches the version of code you have. Also sometimes patches are 'reversed' - i.e. they have the original and modified source version the wrong way round in the diff command that generated the patches. Patch is smart and if it looks like this is the case it will offer to do them all 'backwards' for you.
The -p1 in the above example refers to how many directory '/' separators patch should strip off the filenames before patching. This is to allow for differences in the depth of nesting between the source tree the patch was created on and the one it is being applied to. Normally you will find that -p1 or -p0 is correct. If a patch doesn't seem to work then looking at the depth of filename nesting in it and using a different -p option is the first thing to try.
Once you understand how this works you can save some commands by combining the unzipping and patching commands into one line like this:
zcat binutils-patch.gz | patch -p1
or, if the patch you have is bzipped instead of gzipped, then do:
bzcat binutils-patch.bz2 | patch -p1
To compile your own kernel you need the source and the right set of patches. For all cases you need the base source tree and the ARM kernel patch. The SA1100 patches are usually a good idea too, and are necessary for SA1100 or later processors. For some devices, especially newly-supported ones, you may need a further patch for that device.
Kernel Source
linux-2.4.1-tar.bz2
or linux-2.4.1-tar.gz
patch-2.4.1-rmk1.gz
diff-2.4.0-rmk1-np2.gz
Each applied patch adds a suffix to the kernel name, so a kernel made with the 2.4.1 source with the rmk1 ARM kernel patch and the np2 SA1100 patch would be called zImage-2.4.1-rmk1-np2. The letters indicate the patch source. In the above cases they are the names of the patch maintainers Russell King and Nico Pitre respectively. Note that although they use different naming conventions, both patch files are of the same type.
The kernel source is normally available in both gzipped and bzip2 form. The latter is significantly smaller so that is normally the better one to download. You will need the bzip2 utility to decompress bzip2 files.
All these are on the CD but you will need to copy them into your development directory. Alternatively, obtain the latest version of kernel base, ARM kernel and SA1100 patches from these ftp sites but remember to use your local mirror, e.g. ftp://ftp.uk.kernel.org/ for the UK mirror.
Kernel Source - Current Version
ftp://ftp.arm.linux.org.uk/pub/linux/arm/source/kernel-patches/v2.4/
The source tree can then be unpacked into your development source directory. You can put this anywhere you like, but it must be kept separate from your native source tree in /usr/src/linux. This is because many systems expect the version of headers in /usr/src/linux to correspond to the version of the kernel and glibc being run on the host machine. This is usually different from the version you are using for ARMLinux development. We recommend putting your ARM kernel source tree in /usr/arm-linux/linux (this is alongside the toolchain in a cross-compilation environment). Note that you need a fair amount of disk space free. The unpacked 2.4.1 source is a little over 100MB, and you should have two copies of it, and configuring and compiling only makes it bigger.
In your development directory enter the following command to unpack the source:
tar -xzvf linux-2.4.1.tar.gz
Or if you have the bzipped version, use these options:
tar -xIvf linux-2.4.1.tar.bz2
Finally, unzip/untar the source before applying the ARM and SA1100 patches to give you a new kernel source tree. Using patch -p0 can confuse various versions of patch so its best to cd into the linux directory and use p1, thus:
cd linux
zcat ../patch-2.4.0-rmk1.gz | patch -p1
zcat ../diff-2.4.0-rmk1-np2.gz | patch -p1
If you are intending to work on the kernel, the first thing you should do is take a copy of the pristine tree. This is so that you can generate patches against it after you have made changes. The simplest way to do this is simply to do:
cp -a linux linux-2.4.1.orig
However, as in practice you will only ever change a few files and having two copies of the whole thing, 99% of which are going to remain untouched, means that you may prefer to use hard links to create the copy as then only the changed files take up space. This method relies on the editor creating a new file after every save so that the original is preserved. If you have need of such an editor, take a look at MicroEmacs or GNU Emac's back-up-when-copying-when-linked facility. To create a hard-linked source copy do this:
cp -a -l linux linux-2.4.1.orig
Alternatively, you can use CVS to control your source versions, but that is not covered here.
First you should tidy up the source to get rid of old files and stale dependencies, especially if you have previously configured for a different device with make mrproper. You should then issue the appropriate make target-device_config command to set up a default configuration file for your target device. The list of possibilties for target-device is found in linux/arch/arm/def-configs/. You will then need to set up a kernel configurations file using the defaults which have just been created. This can be accomplished with the make oldconfig command. Finally, make dep sets up kernel dependencies and sub-configuration files on the basis of the specified config whilst make zImage builds the kernel image. The kernel should consequently appear in linux/arch/arm/boot/zImage. So, to summarise:
make mrproper
make target-device_config
make oldconfig
make dep
make zImage
The RAMdisks that are available for popular devices are usually fine for getting started, but sooner or later you will need to make our own. The steps involved are:
Put all the files you want to put on the disk in a suitable directory with the correct directory structure;
Zero out a block of memory (this is so that the spare space in your RAMdisk compresses as much as possible - if it was full of whatever random stuff was in ram at th time it would waste space in the final RAMdisk);
Make a filesystem in this memory;
Mount it;
Copy the files you prepared into it;
Unmount it;
Compress it.
So here's an example. The size of the RAMdisk is 2MB, your prepared files are in the directory preparedfiles, and we are making a conventional ext2 RAMdisk, rather than something more exotic. /mnt/ramdisk should already have been created as a mount point. You will need to be root.
dd if=/dev/zero of=/dev/ram bs=1k count=2048
mke2fs -vm0 /dev/ram 2048
mount -t ext2 /dev/ram /mnt/ramdisk
cp -av preparedfiles /mnt/ramdisk
umount /mnt/ramdisk
dd if=/dev/ram bs=1k count=2048 | gzip -v9 ramdisk.gz
The -m0 option to mke2fs specifies that no extra space for the super-user is reserved - again to minimise the size of the filesystem.
To see what is in an existing RAMdisk you need to gunzip it and loop-mount it as a filesytem. Your kernel need loop support for this to work, but a desktop kernel will nromally have this (it's really useful). Lets say you have a RAMdisk called ramdisk_ks.gz (from the Assabet distribution). It's a good idea to work on a copy of the disk, not the original. Do this (/mnt/ramdisk should already have been created as a mount point and you will need to be root):
gunzip ramdisk_ks.gz
mount -o loop ramdisk_ks /mnt/ramdisk
Now you can see the contents by browsing /mnt/ramdisk like any other filesystem. You can even add files by copying them in if there is space left in the RAMdisk. The kernel needs to have support for the filesystem used in the RAMdisk.
When you have changed some bit of the kernel, e.g. supported a new device or fixed a bug, you need to make a patch of your changes in order to distribute it to others and put it back in the kernel. This is easy to do. Say you have the patched version of the kernel in linux and the original version in linux.orig, then issue these commands.
make mrproper
diff -urN linux.orig linux > my_changes.diff
The make mrproper tidies up all the extra files lying around so that the diff is only of the actual relevant files. Note that the order of the linux.orig and linux arguments above is significant. If you do it the wrong way round you will have made a 'reversed' patch, which is at best confusing. You now have linux/ and linux.orig/ as well as a patch - my_changes.diff. You may now want to rename linux/ to linux.orig so that future patches do not duplicate the chages thus far - this enables each patch to be specific to a change, rather than monolithic. This helps the kernel maintainer (see below).
Russell King maintains an automated 'Patch State System' on his website at http://www.arm.linux.org.uk/developer/patches/ which tracks patches applied to the ARM Linux kernel. It is intended that all ARMLinux developers who wish their patch to be integrated into the ARMLinux kernel (aka -rmk kernels) should submit their patch to this system. These patches will then find their way to Linus.
However, this does not give the full story of patches applied; changes that go into Linus kernels are outside the scope of this patch system.
Please note that by submitting a patch or code to the patch system, you implicitly agree that it is suitable for redistribution with the kernel source. In other words, it is up to you to ensure that the material you submit to the patch system is suitable for inclusion in my kernel, and Linus' kernel. If you have any doubts about this point, please discuss it with Russell in private email.
There are certain restrictions on the system, so please follow these instructions carefully.
If you wish to send in a patch, please use the following procedure. It contains some important points that need to be followed:
Generate the patch. Please tell diff to generate unified patches, recursing and new files if necessary. The options are diff -urN. Also, please generate them using a path relative to the directory directly above the main linux/ source tree. If you only want a small area of the kernel, then use diff -urN linux.org/arch/arm/kernel linux/arch/arm/kernel. In the extremely rare case that you absolutely must generate the patch using a different path, please make this obviously visible in the textual part of the patch mail (not following this will result in delays with application of your patch).
Give the mail a descriptive subject line. This will appear on the web page, and in the release notes for the next -rmk version of the kernel.
Include some text in the message explaining what the new feature is, the bug, or why the patch is needed.
Put on a blank line "PATCH FOLLOWS". There must be no space before or after these words on this line.
On a separate line, add a tag "KernelVersion: " followed by the kernel version that the patch was generated against.
Append your patch as plain unwrapped text after this line to the end of the message. Note that the patches must be precisely what diff generates. It is not acceptable for TABs to be converted to spaces, or extra newlines or spaces to be added into the file. If you are unsure about the behaviour of your mailer, send the patch to yourself and examine it.
Mail it to <patches@arm.linux.org.uk>
When you receive a reply, you may wish to supply a detailed follow up article that explains exactly what your patch does. You can do this by replying to the mail you receive from the patch system.
If at any other time you wish to follow up on the patch, please use the subject line as the key (it should include the exact string "(Patch #number)", where 'number' is the patch number that you wish to follow up to).
Please absolutely do not send MIME encoded emails, even quoted-printable MIME encoded emails to the above address. If quoted-printable emails are sent, then you will receive an error message. All mails to <patches@arm.linux.org.uk> should be plain unwrapped text.
If you have developed a device driver that uses a major/minor pair, please get it allocated according to the linux/Documentation/devices.txt file. Major/minor numbers are device driver specific, not device specific. Any device driver which re-uses major/minor numbers without an extremely good reason (included along with the patch) do not stand any chance of being accepted.
To ease the problems of applying patches, I recommend that you send a patch that adds exactly one feature or bug fix in a single email. Mails containing zero or less, or two or more features stand a greater chance of not being applied if any one part of the patch is not acceptable for some reason.
Patches that are inter-dependent should not be sent - these significantly increase the probability of both patches being rejected, unless both get applied at the same time. My recommendation is: don't do it.
All patches should be complete, that is applying it should not cause any breakage. i.e., adding a new architecture inline function in include/asm-arm/arch-* should be done such that all existing architectures will still at the very least compile correctly. If you're not sure how it should be handled on a particular architecture, put in a GCC #warning statement.
This chapter contains information on building a GNU toolchain for ARM targets.
The toolchain actually consists of a number of components. The main one is the compiler itself gcc, which can be native to the host or a cross-compiler. This is supported by binutils, a set of tools for manipulating binaries. These components are all you need for compiling the kernel, but almost anything else you compile also needs the C-library glibc. As you will realise if you think about it for a moment, compiling the compiler poses a bootstrapping problem, which is the main reason why generating a toolset is not a simple exercise.
This chapter contains information on how the toolchain fits together and how to build it. However, for most developers it is not necessary to actually do this. Building the toolchain is not a trivial exercise and for most common situations pre-built toolchains already exist. Unless you need to build your own because you have an unusual situation not catered for by the pre-built ones, or you want to do it anyway to gain a deeper understanding, then we strongly recommend simply installing and using a suitable ready-made toolchain.
This CD contains three pre-built toolchains, one from emdebian.org, one from the LART project and a third from compaq's handhelds.org team. The emdebian chain is newest, and we've had good sucess with it, but all are used by various people. They all have very similar functionality.
At the moment the most likely situation where a pre-built toolchain will not do the job is if you need Thumb support, in which case you need to use gcc v3 (not yet released at the time of writing, but available as snapshots).
For binary versions of native compilers (ie ones that run on ARM and compile for ARM), the current stable release is on the Aleph ARMLinux CD. You can also get them from:
The current stable release on Debian's master FTP site (armv3l and above).
The latest release on Debian's master FTP site (armv3l and above).
Sometimes ARMLinux.org will have experimental versions available.
The emdebian version includes gcc version 2.95.2, binutils 2.9.5.0.37, and glibc 2.1.3. Installation is simple. If you have a Debian system then the emdebian cross-compiler is incredibly simple to install - just show apt the directory on the CD and do apt-get install task-cross-arm. What could be simpler?
| Warning |
The emdebian cross development environment will install files in /usr/bin so you will have to make sure that you do not overwrite any development tools which you may already have on your system. |
task-cross-arm is a virtual package which includes:
gcc version 2.95.2;
binutils 2.9.5.0.37;
glibc 2.1.3.
This is made up of the following packages:
the C preprocessor: cpp-arm_2.95.2-12e4_i386.deb;
the C compiler: gcc-arm_2.95.2-12e4_i386.deb;
the C++ compiler: g++-arm_2.95.2-12e4_i386.deb;
gnu C library: libc6-dev-arm_2.1.3-8e4_i386.deb;
C++ library: libstdc++2.10-arm_2.95.2-12e4_i386.deb;
C++ library and headers: libstdc++2.10-dev-arm_2.95.2-12e4_i386.deb;
Binary utilities: binutils-arm_2.9.5.0.37-1e3_i386.deb.
They are available in both deb and RPM form.
In order to set up your cross development environment on a Debian system, proceed as follows:
su to root by typing su at the prompt;
add the line
deb http://www.emdebian.org/emdebian unstable main
to your /etc/apt/sources.list file;type apt-get update to tell apt/dselect to note the new packages available ;
enter apt-get install task-cross-arm to install your new development environment;
type exit to become a normal user and begin to cross-compile.
For the RPM form download it and use:
rpm -i g++-arm-1%3a2.95..2-12e4.i386.rpm
The LART tarball contains:
gcc 2.95.2;
binutils 2.9.5.0.22;
glibc 2.1.2.
In order to install the LART tarball on your system, do the following:
mkdir /data
mkdir /data/lart
cd /data/lart
bzip2 -dc arm-linux-cross.tar.bz2 | tar xvf -
You can then add /data/lart/cross/bin to your path. The C and C++ compilers can then be invoked with arm-linux-gcc and arm-linux-g++ respectively.
The Compaq arm-linux cross toolchain includes:
gcc-2.95.2;
binutils-2.9.5.0.22;
glibc-2.1.2 with the international crypt library.
The toolchain is compiled with a i386 host with an armv41 target.
Note: The toolchain must be installed in /skiff/local as it will not work from any other path.
The only other problem that you may have with the include files is that the tarball was set up for Linux 2.2.14. You may consequently need to set up symbolic links:
ln -s /usr/src/linux/include/asm
/skiff/local/arm-linux/include/asm
ln -s /usr/src/linux/include/linux
/skiff/local/arm-linux/include/linux
Alternatively, copy /usr/src/linux/include/asm and /usr/src/linux/include/linux to /skiff/local/arm-linux/include before running make menuconfig and make dep. This will verify that your kernel tree and correct symbolic links are up to date.
Note: This toolchain has glibc symbol versioning. If you are using a NetWinder, you may have to compile your code with static libraries.
In outline what you need to do is:
Decide on the target name;
Decide where to put the images;
Work out headers policy;
Compile binutils first;
Then compile gcc;
Produce gLibc last.
A native compiler is one that compiles instructions for the same sort of processor as the one it is running on. A cross-compiler is one that runs on one type of processor, but compiles instructions for another. For ARM embedded development it is common to have a compiler that runs on an x86 PC but generates code for the target ARM device.
What type of compiler you build and the sort of output it produces is controlled by the 'target name'. This name is what you put in instead of 'TARGET-NAME' in many of the examples in this chapter. Here are the basic types:
This is the most likely target you'll want. This compiles ELF support for Linux/ARM (i.e. standard ARMLinux). ELF is the best and most recent form for binaries to be compiled in, although early Acorn Linux/ARM users may still be using the old 'a.out' format.
This produces Linux/ARM flavour, again, but using the 'a.out' binary format, instead of ELF. This is older, but produces binaries which will run on very old ARMLinux installations. This is now strongly deprecated; there should be no reason to use this target; note that binutils 2.9.5 doesn't contain support for it (refer to the section called Issues with older version of binutils and gcc).
These all produce flat, or standalone binaries, not tied to any operating system. arm-elf selects Cygnus' ELF support, which shares much of its code with arm-linux.
You can fiddle with the arm bit of the target name in order to tweak the toolchain you build by replacing it with any of these:
This makes support for the ARM v2 architecture, as seen in the older ARM2 and ARM3 processors. Specifically, this forces the use of 26-bit mode code, as this is the only type supported in the v2 architecture.
This makes support for the ARM v3 architecture, as seen in the ARM610, and ARM710. The l or b suffix indicates whether little-endian or big-endian support is desired (this will almost always be little-endian).
This makes support for the ARM v4 architecture, as used in the StrongARM, ARM7TDMI, ARM8, ARM9.
This makes support for the ARM v5 architecture, as used in the XScale and ARM10.
In practice the target name makes almost no practical difference to the toolchain you get anyway so you should always use plain 'arm'. This means that the toolchain itself is not unhelpfully tied to the type of processor it was built on. You get a toolchain that will run on all ARM processors and you can set the compiler output for the target processor when you build each part of the toolchain.
In many of the shell commands listed in this document you'll see italicised and emboldened bits of text. These are, on the whole, directory paths which will change depending on exactly how you've configured your toolchain. This means that we have not used an actual directory path in examples as it could be different from your setup. You need to substitute the correct value for your setup yourself for any commands that we have listed in this document.
Here is a list of these items:
This is the base directory containing all the other subdirectories and bits of your toolchain; the default for any system is almost always /usr, so unless you have a particular desire to put your toolchain in /usr/local, or /usr/arm/tools or somewhere else (to keep it separate, perhaps), we recommend you use the default, /usr.
If you're building a cross-toolchain, this is equal to PREFIX/TARGET-NAME (e.g. /usr/arm-linux). If you're building a native compiler, this is simply equal to PREFIX.
This is the place where your kernel source (or at least headers) are stored. Especially if you are cross compiling this may well be different to the native set of files. We recommend that you set this to TARGET-PREFIX/linux as a sensible default.
Binutils is a collection of utilities, for doing things with binary files.
Translates program addresses into file names and line numbers. Given an address and an executable, it uses the debugging information in the executable to figure out which file name and line number are associated with a given address.
The GNU ar program creates, modifies, and extracts from archives. An archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).
GNU as is really a family of assemblers. If you use (or have used) the GNU assembler on one architecture, you should find a fairly similar environment when you use it on another architecture. Each version has much in common with the others, including object file formats, most assembler directives (often called pseudo-ops) and assembler syntax.
as is primarily intended to assemble the output of the GNU C compiler gcc for use by the linker ld. Nevertheless, we've tried to make as assemble correctly everything that the native assembler would. This doesn't mean as always uses the same syntax as another assembler for the same architecture.
The c++filt program does the inverse mapping: it decodes (demangles) low-level names into user-level names so that the linker can keep these overloaded functions from clashing.
Gnu Assembler Macro Preprocessor.
The GNU linker ld combines a number of object and archive files, relocates their data and ties up symbol references. Often the last step in building a new compiled program to run is a call to ld.
GNU nm lists the symbols from object files.
The GNU objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD library to read and write the object files. It can write the destination object file in a format different from that of the source object file. The exact behavior of objcopy is controlled by command-line options.
objdump displays information about one or more object files. The options control what particular information to display.
ranlib generates an index to the contents of an archive, and stores it in the archive. The index lists each symbol defined by a member of an archive that is a relocatable object file. You may use `nm -s' or `nm --print-armap' to list this index.
readelf Interprets headers on elf files.
The GNU size utility lists the section sizes and the total size for each of the object files objfile in its argument list. By default, one line of output is generated for each object file or each module in an archive.
GNU strings prints the printable character sequences that are at least 4 characters long (or the number given with the options below) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.
GNU strip discards all symbols from the target object file(s). The list of object files may include archives. At least one object file must be given. strip /modifies the files named in its argument, rather than writing modified copies under different names.
The first thing you need to build is GNU binutils. 2.9.5 versions have proved stable but generally the latest release is recommended (2.10.1 at the time of writing). No-one should be using 2.9.1 anymore.
Download the latest version you can find from any of these sites:
Unpack the archive somewhere handy, like /usr/src:
cd /usr/src
tar -xzf /.../binutils-2.10.1.tar.gz
There may be ARM-specific patches available for binutils which resolve various bugs, or perhaps improve performance; it's usually a good idea to apply these to the source, if they exist. However ARM binutils are now quite stable (at the time of writing) and integrated with the main tree, so extra patches are no longer normally required. The best place to get up to date information is the armlinux-toolchain mailing list.
The place to check if there are any currently recommended patches is here:
If you do need to patch binutils refer to the section called Patching in Chapter 7 for details of the proceedure.
Essentially, you want to follow the instructions provided in the file called INSTALL. In practice you'll probably use one of the followingexamples.
If you're building a native toolchain, i.e. you're building on an ARM machine for an ARM machine, then you should just do this from inside the binutils directory:
./configure --prefix=PREFIX
If you're building on another machine (such as an x86 Linux box), and you want to build a cross-compiler for the ARM, try this:
./configure --target=TARGET-NAME --prefix=PREFIX e.g. ./configure --target=arm-linux --prefix=/usr
This should succeed (i.e. proceed without stopping with anything that looks like an obvious error message), and you can then actually start the build.
Invoke make in the binutils directory:
make
This should proceed without incident.
If it works, you can then install your new binutils tools, making sure you've read the overwriting warning below (refer to the section called Overwriting an existing toolchain):
make install
You'll notice your new set of tools in PREFIX/TARGET-NAME/. One likely location may be in /usr/arm-linux/.
Right, we're done with binutils. Now we move on to the compiler.
Note: The following headers section may well be redundant if you're building a native compiler, as it will almost certainly have already been done.
If you have a working Linux/ARM kernel installed which is configured for the same sort of machine you're trying to build a toolchain for, simply:
cd TARGET-PREFIX
mkdir include
cd include
ln -s KERNEL-SOURCE-LOCATION/include/asm-arm asm
ln -s KERNEL-SOURCE-LOCATION/include/linux linux
The overwhelming chances are that KERNEL-SOURCE-LOCATION will be /usr/src/linux. Now skip the rest of this section.
However if you are compiling for a different type of ARM machine, or compiling a different version of the kernel or cross-compiling, then you need a different set of headers. First off we need to get hold of a current Linux/ARM kernel. Download the latest kernel archive you can find (version 2.4.1 at the time of writing):
We recommend you use a version 2.4 kernel (i.e. one in the v2.4 directory). There are several reasons for this; many newer ARM architectures are only really properly supported in kernel 2.4 and development on version 2.0 has ceased, whilst 2.2 is now in maintainence mode. However, 2.2 kernels are significantly smaller, so if it has the functionality you need it may make sense to use one, but you will be running against the flow to an increasing extent.
Unpack this somewhere, although preferably not in /usr/src. If you're on a Linux system, the chances are you'll trash whatever Linux kernel source you already have installed on your system. We suggest /usr/PREFIX/ (e.g. /usr/arm-linux/).
There are a wide variety of patches you can apply to Linux kernel source for ARM. Applying the kernel patches tends to be mandatory. The two basic patches we recommend are:
the latest patch you can find on ftp.arm.linux.org.uk for your version of the kernel (currently patch-2.4.1-rmk1.gz for version 2.4);
the latest patch you can find in Nicolas Pitre's StrongARM patches for your version of the kernel (currently diff-2.4.1-rmk1-np2.gz for version 2.4).
You may possibly require patches for specific hardware (e.g. iPAQ, Psion), but this is unlikely for here: we are only trying to get the kernel headers into a state where they can be used to compile gcc; we don't have to worry about device driver support and so forth.
Apply these two patches as shown in the section called Patching in Chapter 7, in sequence (assuming you want to use both of them).
Now you need to tweak the make file, to ensure that the configure scripts select the ARM portion of the kernel. Load up the file Makefile in the top-level kernel source directory into your favourite text editor, and find the line that looks like this:
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
Delete it, or comment it out, and insert this:
ARCH = arm
Now you have to configure the kernel, even though you won't necessarily want to compile from it. Fire up make menuconfig in the top-level kernel source directory:
make menuconfig
Go into the top option: 'System and processor type', and select a system consistent with the tools you're building.
For example, if you're building a set for arm-linux with a StrongARM that doesn't need to support arm v3, select 'LART'. In practice, the toolchain only takes a couple of items from the kernel headers so it doesn't actually matter much what you select, so long as you select something and the correct links are made so that the files needed are visible in the right places.
Exit the configuration program, tell it to save the changes, and then run:
make dep
This command actually makes the links (linking /linux/include/asm/ to /linux/include/asm-arm etc) and ensures your kernel headers are in tip-top condition for the toolchain.
Having patched up your kernel appropriately, you can now copy the headers across into your new toolchain's directory:
mkdir TARGET-PREFIX/include
cp -dR LINUX-SOURCE-LOCATION/include/asm-arm TARGET-PREFIX/include/asm
cp -dR LINUX-SOURCE-LOCATION/include/linux TARGET-PREFIX/include/linux
Now gcc will have its headers, and compile happily.
Download the latest version (2.95.3-prerelease at the time of writing), unless you need thumb support or are feeling brave, in which case you can try a CVS snapshot of the forthcoming v3.0 from any of these sites:
We suggest you grab gcc-core-2.95.3.test4.tar.bz2 (8MB) (in the gcc-2.95.3-prerelease directory on the gcc site), or even gcc-2.95.3-test4.tar.bz2 (12MB) if you're feeling masochistic and want the whole thing.
Following through the same instructions as above, unpack your downloaded gcc. Then you may choose to apply patches if they exist; As of gcc 2.95.2 patches for ARM are not generally required. Check out the armlinux-toolchain list archives for the current state of play or look here to see if there are any current patches for your version:
You can now configure gcc in a similar way that you did for binutils (reading INSTALL as you go).
Most people will have arm-linux as the target name they're configuring for, which builds a toolchain suitable for running on any ARM. For a native compiler do this:
./configure --prefix=PREFIX
For a cross-compiler, do this::
./configure --target=TARGET-NAME --prefix=PREFIX e.g. ./configure --target=arm-linux --prefix=/usr
Configuring done, now we can build the C compiler portion.
This is probably the trickiest stage to get right; There are several factors to consider:
Do you have a fully-working and installed version of glibc for the same ABI as that for which you are building gcc? (i.e is your existing glibc for the same processor-type and binary format etc). If this is your first time building a cross-compiler, then the answer is almost certainly no. If this is not your first time building, and you built glibc previously, in the same format as you're using for gcc now, then the answer might be yes.
If the answer is no, then you cannot build support for any language other than C, because all the other front-ends depend on libc (i.e. the final gcc binary would expect to link with libc), so if this is your first build, or you changed to a different target, then you must append LANGUAGES="c" to each make command line in this section.
Do you even have the libc headers for your target? If this is the very first time you have built a cross-compiler on your host, then the chances are that the answer is no. However, if you have previously successfully completed a compilation of a cross-compiling gcc, and installed it in a location that can be found this time round, the answer is probably yes.
If the answer is no, you will probably need to employ the Dinhibit_libc hack (refer to the section called The -Dinhibit_libc hack); however, it's worth attempting a build first to see whether you're affected or not. See later for information that will allow you to recognise this problem from the output of make.
Invoke make inside the top-level gcc directory, with your chosen parameters:
make [LANGUAGES="c"]
The most common error looks like this:
./libgcc2.c:41: stdlib.h: No such file or directory
./libgcc2.c:42: unistd.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
and is common with first time building of cross-compilers (see above). You can fix it, this time, using the -Dinhibit_libc hack (refer to the section called The -Dinhibit_libc hack) -- follow through the instructions in the hack, and then restart at the configure stage.
Assuming that worked, you can now install your spiffy new compiler:
make [LANGUAGES="c"] install
If this worked, congratulations. You (probably) have a compilation environment capable of compiling kernel-mode software, such as the Linux kernel itself, and if you're only after cross-compiling kernels, feel free to stop here. If you want the ability to compile user-space binaries, press on.
glibc is the C library. Almost all userland applications will link to this library. Only things like the kernel, bootloaders and other things that avoid using any C library functions can be compiled without it. There are alternatives to glibc for small and embedded systems (it's a big library) but this is the standard and it's what you should use for compiling the rest of gcc.
glibc is split into bits:
the linuxthreads code which is in a separate archive;
the crypto stuff, which is only available outside the US (see the USA's cryptography export laws), although this is soon likely to change.
Fetch the main glibc archive (currently glibc-2.1.3.tar.gz is recommended although 2.2.2 has been released) and the corresponding linuxthreads archive from one of the following:
Now fetch a corresponding (if possible) glibc-crypt archive; try the Finnish site above.
Unpack the main glibc archive somewhere handy like /usr/src. Then unpack the two add-on archives inside the directory created when you unpacked the main glibc archive. All set.
This is slightly more complicated than the previous section. The most important point is that before doing any configuring or compiling, you must set the C compiler that you're using to be your cross-compiler, otherwise glibc will compile as a horrible mix of ARM code and native code. This is specified by the CC system variable. Do this in the same shell you're going to compile in:
CC=TARGET-NAME-gcc
Now we can configure glibc. Go into the top-level glibc directory, and you'll probably want to run configure more or less like this:
./configure arm-TARGET-NAME --build=NATIVE-TARGET --prefix=TARGET-PREFIX --enable-add-ons
So what do all the variables mean? arm-TARGET-NAME is important: at present the glibc configuration scripts don't recognise the various mutations of the arm- bit of the target name. So here you have to specify your normal target name, but changing the first arm- bit back to simply arm, rather than, say, armv3l.
NATIVE-TARGET is the target name of the machine you're building on; for instance on an x86 Linux machine, i586-linux would probably do nicely.
You'll notice the prefix is different this time: not just PREFIX, but with the target name component on the end as well.
| Warning |
Don't forget to specify this last component, or you may hose your local libraries, and thus screw up your system. |
Okay, go ahead and configure, reading INSTALL if you want to check out all the options. Assuming that worked, just run:
make
make install
And if those worked, you're sorted. You have a full ARM toolchain and library kit available for use on your system.
You can run the glibc or gcc test suites, and also go back to gcc, and compile up all the parts of the compiler you couldn't before (i.e. you can leave off LANGUAGES="c" now).
You can now try compiling things by using TARGET-NAME-gcc (e.g arm-linux-gcc) as your compiler; just set CC as above (e.g CC=arm-linux-gcc) before compiling any given package, and it should work. For any package using configure, you can normally set CC in the makefile, rather than as a local system variable. Setting the local system variable can be a problem if later on you need to compile something natively and you forget to unset it.
Whatever target name you build gcc for, the main code engine still contains support for all the different ARM variations (i.e. it's the same whatever target name you build with). However, there is a library accompanying gcc, containing some fundamental support routines, called libgcc.a. This is the thing that will differ between different target names, and this is what makes different toolchains binary incompatible.
Note: Exactly the same incompatibilities apply to glibc as well.
If you're building a native compiler, with a significantly different target from the current one, you must be aware that it is extremely easy to trash your toolchain half-way through building. The most common cause of this is trying to build a native set of ELF tools on a system where gcc was built to produce a.out code (e.g. older Linux/ARM systems running on Acorn hardware). This is no longer a significant issue, but the example remains valid. The crucial breaking point is the make install command which installs binutils. In the example scenario, this will leave you unable to link any programs, as gcc's libraries will be in a.out format, but all your binutils will be unable to understand anything but ELF.
So, how does one get round this? A solution is to initially build everything with a "PREFIX" of something like /usr/local/arm-tmp, so as not to interfere with the existing toolchain. Then, go back and compile everything again, but using your proper prefix (e.g. /usr), but making sure /usr/local/arm-tmp (or whatever you used) is on your $PATH environment variable. Then, having built everything in the correct directory, swipe /usr/local/arm-tmp.
If you do manage to trash your toolchain, you will need to go and fetch a suitable toolchain for your existing installation.
There are some significant differences between binutils 2.9.1 and 2.9.5 and between gcc 2.95.1 and 2.95.2. If you use an old binutils with a new compiler or vice versa then things will go wrong. The indications of this areas follows: the error 'unrecognised emulation: armelf_linux' means your toolchain is too old for your compiler. Conversely 'unrecognised emulation: elf32arm' means your compiler is too old for your toolchain.
Upon installing a successful build of gcc, some headers will get put in the target's include directory. However, if you are building a (cross) compiler for the very first time, or with a different set of paths, it won't have these headers to hand. For the first time you build a gcc then, you can follow through these steps to fix the problem:
Edit gcc/config/arm/t-linux
and add
-Dinhibit_libc and -D__gthr_posix_h
to:
TARGET_LIBGCC2_CFLAGS.
That is, change the line that looks like:
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC
to:
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h.
Re-run configure, but supplying the extra parameter --disable-threads.
Other useful sources of information include:
Phil Blundell's web site. This web site is a good place to check for information that isn't out of date.
The crossgcc FAQ is an excellent source of information on building cross-compilers, and should be read.
The main ARMLinux pages often have useful information on them, and are a good starting point.
This chapter describes some GNU/Linux fundamentals and tries to teach by example some basic things you need to know in order to use a GNU/Linux system, eg how to edit a configuration file, or print something. It also teaches you about some useful commands and concepts. It is written assuming that you are running an ARMLinux desktop system, but largely applies eqully to any desktop system. If you have not used GNU/Linux much or at all before then this chapter will be very useful. Although written from a desktop perspective, some of the info here is relevant to small ARMlinux systems too.
Afte installing GNU/Linux, either on the desktop, or on a target device and booting up, you should be met by the following:
armlinux login:
If this is the first time that you have logged in, then you will have to initially log in as the root user which is accomplished by typing root before pressing Return.
You will then see that the prompt is represented by a hash sign (#) which means that you are looking at the root prompt. In contrast, the prompt for non-root users is usually represented by a dollar sign.
[root@armlinux /root]#
or for the non-root user:
[paulw@armlinux paulw]$
Although it is possible to work with your new Linux system at this stage, we would advise you to immediately refer to the section called Accounts for the specifics of creating a user account.
As a new ARMLinux user, you will have to get to grips with the UNIX command prompt although memory-efficient GUIs like fvwm are available. Regular users of Linux call this prompt a shell and it is the means by which you can communicate with the kernel. In fact, the shell is a program which you can use to do all your Linux work if this is what you desire. Because Linux has been developed by a range of people with different interests and needs, it is not surprising that there are a range of shells that you can choose from. Examples include the Bourne Again Shell (Bash) and the Korn Shell (ksh). To find out the name of your current shell type the following command at the prompt:
echo $SHELL
If the response is: /bin/bash then your default shell is bash. Bash is a good shell to learn both because it is installed by default on many Linux distributions and because it has a range of features which you will learn to use as your Linux experience increases. It can also be a good idea to learn how to work with a second shell in case you ever have to use a machine that is not running Bash.
There are also a number of simple commands that you can employ to do useful work on your Linux system like those which are shown in Table 9-1.
Although we list a range of options which you can use with these commands, you should learn how to refer to the UNIX manual pages for a definitive explanation (see the section called Help!).
Table 9-1. Simple Commands
| Command | Explanation |
|---|---|
| cd | change directory |
| pwd | print working directory |
| ls | list files |
| mv | move a file |
| cp | copy a file |
| rm | delete a file |
| mkdir | make a directory |
| rmdir | delete a directory |
The cd command allows you to change directory. To change to the /home directory, you would therefore type cd and /home at the command line.
cd /home
You can also find out the location of the current directory as an absolute path from root by using the pwd command to display the result on screen. Our example consequently shows that we are currently in the /home directory.
pwd
/home
The list files command is invoked by typing ls in combination with a range of arguments which are shown in Table 9-2.
Table 9-2. The List Command
| ls Command with Options | Explanation |
|---|---|
| ls -a | list all files |
| ls -l | long-format (detailed) listing |
| ls --color | list filetypes in colour |
| ls -F | show filetype |
| ls -i | produce a detailed listing |
| ls -s | print file size |
Tip: In order to take advantage of the listing filetype by colour facility which ls offers, you may need to establish an alias. Assuming that you are using Bash, enter the following line in your .bashrc file.
ls='ls --color'
The mv command is used to move a file or directory from one place to another. The file sample.txt can therefore be moved into your /home directory by issuing the following command where the tilde (~) represents /home.
mv sample.txt ~
mv can also be used to rename a file. To change sample.txt's name to final.txt and move the renamed file to the /home directory, enter the following command:
mv sample.txt ~/final.txt
cp is very similar to mv in terms of the way in which you use it. One notable difference is that cp leaves the source file in situ whilst copying the file to your intended destination.
cp sample.txt ~/home
Tip: cp is also used to copy directories including their contents. If you need to do this, issue the cp command in conjunction with the -R option before typing the names of your source and destination directories.
The rm command is very easy to use although it is extremely easy to delete files unintentionally! We therefore advise you to use the -i option so that Linux confirms your intentions before taking any action.
rm -i sample.txt
You can use the mkdir command to create directories and sub-directories. Creation of a directory therefore involves typing the command and the name of your proposed directory whereas the creation of a sub-directory depends upon the -p option.
mkdir work
mkdir -p /work/paul
It's easy to delete an empty directory with the rmdir command. If we assume that the pleasure directory is empty, the next command removes it from our system.
rmdir pleasure
Tip: You should use the rm with the -R option to delete a directory which contains files.
In order to provide you with a working knowledge of the Linux filesystem, the following topics will be introduced in this section.
The Linux Root Filesystem
Permissions
Alternative Filesystems
The filesystem is made up of files and folders or directories. The top level folder is called the root folder and contains all of the files that are pertinent to your system. Each file within this system is allotted a name and a path on the basis of where it lies in relation to the root folder. Thus a sample file -alephlinux.txt- may be found at /home/letters/alephlinux.txt where the forward slash "/" before home denotes root.
Important: The new user must also appreciate that the filesystem is case-sensitive and therefore distinguishes between ALEPHLINUX.txt and alephlinux.txt.
Linux also provides support for long filenames although you should avoid the use of symbols like "@" within filenames, as they are used for other purposes.
The following schematic provides a simple representation of the most important directories and files which make up the root filesystem whilst the subsequent sub-section provides a brief description of the filesystem's structure. For more information about the root filesystem, enter man hier at the prompt for a full description.
Directories
Contains files and sub-directories which may be shared between machines. Important sub-directories include:
/usr/lib which contains programming and language libraries
/usr/local which provides the location for user-specific programs and files
/usr/include for C #include files
all configuration files should be in here (often in subdirectories)
contains home directories for all users on the system. /home/paul would therefore be the home directory for user paul.
contains fundamental executable files (commands or programs) used by users. Only the basic ones are here, most are in /usr/local/bin, but usually a user doesn't care where the executable is actually stored. which <commandname> will tell you where an executable actually resides.
includes executable files which are for system administration, as opposed to programs used by users. An example of this would be the shutdown command which closes the system down properly.
location for mounting filesystems. For supplementary information, consult the section called Alternative Filesystems
a directory which provides the temporary location for different programs. /tmp files tend to be deleted when the system is re-booted.
contains special pseudo files which give access to devices like the keyboard - /dev/kbd - and the virtual terminals - /dev/console, /dev/tty0 and /dev/tty1.
a directory which contains files which can grow through usage. Typical examples include email message files and system accounting files.
/var/adm for per-process accounting records
/var/tmp for temporary files which are not deleted at re-boot time.
/var/spool for running system processes. /var/spool/mail would be a typical file in this sub-directory
Although you should now have some appreciation of the Linux filesystem it is important to realise that Linux can be used in a multi-user or networked environment. It is therefore sensible to learn about the various types of role and permission which can be associated with a file so that the file owner can decide exactly who has access to files.
Any user may consequently fit into any one of three roles which include:
the ownership role
the group role
the other role
The owner of a file can change file permissions at will. Moreover, a file may be associated with a group which is useful in a collaborative project context in which file access can be restricted to group members. Finally, the other role applies to a user who is neither the owner of the file nor the member of the group which is associated with the file.
In a similar vein, for every Linux file, three types of permission can be applied to each of the three roles. These permission switches are as follows
R (Read): enables the user to read files, or (for a directory) to list files on the system
W (Write): allows for the alteration or deletion of files, or (for a directory) deleting, adding and renameing of files
Execute (Execute): allows for the execution of a file where it is an executable or for changing directories.
In order to clarify matters, this information can be most effectively presented in tabular form. Note that a dash in the line of text denotes the absence of a permission whilst r, w or e indicates that one of the three types of switch is activated.
Table 9-3. Permissions by Role
| Owner | Group | Other |
|---|---|---|
| r w x | r w x | r - x |
To illustrate all of the above, consider a situation where we want to know the permissions which apply to a particular file. After invoking the ls -l <filename> command, our hypothetical output might look some thing like the following:
—rw—r——r—— 1 paul paul 388 June 10 09:30 notes.txt
Reading across the listing from left to right, the first character position show the file's filetype which in this example is a normal file. Other possibilities include:
d for a directory
c for a device
b for a socket
s for a pipe
The remaining nine bits apply to the user, group and other roles respectively with three bits being alotted to each of the roles. Thus our hypothetical output shows that the user has read and write permissions whilst the group and other roles have read permission only. Note also that a dash denotes the absence of a permission.
If however, it becomes necessary to change file permissions, this can be accomplished by:
setting file permissions with octal numbers
setting file permissions with a combination of symbols
setting the setuid, setgid and sticky bits
To alter a file's permissions with numbers, Linux uses four numbers which determine permission types including:
4: read permissions
2: write permissions
1: execute permissions
0: no permissions
Therefore, to alter the permissions status of our hypothetical file so that the group has read and write permissions, we would add 4 (read permission) and 2 (write permission) together before issuing the following command:
chmod 664 notes.txt
The following table summarises the situation thus far:
Table 9-4. Permissions by Numbers
| Role | Permission | Calculation |
|---|---|---|
| Owner | 6 | 4+2+0 (r+w+e) |
| Group | 6 | 4+2+0 (r+w) |
| Other | 4 | 4+0+0 (r) |
In a situation where it is necessary to set permissions one role and one permission at a time, the symbolic permission notation can be used. In order to make use of this facility, the user need only remember that permissions may be granted or denied by using the following three symbols in conjunction with the read, write and execute switches that we have already encountered:
u signifies the user/owner role
g represents the group role
o signifies the other role
Therefore, in order to allocate a group read and write permissions for the file notes.txt using symbolic notation, the user could enter the following command:
chmod g+rw notes.txt
Because many permutations are possible when using this method, the table below gives some indication of how permissions may be alterred. Note that "+" means that permission is granted whilst "-" shows that permission is denied.
Table 9-5. Permissions by Symbols
| Granted/Denied | Permissions | String |
|---|---|---|
| user, group, other | read, write, execute | ugo+rwx |
| user, group, other | read, write, execute | ugo-rwx |
| user, group | read, write | ug+rw |
| user, group | read, write | ug-rw |
| user | read | u+r |
| user | read | u-r |
Of course, there is much more that could be said about permissions but for further details on the specifics of topics like sticky bits, shadow passwords and filesystem maintenance, consult the relevant man page. Refer to the section called Help! for advice on using man.
The important thing to remember is that if you are having a problem with missing files or some other mysterious error, it is very often due to incorrect permissions somewhere in the system. Always remember to check.
ARMLinux can similarly make use of a range of filesystems in addition to its own Second Extended filesystem (ext2fs).
Under Linux the user will however have to mount a device before it can be accessed and used. This is done with the mount command but you will initially have to edit the /etc/fstab file as the root user in order to avail of this facility. This file is also used to specify which filesystems should be mounted automatically at boot time. To edit this file - which is just a text file - use Vim to open the file with the following command:
vim /etc/fstab
If your file doesn't include a line like the following:
/dev/hda1 /adfs adfs noauto,user 0 0
then you should add one in order to be able to read your RISC OS drive from ARMLinux. Note that if your RISC OS drive is RISC OS 4 with long filenames then this is not supported at the time of writing so you can skip this section. The format of this file is explained in man fstab.Save and quit by depressing the ESC key, waiting for a beep and then typing :wq /etc/fstab. Where this line is missing, type it in from scratch noting that there should be no spaces between noauto any punctuation and user. if you want this drive to be automatically mounted on boot then change the final 0 to a 1. You will then need to make a mount directory.
mkdir /adfs
Congratulations, you are now in a position to mount your RISC OS filesystem with the following command:
mount /adfs
You can now access your files from the /adfs directory.
In order to take full advantage of Debian, you need to learn a little about the package management system which underpins it. Debian packages everything in .DEB files. These packages are controlled by a program called dpkg, or from a friendlier front-end such as dselect or apt. The system is extremely powerful; every file on your system is known about by the system and it takes care of a great deal of complexity when installing, removing or upgrading software. It knows about the interdependencies between pieces of software and if you ask to install something it will also get the other things it needs. It knows which files are configuration files and will not overwrite them when upgrading a package. It can also upgrade a running system without breaking things and lets you find out what is on your system. To a large extent the package management system is what makes Debian special and once you understand it you will find it a marvellous facility.
dselect is the interface that you will first use. It was designed when Debian had 500 rather than 5000 packages and suffers a bit because of this, but it is quite straightforward to use and a good introduction to the package system. Later you will just use apt to install new software. Once apt has been taught where to get software (usually off the CD and off the net) you can say things like apt-get install <software> and it will go away and get it for you, then install it, install anything else necessary and configure them all, often without asking you any further questions apart from telling you which CD to insert or if the download size is OK.
It is important to understand however that if you want to install software that is not in the Debian archive then everything is not taken care of for you and you will have to understand what is going on and do some work yourself. For example, if obtaining a package from a distribution which is meant for x86-based PCs, you will have to compile it from source as the binary versions supplied will not work on an ARM-based machine. Such a procedure is outside this manual's scope but - assuming that you want to use a package which is on the ARMLinux CD or in the huge Debian archive - read on!
dpkg can for example be used to install a package by using the i (or --install) switch.
dpkg -i /cdrom/debian/dists/potato/main/binary-arm/utils/mc<TAB>
Note that the <TAB> above means press the TAB key, not type in those letters. This uses the shell's filename expansion facility to fill in the end of the filename. It's a marvellous facility. If it beeps then there is more than one possible answer - press <TAB> again to see the list. It even works on commands.
However, it is standard practice to use apt instead to save typing long pathnames, like this:
apt-get install mc
Here apt knows where to look for packages, finds mc and then uses dpkg to actually do the installation, but saves you worrying about the actual location of the package.
What you have just done is to use dpkg to install Midnight Commander (mc) - a visual shell which does not need X Windows - on your system. Conversely, you may choose to delete or uninstall a package which can be accomplished by using the -r (or --remove) switch. The following command consequently removes mc.
dpkg -r mc
Don't be too hasty however. MC is an excellent way of navigating the filesystem when used in conjunction with the shell. So why not learn a bit about it before using dpkg's -r switch?
Congratulations, you've managed to mount your filesystem and have a look at some files. Before removing your CD-ROM, you will need to use the umount command which can either be used to unmount the current filesystem or a specific directory. But please be careful with your typing and key in umount rather than unmount. If it tells you that the filesystem is busy then your current directory is probably in the mounted filesystem. You need to change directory elsewhere before you can umount.
umount /dev/cdrom
or
umount /cdrom
In order to find out about other filesystem types and the specifics of the mount and umount commands, you can take advantage of the range of commands and applications which are briefly described in the section called Help!.
If you are an experienced Linux user, enter the following commands before proceeding to the next section. If you are a beginner, move swiftly on to the next paragraph!
updatedb
/usr/sbin/makewhatis
If you are a newbie, you will be a little perplexed by all the unfamiliar terminology. If this is the case, don't despair. Linux is very well documented and you can access all this information by taking a few preliminary steps. At the prompt enter the following command:
updatedb
This command updates a database of filenames which you can then search by typing in the locate command with your filename as the command's argument. The experienced user can of course enter special characters - called metacharacters - as opposed to a text string in order to generate a more sophisticated search but a discussion of this technique is outside the scope of this manual. For further details take a look at the updatedb man page as well as the man pages for locatedb, locate, find and xargs. Remember however to update the filename database regularly if you are continually producing new documents. If your machine is left on overnight it will automatically do this itself.
You can of course make use of a further command which you can again enter at the shell prompt (and as root):
/usr/sbin/makewhatis
What you have just done is to build the whatis database which contains information that you can now access to improve your skills. This process may take a few minutes but when it is completed, you can read the UNIX manual pages on any subject that you want. To make use of man, type the man command with the topic area as man's argument at the shell prompt. You can then scroll through the manual by pressing the space bar as a prelude to leaving man by typing q for quit. The following command consequently takes you to that part of the UNIX manual which is concerned with Groff - a document formatting system which many people use as an alternative to a word processor:
man groff
But how can you use man if you don't know the name of the command which would meet your requirements? Well, help is available with the apropos command. To use apropos, simply type the name of a keyword that is applicable to your interests after the apropos command (it is this indexing ability that the whatis database is used for). In order to find out about the editors which are available on your system type:
apropos editor
You may also see man -k mentioned - which is exactly equivalent to apropos (use whichever command you prefer) - as well as the whatis command. Whatis is particularly useful if you have heard about an application and require a simple one line description. If necessary, you may also take advantage of the built-in help facility which comes with many commands by typing the name of a command, a help switch, the pipe character and less to signify the less pager which allows you to view information one screen at a time.
man --help | less
Alternatives to both man and the apropos command include the info pages, the manuals of the Linux Documentation Project which can be downloaded from (http://www.linuxdoc.org/) and a selection of HOWTO documents which are available on the Aleph ARMLinux CD and can be read through a web browser like Lynx.
You may also need to create a user account if you have not done this already. It is important to do this because the root account gives you access to all files on your system. What this means is that a few careless strokes on the keyboard whilst you are logged in as root could result in an unusable system (rm is a potentially disastrous command to use although its effect can be lessened with the -i switch). In your early adventures with ARMLinux it would therefore be better if you learnt about your system from the relative safety of a user account. To create a user account, follow the instructions below:
Login as root,
or
su root
if logged in as an ordinary user,
type
adduser fred
at the prompt where fred is our hypothetical user,
You will be asked to set a password, (which can be done for an existing user with the
passwd command)
and follow the instructions.
Assuming that you are logged in as root do the following:
adduser majcon
Linux will set up the new user with a password, user id, a group membership (id) and a login name, home directory and mailbox. You can then enter the password twice as instructed.
A detailed discussion of Linux systems administration is outside the scope of this manual but consult The Linux Systems Administrators' Manual which is available from http://www.tcm.hut.fi/~viu/linux/sag/ for more information. What you must remember is that your password must be as ingenious as you can make it if you wish to avoid the possibility of your files being read by a stranger. Your password should make use of a mixture of upper and lower-case letters as well as numbers and symbols. But again, be sure to remember what you have actually typed!
You might think that this discussion of user accounts is not really relevant to you but it becomes an important consideration when your ARMLinux machine is being used concurrently by other users in a business or educational setting.
Because of the many uses to which ARMLinux can be put, it would not be practical in a short manual to provide a description of the rudiments of every program. We have therefore limited ourselves to an introductory treatment of text editing because this is a task which any user will need in their ARMLinux career.
There are literally hundreds of editors available including Vim, Jed, Joe and Emacs. Jed is a nice full-screen editor which is somewhere between MS DOS's Edit and Emacs whilst Joe will be appreciated by those who are used to the old Borland/WordPerfect control-key settings. Emacs, in contrast, has many of the characteristics of a complete working environment because it allows the user to do everything from writing letters to surfing the net. You can even play games within Emacs or indulge in a bit of psychotherapy by using the doctor package! We have not however, provided an Emacs tutorial in this guide so interested readers should refer to the section called Reading List in Chapter 12 or to http://www.gnu.org/manual/emacs-20.3/emacs.html/ where you can find a comprehensive Emacs guide.
Tip: If you decide to learn Emacs, you may see references to the META key in the Emacs literature which is equivalent to the ALT key on most keyboards. If you can't use ALT (it often doesn't work in terminals, for example) then you can use ESC to do the same job, but it should be released before the next keypress, not held down at the same time as it.
This section introduces you to:
ae - the standard, tiny editor.
Jed - a modeless editor which users of StrongED and Zap will find very accessible.
Vim - an extremely powerful editor which can be found on all UNIX-like operating systems.
ae can be activated by typing:
ae at the shell prompt
ae <filename> where you wish to work on a pre-existing file.
Two screens will then appear: an editing screen into which you can type and a help screen which provides a selection of useful commands. If you have used ae before, you can toggle the help screen on and off by typing C-x+C-h.
ae operates, like many Linux editors, via a series of control characters. C-x therefore instructs the user to depress the C (Ctrl) and x keys at the same time.
Typing a non-control character consequently has the the effect of placing the character which you have typed at the cursor. When you have finished your work, type C-x+C-s to save the current file to disc or C-x+C-c to save and exit.
ae is therefore very easy to use although its simplicity conceals a number of sophisticated features which include:
The ability to work with multiple buffers by using a root buffer and a series of virtual folds which correspond to the files to be edited.
User configurable key bindings.
For further information on ae, visit the editor's home page at http://www.interalpha.net/customer/nyangau/ae/platform.htm/.
Jed can be driven from a series of menus or with a combination of shortcuts. Jed is a modeless editor which means that you do not have to be in different modes to edit or insert text. Jed is also very easy to use and offers a range of facilities which include:
Colour syntax highlighting which can be useful for debugging your documents.
Special features which are activated on the basis of filetype.
Extensibility via the C-like S language.
Jed can be invoked by typing:
jed at the shell prompt.
jed <filename> at the shell prompt where you wish to edit a specific file.
C-x+C-f in the mini-buffer. If you choose this command, you will see Enter Filename in the mini-buffer.
In addition to commands which begin with the Ctrl character, Jed also uses the ESC key for a number of commands. ESCn therefore means that you should press ESC before releasing it and pressing key n.
Assuming that you are working on the file readme.txt, type jed <readme.txt> at the shell prompt. You can then insert and edit text and move around the document by using the arrow keys. When you have finished the session, type C-x+C-s to save your document to disc. You can then exit from Jed by typing C-x+C-c.
The Jed screen contains a number of features which may be unfamiliar to you. These are:
A Menu Bar across the top of the screen.
A Mode Line containing useful information.
A Mini-Buffer which is below the Mode Line.
The Menu Bar contains the menu options which you can use as an alternative to the keyboard shortcuts. To activate the Menu Bar, press the F10 key and select the menu which you require by using the arrow keys. The menu options should be self-explanatory with the possible exception of the Buffers option. A buffer is essentially a temporary workspace inside which you perform your work until you save any changes which are then written to the file.
In contrast, the Mode Line provides information about the document which you are currently working on. If you can see two asterisks (**) on the extreme left of the mode line, this is an indication that you have made changes to a document which has not been saved to disc. The mode line also tells you where you are in the document in terms of a line number as well as giving an indication of the current editing mode. Editing modes essentially help you to efficiently edit your documents by activating features like syntax colouring and specific formatting styles.
Finally, the Mini-Buffer is located below the Mode Line and echoes commands back to the user. Try keying in C-x+C-v to find an alternative file and you should get the idea but remember to hit the Return button after you have finished typing.
You should now know enough about Jed to perform simple editing. Jed also comes with its own form of on-line Help which can be activated by pressing C-h+C-h. A number of useful WWW resources are also available so point your browser to http://space.mit.edu/%7Edavis/doc/jed.html/ and http://www.geocities.com/mmarko.geo/jed/ Finally, take a look at Appendix A which lists some useful Jed commands. Please be aware however that the table uses commands which assume that Jed is using Emacs keybindings.
Vim is another editor which you can learn how to use. Vim also comes with an excellent tutorial which you can avail of by typing the following command at the prompt:
vimtutor
You can also save a bit of typing by using the filename completion facilities of the Bash shell. Simply type vim/usr/doc/vim and then press <TAB> so the shell fills in the remainder of the directory name, then you can enter the tutor and press <TAB> again to get the rest.
The tutorial will open from within Vim and you will then be able to learn enough to perform most of your editing activities. But just in case you want to familiarise yourself with Vim without recourse to the tutorial, what follows is an introduction to the editor's capabilities.
Vim is a modal editor which means that there are different modes for performing different tasks. Vim consequently operates in command mode when commands are being issued or in insert mode when text is entered on the screen. Although the method of issuing commands with a key press may seem counter-intuitive and positively archaic in comparison with more conventional point-and-click methods, it is actually a very efficient method of working and should be perservered with if at all possible.
In order to become conversant with Vim, we therefore suggest that you learn a few new commands per day and practice! Appendix B lists some of the common commands that you are likely to need.
Note: The user enters command mode by pressing the ESC key whilst insert mode can be activated by pressing i.
For more information on Vim, consult its home page http://www.vim.org/ or check out one of the many books which are available on Vi - Vim's predecessor.
After having learnt something about text editing, it seems sensible to provide a brief introduction to the subject of printing under Linux. Although word processors are available for Linux, you will still need to learn something about traditional UNIX tools like the lpr printer daemon and the power of PostScript - a language which is used to describe page layouts.
Although using the command line to print documents is not the easiest way to produce a hard copy of your documents, this approach has considerable advantages over the use of a conventional word processor like OpenOffice or Abiword because the user creates plain text files which are portable across platforms. Moreover, although BSD-derived packages like lpr are more difficult to learn about than GUI based printer management tools, the Berkeley UNIX (BSD) approach gives the user a fine-grained control over the printer.
Because of the complexity of the printer configuration process, we shall not discuss the topic in any detail. We would however, advise any user to do the following:
Obtain your printer's technical specifications which will usually be available from the manufacturer's web site.
Read through all relevant document - both HOWTOs and man pages - before doing anything.
Check that your printer is working from within RISC OS before attempting to configure it for Linux.
Do a test print using the lptest utility.
Edit the /etc/printcap file where necessary.
Ensure that Ghostscript works both with the X Windows System and through the shell.
Use an application like magicfilter which helps you to configure your printer.
Tip: If you have a Linux system up and running and you want to print man pages, an environmentally friendly method is to take advantage of the psnup command which forms part of the pstools package. This command allows you to decide how many man pages will be printed per page although it is dependent on the user being able to convert the requisite page to PostScript format.
Assuming that you have successfully configured your printer, printing through the shell generally involves two stages:
the user creates a document with an editor like Vim or Emacs which may be interlaced with formatting instructions. Such formatting instructions are typically specific to either TeX or Groff.
A number of filters may also be applied to the file if the user intends to do things like formatting line lengths. Other examples of typical filters include Enscript and a range of magic filters which convert to PostScript on the basis of a file's initial filetype.
The file is then sent to the printer by using lpr, Enscript or Ghostscript.
With regard to point two, lpr could be used to print a plain text file formatted according to personal preference. If a more complex document has been generated with either TeX or Groff which includes floating objects like tables and graphs, then one possible alternative would be to convert the file to PostScript as a prelude to printing to a PostScript printer. Groff and TeX files can for example both be converted to PostScript using Dvips - a DVI to PostScript driver. Alternatively, users without a PostScript printer can also take advantage of Ghostscript- a program which can be used as a PostScript viewer, file converter and printer driver.
So in order to make the process more meaningful, let's use a fictitious document to illustrate the process in action. Suppose we have written a letter to a friend using LaTeX - the TeX macro set. For those who are unfamiliar with LaTeX, a sample file together with formatting instructions, is listed below:
\documentclass[a4 paper,12pt]{letter} |
You would of course create this document with your favourite editor before saving it as letter.tex. Don't forget the suffix which indicates that the file is a LaTeX source file. letter.tex would then be processed by using the latex command to create a Device-Independent or DVI file - letter.dvi - with the dvi suffix.
latex letter
You are now ready to convert letter.dvi to PostScript by using Dvips. If you are successful, you will be left with letter.ps.
dvips -o letter.ps letter.dvi
And finally, print using either lpr Enscript or Ghostscript.
lpr letter
You can also print the raw LaTeX file with the pr command although this would not be particularly appropriate in a situation where one wished to process the formatting instructions as opposed to seeing them on the page.
pr letter
There is a wealth of information on printing and related utilities under Linux.
But your first port of call should be the:
The printing HOWTOs are available on the CD in the Docs.Html-Howto. The relevant man pages are, as always, ever useful.
General PostScript and Ghostscript resources are available from http://www.geocities.com/SiliconValley/5682/postscript.html/. PostScript-specific information can also be found on Adobe's web site at http://www.adobe.com/print/postscript/.
Ghostscript's Home Page can be found at http://www.cs.wisc.edu/~ghost/ whilst the Ghostscript Manual is available from http://www.pdflib.com/gsmanual/index.html/.
Point your browser to http://www.tug.org/in order to learn about printing TeX-related files. Similarly, http://www.sunsite.ubc.ca/Resources/Graphics/dvips/ is the link to a comprehensive manual on the DVI to PostScript driver.
Although it is possible to work entirely through the shell, modern Linux distributions allow the user to work through a GUI and ARMLinux is no exception! Indeed, if your preferred method of working is to point-and-click, then you will feel very much at home with this distribution.
However, a brief explanation of the X Windows System is in order so that you can take advantage of the power which is at your fingertips.
The X Windows System or "X" as it is more commonly known is based on a client-server way of doing things in which the server program determines access to your graphics hardware. The client, in contrast, is simply an applications program like xpdf or one of the many types of window manager. Although X clients usually run locally, remote connection to a client is possible and can be very useful in situations where you need to access an important file on another computer. RISC OS users will no doubt be interested to know that it is even possible to start up an X-Server under RISC OS itself if you take advantage of an application like !X (http://gnome.co.uk/) or !X-Server (http://kyllikki.fluff.org/software/x/).
There are many window mangers available for GNU/Linux so for reasons of brevity, we will confine ourselves to a description of Window Maker's basic features because this is the default desktop for Debian.
X Windows can be activated with the startx command. . To start Window Maker simply press the right mouse button and click on WindowManagers and then on the wmaker sub-menu.
When you fire up Window Maker, you will notice a number of distinctive features which include:
The Window Maker Workspace from which you can launch applications by clicking with the right mouse button before choosing the application which you require.
An Applications Dock on the right hand side of your screen which is used to activate applications which you use regularly.
A series of Miniwindows at the bottom of your screen. The Miniwindow is made up of an icon and a title and appears when you temporarily close an application window.
To end your Window Maker session, click on the workspace with your right mouse button and select WindowManagers and Exit or Exit Session. If you choose Exit Session, all applications will be closed.
For further information, take a look at the official Window Maker web site (http://www.windowmaker.org/) which has links to mailing lists, user guides and sample configuration files where you wish to customise your setup.
Congratulations, you can now use all of the X applications which are on the CD but you will need to make a few changes to the default configuration before X Windows is fully usable.
Add the line *input: true to the .X defaults file which will be in your home directory. This should solve the problem of being unable to type into dialogue boxes under X.
You will need to install pcnfsd if you wish to use the Network Filing System (NFS) for sharing files over a network to a RISC OS machine or a PC. It is not needed for UNIX-UNIX sharing. Supplementary information on this topic can be found on the CD in Docs/html-howto. The Networking HOWTO is also required reading.
So we've taken a look at Window Maker itself and in order to help you to use this window manager, what follows is a description of some of the core X applications which you may find useful. If you decide to install an application, follow the instructions in the section called Alternative Filesystems which tell you how to install a package by using dpkg.
X Applications
A window containing the shell. xterm allows the user to cut-and-paste and to scroll. To close the xterm window, type exit at the prompt, press Ctrl+D or select Close with your mouse by clicking on the button on the extreme left of the fvwm titlebar.
A viewer for Portable Document Format (PDF) files. xpdf has been ported to RISC OS by Leo Smiers.
A program which is ideal for the production of complex drawings which can be saved in a variety of formats including PostScript and LaTeX.
Allows the user to view and convert images in a variety of formats including GIF, JPEG and TIFF. Facilities are also available for image cropping, rotation, gamma correction and for the capturing of screenshots.
You can even have some fun with Linux by playing games like xmahjonng, xgalaga or xgammon. If you want to have fun without using X, then why not check out bsd-games - a collection of classic non-X games including battleshar, gomoku and phantasia?
One of the attractions of ARMLinux is that there are so many tools which allow you to read and send news and email and to view web pages. This section will therefore show you how to establish a dial-up connection as well as introducing you to some useful net-related utilities.
In order to get on-line you will need to set up your dial-up connection so we'll help you to do this by taking a look at the Point-to-Point Protocol (PPP).
This section has consequently been written for those who wish to gain a general sense of what is involved before consulting alternative resources. Newbies should therefore read this section before referring to the PPP-HOWTO which is on the CD in Docs.Html-Howto. Useful information can also be gained from the README.linux file in /usr/doc/ppp-2.2.0f-2, the pppd man pages and from the PPP FAQ (http://cs.uni-bonn.de/ppp/faq.html/). Users who wish to establish their own PPP server or to set up a Wide Area Network (WAN) will also find these resources helpful. Moreover, those who wish to use the Debian distribution of ARMLinux should refer to install.en.txt on the CD in Debian.docs for an explanation of pppconfig. Debian users will also find the wvdial dialler to be invaluable.
Note: We have avoided any reference to SLIP connections or to DIP scripts because of the sheer complexity of the latter.PPP configuration will also become easier as ARMLinux is developed. The RHS Linux Network Manager is already available which allows users to configure interfaces, domains and name servers from the fvwm control panel and the eventual appearance of KDE will mean that PPP can be set up by using the kppp tool.
At present, you may set up your internet connection by:
Writing your own scripts.
Using the pppsetup program.
In order to configure PPP, you will need to find out the following information which is usually available from your Internet Service Provider (ISP):
Dialup number.
PABX number if you require an outside dialling tone.
Login details which will usually be a combination of letters and numbers.
Password-again a combination of letters and numbers.
Gateway-four numbers punctuated by dots.
Domain Name Server (DNS) Internet Protocol (IP) address - as with gateway.
Note: It is advisable to ask for two DNS IP addresses in case one of the servers is temporarily disconnected from the net.
You will also need to ask your ISP about:
Its support for PAP or CHAP authentication.
The allocation of IP addresses. Nowadays, ISPs tend to dynamically assign IPs on a session-by-session basis. If this applies to you, this may have implications for how you offer server apps like ftpd on your machine.
The IP and netmask numbers that can be used in a situation where provision has been made for a subnet of IP numbers.
You will also have to think about configuring your modem which will involve:
Finding the name of the COM port.
Creating a link between the COM port name and /dev/modem.
Taking other factors into account like flow-control, line-termination and the connection speed that you will require.
Tip: if you don't know the name of your COM port pipe the output of dmesg through fgrep:
dmesg | fgrep tty
If you require further information on configuring your modem, take a look at the Serial-HOWTO which is on the CD in Docs.html-Howto.
Note: You may also need to recompile your kernel to enable PPP support.You can check that PPP support is enabled by availing of the dmesg command:
dmesg | fgrep PPP:
If you think for example of a situation where you want to establish a connection with Freeserve - a popular account with RISC OS users - PPP configuration can be achieved by taking the following steps:
Edit the /etc/ppp/options file so that it contains information on the device that you will be using as well as the script - CHAP or PAP - that you will be using for dialling:
connect '/usr/sbin/chat -v -f /etc/ppp/chat-script'
asyncmap 0
crtscts
defaultroute
modem
lock
mtu 542
mru 542
115200
/dev/modem
Set up configuration and dialer files which may be found in /usr/doc/ppp-2.2.0f or in /etc/ppp. Assuming a chat script, enter the following in /etc/ppp/chat-script:
ABORT 'NO CARRIER'
ABORT BUSY
''ATF1
OK ATD084550796699
CONNECT''
login:USER.freeserve.co.uk
word:PASSWORD
Create or adapt the secrets file if you are using PAP or CHAP authentication where both files - /etc/ppp/chap-secrets and /etc/ppp/pap-secrets - take the form of:
USER.freeserve.co.uk*PASSWORD
Run pppd as root.
Configure /etc/resolv.conf so that domain names are associated with IP addresses:
# /etc/resolv.conf
search.
domain freeserve.co.uk
nameserver 194.152.64.35
nameserver 195.92.193.8
Automate the connection process by copying the ppp-on and ppp-off scripts to /usr/bin as root. This will then allow you to toggle your connection on and off with the equivalent command.
You should then
Secure all passwords on your system by setting them to 660 with chmod.
Log all PPP operations where you are having problems by entering the following command:
tail -f /var/log/messages
If you want to use PPP as a normal user, SUID pppd by entering this command at the prompt:
chmod +s 'which pppd'
The pppsetup program is an effective alternative for those who feel intimidated by the process of hand-crafting an internet connection. PPPsetup is available from http://members.nbci.com/chrissawer/ and was orginally derived from PPP version 2.3.5. Newbies should consequently note that the chat and chat.8 files should be placed in /usr/sbin and /usr/man/man8 respectively. The program also needs a current version of chat which can be downloaded from ftp://cs.anu.edu/pub/software/ppp/.
Shutting down an ARMLinux machine is substantially different from what you are used to. Simply resetting the machine can for example lead to the corruption of data, or at least a very slow boot due to the disc-checking process. You can shut the system down properly with the halt command although you will have to be logged in as root:
halt
If you want to reboot then you use reboot instead. Even easier is to use Ctrl-Alt-Del which also does 'reboot', even if you are not root. These are actually synonyms for various options to the shutdown command - ie shutdown -h now is the same as the halt command. There are of course many other options or switches that you can use in relation to this command, but you don't need to know those now. Use man 8 shutdown to read the details if you are interested.
This subsection has only scratched the surface of what can be accomplished with ARMLinux. We have however given you enough information to enable you to take those first tentative steps on your journey towards GNU/Linux enlightenment.
Good Luck and welcome to the open-source revolution!
A: All modern CPUs expect that fundamental types like ints, longs and floats will be stored in memory at addresses that are multiples of their length.
CPUs are optimized for accessing memory aligned in this way.
Some CPUs:
allow unaligned access but at a performance penalty;
trap unaligned accesses to the operating system where they can either be ignored, simulated or reported as errors;
use unaligned addresses as a means of doing special operations during the load or store.
When a C compiler processes a structure declaration, it can:
add extra bytes between the fields to ensure that all fields requiring alignment are properly aligned;
ensure that instances of the structure as a whole are properly aligned. Malloc always returns memory pointers that are aligned for the strictest, fundamental machine type.
The specifications for C/C++ state that the existence and nature of these padding bytes are implementation defined. This means that each CPU/OS/Compiler combination is free to use whatever alignment and padding rules are best for their purposes. Programmers however are not supposed to assume that specific padding and alignment rules will be followed. There are no controls defined within the language for indicating special handling of alignment and padding although many compilers like gcc have non-standard extensions to permit this.
Summary
Structure alignment may be defined as the choice of rules which determine when and where padding is inserted together with the optimizations which the compiler is able to effect in generated code.
A:
The early ARM processors had limited abilities to access memory that was not aligned on a word (four byte) boundary.
Current ARM processors (as opposed to the StrongARM) have less support for accessing halfword (short int) values.
The first compilers were designed for embedded system applications.
The compiler writers chose to allow the declaration of types shorter than a word (chars and shorts) but aligned all structures to a word boundary to increase performance when accessing these items.
These rules are acceptable to the C/C++ language specifications but they are different from the rules that are used by virtually all 32 and 64 bit microprocessors. Linux and its applications have never been ported to a platform with these alignment rules before so there are latent defects in the code where programmers have incorrectly assumed certain alignment rules. Moreover, these defects appear when applications are ported to the ARM platform.
The Linux kernel itself contains these types of assumptions.
These latent defects can consequently lead to:
decreased performance;
corrupted data;
program crashes.
The exact effect depends on how the compiler and OS are configured as well as the nature of the defective code.
These defects may be fixed by:
changing the compiler's alignment rules to match those of other Linux platforms;
using an alignment trap to fix incorrectly aligned memory references;
finding and fixing all latent defects on a case-by-case basis.
The three alternatives are, to some extent, mutually exclusive. All of them have advantages and disadvantages and have been applied in the past so there is some experience with each although the correct solution depends on your goals (see below).
A: On the StrongARM processor, the OS can establish a trap to handle unaligned memory references. This is important because unaligned memory references are a frequent consequence of alignment traps although they are not the only consequence.
Thus, some, but not all, alignment defects can be fixed within an alignment trap.
Furthermore, not every unaligned access indicates a defect. In particular, compilers for processors without halfword access will use unaligned accesses to efficiently load and store these values. If the alignment trap fixes these memory references, the program will produce incorrect results.
On the ARM and StrongARM, if you ask for a non-aligned word and you don't take the alignment trap, then you get the aligned word rotated such that the byte align you asked for is in the LSB.
Consider:
Address: 0 1 2 3 4 5 6 7
Value : 10 21 66 23 ab 5e 9c 1d
Using *(unsigned long*)2 would give:
on x86: 0x5eab2366
on ARM: 0x21102366
An alignment trap can distinguish between kernel code and application code and do different things for each.
The basic choices for the alignment trap are:
It can be turned off. The unaligned access will then behave like unaligned accesses on other members of the ARM family without performance penalty.
It can "fixup" the access to simulate a processor that allows unaligned access.
It can fixup the access and generate a kernel message.
It can terminate the application or declare a kernel panic.
There is a significant performance penalty for fixing up unaligned memory references.
A: The ARM port of GCC can be configured to either:
align all structures to a word boundary -- even those containing just chars and shorts (this is the way ARMLinux is distributed);
align structures based on the alignment constraints of the most strict structure member (this is the same alignment as is used on the x86);
follow other rules.
Changing between 1 and 2 is a one line change in the gcc or egcs source. With additional effort, these could be modified with an additional compile time parameter selecting the alignment rules to be used. Some other architectures already have such a flag, so these could be used as a model.
The compiler supplied with the ARM SDT defaults to align all structures on a word boundary. It has a "packed structure option" (-zas1) that changes alignment to match the x86 rules. In future, this option will be the default since:
word-alignment causes too much user trouble, and the performance/codesize improvement has never been proven (typically the affected structures are small, and generally not copied around a lot).
A: The advantages are as follows:
structure copies for structures containing only chars and shorts are much faster;
faster code can be generated for halfword access on pre ARM.v4 processors;
binary compatibility across all ARM processors;
binary compatibility with the original compilers;
compatibility with ARM Directives.
The overall performance impact on StrongARM processors is hotly debated.
Here are some typical responses:
most of the system would run faster | ||
| --unattributed | ||
pretty much ANYTHING that you care about memory bandwidth and performance issues on will or could seriously be impacted by this. | ||
| --unattributed | ||
Although in theory it produces faster code, in practice most code and thus the system will run a lot slower. | ||
| --unattributed | ||
The performance impact on other processors is less debated, but there is not complete consensus there either.
The only way to resolve this debate is to measure the relative performance.
A: The disadvantages of word alignment are that:
it exposes latent defects. If the compiler aligned consistently with other Linux platforms, these defects would remain latent and the effort involved in porting Linux to the StrongARM would be reduced;
uncorrected defects can silently corrupt data;
uncorrected defects cause unreliability. Alignment defects that only show up under heavy load, under certain patterns of use, at particular optimization levels, or in certain configurations are particularly difficult to find and fix;
the corrected programs are "fragile". Subsequent code changes can create or expose new alignment defects;
it effectively decreases performance.
There is hot debate on both the number of Linux packages that have latent alignment defects and how difficult these defects will be to find and fix. Estimates of the magnitude of the problem include:
The only programs that I found that were violating this when I did the original port were very few and far between. I think it was in the order of 1 in 200. However, as of lately, maybe because of the commercialisation of the Internet, this figure appears to be increasing. | ||
| --unattributed | ||
Generally, the defects I've found stick out like a sore thumb. | ||
| --unattributed | ||
These problems are so severe that I'd be very surprised if any major Linux application runs reliably or can be made to run reliably without superhuman effort. | ||
| --unattributed | ||
Unless other measures are taken, this debate will not be resolved until ARM distributions that align all structures are complete and widely deployed or the attempt is abandoned. Distributions that elect to not align all structures avoid the problem and thus never find out its magnitude in detail.
The alignment trap for application code can be used to produce an estimate of the problem magnitude earlier than this. Application code will execute unaligned memory references in the following circumstances:
it was compiled for an ARM processor and is using "legal unaligned load word instructions" to reference halfword and/or byte data;
the application has code that deliberately does unaligned memory references. This indicates that the application is not portable to a variety of platforms;
the application has latent alignment defects exposed by alignment rule differences.
When the alignment trap is set to generate a count of traps from application code and code compiled for the StrongARM is run, then every trap signals the existence of a defect that needs to be fixed. If the problem magnitude is large, many messages/counts will be recorded. If the problems are rare or have already been fixed, the trap will be silent.
The early results of this testing on the NetWinder have been:
X generates literally tens of millions of alignment faults. Line drawing is particularly nasty;
without X, after a reset and login there are 21256 userland faults;
GCC generates unaligned load/store multiple instructions now and then too.
This picture has changed as more and more packages are updated to newer versions and compiled with newer compiler versions to the point that the number of traps has declined to about 1,000 per CPU minute even with X windows use.
Setting the alignment trap to produce messages or counts is obviously useful for debugging as well. However, it produces only an estimate of the magnitude because there are potential latent defects that will cause applications to fail without ever doing an unaligned memory reference.
The argument that aligned structures are effectively slower is based on three positions:
the fixes to alignment defects often result in slower code;
the alignment trap would be called less frequently if the compiler didn't align all structures;
code compiled for ARM processors will execute slower than code compiled specifically for the StrongARM.
A: At this point, several years of fixing alignment defects in Linux packages have reduced the problems in the most common packages.
Packages known to have had alignment defects are:
Linux kernel;
binutils;
cpio;
RPM;
Orbit (part of Gnome);
X Windows.
This list is very incomplete.
A: The problem with changing the compiler is one of compatibility and transition. A completely new distribution for the ARM or StrongARM could use whatever alignment rules meet its goals. However, there would be problems running binaries from other distributions. For commercial applications, this would split the ARM market in two and they would need to decide which distribution(s) to support.
Those familiar with UNIX history know the potential costs of these splits.
Since StrongARM binaries cannot be run on the ARM processors, this is the natural dividing point for this split. To some extent, this split has already occurred since many packages are being ported specifically for the StrongARM.
Changing alignment in a StrongARM distribution will therefore affect its ability to run ARM binaries.
From this perspective, the worst case is having two binary standards on the StrongARM processor for the same OS.
The upgrade from aligned to unaligned or vice versa is particularly tricky because of interdependencies between programs and shared libraries. When the upgrade is in progress, the system is really some kind of "mixed distribution". Also, local programs compiled before the upgrade need to be recompiled to ensure compatibility.
A: It is possible to create header files for libraries and system calls that are independent of which alignment rules are used by the compiler and thus ensure binary compatibility between distributions even if different compilers are used. All of the distributions would need to standardize on these modified headers for this to work.
If these changes were in place, different applications could be compiled with different rules within the same distribution as the needs of the application itself dictate. Some people are going to be experimenting with alternatively configured compilers and will need to make at least a start on these changes in order to do this experimentation. Later in this FAQ is a list of the system header files that would be affected.
A: All of the following examples are defective in a way that works for most Linux platforms and fails under the ARMLinux distribution. The behaviour of the ARMLinux distribution is described.
Example A
Suppose, I'm doing something to a truecolour image in C++ (brightening it for instance) and I have a pointer to the image in memory.
struct Pixel |
The Pixel structure will be padded with an extra byte at the end and will be aligned to a word boundary. Each ptr++ will step the pointer by four bytes instead of three as intended and thus the image will be corrupted. If image is aligned on a word boundary (this is random chance), no unaligned memory references will be made.
If the loop is alterred so that ptr is incremented by three bytes instead of four, then the image may be corrupted depending on what brighten does and the optimization level.
Example B
Suppose now, I have an alpha field:
struct RGBAPixel |
which is the layout on most other Linux platforms.
Example C
struct Date |
All of the date fields will be corrupt after the read.
Example D
This example is from the Kernel source.
struct nls_unicode { |
Each unicode character consumes four bytes instead of two as on other platforms. Although in this case, the only impact is benign (extra memory consumption).
Attempting to read, write, or copy unicode strings based on this definition would lead to problems.
A: This section is fairly specific to ARMLinux application porting. Fixing all alignment problems, including those that may cause problems in future or on other platforms, is beyond the scope of this FAQ.
The gcc compiler for the ARMLinux distribution aligns all structures containing ints, longs, floats and pointers in the same way as gcc on x86 and other 32 bit platforms. The differences that may result in exposing latent alignment defects are all related to structures consisting entirely of chars and shorts either signed or unsigned. On ARMLinux, these are aligned to a word (4 byte) boundary. On other platforms these are aligned to a character boundary (ie: unaligned) for structures containing only chars and a halfword boundary for structures containing shorts or shorts and chars.
In practice, structures of this nature are relatively rare, so this is a good place to start looking.
The uses of these structures that may cause problems are:
one of these structures is contained within another structure. This will generate additional interior padding in the containing structure unless the contained structure just happens to be already aligned. This interior padding will cause problems if the structure is read or written as whole or aliased to another data structure;
an array of one of these structures or a containing structure is defined. These will be larger on ARMLinux unless the structure just happens to be a multiple of 4 bytes long. This is really just another type of internal padding and the same caveats apply;
a pointer to something else (usually char* or void*) is cast to a pointer to one of these structures, a containing structure or an array of one of these. The compiler expects that all pointers to one of these structures are aligned on a word boundary. If not, the generated code can incorrectly load field values and silently corrupt memory contents on stores. The exact behaviour depends on how the fields are accessed and optimizations made by the compiler;
sizeof() is taken on the structure, an instance of the structure or a containing structure or an array of one of these. The length returned will be different on ARMLinux unless the structure just happens to be an even multiple of 4 bytes long. This isn't a problem in itself, but the program may use this value inappropriately;
sizeof() is assumed. Look for #defines and comments that mention the size of the structure, a containing structure or the array as these indicate potential problems;
in a mixed environment (using different compilers or a compiler switch), problems occur if a structure or pointer to a structure is passed between a caller and a called routine that have different alignment rules or different interior padding. In this case, the mere existence of structures that would be differently aligned or padded in a public header file is a defect.
A: This really depends on your goals.
If you are concerned with the long term portability of the code, you will find and remove all expectations about padding and alignment from it. How to do this is beyond the scope of this FAQ.
If you want to port a package to ARMLinux with minimal code changes or you suspect alignment problems and want a quick test, using the gcc extension __attribute__((packed)) will help in many cases.
If you want to arrange the header files of a library for binary compatibility between different alignment settings on StrongARM compilers, use __attribute__((packed)), explicitly insert padding bytes, and/or force alignment with unions or zero length arrays.
A: A C++ class is an extension of a struct and many of the same comments apply. In addition, inheritance and template classes introduce new ways of combining structures that can cause interior padding that is different between on ARMLinux and x86 systems. Name mangling may or may not be affected. This makes the problems more difficult to identify from the source code. C++ programs in particular need to be devoid of all expectations of interior padding and alignment.
This chapter contains information on the various ARM machines available around the world which are using ARMLinux.
Note: Aleph One currently supply ARMLinux distributions and documentation covering the Risc PC, LART, Assabet/Neponset and Psion5. The Documentation also covers the generic principles for many ARM devices. Where a device is not listed, Aleph One are able to get ARMLinux up and running on your hardware on the understanding that you supply the necessary kit and hardware documentation. We will also take care of passing back the necessary changes to the main kernel tree.
Aleph ARMLinux is currently available for Risc PC users although there are alternative RISC OS machines for which support exists in the Linux kernel. These include:
The RiscStation - this support is now functional but not yet quite ready for release. Watch the web sites for updates.
The Acorn Archimedes range of computers which include machines like the A3000 and
The A5000 series.
With regard to Linux installation on the Archimedes range, detailed information can be found on the ARMLinux web site. Alternatively, Chris Pringle's manual - available from http://latrigg.demon.co.uk/chris/linux.html/ - provides a useful resource for those who wish to install ARMLinux on an 8MB A5000.
ARMLinux is also available in proof-of-concept form for the Psion Series 5 and for the related Geofox PDA because of the efforts of the Linux 7k project. ARMLinux for Psion uses the standard 2.2.1 Linux kernel with the addition of a specific psion-arm patch. This port offers support for established Psion and Geofox-related drivers and is able to take advantage of a range of applications. Only very limited use of Linux can be made without the addition of a compact flash card to extend the available storage.
Work is also in progress on a suitable Graphical User Interface of which an interesting example is the API developed by the MicroWindows Project. MicroWindow's API is known as Nano X and is much like xlib. At the time of writing (November 2000), this is just becoming functional on the Psion.
Note: Aleph One Limited hope to have an ARMLinux distribution available for the Psion Series 5 by early 2001.
Distinctive features of ARMLinux for Psion include the
Development of ArLo or the ARMLoader which loads and executes Linux whilst Psion's EPOC OS is running.
Use of the Initrd virtual filing system image which contains a miniature version of Linux.
Additional information about the Linux 7k project is available from http://linux-7110.sourceforge.net/. Current information on how the project is progressing can similarly be obtained by joining the mailing list <linux-7110-request@sourceforge.net> which can be accomplished by writing "subscribe" in the subject area of your email. Linux 7k also maintain an ftp site at ftp://ftp.sourceforge.net although the mirror site at Imperial College London - ftp://ftp.sunsite.org.uk/Mirrors/sourceforge.net - is more convenient for European users. A comprehensive Linux 7k mini-HOWTO by Stephen Harris is similarly available from the project's web site.
Insofar as supplementary information about Geofox is concerned, the company web site is no longer available although hardware information is obtainable from ftp://ftp.linuxhacker.org/pub/geofox.
In a similar vein, up-to-date information on the Nano X project can be had by subscribing to the Nano X mailing list on <nanogui-subscribe@linuxhacker.org> or by pointing your browser to http://microwindows.censoft.com/.
Footbridge is a term which applies to DC21285- the PCI Core Logic device for the StrongARM processor. DC21285 appears in the NetWinder, in EBSA285 and in the CATS board.
Rebel.com's NetWinder range of computers include machines like the Office Server. This machine has been designed with the needs of home and small business users in mind who have need of a firewall/web/mail server which runs on Linux.
Distinctive features include support for:
Secure connection outside of a LAN via Progressive Systems's Smartgate VPN server.
Customisation of the user environment using specifications which are in the public domain.
Easy access to programs from http://www.netwinder.org/.
A default set of firewall rules which are useful in the prevention of IP spoof attacks.
EBSA285 or the Intel StrongARM SA-110/21285 Evaluation Board is a development environment for applications which will be based on the SA110 processor and 21285 Core Logic Chip.
EBSA285 can run Linux in addition to other OSs and is able to take advantage of a range of software from ARM and Cygnus.
Supplementary information on EBSA285 in the form of a product brief is available as a PDF file from the Intel Developers site at http://developer.intel.com/design/strong/quicklist/eval-plat/sa-110.htm/.
The Linux Advanced Radio Terminal (LART) is a compact energy efficient computer which was developed in order to conduct experiments in wireless multimedia. LART's standard configuration includes 32MB DRAM in addition to 4MB Flash ROM which is sufficient for the Linux kernel and a RAMdisk image. Setting up Linux on the LART is relatively straightforward because of the existence of the necessary patches in the main SA-1100 Linux patch. However, users will also need to acquire some LART-specific patches which are available as tarballs from http://www.lart.tudelft.nl/download.php3/. One such patch is the clock scaling patch which allows the user to customise the clock speed of the SA-1100 CPU.
Other distinctive features include:
Small size - 100mm x 60mm.
A modular design which is easily updatable.
Blob - LART's boot loader.
The availability of a C/C++ cross-compiler.
The original developers at the University of Delft (TU) don't currently produce LARTs other than as university research tools so interested readers should consider joining the LART mailing list at <lart@lart.tudelft.nl> for news of developments. Conversely, CAD files are available for use as is the LART software and LART-specific patches. To subscribe to the LART mailing list, send a message to <major-domo@lat.tudelft.nl> with the phrase "subscribe lart" in the message body. Alternatively, archives of the mailing list are available from http://www.lart.tudelft.nl/list/list.php3?arc=lart/. For general information on the project go to LART's web site at http://www.lart.tudelft.nl/.
This project - originally inspired by the Turbo Tortoise - encompasses a number of hardware and software initiatives together with associated tools which will be designed specifically for the aforementioned projects. PLEB was the brain-child of designers at the University of New South Wales http://cse.unsw.edu.au/~pleb/ who wanted to make a pocket computer which was able to run the Linux kernel.
Distinctive components of the PLEB project include the:
Development of the Photon - a credit-card sized StrongARM prototype for embedded and/or portable applications.
Atmel AVR board known as the Nova which has been used for small projects like the JTAG programmer.
Catapult - a firmware bootloader which will replace Blob - the bootloader of the LART project.
Gauntlet - an L4 micro-kernel for ARM.
Anvil - JTAG software for hardware programming and diagnostics.
Supplementary information on the PLEB project can be obtained by subscribing on-line to the PLEB mailing lists which include the general list <pleb@cse.unsw.edu.au> or the hardware-specific list <pleb.hardware@cse.unsw.edu.au>.
An SA-1110 evaluation board which may be repackaged as a PDA. Notable features include:
The availability of Win32 programming utilities like the SA-1110 Development Board, JTAG Programming Software V0.3 and Jflash-Linux which have been ported to Linux by Nicholas Pitre.
Neponset - a SA-1111 Development module which can deal with system lock ups which may in turn be caused by interrupt handling difficulties.
Use of the 2.4 kernel series with support for the Assabet and Neponset via a patch chain.
Alternative boot methods - the Angelboot utility is one example.
The capacity to run MicroWindows although a backlight power source needs to be added.
Work is also underway on support for Compact Flash on the Assabet and on PCMCIA support for the Neponset (http://www.compactflash.org/). In addition, the Socket LP-E CF + Card is now operative (http://socketcom.com/lpecfmp.htm/) as is the IBM Microdrive (http://www.storage.ibm.com/hardsoft/diskdrdl/micro/).
A project which is known as the Simple Inexpensive Multilingual Computer (Simputer http://www.simputer.org/ ). The Simputer exists to produce a low-cost Assabet-like PDA.
Distinctive features include:
A smart card reader.
Use of text-to-speech audio facilities.
Use of a browser which renders Information Markup Language (IML) which is smart card aware.
Touch screen and a local-language software interface.
More information is available from the Simputer mailing list which you can either join on-line (http://www.simputer.org/ or by writing "subscribe" in the body of an email which should be addressed to <simputer@egroups.com>.
A pocket computing initiative which uses Linux and the standard GNU tools to offer the following distinctive features.
Flexible interfaces for adding custom-made daughter cards.
Support for speech recognition.
Additional technical information on the Itsy Pocket Computer and on the Memory Daughter Card - both for Version 1.5 - can be downloaded from the Itsy web site at http://research.compaq.com/wrl/projects/itsy/index.html/. A number of slide shows are also available from the same web site which showcase the project's accomplishments to date.
The basic project - initiated by the Swedish Royal Institute of Technology http://www.it.kth.se/edu/gru/Fingerinfo/telesys.finger/Mobile.VT98/badge.html/ - uses an Intel StrongARM processor, sensors, built-in communication links and a PCMCIA interface. The complete schematic for this device is available from the SmartBadge web site as are a series of PDF files.
Particular features of the SmartBadge III Project include:
Speech synthesization.
giveio.sys - device driver for NT 4.0.
instdrv.zip - a transient device driver which allows the user to load and start a device driver without necessarily having to permanently install it.
tar.zip - a miscellaneous collection of TAP master code.
TAP master documentation which is available from the SmartBadge web site
A StrongARM-based embedded computing research prototype which is intended for use with a variety of applications http://crl.research.compaq.com/projects/personalserver/default.htm/. One recent use of the Personal Server was in the form of a Compaq Robot Controller at MIT's Autonomous Robot Design Competition (http://mit.edu/6.270/). The Compaq Project is also noteworthy because of its use of a Debian based Linux distro - kernel 2.2.9 - from Chalice Technology (http://www.chaltech.com/. The distro currently fills an 8MB filesystem and therefore needs a remote connection to a filesystem in order to take advantage of additional applications.
A range of documents are available which are pertinent to this project including:
The Personal Server Users' Manual which examines bootldr, Linux and NetBSD.
Documentation for the Java package for the Personal Server with RCC.
There are also Compaq Server mailing lists at <robot-controller@crl.dec.com> and <6.270-organizers@mit.edu>. The latter list focuses on the MIT 6.270 contest.
Developers may also be interested in Cameron Moreland's HOWTO which is specifically concerned with running Linux on an Intel Brutus Board although it also contains much of relevance to those who intend to install Linux on a range of ARM machines. This document is available from the Aleph One web site http://www.aleph1.co.uk/armlinux/resources.html/.
There are various places you can get help which include:
This includes specific information relating to a selection of ARMLinux devices and generic info on tools and techniques.
Our web site will also grow to contain much useful ARMLinux information.
http://www.arm.linux.org.uk/ will take you to Russell King's main ARMLinux site which is the definitive source for current ARMLinux kernel updates, ARM architecture information and general info.
The Debian Project (http://www.debian.org/) provides a number of guides and mailing lists which cater for different audiences. Reference has however only been made to documentation which is complete and up to date. Interested readers should consequently refer to The Debian Documentation Project's web page (http://www.debian.org/doc/ddp/) for details of work in progress.
http://www.debian.org/doc/packaging-manuals/developers-reference/
ftp://ftp.debian.org/dists/stable/main/disks-*/current/doc/dselect-beginner.*/
There are a number of mailing lists for this Linux distribution but <debian-user@lists.debian.org> is a good place to direct your questions. To subscribe, type "subscribe" in the subject line and mail to <debian-user-REQUEST@lists.debian.org>
In order to find out about other mailing lists, take a look at mailing-lists/txt which is on the Aleph One CD in the Doc directory.
You can also refer to the section called Mailing Lists for details of ARM-specific lists.
You can similarly learn how to solve Debian-specific problems by pointing your browser to http://www.debianhelp.org/.
There are many news groups which provide useful information which is not strictly speaking ARMLinux specific but which is none the worse for this including:
comp.os.linux.advocacy which will keep you in touch with current software releases.
comp.os.linux.answers which provides the definitive source of information for current HOWTOs and FAQs.
uk.comp.os.linux which is a useful source of help.
This directory contains information which will be of interest to users and developers including:
The Debian/GNU Linux FAQ in HTML, PostScript and Plain Text formats.
The Debian Constitution.
How it all started...
How to subscribe to the Debian mailing lists.
Describes Debian's commitment to free software.
How to unpack a Debian source package.
Developers' Pretty Good Privacy (PGP) keys.
How to report a bug in Debian.
Documentation for developers.
If you bought this book with a CD direct from Aleph One then it comes with technical support. Please email first, but if things get complicated than a phone call may be useful, quoting your registration code, and we will do our best to help. This service is currently focused on helping you to get ARMLinux installed and set up; queries about other aspects of Linux are probably best directed elsewhere.
The support email address is <armlinux-support@aleph1.co.uk>. The support phone number is 01223 811679.
There are now quite a few, and which one(s) are most appropriate, depends on your level of experience and area of interest.
<linux-arm@lists.arm.linux.org.uk>. This is the main ARMLinux list which covers ARMLinux topics not specific to and of the other mailing lists. This covers all architectures that ARMLinux is used on (Desktops, PDAs, development boards etc), so much of the discussion is not specifically related to your machine. Users who have ceased to be newbies will find this of interest. To subscribe send "subscribe" (in the body of the message) to <linux-arm-request@lists.arm.linux.org.uk>, or use the web interface at:http://www.arm.linux.org.uk/armlinux/mailinglists.shtml.
<linux-arm-kernel@lists.arm.linux.org.uk> is for kernel-related discussions, generally of a technical nature. This normally covers the kernel, related tools and new hardware. If you are a Linux beginner you won't understand a word of what goes on here :-) This is the place for those interested in the grubby stuff. To subscribe send "subscribe" (in the body of the message) to <linux-arm-kernel-request@lists.arm.linux.org.uk>.
<linux-arm-announce@lists.arm.linux.org.uk> is a moderated low-traffic list for announcements relevant to ARMLinux. To subscribe send "subscribe" (in the body of the message) to <linux-arm-announce-request@lists.arm.linux.org.uk>.
<ARMLinux-toolchain@lists.armlinux.org>This list serves mainly as a place for developers to discuss any aspect of the GNU development toolchain on the ARM architecture (including other operating systems). It's also a diagnostic forum to an extent, if you're having problems. http://www.armlinux.org/cgi-bin/mailman/listinfo/armlinux-toolchain and fill in the form. An archive of submissions to this group is also available from http://www.armlinux.org/pipermail/armlinux-toolchain/
There is a mailing list specifically for people new to ARMLinux, where you are positively encouraged to ask stupid questions. This is aimed at users as opposed to developers, particularly RISC OS machine users and PDA users ,and is at <ARMLinux-newbie@lists.armlinux.org>. This is not the place to ask about toolchains, the kernel, or any development-type questions. This is the place for installation problems, and questions about software that just crashes or doesn't seem to work right. We recommend that all users join this list so that the community can help each other out and compare notes. An archive of submissions to this group is also available from http://www.armlinux.org/pipermail/armlinux-newbie/.
If you are using, or working on, the Debian ARM distribution then <debian-arm@lists.debian.org> is the place to talk to other users and developers about any ARM-specific issues. Debian has loads of maiing lists for other aspects of the distribution.
<emdebian-discuss@lists.sourceforge.net> is a project to make Debian work on small embedded systems and PDAs. It supplies a very good Toolchain and experimental software (CML2+OS)to generate small installations and kernels from the huge Debian archve. It needs some more active developers - join this list if you think you can help or are interested in the design process.
<lart@lart.tudelft.nl> is the place for all tings LARTy. All LART users should be subscribed here. Its the place to get hardware or software help and discuss the possibilities of your LART.
<linux-7110@sourceforge.net> is concerned with the Psion 5/5mx/7 port of ARMLinux. This is a list both for developers and users. Information for the 5mx has recently been obtained from Psion so the list has been revitalised with the new porting activity.
<sa1100-linux@pa.dec.com> is for those who are interested in StrongARM-specific issues - primarily kernel development.
The iPAQ has proved a very popular ARM/PDA development platform due to Compaq's support. There is an active community working on distributions and the hardware on this list: <ipaq@handhelds.org>. Handhelds.org also has other lists, not necessarily specifc to ARM.
There are many good books about UNIX and Linux. None of them are aimed specifically at ARMLinux but most will nevertheless be helpful. A list of books and ISBNs which we have found helpful is provided in the bibliography.
A number of commercially available books and sample chapters are also available on-line including:
Learning GNU Emacs, Debra Cameron, Bill Rosenblatt, and Eric Raymond, 1565921526, O'Reilly & Associates, 1996.
Debian GNU/Linux Bible, Steve Hunger, Randolph Chung, and Steve Chung, 0764547100, IDG Books Worldwide, 2000.
The TeXbook: A Complete User's Guide to Typesetting with TeX, Donald Knuth, 0201134489, Addison-Wesley, 1998.
LaTeX. A Document Preparation System: User's Guide and Reference Manual, Leslie Lamport, 2nd Edition, 0201529831, Addison-Wesley, 1998.
Sams Teach Yourself GIMP in 24 Hours, Joshua Pruitt and Ramona Pruitt, 0672315092, Sams Publishing, 1999.
Beginning Linux Programming, Richard Stones and Neil Matthew, 2nd Edition, 1861002971, Wrox Press, 1999.
Running Linux, Matt Welsh, Matthias Kalle Dalheimer, and Lar Kaufman, 3rd Edition, 156592469X, O'Reilly & Associates, 1999.
Aleph One will be monitoring the various ARMLinux mailing lists, and will improve this distribution according to the sorts of requests and problems we see.
We are also keen to receive email on <devel-armlinux-feedback@aleph1.co.uk> with suggestions for improvements.
And you can write to us at Aleph One Ltd, The Old Courthouse, Bottisham, CAMBRIDGE, CB5 9BA, UK
| Key Combination | Function |
|---|---|
| C-a | move cursor to beginning of line |
| C-b | move back one character |
| C-d | delete a character |
| C-e | move cursor to end of line |
| C-f | move forward one character |
| C-k | delete the line |
| C-n | move cursor to next line |
| C-p | move cursor to previous line |
| C-v | page down |
| C-x u | undelete |
| C-x C-c | exit |
| C-x C-f | find a file |
| C-x C-s | save file |
| C-x C-v | find alternative file |
| C-x C-w | write to a file with new filename |
| ESC b | back one word |
| ESC d | delete word |
| ESC f | move cursor by one word |
| ESC < | move to beginning of file |
| ESC > | move to end of file |
| ESC v | page up |
| Key | Function |
|---|---|
| b, B | back one word |
| cc | change current line |
| CTRL-B | scroll one screen back |
| CTRL-F | scroll one screen forward |
| CTRL-G | show current line |
| cw | change word |
| :d | delete a character |
| :dd | delete current line |
| :dw | delete a word |
| :/expression | forward search for expression |
| :?expression | backward search for expression |
| :e! | wipe session edits |
| h, j, k, l | left, down up or right |
| i, a | insert text before/after cursor |
| p, P | put yanked/copied text after/before cursor |
| :q | quit file |
| r | replace character |
| :set nu | set numbers down left margin |
| set wm=x | insert newline 'x' distance from right margin |
| :sh; shell_type CTRL-D | access a shell |
| w, W | forward by a word |
| :w | save file |
| :wq | save and quit file |
| x | delete character |
| yw | yank/copy a word |
| yy | yank/copy a line |
| ZZ | save and quit file |
| xp | transpose two letters |
1998-2000 Jan-Derk Bakker, TU Delft and others™.
HARDWARE INFORMATION shall mean the CAD databases, schematics, logic equations, bills-of-materials, manufacturing and assembly information, documentation, and any associated information included in this archive.
DEVICE shall mean a physical object based on all or part of the HARDWARE INFORMATION.
This HARDWARE INFORMATION is copyrighted by Jan-Derk Bakker, TU Delft and other parties. The following terms apply to all files associated with the HARDWARE INFORMATION unless explicitly disclaimed in individual files.
The authors hereby grant non-exclusive permission to use, copy, modify, distribute, and license this HARDWARE INFORMATION, and to build, sell or otherwise distribute an unlimited number of DEVICES for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, licence, or royalty fee is required for any of the authorized uses. Modifications to this HARDWARE INFORMATION may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS HARDWARE INFORMATION OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS HARDWARE INFORMATION IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Application Binary Interface.
A window manager which both emulates and builds upon NEXTSTEP(tm). Features include configurable desktops and the option to use a range of utilities via a series of modules. AfterStep is GNOME-compliant and works with KDE.
A version of the GNU/Linux operating system targeted at ARM processors.
SA-1110 development platform which is suited to the production of handheld and palm devices.
A Linux distribution which is made up of a kernel, basic tools and applications software. Debian is distinctive because it is produced entirely by volunteers who share a commitment to the development and dissemination of free software. The name derives from the people who founded the Debian Project: Debra and Ian Murdock.
An extensible editor with modes for programming, writing and the creation of simple drawings. Emacs has many of the characteristics of a self-contained working environment.
The normal Linux filesystem
A window manager which is popular amongst memory-conscious users. Features included extensibility via a series of modules, support for virtual desktops and a 3D-look.
An image creation and photo retouching package - extremely powerful. Application currently confined to Linux although ports to Windows and OS/2 are ongoing.
GNOME or the GNU Object Model Environment is best regarded as a desktop rather than as a window manager. GNOME will work with any window manager which is GNOME-compliant but the Enlightenment w.m. seems to be the default choice.
A synonym for the Linux system. In fact, GNU/Linux is the more accurate term because it makes a distinction between the kernel - Linux - and much of the software which was developed by the GNU Project in association with The Free Software Foundation.
Graphical user interface. The typical 'desktop' as used by RISC OS, Windows, the Mac and so on. Approximately synonymous with the older term WIMP.
When working with an embedded system, this is the desktop machine that contains the development environment. Files are uploaded from this machine to the target device.
A type of hard drive interface. Provided as standard on Risc PC motherboards. It can have up to two physical drives, configured as 'master' and 'slave'.
A form of hypertext help page which can be read from within Emacs or by using the info command. These pages can also be printed. Info pages are created with TeXinfo.
KDE or the K Desktop Environment allows for easy navigation with the aid of the K File Manager, Virtual Desktops and use of KDE-based applications like K-Edit. Currently, installed by default on many Linux distributions with notable exceptions of RedHat (GNOME) and Debian (Window Maker).
Any server running on a LAN (Local Area Network). Normally used for file or printer sharing. RISC OS uses Acorn Access. Linux has many, including SAMBA, which is equivalent to an NT or Windows 9x server, NFS (Network File System), and LPD (Printer sharing).
The Linux Advanced Radio Terminal (LART) is a compact energy efficient, embedded computer with a standard configuration of 32MB DRAM and 4MB Flash ROM. Originally developed at the University of Delft.
A command which is used to view the contents of a file one screen at a time. Similar commands include cat, more and tail.
A collaborative project which aims to produce free high quality documentation about GNU/Linux.
A Database Management System which is available for both Linux and Windows.
Network Filing System. The standard UNIX system for sharing disks over the network.
An office-productivity suite which is approximately comparable to MS Office. It was previously known as StarOffice before it became an open-source project. OpenOffice comes with OpenWriter - a word processor, OpenCalc - a spreadsheet and OpenImpress - a presentational package. OpenOffice requires the X-Windows System although a version exists for Windows.
This is a less-confusing name for what is also called 'Free Software'. It describes the development method used for many pieces of software, including the Linux kernel, where the source is freely available for anyone to work on, or modify, or learn from, or use in other projects.
A powerful interpreted language, which is particularly good for text-processing. Also often used for Web CGI scripts. Famous for being 'powerful but cryptic'. Python is very similar but less cryptic.
A way of connecting two programs together so that the output of one program becomes the input of another.
An umbrella term for a number of hardware and software initiatives which include the development of a credit-card sized StrongARM prototype for embedded systems and Catapult - a replacement bootloader for Blob.
A type of peripheral interface, allowing up to 7 (or even 15) devices. Usually used for scanners, external drives, expansion drives and CDs.
The UNIX shell processes user commands. It has extensive scripting functions which let you write small programs to automate tasks. These are called scripts. A shell script is equivalent to a RISC OS Obey file or a DOS Batch file, but much more flexible.
RISC OS normally runs in the familiar desktop. Some utilities (eg hard drive formatters) run 'outside' the desktop, disabling the normal multi-tasking that goes on. Thus this is referred to as 'single-tasking' mode. All other RISC OS tasks are suspended until the utility quits.
A file or partition used by the kernel to allow the machine to appear to have much more memory than it has.
When working with an embedded device and a separate development system, this is the name for the embedded device. Normally the work is done on the development system or host' machine.
A typesetting system which is used to create highly structured documents which may contain alot of mathematics. A number of popular TeX macro packages exist but the most notable is LaTeX.
A documentation system which can produce both on-line and printed documentation from one source file. The source file may be processed by TeX or Groff to create printed output and by makeinfo and Emacs to create an info file.
A standard text-editor which is available for nearly every type of UNIX system.
A modified version of Vi with additional features. Easy to use for Vi veterans.
Software that sends web site pages back to browsers. Also referred to as an HTTP daemon (HTTP being the protocol used for web pages). If you run this software then you have set up your own web site.
A window manager which offers mutiple workspaces, graphical configuration tools, pinnable menus and drag-and-drop support. The default window manager for Debian ARMLinux.
An X-Windows System program that determines how 'X' deals with your desktop and client windows.
Linux's graphical interface which is commonly know as X11 or more simply as 'X'.