Archive for June, 2010

Free Linux Training Material and Video Presentations

Wednesday, June 9th, 2010

Dotted across the Internet is a wealth of free resources including papers, presentations, articles and blogs on various topics to do with Linux and programming. I thought I would share these as I come across them.

One particularly useful resource is that of Free Electrons, an organisation based in France committed to promoting and contributing to free software. They also provide Linux training and have made all their training material available on-line under the Creative Commons Attribution-ShareALike 3.0 License. The material absolutely everything you’d ever need to know to become an expert in embedded Linux development. They can be downloaded here:

http://free-electrons.com/docs/

They also have posted recording of presentations made at various conferences such as the Embedded Linux Conference and Fosdem.

http://free-electrons.com/community/

And whilst we’re talking about ELC – you can find the archives and presentation materials here:

http://www.embeddedlinuxconference.com/

All worthwhile reading on a rainy day :) .

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Slashdot
  • Reddit
  • Technorati

PrintK Format Specifiers

Saturday, June 5th, 2010

As a kernel developer you’ll probably find yourself treating the ‘printk’ function as a drop-in replacement for the ‘printf’ function provided by any useful C library such as uclibc or glibc – After all, it’s usage is virtually the same. It was for this reason that I found my self naively surprised when reading the source for the kernel’s implementation – I was surprised because it offers many more features than the typical C libraries’ implementation. As I was unable to find any useful documentation on this – I thought I’d provide a brief overview.

Let’s start with the typical ‘%p’ type format specifier – we usually use it for printing the address of a pointer. However if you take a peek at the ‘pointer’ function in lib/vsprintf.c you’ll notice that you can further specify the pointer type to print additional information. We’ll look at some examples.

printk("%pF %pf\n", ptr, ptr) will print:
module_start module_start+0x0/0x62 [hello] 



So where ptr is a function pointer, the %pF and %pf format specifiers will print the symbolic name of the function with or without an offset. In order to make use of this you need to ensure your kernel is compiled with support for CONFIG_KALLSYMS - This adds a symbol table to the kernel.

How about this one:

printk("%pM %pm\n", mac, mac) will print:
2c:00:1d:00:1b:00 2c001d001b00 

So where mac refers to a MAC address, the %pM and %pm format specifiers will nicely print the MAC address with or without colons between bytes.

And finally:

printk("%pI4 %pi64\n", ip, ip) will print:
127.0.0.1 127.000.000.001

So where ip refers to an IP address, the %pI and %pi format specifiers will nicely print the IP address. The 4 suffix specifies the address is an IPv4 address – the 6 suffix for IPv6 address could also be used instead. In the case of IPv4 addresses the difference between an upper and lower case ‘I’ determines if leading zeros should be used (only in the most recent of kernels). In the case of IPv6 addresses the capitalization determines if colons are used or not.

So if you find yourself writing a network driver, debugging something with function pointers or wondering why stack traces don’t contain symbols then these format specifiers may come in useful. For more information, and the full extent of the extended format specifiers (there are more), the best place to look is the code. Happy Coding.

  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Slashdot
  • Reddit
  • Technorati