helloworld驱动学习



今天开始动手写驱动程序,先从helloworld开始。出现了几个错误,第一个问题出现在makefile的编写上,第二个问题也是语法错误,不能在printk函数中的KERN_ALERT后面加逗号,我加了;然后,编译没有问题之后,加载和卸载的时候,并不出现打印信息,然后用lsmod看,能够看到模块确实被加载上了,于是,一篇博文出现了,如下,谢谢两位博主!
如有意见,请两位提醒我删帖,谢谢

  1. # 如果已定义了KERNELRELEASE,则说明是从内核构造系统调用的,
  2. # 因此可利用其内建语句:obj-:= hello.o
  3. ifneq ($(KERNELRELEASE),)
  4.     obj-:= hello.o    # 该语句使用了GNU make的扩展语法,说明了有一个模块需要从
  5.                # 目标文件hello.o中构造,而从该目标文件中构造的模块名称
  6.        # 为hello.ko。如果我们要构造的模块名称为modules.ko,并由
  7.        # 两个源文件file1.c & file2.c生成,则这里应该写为:
  8.        # obj-m := module.o
  9.        # module-objs := file1.o file2.o
  10.     
  11. # 否则,是直接从命令行调用的,此时要调用内核构造系统。
  12. else
  13.     KERNELDIR ?= /home/moran/program/micro2440/kernel/linux-2.6.32.2
  14.     PWD := $(shell pwd)
  15.     
  16. default:
  17.     $(MAKE) -C $(KERNELDIR) M=$(PWD)    # 此命令首先改变目录到-C选项指定的位
  18.                                # 置(即内核源代码目录),其中保存有
  19.                                        # 内核的顶层Makefile文件。 M=选项让
  20.                                        # 该Makefile在构造modules目标之前返
  21.                                        # 回到模块源代码目录。然后,modules目
  22.                                        # 标指向obj-m变量中设定的模块,此例
  23.                                        # 中,我们设置成了hello.o
  24.     
  25. clean:
  26.     rm -rf *.*~ core .depend .*.cmd *.ko *.mod..tmp_versions
  27.     
  28. endif
    
    在一个典型的构造过程中,该Makefile将被读取两次。
    当从命令行执行make命令时,该Makefile将会被调用,此时是第一次读取
该Makefile,变量KERNELRELEASE没有设置,ifneq条件不满足,所以会运行else
分支,根据变量KERNELDIR指定的路径找到内核源码树。

    接着第二次运行make命令,以便运行内核构造系统,在第二次读取该
Makefile文件时,它设置了obj-m,而内核的Makefile真正负责构造此模块。

*------------------------------------------------------------------*

【5】安装模块:
# insmod hello.ko
或者
# insmod ./hello.ko
一个意思。
这一步完了没反应。接着再试一次:
# insmod hello.ko
提示错误:
insmod: error inserting 'hello.ko': -1 File exists
说明hello模块是安装成功的。

# lsmod
也能查看到hello模块。
防止打印太多,用:
# lsmod | head -5
只显示前5行等。如:
Module                  Size Used by
hello                   9344 0 
binfmt_misc            16776 1 
bridge                 56340 0 
stp                    10500 1 bridge
看到hello模块了吧~~~
可是为什么不打印呢?先不说这个。。。

【6】卸载模块
# rmmod hello.ko
再用
# lsmod | head -5
发现hello模块已经不存在了。

【7】关于printk
现在谈谈这个问题:insmod的时候,printk问什么没有在终端中显示Hello World呢?因为hello.c中明明是这么写的:
static int hello_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
答案只有一句:printk不显示在超级终端上!靠!为什么?我也不知道。。。

【8】printk调试信息打印的补救方法
用命令:
# dmesg | tail -8
这个命令格式类似于lsmod(只显示最后8行)。
[   95.586960] Good bye, ubuntu
[   96.483964] Hello World!
[   97.031787] Good bye, ubuntu
[   97.594151] Hello World!
[   98.109896] Good bye, ubuntu
[   98.615569] Hello World!
[   99.098943] Good bye, ubuntu
[ 1893.976170] Hello World!
以上的信息显示:笔者在95.586960做了rmmod hello.ko,在96.483964做了insmod hello.ko……
这里[]中的数字表示执行模块安装/卸载聚开机的时间,如96.483964 S(约开机一个半小时以后)。

【9】那么这些信息都存在哪儿呢?
都说默认是在/val/log/messages目录下;可是有时候你看了,没有;
那么请看看另一个目录:
# cd /etc
# ls

你会找到包含syslog的文件,如:
syslog.conf
那么就是它了。
# cat syslog.conf | head -20
同理,只显示前20行的东东;看到类似以下的东东:
# /etc/syslog.conf Configuration file for syslogd.
#
#    For more information see syslog.conf(5)
#    manpage.

#
# First some standard logfiles. Log by facility.
#

auth,authpriv.*    /var/log/auth.log
*.*;auth,authpriv.none   -/var/log/syslog
#cron.*     /var/log/cron.log
daemon.*    -/var/log/daemon.log
kern.*     -/var/log/kern.log
lpr.*     -/var/log/lpr.log
mail.*     -/var/log/mail.log
user.*     -/var/log/user.log

#
# Logging for the mail system. Split it up so that
...
看到kern.*了吧~看到/var/log/kern.log了吧!我猜消息就在这底下。

于是,
# cat /var/log/kern.log | tail -10
显示:
Aug 4 23:40:53 ubuntu kernel: [   38.848634] eth0: no IPv6 routers present
Aug 4 23:41:47 ubuntu kernel: [   92.893834] Hello World!
Aug 4 23:41:50 ubuntu kernel: [   95.586960] Good bye, ubuntu
Aug 4 23:41:51 ubuntu kernel: [   96.483964] Hello World!
Aug 4 23:41:51 ubuntu kernel: [   97.031787] Good bye, ubuntu
Aug 4 23:41:52 ubuntu kernel: [   97.594151] Hello World!
Aug 4 23:41:52 ubuntu kernel: [   98.109896] Good bye, ubuntu
Aug 4 23:41:53 ubuntu kernel: [   98.615569] Hello World!
Aug 4 23:41:53 ubuntu kernel: [   99.098943] Good bye, ubuntu
Aug 5 00:11:48 ubuntu kernel: [ 1893.976170] Hello World!
看到了吧!跟先前的dmesg显示的内容相似而更完整了!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值