龙芯俱乐部开源技术社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3914|回复: 4

生成.ko 模块文件

[复制链接]

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
发表于 2017-8-5 11:32:17 | 显示全部楼层 |阅读模式
Linux系统下.ko文件是什么文件?.so文件是什么文件?

.ko  -- kernel object,内核模块,可以在linux内核起来之后动态的加载和卸载,内核使用的动态连接文件的后缀名。

.so  -- shared object,用户层的动态库 (共享库),用于动态连接的,和dll差不多。使用同一个.so的程序在运行时只需要该.so的同一份拷贝,

如果编译安装了模块,还会在/lib/modules中增加一个以新内核版本为名字的目录,新的模块文件就放在里面。
----------
在你编写的源代码目录下,写一个Makefile文件,内容如下:
obj-m := module.o
module-objs := file1.o file2.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KENREL_DIR) M=$(PWD) modules
然后,直接make就可以得出moduble.ko
说明:
1)module.o表示编译模块的名字;
2)/lib/modules/$(shell uname -r)/build表示Linux内核的存放路径

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
 楼主| 发表于 2017-8-5 13:51:42 | 显示全部楼层
最简单的 hello 驱动源码:
/*
* Name:hello.c
* Copyright (C) 2015 sundm75 (17164830@qq.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/module.h>
#include <linux/kernel.h>
/* 驱动程序的入口函数 */
static int __init hello_init(void)
{
printk(KERN_WARNING "Hello_init!\n");
printk(KERN_WARNING "Hello,world!\n");
return 0;
}
/* 驱动程序的出口函数 */
static void __exit hello_exit(void)
{
printk(KERN_WARNING "Hello_exit!\n");
printk(KERN_WARNING "Goodbye,world!\n");
}
/*
* 用于修饰入口/出口函数,
* 告诉内核驱动程序的入口/出口函数在哪里
*/
module_init(hello_init);
module_exit(hello_exit);
/* 该驱动支持的协议、作者、描述 */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("sundm75");
MODULE_DESCRIPTION("Board First module test");

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
 楼主| 发表于 2017-8-6 18:23:01 | 显示全部楼层
编写 Makefile:
#定义生成的目标
obj-m := hello.o
#定义目录变量
KDIR := /Workstation/tools/kernel/linux-3.0.82-openloongson
PWD := $(shell pwd)
all:
# make 文件
make -C $(KDIR) M=$(PWD) modules ARCH=mips CROSS_COMPILE=mipsel-linux-
clean:
rm -rf *.o *.mod.c *.ko 以上代码注意:
1)make-C.....这一行中,行首要 tab 缩进,不是空格。rm –rf.....这一行,行首也是缩进。
2)/root/Downloads/linux-3.0.82-openloongson 是虚拟机的内核源码的目录,要根据自
己内核位置进行相应修改,而内核源码一定要编译过,而且开发板上下载的 vmlinuz 版本也
是这个编译过的版本,否则会出现编译错误或者编译正确后无法加载错误。
make -C $(Kdir) M=`pwd` modules 该命令是 make modules 命令的扩展, -C
选项的作用是指将
当前的工作目录转移到制定的目录,即(KDIR)目录,程序到(shellpwd)当前目录查找模

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
 楼主| 发表于 2017-8-6 18:30:14 | 显示全部楼层
块源码,将其编译、生成.ko 文件。
$(PWD) 指当前目录的全路径名称。
`pwd`即获取当前路径。 `` (注意`不是单引号,`是 Tab 键上面那个)作用是执行指令。
$1 是获取函数的第一个参数值。
以下是模块加载不成功错误,提示 version 版本问题。
[root@Loongson:/]#insmod hello.ko
hello: disagrees about version of symbol module_layout
insmod: can't insert 'hello.ko': invalid module format

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
 楼主| 发表于 2017-8-6 22:56:15 | 显示全部楼层
root@debian:/home/111/linux-1c/loongson/loongson1/openloongson/linux/linux-3.0.101# make ls1c300a_openloongson_robot_defconfig
warning: (USB_MUSB_HDRC_HCD && USB_MUSB_OTG && USB_GADGET_SNPS_DWC_OTG && USB_LANGWELL_OTG && FSL_USB2_OTG) selects USB_OTG which has unmet direct dependencies (USB_SUPPORT && USB && EXPERIMENTAL && USB_SUSPEND)
warning: (USB_MUSB_HDRC_HCD && USB_MUSB_OTG && USB_GADGET_SNPS_DWC_OTG && USB_LANGWELL_OTG && FSL_USB2_OTG) selects USB_OTG which has unmet direct dependencies (USB_SUPPORT && USB && EXPERIMENTAL && USB_SUSPEND)
#
# configuration written to .config
#
root@debian:/home/111/linux-1c/loongson/loongson1/openloongson/linux/linux-3.0.101#
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|龙芯俱乐部开源技术社区

GMT+8, 2024-12-1 04:35 , Processed in 0.115929 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表