请教!如何将一个模块加到目标开发板?

发布于 2022-09-30 00:01:01 字数 2140 浏览 16 评论 0

我的模块就是一个很简单的字符设备驱动程序
如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");

#define MAJOR_NUM 254 //主设备号

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

//初始化字符设备驱动的file_operations结构体
struct file_operations globalvar_fops =
{
 read: globalvar_read,;
write: globalvar_write,
};
static int global_var = 0; //"globalvar"设备的全局变量

static int __init globalvar_init(void)
{
 int ret;

 //注册设备驱动
 ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
 if (ret<0)
 {
  printk("globalvar register failure");
 }
 else
 {
  printk("globalvar register success");
 }
 return ret;
}

static void __exit globalvar_exit(void)
{
 int ret;

 //注销设备驱动
 ret = unregister_chrdev(MAJOR_NUM, "globalvar");
 if (ret<0)
 {
  printk("globalvar unregister failure");
 }
 else
 {
  printk("globalvar unregister success");
 }
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
 //将global_var从内核空间复制到用户空间
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  return – EFAULT;
 }
 return sizeof(int);
}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
 //将用户空间的数据复制到内核空间的global_var
 if (copy_from_user(&global_var, buf, sizeof(int)))
 {
  return – EFAULT;
 }
 return sizeof(int);
}

module_init(globalvar_init);
module_exit(globalvar_exit);

该模块在自己的PC机上可以调试成功
但是我想把它动态加载加到开发板上,我应该怎么做呢?

请高手指点,非常感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

毁我热情 2022-10-07 00:01:01

利用某种方式 nfs 或tftp 传到开发板上  然后insmod

可爱咩 2022-10-07 00:01:01

那应该要先交叉编译一下把??
但是我的模块交叉编译不了啊
所以后面的都没有做
我知道如何将文件传到开发板上
但是,交叉编译不成功,即使下载下去也运行不了咯,呵呵

谢谢你,,呵呵

风月客 2022-10-07 00:01:01

那应该要先交叉编译一下把??
但是我的模块交叉编译不了啊

你怎么不会提问?

你的标题是"请教!如何将一个模块加到目标开发板?", 你的内容是"模块交叉编译不了".

为什么编译不了????

可可 2022-10-07 00:01:01

呵呵,不好意思啊,好象扰乱你的思路了

我用的编译命令是:
arm-linux-gcc -Wall -DMODULE -D__KERNEL__ -DDEBUG -PRINTK -I /usr/src/linux-2.4.20-8/include globalvar.o globalvar.c

我也不知道为什么交叉编译不了....出了很多错误,生成不了.BIN文件
首先,交叉编译工具应该没什么问题把,我已经交叉编译过应用程序放到开发板上了,并且运行成功...
其次,该模块在PC上的LINUX里,已经用应用程序测试过了...

请高手指点...非常感谢

成熟稳重的好男人 2022-10-07 00:01:01

你把出错信息贴出来. 如果太多, 起码把前面的出错贴出来.

樱&纷飞 2022-10-07 00:01:01

呵呵,谢谢你了啊,昨天出去办事了
现在才有时间,希望你还能看到

用arm-linux-gcc -Wall -DMODULE -D__KERNEL__ -DDEBUG -PRINTK -I /usr/src/linux-2.4.20-8/include -c -o g;obalvar.o globalvar.c
命令后,错误如附件1

使用命令
arm-linux-gcc -Wall -Os  -DMODULE -D__KERNEL__ -DDEBUG -PRINTK -I /usr/src/linux-2.4.20-8/include -s -o globalvar globalvar.c
错误如附件2

我是刚接触LINUX,还不太懂内核,上面信息看不明白是什么意思。。。
打算在开发板上LINUX下编个字符设备驱动。。。
请高手指点,3X

无声无音无过去 2022-10-07 00:01:01

有些像编译器arm-linux-gcc和内核版本之间匹配的问题.

你查看当前编译器的文档, 看支持哪些内核版本, 再更换编译器或内核版本试试.
另: /usr/src/linux-2.4.20-8/include/asm是一个链接, 确认一下这个链接是否指向正确的地址.

萌能量女王 2022-10-07 00:01:01

呵呵,谢谢你了,光明使者,试一下

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文