Site Tools


kerneldev

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
kerneldev [2012/02/21 01:57] – [Kernel Debugging] armelfkerneldev [2014/06/21 18:57] (current) – [Mainline Git Kernel] santox
Line 5: Line 5:
 [[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 [[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**)).
Line 43: Line 43:
 You can extract zImage and corresponding modules from these packages. You can extract zImage and corresponding modules from these packages.
  
-=== RPM ===+=== From RPM ===
  
-TODO by turbo_ac100! :-^+==Using alien== 
 +  * ''alien --to-tgz linux-image-XXX.rpm'' 
 +  * ''tar xf linux-image-XXX.tgz''
  
-=== DEBs ===+=== From DEB === 
 +Get a kernel deb, for example http://startx.ro/~jani/linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb
  
-  from oneiric with http://startx.ro/~jani/linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb +  apt-get install alien +==Using alien== 
-  * alien --to-tgz linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb +  ''alien --to-tgz linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb'' 
-  * tar xf linux-image-3.0.19-1-ac100-3.0.19.tgz +  * ''tar xf linux-image-3.0.19-1-ac100-3.0.19.tgz'' 
-  * 4 - cp -Rp lib/modules/3.0.19-1-ac100 /<your rootfs>/lib/modules +==Or using file-roller== 
-  * 5 - abootimg -u /tmp/alien/part-6.img -k /tmp/alien/tgz/boot/vmlinuz-3.0.19-1-ac100+  * ''file-roller linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb'' (Can non Ubuntu versions of file-roller also read debs?) 
 +==Or using dpkg== 
 +  * ''dpkg -linux-image-3.0.19-1-ac100_3.0.19-1.1_armel.deb'' 
 + 
 +===Afterwards=== 
 +  * ''cp -Rp lib/modules/3.0.19-1-ac100 /<your rootfs>/lib/modules'' 
 +  * ''abootimg -u /tmp/alien/part-6.img -k /tmp/alien/tgz/boot/vmlinuz-3.0.19-1-ac100''
 ===== Compilation environment consideration ===== ===== Compilation environment consideration =====
  
Line 81: Line 90:
 ===== 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> </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>
 +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>
 +
 +===== Mainline Git Kernel =====
 +From 3.15, AC100 finally boots the official mainline kernel ! 
 +To succesfully cross-compile it, i used linaro precompiled toolchain [[http://releases.linaro.org/14.05/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux.tar.xz]]:
 +
 +  wget http://releases.linaro.org/14.05/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux.tar.xz
 +
 +extract it somewhere, and export install path so the toolchain can be found:
 +  tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux.tar.xz 
 +  export PATH=$PATH:gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux/bin/
 +
 +Now you have to clone the kernel git repository:
 +  git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
 +  cd linux
 +  
 +As already described above, configure && make && install and your kernel is ready!
 +  make tegra_defconfig ARCH=arm
 +  make zImage modules dtbs INSTALL_MOD_PATH=/tmp INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
 +  make modules_install INSTALL_MOD_PATH=/tmp INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
 +
 +Copy everything you need in a folder (to copy on SD or USB key and put into AC100)
 +  mkdir ~/linux-3.16-0
 +  mv /tmp/lib/ ~/linux-3.16-0/
 +  cp arch/arm/boot/zImage ~/linux-3.16-0/
 +  cp arch/arm/boot/dts/tegra20-paz00.dtb ~/linux-3.16-0/
 + 
 ==== 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 ==
Line 118: Line 257:
  
 [[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) :
Line 140: Line 285:
  
 TODO TODO
 +
 +[[http://dtrace.org/|DTrace's blog]]
 +
 +[[http://www.dtracebook.com/|the DTrace book of scripts and strategy, 1100 pages (2011)]]
  
 [[http://www.crisp.demon.co.uk/blog/index.html|Porting effort of DTrace on Linux]] blog of Paul FOX. [[http://www.crisp.demon.co.uk/blog/index.html|Porting effort of DTrace on Linux]] blog of Paul FOX.
  
 [[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 ======
kerneldev.1329785864.txt.gz · Last modified: 2012/02/21 01:57 (external edit)