搜索
bottom↓
回复: 11

请教,linux中为什么有些功能模块需要在编译内核时编译?

[复制链接]

出4375入62汤圆

发表于 2018-8-18 17:07:44 | 显示全部楼层 |阅读模式
本帖最后由 supercoo 于 2018-8-18 17:09 编辑

我是一个搞单片机的,linux菜鸟

现在使用一款arm cotex A7内核cpu的1588功能

在编译一个1588demo时(不是驱动,不是.ko),现在使用的方法是在编译内核时使用make menuconfig 配置


我的问题是
这个demo为什么一定要在编译内核时编译,能不能在板子运行的系统下编译,而不编译内核

如下是其中一个文件包含的头文件,我试着在板子运行系统下全盘搜索了of_platform.h,没有发现这个文件,而在内核源码中\linux\include找到了这个文件
是这个原因,所以此demo必须在编译内核时编译而不能在板子运行的系统下编译吗?
那如果我把内核源码中的这个.h复制到板子运行的系统中(包括其他板子中没有的.h文件),然后编译,这样行不行?
另外为什么有些.h文件,内核源码中有,而编译后的镜像运行系统中没有,是安全的考虑吗?

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/device.h>
#include <linux/hrtimer.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/timex.h>
#include <linux/io.h>

#include <linux/ptp_clock_kernel.h>

#include "gianfar.h"

出0入0汤圆

发表于 2018-8-18 18:55:09 | 显示全部楼层
板子开始跑linux之后,linux只相当于单片鸡程序编完了的bin。这个bin不是linux源码。
开发linux的应用程序或者驱动程序时,必须使用linux的源码,因为只有源码里才有.h;而且必须使用相应的工具链,工具链里面有库文件、头文件等。
我也是新手,可能解释的不太对,有错误的地方希望大家纠正。

出0入0汤圆

发表于 2018-8-18 20:27:18 | 显示全部楼层
本帖最后由 dr2001 于 2018-8-18 20:36 编辑

你这个东西就是一个内核的Module。

由于Linux Kernel不保证Kernel内部API的稳定性,因此,内核态的东西必须使用目标内核的源码进行编译;最好编译器也是同一个,但这点要求很弱。

Linux的内核-用户态之间的API是稳定的,因此只要Libc的版本够,用libc自带的API头文件就足够了。而且,基本设定不变的话,编译结果能在略宽泛的环境下用;静态连接基本就是小通吃。


可以离线编译,上网搜索就行了,大体步骤:
1 目标内核源码某个目录解压
2 export环境,主要是CROSS_COMPILE,ARCH那几个
3 在目标内核源码目录成功编译出来目标内核,不用make install;绝对不能make clean
4 在你的源码目录底下建立个Makefile,大约需要obj-m := file.o这行,然后make -C /source/dir modules,即可。

出0入0汤圆

发表于 2018-8-18 21:41:56 | 显示全部楼层
#include <linux/kernel.h> 这个头文件明显是内核模块用的,正常来讲不可能是应用程序使用的,如果你这个代码不直接生成ko文件,可能是生成ko文件所使用的代码。

出615入1076汤圆

发表于 2018-8-18 22:03:04 | 显示全部楼层
本帖最后由 dukelec 于 2018-8-18 22:05 编辑

> 那如果我把内核源码中的这个.h复制到板子运行的系统中(包括其他板子中没有的.h文件),然后编译,这样行不行?

可以的啊,你把內核代碼(主要是頭文件)也拷貝到板子上就好了啊。


其實板子和電腦在 linux 世界是平等的,只是性能不同而已。

比如對於電腦而言,要編譯驅動模塊的話,要先安裝 linux kernel 頭文件(有專門的軟件包),然後就可以愉快的編譯了。。。

只不過板子的代碼通常不標準,要用廠商改過的爛代碼,所以一般就手動拷貝囉。。。

出615入1076汤圆

发表于 2018-8-18 22:04:54 | 显示全部楼层
本帖最后由 dukelec 于 2018-8-18 22:07 编辑

> 另外为什么有些.h文件,内核源码中有,而编译后的镜像运行系统中没有,是安全的考虑吗?

用不到的話默認不拷貝,是爲了省 Flash 空間而已。。。

同樣是爲了省空間,電腦上的包管理系統,提供了單獨安裝內核頭文件的選擇,與之對應的是下載完整內核代碼。

出0入0汤圆

发表于 2018-8-18 23:40:25 来自手机 | 显示全部楼层
本帖最后由 hl1200 于 2018-8-18 23:48 编辑

这个demo为什么一定要在编译内核时编译,能不能在板子运行的系统下编译,而不编译内核                这个不行的,SDK的toolchain一般基于上位机,放不进下位机运行。正确做法是写Makefile单独编译该模块,改config文件kernel不编译该模块,改启动脚本,init后自动加载运行该模块。

出4375入62汤圆

 楼主| 发表于 2018-8-19 13:35:40 | 显示全部楼层
WM_CH 发表于 2018-8-18 18:55
板子开始跑linux之后,linux只相当于单片鸡程序编完了的bin。这个bin不是linux源码。
开发linux的应用程序 ...


“开发linux的应用程序或者驱动程序时,必须使用linux的源码,因为只有源码里才有.h”

这句话不对,不是必须使用linux的源码,比如spi的驱动在板子运行的环境下就有.h文件

出0入0汤圆

发表于 2018-8-19 13:40:44 来自手机 | 显示全部楼层
确定你的板子上有编译工具链?一般嵌入式环境都不会有,依赖交叉编译,也可以不编内核单独编ko出来。如果板子上有gcc这些可以试试,把arch、include和script目录拷到板子上编。

出4375入62汤圆

 楼主| 发表于 2018-8-19 13:49:43 | 显示全部楼层
eleqian 发表于 2018-8-19 13:40
确定你的板子上有编译工具链?一般嵌入式环境都不会有,依赖交叉编译,也可以不编内核单独编ko出来。如果板 ...

确认板子上有交叉编译工具

出0入0汤圆

发表于 2018-8-19 19:14:10 | 显示全部楼层
supercoo 发表于 2018-8-19 13:49
确认板子上有交叉编译工具

运行环境下需要Native的工具链,不是Cross的。

编译内核相关代码,默认情况下需要Kernel Source,因为一般人搞不动kbuild(修改kbuild)。
如果你能搞定kbuild,我认为你不会提这个问题。

出0入0汤圆

发表于 2018-8-19 19:59:36 来自手机 | 显示全部楼层
你这个1588demo应该是驱动和应用部分写在一起了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 10:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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