首页 > 编程知识 正文

linux驱动安装命令,linux设备驱动程序

时间:2023-05-05 10:56:26 阅读:165189 作者:3247

对于熟悉嵌入式和linux内核的人来说,您一定不熟悉printk这个函数。 printk相当于printf的双胞胎姐妹,一个在用户状态下运行,另一个在内核状态下众所周知。 printk是向在内核内运行的控制台输出显示的函数,Linux内核首先在内核空间中分配静态缓冲区作为显示用的空间,然后调用sprintf格式化字符串,最后调用tty_write在终端上进行信息的显示printk和printf的区别在于,为什么一个在内核状态下运行,另一个在用户状态下运行? 实际上,这两个函数的数量几乎相同,这种差异的出现是因为tty_write函数需要使用由fs表示的字符串,fs是专门用于存储用户状态段选择符的。 因此,当处于内核状态时,printk根据tty_write函数将fs修改为内核状态段选择符ds的值,且可以正确地指向内核的数据缓冲器,由此,printk和printf间的差异取决于fs 【原型】intprintk(constchar*fmt,…); 【示例】与演示大多数printf功能一样,使用helloworld程序演示printk的输出。 创建内核模块。

#包含

#包含

#ifCONFIG_MODVERSIONS==1

#defineMODVERSIONS

#包含

#endif

module_license(GPL );

intinit_module ()

{

打印(hello.word-thisisthekernelspeaking (n ) );

返回0;

}

voidcleanup_module (

{

打印(shortisthelifeofakernelmodule (n );

}保存文件hello.c以创建Makefile:

CC=gcc

mod cflags :=-o6-wall-d module-d _ _ kernel _-d Linux

hello.o : hello.c/usr/include/Linux/version.h

$(cc ) $ ) $(MODCFLAGS )-chello.c

echoinsmodhello.ototurniton被保存为文件。 当Makefile运行make时,您会看到它生成了hello.o的内核模块。 使用此模块可以在插入内核时输出消息' hello.word-thisisthekernelspeaking '。 那就从它开始吧。 [ root @ localhost root ] # insmod hello.o [ root @ localhost root ] #没有输出任何消息。 why? 这也是printf和printk的不同之处用printk。 内核可以根据日志级别将消息打印到当前控制台。 此控制台通常是字符模式终端、串行打印机或并行打印机。 这些消息正常输出的前提是——日志输出级别小于console_loglevel (内核中的数字越低,优先级越高)。 未指定日志级别的printk语句的默认级别为DEFAULT_ MESSAGE_LOGLEVEL,其定义为可以在linux26/kernel/printk.c中找到日志级别共计8的printk 在include/linux/kernel.h中,#define KERN_EMERG 0/*紧急事件消息在系统崩溃之前发送到*/#define KERN_ALERT 1/*报告表示必须取define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软件操作失败*/#define KERN_ERR 3/*错误条件,动因常为KERN_ERR definekern_wwww警告可能发生问题的情况*/#define KERN_NOTICE 5/*正常但重要的条件。 */#define KERN_INFO 6/*将用于在驱动程序启动时警告打印硬件信息等信息的printk输出电平设置为最高: printk ('0' ' hello.word-thisisthekero ) 然后重新编译hello.o,然后插入内核。 [ root @ localhost root ] # insmod hello.o [ root @ localhost root ] # messagefromsyslogd @ localhostataug 1505336032333

lo,world信息出现了。其实printk始终是能输出信息的,只不过不一定是到了终端上。我们可以去/zjdddd/log/messages这个文件里面去查看。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下:#cat /proc/sys/kernel/printk 6 4 1 7上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。可用下面的命令设置当前日志级别:# echo 8 > /proc/sys/kernel/printk这样所有级别<8,(0-7)的消息都可以显示在控制台上.如果变量类型是 , 使用 prink 的格式说明符 :int                                        %d 或者 %x( 注: %d 是十进制, %x 是十六进制 )unsigned int                        %u 或者 %xlong                                        %ld 或者 %lxunsigned long                        %lu 或者 %lxlong long                                %lld 或者 %llxunsigned long long                %llu 或者 %llxsize_t                                %zu 或者 %zxssize_t                                 %zd 或者 %zx原始指针值必须用 %p 输出。u64,即(unsigned long logn),必须用 %llu 或者 %llx 输出,如:printk("%llu", (unsigned long long)u64_zjdddd);s64,即(long long),必须用 %lld 或者 %llx 输出,如 :printk("%lld", (long long)s64_zjdddd);如果 ( 变量类型 ) 的长度依赖一个配置选项 ( 例如: sector_t, blkcnt_t, phys_addr_t, resource_size_t) 或者 依赖相关的体系结构(例如: tcflag_t ),使用一个可能最大类型的格式说明符,并且显示转换它。如:printk("test: sector number/total blocks: %llu/%llun",(unsigned long long)sector, (unsigned long long)blockcount);

源于:http://blog.csdn.net/hustyangju/article/details/21080603

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。