当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 请教一个弱智的内核编程问题
帖子发表于 : 2008-06-01 21:11 

注册: 2008-05-09 22:00
帖子: 55
送出感谢: 0 次
接收感谢: 0 次
小弟刚开始接触潜入式系统,写了一个程序,请大侠们指点一下:
/*hello.c*/
#include<linux/init.h>
#include<linux/module.h>
#include<linux/moduleparam.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello,world\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT "goodbye,world\n");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);

之后写了一个makefile程序
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY:modules modules_install clean
else
obj-m:=hello.o
endif

在根目录下执行make,结果如下:
root@wuyi:/home/wuyi/hello# make
make -C /lib/modules/2.6.24-16-generic/build M=/home/wuyi/hello modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-16-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic'
在此目录下执行:insmod hello.ko,结果什么都看不到,恳请大侠指点,这是怎么回事阿,谢谢
这个问题看起来问的有点弱智,但小地我真的很想知道这是为什么


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-07-01 11:56 

注册: 2008-07-01 11:44
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
好像要把 代码放到一个内核的/drivers/char下面 再修改makefile,然后make modules
用insmod 把模块加入进去


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-07-03 16:55 

注册: 2006-03-30 21:26
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
应该是printk的级别问题,你试着把KERN_ALERT改成其它不同的级别试试。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-07-10 9:52 

注册: 2008-01-28 9:55
帖子: 11
送出感谢: 0 次
接收感谢: 0 次
有可能输出到 /var/log/messages cat看看有没有打印


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-07-10 13:58 

注册: 2008-01-28 9:55
帖子: 11
送出感谢: 0 次
接收感谢: 0 次
在/var/log/syslog

#cat /var/log/syslog
#kernel: [17306.492000] Hello, world
#kernel: [17572.404000] Goodbye, cruel world
#kernel: [17574.548000] Hello, world


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-07-13 12:09 

注册: 2008-06-10 22:53
帖子: 29
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
在root用户下执行insmod ./hello.ko。没有错误提示的话,
这个程序就被执行了,可能是与系统的默认打印级别有关,
运行一下dmesg,最后一行是不是可以看到hello,world字样,
再执行rmmod hello
运行dmesg,最后一行又出现了goodbye,world。


_________________
裸奔时代


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-07-16 16:03 

注册: 2008-07-02 13:12
帖子: 2
送出感谢: 0 次
接收感谢: 0 次
看不见就对了。 cat /var/log/messages 可看见。

printk 是内核的调用接口,它在系统init之前,把消息写往控制台,但是一旦系统init之后,便改写到系统的日志中。因为init之后用户所能够感受到的进程(拥有控制台)都是用户空间的进程,而用户空间的进程是无法反映内核数据的,除非通过一定的方式(如proc文件,netlink...)向内核申请相关的信息,并在用户空间反映出来.这样做的好处不言而喻的,如果内核在任何的时候都可以写信息到控制台,那控制台一定会被这样的信息淹没,而无法工作。

系统初始化进程(pid=0),工作在内核空间,它在启动init进程(pid=1)之前,把所有的信息通过printk内核方法写往控制台.printk把欲打印的日志消息,首先首先保存到内核的日志缓冲区之中.而后申请控制台的信号量,如果申请到,则调用控制台写方法,写控制台.而此时系统中并没有打开控制台,故而初始化进程,可以申请到控制台的信号量.当系统初始化到达一定阶段后,便会启动init进程(pid=1),并在此之前打开控制台,控制台的信号量增加,此后,printk便无法申请到信号量,而无法写数据到控制台.转而通过和用户空间的进程协作把内核的日志消息写到系统道的日志文件之中.-------前台进程通过sys_log系统调用读出,并根据配置文件sys_conf写向相应的日志文件或/var/log/messages文件中。

读printk原码可知流程。


最后由 和月瑛泓 编辑于 2008-12-01 13:41,总共编辑了 3 次

页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-08-17 9:21 

