Press "Enter" to skip to content

Linux内核调拭之printk用法(2)

本文演示了一下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()的信息

Leave a Reply

Your email address will not be published. Required fields are marked *