printf到printk的转变
来源:互联网 发布:手机网络数据不可用 编辑:程序博客网 时间:2024/04/28 11:53
昨天下午stepbystep的为其他同学演示了内核模块编程hello,kernel!在陈老师的指导下,先为大家演示了最基本的C程序hello,world。然后又一步步的转换成内核模块程序。在这一步步的转变过程中,我也发现了自己在学习内核模块中的不足,下面将下午遇到的一些问题总结如下。
一个简单的hello,world程序如下:
#include <\stdio.h\>int main(){ printf("hello,world\n"); return 0;}
对于上面的程序,我们通常一步到位进行编译:
gcc hello.c -o hello
这样的命令简单方便,不过通常会让我们忽略从.c文件到可执行文件的整个编译过程。通常在使用gcc编译程序时,编译过程通常会分为4个阶段,即预处理(pre-processing),编译(compiling),汇编(assembling),链接(linking)。
在预处理阶段,一般输入的是.c文件,而输出的是.i文件。在此阶段中通常会处理源文件中的预处理命令,比如#define,#include,#ifdef等命令。如果想要生成这种.i中间文件,那么可以使用下面命令:
gcc -E hello.c -o hello.i
在编译阶段,输入的是.i中间文件,输出的是.s汇编语言文件。可以使用下面的命令:
gcc -S hello.i -o test.s
在汇编阶段,输入的是上一步产生的.s文件,产生的是二进制机器代码.o文件。此阶段对应的命令如下:
gcc -c test.s -o test.o
在链接阶段,输入的是.o二进制机器代码文件,连同其他的(如果有的话)机器代码文件和库文件一起汇集成一个可执行的二进制代码文件。
gcc test.o -o test
以上是一个程序编译完整的四个阶段。一般来说我们会将前三个阶段一步搞定,那么整个编译过程可以用下面两条命令就完成:
gcc -c test.c -o test.ogcc test.o -o test
也就是先生成目标文件,再将目标文件连接成可执行文件。当你熟悉了整个编译过程后,可以用一开始我们说的一条命令来完成。
了解普通文件的编译过程,我们现在就将hello.c中的代码转换成模块编程中的.c代码。首先我们要更改头文件:
#include <\linux/kernel.h\>#include <\linux/module.h\>
这与我们一般的头文件不同。一般我们在用户态下编写C程序,头文件会放在:/usr/include/下,而我们模块编程时,它使用的是内核中的头文件,一般在:cd /usr/src/linux-headers-2.6.32-21/include/。特别的我们这里使用的是include/目录下linux/这个子目录中的头文件,因此模块编译的时候会自动在内核中的include/目录下找linux/kernel.h这样的头文件。
其次,printf到printk是一个典型的用户态下编程与内核模块编程的不同。可能我们一开始会比较奇怪,为什么我make成功,加载也成功,但是就是不能显示printk里面的语句呢?我们可以这么想printk就是专门为内核“服务”。它一般输出的语句都在内核的日志文件当中。
- printf到printk的转变
- printf到printk的转变
- printf到printk的转变
- printf到printk的转变
- printf到printk的转变
- printk和printf的区别
- printk和printf的区别
- printk和printf的区别
- 控制调试信息的打印(printk,printf)
- linux之printk和printf的区别
- 工程师到管理者的转变
- 程序员到项目经理的转变
- 电气工程师到程序员的转变
- linux 驱动 printf printk
- Printf and Printk
- printf printk 颜色设置
- printk()函数的总结 及 和printf()函数的比较
- kernel module编程(六):printk-printf的debug
- 常用正则表达式
- Linux性能监视
- 正则表达式学习指南(四)----How a Regex Engine Works Internally
- compare()与compareTo()方法
- 第2章 Java内存区域与内存溢出异常--《深入理解 Java 虚拟机》笔记
- printf到printk的转变
- 输出21个AAAAAAAAAAAAAAAAAAAAA的巧妙做法
- tomcat乱码显示中文名图片配置一劳永逸解决
- 交换两个指定位置字符的4种方法
- 两个controller 切换 (未用导航条)
- 把123456789转换为12-345-6789的3种方法
- 爱生气的你
- Delphi Menu Designer(菜单设计器)之一
- url传递中文的解决方案