SystemTap on Fedora ARM
The ARM processor is an extremely popular processor with a variety of Linux distributions available, including Fedora (http://fedoraproject.org/wiki/Architectures/ARM). The ARM is a secondary architecture for Fedora and currently has a Fedora 13 release candidate available rather the Fedora 15 that is available for x86 processors.
It is possible to build the current SystemTap from the git repository for Fedora 13 on arm. It is also possible to build the SystemTap binary rpms if one turns off the with_crash flag in the systemtap.spec files.
One aspect that the ARM processors differ greatly from x86 processors is ARM has been mostly used as an embedded processors. For these applications developer usually configure the ARM kernels features during compile. Thus, rather than having a generic kernel that runs on AMD, Intel, and VIA X86 processors and dynamically determines which features the processor support each ARM platform needs a custom configured kernel. The result of this is that there are not usually kernel RPMs for ARM platforms. ARM Fedora developers are starting to address this (http://fedoraproject.org/wiki/Architectures/Fedora_ARM_Kernels), but the kernel-debuginfo and kernel-devel rpm packages are not usually available. The systemtap rpm needs those packages around to be able to build the instrumentation module.
Need to build a kernel to make a kernel build tree that can be used by systemtap. This could be cross compiled or natively built. This document will limit itself to the cross compiled kernel where the kernel is built on a x86_64 host machine machine for an ARM target.
The cross compiler mentioned in the following Fedora URL is relatively old and does not understand the "-mcpu=cortex-a8" option needed to build kernels for some of the newer ARM processors:
Ended up install the boostrap arm fedora 15 bootstrap tools and building the compiler in there. Information on the tool at:
The git clone of this will create a bootstrap directory. This tools needs srpms. Downloaded the dvd iso of the srpms, loop mount the dvd iso, and link to the SRPMs to the dvd iso mount point. Also made a SRPMlocal directory. Then in bootstrap directory:
./stage1 kernel-headers ./stage1 binutils ./stage1 gcc-host ./stage1 glibc-headers ./stage1 gcc-libgcc ./stage1 glibc
At this point have cross compile tools in bootstrap/install/bin. Alternative you might also be able to use cross compiler RPMs mentioned in:
http://lists.fedoraproject.org/pipermail/arm/2011-July/001646.html
For uImage will also need the uboot-tools so as root:
yum install uboot-tools
Grab the kernel for my Efika MX smartbook platform at:
- git://gitorious.org/efikamx/linux-kernel.git
Then adding environment variable for the cross compile (adjust as needed):
export PATH=/home/wcohen/stuff/efikamx/bootstrap/install/bin:$PATH export ARCH=arm export CROSS_COMPILE=armv7hl-redhat-linux-gnueabi-
Setup configuration for the efika mx with:
make mx51_efikamx_defconfig
Make sure the following config entries in the .config are active (=y or =m):
- CONFIG_DEBUG_FS
- CONFIG_KPROBES
- CONFIG_DEBUG_INFO
- CONFIG_RELAY
- CONFIG_PROFILING
- CONFIG_TRACEPOINTS
Check to see whether there are any additional CONFIG_* that need to be set:
make oldconfig
Then start building with (other platforms may use zImage instead of uImage):
make vmlinux uImage modules
Now time to install the code on an SDcard. The card already has an bootable fedora install as in /boot and /root partitions. As root:
export PATH=/home/wcohen/stuff/efikamx/bootstrap/install/bin:$PATH export ARCH=arm export CROSS_COMPILE=armv7hl-redhat-linux-gnueabi- export VERSION=2.6.31.14.23-efikamx make modules_install INSTALL_MOD_PATH=/media/root cp arch/arm/boot/uImage /media/boot/uImage-$VERSION
Unmount all the SDcard partions on host. Move SDcard to target machine. Boot it up with the old kernel.
Time Update to new kernel. Make sure that uboot-tools rpm are installed on target. As root on ARM target machine:
cd /boot export VERSION=2.6.31.14.23-efikamx dracut -f uInitrd-$VERSION.img $VERSION mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs \ -d /boot/uInitrd-$VERSION.img /boot/uInitrd-$VERSION cp uImage-$VERSION uImage cp uInitrd-$VERSION uInitrd mkimage -A arm -O linux -a 0 -e 0 -T script -C none \ -n "EfikaMX Boot Script" -d /boot/boot.scr.in /boot/boot.scr
Reboot the machine to start the new kernel.
Test out systemtap ability to generate scripts on host for a different target architecture based on the information in:
Build the systemtap instrumentation module with the following command run as a normal user:
export KERNEL_SRC=/home/wcohen/stuff/efikamx/kernel/linux-kernel stap -a arm -B CROSS_COMPILE=armv7hl-redhat-linux-gnueabi- \ -r $KERNEL_SRC \ -m vfs_read -e 'probe vfs.read {printf("read performed\n"); exit()}'
Copy the vfs_read.ko file to the target machine. Install the systemtap-runtime rpm from:
http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=127355
Then on ARM target machine run as root the following:
staprun vfs_read.ko
Will get some thing like the following output on the ARM target system
read performed
As work progresses on Fedora ARM steps such as cross compiling the kernel and building the systemtap module on a separate machine will be eliminated.