本文演示了一下printk的基本用法,实验环境为CentOS 5.9 64bit
1,下载内核源码
下载地址是https://www.kernel.org/pub/linux/kernel/v2.6/
CentOS 5.9用的是2.6.18版,CentOS 6用的是2.6.32,下载对应版本的内核文件就可以了
# wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz
# tar -zxvf linux-2.6.18.tar.gz
# cd linux-2.6.18
2,修改内核
vim init/main.c
查找start_kernel,在大约456行有如下内容:
……
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern struct kernel_param __start___param[], __stop___param[];
smp_setup_processor_id();
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
……
系统从start_kernel()函数开始启动。所以我们要把printk()添加到这个函数里
这里我选择把printk()添加到start_kernel()里的第一个函数前,形成如下所示的内容:
……
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern struct kernel_param __start___param[], __stop___param[];
printk(KERN_ALERT "5555555555555555555555\n5555555555555555555555\n");
smp_setup_processor_id();
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
……
这里之所以选择输出一大串连续的数字,是因为这样比较有视觉冲击力,等一下系统启动的时候,视觉上可以快速发现这条输出
3,编译新内核
编译新内核的完整文档请见这篇文章,这里只简要记录几条主要命令
# yum install -y gcc make bison ncurses-devel rpm-build
# make menuconfig 进入以后直接退出就行了,目的是为了生成.config文件
# make dep
# make
# make modules_install
# make install
然后可以在/boot/grub/grub.conf看到刚刚编绎好的内核了,只是启动顺序上,仍是启动原来的内核
4,检验输出结果
重启,选择用新内核启动。Kernel启动的过程一闪而过,看不到我们在第2部中添加的printk()输出。不用急,先进入系统
# dmesg >> 1.txt 把kernel启动过程写入一个文件中
# more 1.txt
Bootdata ok (command line is ro root=/dev/VolGroup00/LogVol00)
5555555555555555555555
5555555555555555555555
Linux version 2.6.18 (root@localhost) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Fri Aug 16 1
8:05:08 CST 2013
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000003fee0000 (usable)
……
可以看到,Kernel启动过程已经输出了printk()的信息