Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
kerneldev [2012/02/21 14:37] – [Kernel Debugging] armelf | kerneldev [2013/08/22 13:36] – [3.0.x Kernel series] stuw |
---|
[[http://en.wikipedia.org/wiki/Nvidia_Tegra#Tegra_2_series|NVidia's Tegra2]]((http://www.nvidia.com/object/tegra-2.html)), which is dual-core [[http://arm.com|ARM]] [[http://en.wikipedia.org/wiki/Cortex-A9|Cortex-A9]], supports only [[http://en.wikipedia.org/wiki/ARM_architecture#VFP|VFPv3]] ((http://www.arm.com/products/processors/technologies/vector-floating-point.php)) and **not** [[http://en.wikipedia.org/wiki/ARM_architecture#Advanced_SIMD_.28NEON.29|NEON]] ((http://www.arm.com/products/processors/technologies/neon.php)) extensions which are more powerful. | [[http://en.wikipedia.org/wiki/Nvidia_Tegra#Tegra_2_series|NVidia's Tegra2]]((http://www.nvidia.com/object/tegra-2.html)), which is dual-core [[http://arm.com|ARM]] [[http://en.wikipedia.org/wiki/Cortex-A9|Cortex-A9]], supports only [[http://en.wikipedia.org/wiki/ARM_architecture#VFP|VFPv3]] ((http://www.arm.com/products/processors/technologies/vector-floating-point.php)) and **not** [[http://en.wikipedia.org/wiki/ARM_architecture#Advanced_SIMD_.28NEON.29|NEON]] ((http://www.arm.com/products/processors/technologies/neon.php)) extensions which are more powerful. |
| |
As of 2012/02/18, the most stable kernel is 3.0.19, and [[http://gitorious.org/~marvin24/ac100/marvin24s-kernel/|Marc Dietrich]], the ac100 kernel maintainer, started to work on [[http://gitorious.org/~marvin24/ac100/marvin24s-kernel/commits/chromeos-ac100-3.2-exp|kernel 3.2.x series]] for AC100. | As of 2012/06/28, the most stable kernel is [[http://gitorious.org/~marvin24/ac100/marvin24s-kernel/commits/chromeos-ac100-3.0|3.0.19]]. This kernel is based on the original work made by [[http://git.chromium.org/gitweb/?p=chromiumos/third_party/kernel.git;a=summary|Google]]. Work has been started on a [[http://gitorious.org/ac100/marvin24s-kernel/trees/linux-tegra-nv-ac100-3.1-exp|3.1.10]] kernel for AC100, which is based on the work of [[http://nv-tegra.nvidia.com/gitweb/?p=linux-2.6.git;a=summary|NVIDIA]]. The next Ubuntu version 12.10 will be based upon this kernel. There also exists a very experimental version of a mainline kernel [[http://gitorious.org/~marvin24/ac100/marvin24s-kernel/commits/for-next|(for-next)]] with a minimal amount of patches. |
| |
The most hotspot in kernel development is NVEC driver (incomplete implementation and marginal stability issue), sound driver (noise annoyance, automatic switch between Speaker/Headphone (not implemented at all in ASoC but can be easily done with a userspace daemon)) and ''rt2800usb'' Wifi driver (some stability issues and high stress on specific memory pool (reduced by **echo 32000 > /proc/sys/vm/min_free_kbytes**)). | The most hotspot in kernel development is NVEC driver (incomplete implementation and marginal stability issue), sound driver (noise annoyance, automatic switch between Speaker/Headphone (not implemented at all in ASoC but can be easily done with a userspace daemon)) and ''rt2800usb'' Wifi driver (some stability issues and high stress on specific memory pool (reduced by **echo 32000 > /proc/sys/vm/min_free_kbytes**)). |
===== 3.0.x Kernel series ===== | ===== 3.0.x Kernel series ===== |
TODO | TODO |
| === From marvin24s git === |
| To build the kernel native on the ac100, do the following: |
| <code> |
| git clone -b chromeos-ac100-3.0 git://gitorious.org/~marvin24/ac100/marvin24s-kernel.git |
| cd marvin24s-kernel |
| make paz00_defconfig |
| make zImage modules |
| make modules_install |
| </code> |
| You will find the kernel in arch/arm/boot/zImage, which you can flash with abootimg (see above). |
| |
| Cross-Compiling: |
| If you don't have the time to wait for a build on the AC100 (~ 30 minutes), you can try with a cross-compiler on your favorit desktop machine. How to setup such an environment is out of scope of this article, but google is your friend. |
| |
| The procedure is similar to the native one: |
<code> | <code> |
git clone -b chromeos-ac100-3.0 git://gitorious.org/~marvin24/ac100/marvin24s-kernel.git | git clone -b chromeos-ac100-3.0 git://gitorious.org/~marvin24/ac100/marvin24s-kernel.git |
cd marvin24s-kernel | cd marvin24s-kernel |
| make paz00_defconfig ARCH=arm |
| make zImage modules INSTALL_MOD_PATH=/tmp INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- |
| make modules_install INSTALL_MOD_PATH=/tmp INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- |
| </code> |
| |
| The INSTALL_MOD_PATH and INSTALL_MOD_STRIP arguments are optional, but convenient. After this, you will find |
| the stripped modules under /tmp/lib/modules/<kernel-version>. |
| |
| Similar procedures can be used for the 3.1 and for-next kernels. |
| |
| Some note on the needed kernel command lines: |
| The 3.0 series uses a reserved video memory which is created by adding "mem=448M@0" to the kernel command line. |
| Later kernels can reserve this memory by themself, thus adding "mem=512M@0" is required here. |
| |
| The for-next series is very special (you may have guessed that already). First, everything is setup by device-tree info (if you don't know what a device-tree is, yes, google is your friend again). This means that beside the kernel and the modules, you also have to compile the device-tree, which is done by the "dtbs" make target. After that, the compiled device-tree (in arch/arm/boot/tegra20-paz00.dtb) must be concatenated to the kernel image. So something like |
| <code> |
| cat arch/arm/boot/tegra20-paz00.dtb >> arch/arm/boot/zImage |
| </code> |
| should be sufficient. Make sure you used paz00_defconfig, because this kernel seems to ignore the parameters submitted by the bootloader. |
| |
| === Stock Ubuntu 12.04 Kernel === |
| |
| Step by step: Recompiling the Ubuntu stock kernel natively (for example to patch it) coming from a stock Ubuntu 12.04 install. |
| As of writing the kernel-version is **3.0.27** and will have to be replaced when another kernel comes out/is used. The created files will be copied to a safe place (/home/turbo/Downloads/ in my case) |
| |
| Become root for all steps |
| <code>sudo su</code> |
| Install dependencies for the kernel and build it: |
| <code> |
| apt-get build-dep linux-ac100 |
| apt-get install build-essential lzop |
| cd /usr/src/ |
| apt-get source linux-ac100 |
| cd linux-ac100-3.0.27/ |
| </code> |
| Now if you want the original Ubuntu config do |
| <code>cp /boot/config-$(uname -r) .config</code> |
| If you want the standrad ac100 config instead do: |
| <code>make paz00_defconfig</code> |
| Apply patches if wanted. In this example I use gordans overclocking patches from [[http://www.altechnative.net/2011/12/31/overclocking-the-toshiba-ac100/|his site]]. |
| <code>patch -p1 < tegra_common.patch |
| patch -p1 < tegra_1200.patch</code> |
| (Note that one patch didn't apply cleanly, but the errors were pretty obvious and easy to fix manually.) |
| |
| <code> |
| make -j3 INSTALL_MOD_STRIP=1 zImage modules |
| make -j3 modules_install |
| cp arm/boot/zImage /home/turbo/Downloads/zImage1200-3.0.27 |
| cp .config /boot/config-3.0.27 |
| </code> |
| |
| Get the bootimg.cfg |
| <code>cd /boot/bootimg.cfg /home/turbo/Downloads/</code> |
| Adjust the bootimg.cfg to your needs. Most importantly giving it a cool greeting text of course! |
| |
| Create the initrd |
| <code> |
| cp .config /boot/config-3.0.27 |
| update-initramfs -k 3.0.27 -c |
| cp /boot/initrd.img-3.0.27 /home/turbo/Downloads/initrd1200-3.0.27.img |
| </code> |
| |
| Create the final image |
| <code>cd /home/turbo/Downloads/ |
| abootimg --create part6_1200-3.0.27.img -f bootimg.cfg -k zImage1200-3.0.27 -r initrd1200-3.0.27.img</code> |
| In my case (10K, Android 2.2) the boot partition is partition 6 as seen by nvflash and /dev/mmcblk0p4 as seen from Ubuntu. Make sure you flash to the right partition, this means: `cat /proc/partitions` has to show the partition as 8.0 MiB and `sudo abootimg -i /dev/mmcblk0p4` has to show "Android boot Image" in the first line. |
| |
| Double-check and create a backup of the boot partition: |
| <code>dd if=/dev/mmcblk0p4 of=/home/turbo/Downloads/part6-$(uname -r).img</code> |
| Size of the original is 8388608 aka 8.0M. This backup wont help you if it's //on// your ac100, so: |
| Be sure to copy this image somewhere else. |
| |
| Be sure to copy this image somewhere else. Really. |
| |
| Flash the image |
| <code>dd if=/home/turbo/Downloads/part6_1200-3.0.27.img of=/dev/mmcblk0p4</code> |
| |
| Reboot. |
| |
| ===== 3.10.x Kernel series ===== |
| 3.10 build process is close to 3.0 for-next. |
| Device-tree is mandatory, you need to build it and concatenate with a kernel: |
| <code> |
| make dtbs |
| cat arch/arm/boot/tegra20-paz00.dtb >> arch/arm/boot/zImage |
</code> | </code> |
| But 3.10 don't use paz00_defconfig anymore. Instead is uses tegra_defconfig (main idea of device-tree is to have all-in-one kernel and choose drivers on boot time using device-tree): |
| <code>make tegra_defconfig</code> |
| |
==== Kernel Debugging ==== | ==== Kernel Debugging ==== |
| |
TODO | TODO |
| |
| [[http://kernelnewbies.org/KernelHacking|Kernel Hacking]] |
| |
=== GDB and KGDB === | === GDB and KGDB === |
| |
TODO | TODO |
| |
| http://kgdb.sourceforge.net |
| |
== Remote debugging session == | == Remote debugging session == |
| |
[[http://www.ibm.com/developerworks/linux/library/l-systemtap/index.html|Linux introspection and SystemTap, An interface and language for dynamic kernel analysis]] by [[http://www.ibm.com/developerworks/linux/library/l-systemtap/index.html|M. Tim Jones]] | [[http://www.ibm.com/developerworks/linux/library/l-systemtap/index.html|Linux introspection and SystemTap, An interface and language for dynamic kernel analysis]] by [[http://www.ibm.com/developerworks/linux/library/l-systemtap/index.html|M. Tim Jones]] |
| |
| [[http://dtrace.org/blogs/brendan/2011/10/15/using-systemtap/|Using SystemTap]] by [[http://dtrace.org/blogs/brendan/about/|Brendan Gregg]] |
| |
| [[http://sprocket.io/blog/2007/11/systemtap-its-like-dtrace-for-linux-yo/|SystemTap: It's like dtrace for linux, yo.]] by [[http://sprocket.io/blog/contact/|Thomas Strömberg]] |
| |
| [[http://sourceware.org/systemtap/examples/|SystemTap Examples]] |
| |
Examples written by Paul Fertser for tracking [[hardware_specs?&#keyboard_touch_led_battery_controller|NVEC]] activities (this assumes you're crosscompiling and then manually scp'ing and staprun'ing modules) : | Examples written by Paul Fertser for tracking [[hardware_specs?&#keyboard_touch_led_battery_controller|NVEC]] activities (this assumes you're crosscompiling and then manually scp'ing and staprun'ing modules) : |
| |
[[http://sourceware.org/systemtap/wiki/SystemtapDtraceComparison|SystemTap vs. DTrace]] | [[http://sourceware.org/systemtap/wiki/SystemtapDtraceComparison|SystemTap vs. DTrace]] |
| |
| === ftrace === |
| |
| TODO |
| |
| [[http://lwn.net/Articles/365835/|Debugging the kernel using Ftrace - part 1]] |
| |
| [[http://lwn.net/Articles/366796/|Debugging the kernel using Ftrace - part 2]] |
| |
| http://elinux.org/Ftrace |
| |
| [[https://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_rostedt.pdf|Ftrace Linux Kernel Tracing]] by Steve Rostedt |
| |
| [[http://git.kernel.org/?p=linux/kernel/git/rostedt/trace-cmd.git;a=summary|Home of trace-cmd and kernelshark]] |
===== Git-Fu ===== | ===== Git-Fu ===== |
TODO | TODO |
| |
[[http://www.eecs.harvard.edu/~cduan/technical/git/|A tutorial on Git]] by Charles Duan. | [[http://www.eecs.harvard.edu/~cduan/technical/git/|A tutorial on Git]] by Charles Duan. |
| |
| [[http://schacon.github.com/git/gittutorial.html|official Git tutorial]] |
| |
====== Kernel Hot patching ====== | ====== Kernel Hot patching ====== |