linux内核,驱动,应用程三者的概念和之间的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核,驱动,应用程三者的概念和之间的关系相关的知识,希望对你有一定的参考价值。

我知道三者是怎么下载到开发板的,linux内核是编译以后利用u-boot下载到开发板的,那驱动程序是单独下载的还是编译好后放在linux内核中一起随内核编译下载的还是其它的什么,应用程序编译好后放在内核中还是单独下载到开发板的,要是单独下载的话那它们之间的下载顺序是怎么样的。本菜鸟也是刚学linux 嵌入式,我觉得怎么样写代码这不重要,重要的是弄清楚一些概念,很多书只讲了怎样写代码,怎么移植,但不知道如何下载。

首先,要理解操作系统的概念,操作系统是用户和硬件之间的一层媒介程序。不管是Linux还是Windows或者安卓、ios,它的主要功能有两点:
1、有效管理硬件。
2、方便用户操作。

其次,Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理、IO设备管理等等功能,主要目的是为了应用程序提供一个稳定良好的运行环境,这是一个基础。

再次,驱动程序是操作系统有效管理硬件的一个途径。应用程序是方便用户操作提供的程序,比如Shell,Linux中的bash shell以及KDE、gnome等图形Shell都是应用程序。 你可以简单的理解为驱动程序实现了操作系统对硬件的有效管理,应用程序实现了操作系统方便用户操作的目的。

最后,从编程角度来看,Linux内核就是一个调用库,应用程序通过调用Linux提供的API函数来实现操作,Linux内核通过与驱动通信实现对硬件的有效管理。具体的编程细节,需要自己在实践编程中体会。这是一个整体的描述。
参考技术A 1、首先楼主脑子中要有个概念 U-BOOT(BOOTLOADER) LINUX内核(一般包含驱动,也就是和内核一起编译好后下载到板子中) 文件系统(包含用户应用程序等)这三个重要部分 是按照预先设定好的位置放置于NAND FLASH(我这里就不说BOOTLOADER放在NOR FLASH,从NOR 启动了),板子上电后直接运行 BOOTLOADER,BOOTLOADER 根据预先设置好的位置 把LINUX内核加载到内存,并将控制权交给LINUX内核,内核利用文件系统驱动(比如YAFFS驱动等)来从NAND FLASH中操作文件系统。
2、应用程序是放在文件系统(比如YAFFS文件系统)中的,所以应用程序不放在内核中,而是放在文件系统中,制作成文件系统一并下载到NAND FLASH中(或者通过其它途径把文件拷贝到该文件系统中)。追问

文件系统编译好后单独利用U-Boot下载到开发板中的吗,是不是U-BOOT已经把nand flash分区好了,先将内核下载到一个分区,再下载文件系统啊,另外应用程序是编译好后放在文件系统的哪个文件夹中,还是将应用程序源文放到文件系统中一起编译,如果是这样那放到文件系统的哪个文件夹下

追答

是的,需要单独下载到开发板中,分区是事先根据各个大小确定好位置后,然后BOOTLOADER和内核的分区里面一致不冲突就可以了。你可以先下载文件系统后在下载内核,不冲突。因为现在已经对这两块内容固定起始位置了。先下载哪个都无所谓。

本回答被提问者采纳
参考技术B 先说内核,内核就是系统本身,你可以考虑为 win7 系统。 驱动呢,可以编译进内核,也可以不编译进去。不编译进去的时候,可以在内核跑起来之后,用insmod 加载进内核,这个过程,就好比你在win7 下,从网上下载一个显卡驱动并装上。应用呢,就是内核起来后,可以在系统里跑的程序,比如浏览器什么的。那么驱动和应用有啥不同呢,应用是调用内核提供给用户空间的接口,而驱动是在内核空间运行的,用的是内核内部的接口。

Linux内核配置和编译原理 & menuconfigMakefile.config三者之间的关系

1、内核的配置体系