注册: 2008-08-16 15:49
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
你的程序和编译语句都没有错。

你在hello.ko下的目录,
你这里应该用编译命令:

insmod ./hello.ko

运行一下dmesg,最后一行可以看到hello,world字样,

再执行:
rmmod hello

运行dmesg,最后一行又出现了goodbye,world。
这样才可以。


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-09-04 22:50 

注册: 2006-10-08 16:32
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
在终端模式下插入,不要在X下,就可以看到了。


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-09-07 11:31 

注册: 2008-09-01 17:08
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
和月瑛泓 写道:
看不见就对了。 cat /var/log/messages 可看见。

printk 是内核的调用接口,它在系统init之前,把消息写往控制台,但是一旦系统init之后,便改写到系统的日志中。

这样做的好处不言而喻的,如果内核在任何的时候都可以写信息到控制台,那控制台一定会被这样的信息淹没,而无法工作。printk的实现很简单,就是在有了日志消息后,首先申请控制台的信号量,如果申请到,则调用控制台写方法,写控制台。当linux初始化完成的时候,会在init之前打开控制台,此后,printk便无法申请到信号量,而把消息组织为skb发往特定的netlink缓冲区,由klogd读出,写向/var/log/messages文件中。

读printk原码可知流程。


正解~~。

printk的输出在内核空间,而控制台的输出在用户空间。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 请教一个弱智的内核编程问题
帖子发表于 : 2009-06-14 10:07 

注册: 2009-03-17 19:01
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
感谢5--10楼的强人们!


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 请教一个弱智的内核编程问题
帖子发表于 : 2009-06-28 14:57 

注册: 2009-06-28 14:16
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
用dmesg看看吧


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 请教一个弱智的内核编程问题
帖子发表于 : 2009-06-29 10:10 

注册: 2009-06-10 3:16
帖子: 12
送出感谢: 0 次
接收感谢: 0 次
还显示messages最后10条:
cat /var/log/messages | tail -10


页首
 用户资料  
 
14 楼 
 文章标题 : Re:
帖子发表于 : 2009-07-08 1:49 
头像

注册: 2007-05-31 20:17
帖子: 207
地址: DUT
送出感谢: 0 次
接收感谢: 0 次
和月瑛泓 写道:
看不见就对了。 cat /var/log/messages 可看见。

printk 是内核的调用接口,它在系统init之前,把消息写往控制台,但是一旦系统init之后,便改写到系统的日志中。因为init之后用户所能够感受到的进程(拥有控制台)都是用户空间的进程,而用户空间的进程是无法反映内核数据的,除非通过一定的方式(如proc文件,netlink...)向内核申请相关的信息,并在用户空间反映出来.这样做的好处不言而喻的,如果内核在任何的时候都可以写信息到控制台,那控制台一定会被这样的信息淹没,而无法工作。

系统初始化进程(pid=0),工作在内核空间,它在启动init进程(pid=1)之前,把所有的信息通过printk内核方法写往控制台.printk把欲打印的日志消息,首先首先保存到内核的日志缓冲区之中.而后申请控制台的信号量,如果申请到,则调用控制台写方法,写控制台.而此时系统中并没有打开控制台,故而初始化进程,可以申请到控制台的信号量.当系统初始化到达一定阶段后,便会启动init进程(pid=1),并在此之前打开控制台,控制台的信号量增加,此后,printk便无法申请到信号量,而无法写数据到控制台.转而通过和用户空间的进程协作把内核的日志消息写到系统道的日志文件之中.-------前台进程通过sys_log系统调用读出,并根据配置文件sys_conf写向相应的日志文件或/var/log/messages文件中。

读printk原码可知流程。


学习


_________________
I can do if I try!!!


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 请教一个弱智的内核编程问题
帖子发表于 : 2009-08-05 17:01 

注册: 2009-08-02 20:55
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
7楼的答案是对的,但是你也可以直接在控制台(tty)运行,然后就可以看到信息了。
注意:不是图形界面的虚拟终端。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译