免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2308 | 回复: 6
打印 上一主题 下一主题

才开始看就不懂,求教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-18 20:16 |只看该作者 |倒序浏览
本帖最后由 biliucheng 于 2010-11-18 20:20 编辑

为什么要构建内核树啊。看了版上的庖丁解牛pdf,还是不懂。系统里没有内核吗,干吗还编译呢。希望能有人指点一下,让我入门。下面是我从网上搜来的驱动开发环境搭建的过程,跟庖丁pdf上说的不太一样啊:
在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本一致)。开发工具主要有gcc、gdb、make等,这些工具在redhat或fc中默认就安装了,在debian或Ubuntu中可以通过下面这个命令安装:
apt-get install build-essential
linux源码可以通过以下几种途径获得:
直接去www.kernel.org下载
通过包管理工具下载源码,在debian和Ubuntu中可以通过下面这个命令下载,
apt-get install linux-source-(版本号) ,下载后的文件在/usr/src目录中,解压到该目录即可
将源码解压到/usr/src/目录后,进入linux-source-(版本号)目录中执行下面几个命令:
make oldconfig
make prepare
make scripts

编写Linux驱动程序,以一个最简单的hello.c为例,hello.c的内容如下:

#include "linux/init.h"
#include "linux/module.h"

static int hello_init(void)
{
    printk(KERN_ALERT "Hello World linux_driver_module\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbey linux_driver_module\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lpj");
写Makefile文件,一个示例如下,里面各项参数根据实际情况更改:

#sample driver module
obj-m := hello.o
KDIR = /usr/src/linux-source-2.6.24/

all:
     $(MAKE) -C $(KDIR) M=$(PWD)

.PHONY:clean
clean:
     rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
编译,在hello.c和Makefile所在目录下执行 make 即可,编译后在当前目录生成hello.ko文件
加载并测试:加载使用insmod或modprobe命令来实现,如在当前路径执行如下代码:
insmod hello.ko 或 modprobe hello
注意,如果在虚拟终端加载内核的话,将看不到内核打印信息,因为内核打印信息不会输出到虚拟终端,而是输出到/proc/kmsg文件中,所以可以通过以下方式查看内核信息:
cat /proc/kmsg 会一直打印,需要Ctrl-C手动终止
dmesg 或 dmesg | tail -N ,N为一数字,表示显示最后N行
卸载:使用rmmod命令卸载驱动模块,如 rmmod hello

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2010-11-18 20:39 |只看该作者
回复 1# biliucheng


    不知道你说的那些不一样。
没有内核源码树的话,就相当于你编译应用程序找不到头文件一样。同样,不同的内核版本,其相同功能函数接口可能不一样,不仅编译通不过,程序运行也会异常的。

论坛徽章:
0
3 [报告]
发表于 2010-11-19 09:35 |只看该作者
回复 2# dreamice


    请教如何构建源码树啊(我开发用机器和被开发的内核是同样的版本,是不是就不用编译内核了啊),我帖子里粘贴的那个并没有编译内核啊,只用了三步
make oldconfig
make prepare
make scripts

但是庖丁解牛里,这么多
step1:make oldconfig (or make menuconfig)
这样做是为了简便一些,避免了无谓的配置;当然,也可以 make menuconfig,基于图
形化的配置,这是比较耗时的了,推荐高手采用这种方法。对于跨版本的(主机内核版本和
源码版本不一致的),可能这个选择更好一些。
Step2: make
让他编译吧,耐心等待。
Step3: make bzImage
Step4: make modules
Step5: make modules_install
Step6: make install

论坛徽章:
0
4 [报告]
发表于 2010-11-19 17:09 |只看该作者
版主给的只是初步几步,编译成功不代表你能启动,很可能down在kernel panic。
我建议你去下个Fedora_4(正好是2.6.11内核),不用再搭环境上花太多时间,下载源代码  一个make  load unload 就可以学ldd3了。

论坛徽章:
0
5 [报告]
发表于 2010-11-20 06:35 |只看该作者
LZ, 你那样根本没有编译内核.

按照 庖丁解牛 作. 不过 STEP 2 MAKE BZIMAGE 可以省略.

论坛徽章:
0
6 [报告]
发表于 2010-12-10 21:03 |只看该作者
与禽兽搏斗的三种结局:
1.赢了,比禽兽还禽兽;
2.输了,禽兽不如;
3.平了,跟禽兽没两样。
结论:选择正确的对手最重要!!!

论坛徽章:
0
7 [报告]
发表于 2010-12-11 10:03 |只看该作者
楼上的不要灌水呀,小心我向版主举报你

评分

参与人数 1可用积分 +6 收起 理由
accessory + 6 同意,呵呵

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP