Tuesday, January 3, 2012

Disable Optimization in Linux Kernel

edit Makefile
find the symbol: CC_OPTIMIZE_FOR_SIZE... make the 3rd line KBUILD_CFLAGS to -O0 instead of -O2 (default)

also enable kernel hacking --> kernel debugging, compile with debug info, allow gcc to uninline, compile kernel with frame pointer



Monday, January 2, 2012

Event Tracing and perf tool

event tracing in module: see sample/trace_events
event tracing in kernel: see lwn articles PI PII PIII

events are listed in /sys/kernel/debug/tracing/events/subsys/event function

also /sys/kernel/debug/tracing/available_events show a list of events.
again, an event can be sent to set_event entry for tracing.

three ways to stop/start tracing
1. echo 0/1 > subsys/enable or sybsys/event name/enable
2. echo '!func_name' > set_event... echo func_name > set_event
3. obvious echo 0/1 > tracing_on

NOTE: module Makefile should contain a line
CFLAGS_module-name.o := -I$(src)... so that the define_trace.h file can see the header file for the module where tracers are defined

tracing events can be used with perf tool (link), (link) and (link)


Wednesday, December 28, 2011

QEMU Networking

Summary:

{/etc/qemu-ifup}
#!/bin/sh
#switch=$(/sbin/ip route list | awk '/^default / { print $5 }') -- error/remove
switch=virbr0 -- correct
/sbin/ifconfig $1 0.0.0.0 up -- keep
/usr/sbin/brctl addif ${switch} $1 -- keep

{/etc/qemu-ifdown}
#!/bin/sh
#switch=$(/sbin/ip route list | awk '/^default / { print $5 }') -- error/remove
swtich=virbr0 -- correct
/usr/sbin/brctl delif $switch $1 -- keep
/sbin/ifconfig $1 0.0.0.0 down -- keep

add these parameters to qemu: -net nic,vlan=0 -net tap,vlan=0

Previous Writing:
Write 2 network scripts as below: ( don't forget the chmod +x on each file. )

[root@sitedesign ~]# cat /etc/qemu-ifdown
#!/bin/sh
/sbin/ifconfig virbr0 down
/sbin/ifconfig down $1
/sbin/ifup eth0

[root@sitedesign ~]# cat /etc/qemu-ifup
#!/bin/sh
/sbin/ifconfig $1 0.0.0.0 promisc up
/usr/sbin/brctl addif virbr0 $1

Then to start the VM:

as root:
#~> qemu-kvm -net nic,vlan=0 -net,tap,vlan=0 -hda winxp.img -hdb winxp_disk2.img -usb -usbdevice tablet -localtime -daemonize
That should start you up with a connection to the default virbr that gets made by fedora at boot time.

(original link)

using CSCOPE

1. build database: cscope -b -q -k -R
2. invoke: cscope -d ... does not create the database again

3: invoke command line:
      find all functions that calls bad_page()
          cscope -d -3 bad_page -L
      find all functions that bad_page() calls
          cscope -d -2 bad_page -L

exit: ctrl_d




Friday, December 16, 2011

Using QEMU for Direct Debugging (INCOMPLETE)

Install kvm-pxe first

kernel build: two places
     inside the vm
     in in the host

make initrd inside vm, copy it to host in the qemu disk directory
copy vmlinux, sysmap and config into qemu disk directory

then run the kernel:
qemu -smp 4 -m 384 -hda ubswapper.img -kernel vmlinuz-2.6.38.2 -initrd initrd.img-2.6.38.2 "console=ttyS0,115200n8 root=/dev/sda1 text" -serial stdio > trace


Friday, December 9, 2011

Tracing In Brief

cd /sys/kernel/debug/tracing

# viewing functions
functions are listed in available_filter_function
grep shrink available_filter_function

# viewing tracers
cat available_tracers
function_graph, function are important

# setting function and graph
root@musfiq-Dell-DM051:/sys/kernel/debug/tracing# echo shrink_zone > set_ftrace_filter
root@musfiq-Dell-DM051:/sys/kernel/debug/tracing# echo shrink_zone > set_graph_function

# set tracer
root@musfiq-Dell-DM051:/sys/kernel/debug/tracing# echo function_graph > current_tracer
root@musfiq-Dell-DM051:/sys/kernel/debug/tracing# echo 1 > tracing_on

root@musfiq-Dell-DM051:/sys/kernel/debug/tracing# echo 0 > tracing_on

Thursday, December 8, 2011

Console Over Serial

in kvm, add another serial connection
in kernel boot parameters, add: console=ttyS1
now, all kernel messages will be redirected to ttyS1
if kgdboc=ttyS0, then run gdb on that port.
that's it!

so, now you can debug kernel on one serial port while get the kernel messages on another serial port.