内核是高度可裁剪的,开发产品时根据产品的需求将无用的模块裁剪掉,也就是不要编译进内核,这样编译出来的内核体积小,节省内存,还可以节省性能。由此就需要条件编译,但是内核的可选编译模块太多了,必须要用一套编译体系来管理。我们可以这样类比来理解为什么内核需要一套编译体系来进行配置:当工程只有一个a.c,我们可以直接"gcc a.c"进行编译,但是有1000个源文件,用这种方法就不可行了,于是我们用Makefile进行编译;Makefile可以通过条件编译来让同一份代码在不同的平台上运行,假设代码编译的条件只用选两个平台(arm和下x86),我们可以"make plat=arm"或者"make plat=x86",那如果要条件编译的选项有上千个,同样的这样手工选择的方法也不可行,于是发明了一套编译体系来实现条件编译。总结:工程要管理的源文件太多,发明了Makefile;内核的Makefile要实现的条件编译太多,发明了一套编译体系;内核的配置体系由:Makefile、menuconfig、.config三部分构成。

2、内核配置和编译步骤

(1)确认Makefile:确认ARCH变量,比如ARCH=arm,表示编译ARM平台的内核,这个根据你用的soc选择;检查交叉编译工具链有没有设置对。如:CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
(2)make xxxx_defconfig:执行该语句后出现:configuration written to .config这句话就成功了。xxxx_defconfig是配置文件,指导编译内核,根据自己的硬件平台去选择,这句指令的作用就是生成.config文件,相当于"cp arch/xxx/configs/xxx_defconfig ./config",xxxx_defconfig是放在arch/平台名/configs下的。
(3)make menuconfig:会出现图形化的界面,可以在此界面配置内核,加载或者去除掉某些模块。
执行menuconfig可能出错的原因:屏幕太小,显示不了。解决方法就是全屏或者把字体调小;ncurses库没装,会有相关报错信息;

3、".config"文件

.config文件是一个隐藏文件,要用"ls -a"才能看见,默认是没有这个文件的,需要执行配置命令(make xxxx_defconfig)后才会生成。.config文件最初就是由xxxx_defconfig文件复制得来,里面全是配置项,以行为单位。每个配置项的格式都是CONFIG_xxx=x,每个配置项都可以在menuconfig中找到。CONFIG_xxx是配置项的名字,该配置项在menuconfig中的名字就是xxx,等号后面是配置的结果,可以是Y、N、M,Y代表编译连接此模块,N代表不编译此模块,M代表将该模块单独编译成.ko文件。
总结:.config文件最初由xxxx_defconfig文件复制得来,然后可以在menuconfig中做修改,最终Makefile会读取.config文件,里面的每个配置项都会指导内核的编译。

4、menuconfig详解

参考博客《Linux内核配置——menuconfig》

5、Kconfig文件

参考博客《Linux内核配置——Kconfig文件》

6、menuconfig、Makefile、.config三者之间的关系

6.1、Kconfig文件内容

config DM9000
	tristate "DM9000 support"
	depends on ARM || BLACKFIN || MIPS
	default y
	select CRC32
	select MII
	---help---
	  Support for DM9000 chipset.

	  To compile this driver as a module, choose M here.  The module
	  will be called dm9000.

6.2、.config文件

6.3、对应在menuconfig中

6.4、文件之间关系的解读

通过以网卡芯片DM9000的配置为例,讲解几个文件之间的联系。
(1).config文件默认在内核源码中是没有的,要先执行"make xxxx_defconfig"生成.config文件,这是对内核的初步配置。其中DM9000对应的名字是CONFIG_DM9000,等号后面的对DM9000的配置选项;
(2)执行"make menuconfig",在menuconfig会读取.config和Kconfig,在menuconfig中可以找到DM9000配置项,可以再次选择;
(3)Kconfig中DM900的内容是.config和menuconfig内容的来源,仔细对比DM9000在三个文件中的名字,可以发现关联;
(4)关闭menuconfig后,会把改变过的选项写会到.config中;
(5)Makefile中,会去.config中读取每项配置,其中就包括CONFIG_DM9000,如果CONFIG_DM9000=y则将编译进内核,如果CONFIG_DM9000=n则不会编译,如果CONFIG_DM9000=m则单独编译成.ko文件;

以上是关于linux内核,驱动,应用程三者的概念和之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核配置和编译原理 & menuconfigMakefile.config三者之间的关系

linux内核同步问题

深入Linux内核架构 - 内核之中数据结构之间的关系图 & 设备驱动程序(转)

事件驱动模型初探

TCP网络编程中connect()listen()和accept()三者之间的关系

linux字符设备驱动