您的位置:首页 > 运维架构 > Linux

linux设备驱动学习(一):内核的相关基础概念

2014-11-09 20:38 260 查看
一.linux设备驱动的作用
Linux内核: 用于管理软硬件资源,并提供运行环境。
linux设备驱动:是连接硬件和内核之间的桥梁。

linux系统按个人理解可按下划分:

应用层:包括POSIX接口,LIBC,图形库等,用于给用户提供访问内核的接口。属于用户态,ARM运行在用户模式(usr)或者系统模式(sys)下。
内核层:应用程序调用相关接口后,会通过系统调用,执行SWI指令切换ARM的工作模式到超级用户(svc)模式下,根据用户函数的要求执行相应的操作。
硬件层:硬件设备,当用户需要操作硬件时,内核会根据驱动接口操作硬件设备

图结构如下:





二.内核代码树介绍

linux-2.6.29
|-arch ---------------------------包含和硬件体系结构相关的代码
|-block --------------------------块设备的通用函数
|-firmware -----------------------固件,如BOIS
|-Documentation ------------------标准官方文档
|-dirver -------------------------linux设备驱动目录
|-fs -----------------------------内核所支持的文件系统
|-include ------------------------头文件.linux/module.h linux/init.h常用库。
|-init ---------------------------库文件代码,C库函数在内核中的实现. init/main.c->start_kernel->内核执行第一条代码
|-ipc ----------------------------进程间通信
|-mm -----------------------------内存管理
|-kernel -------------------------内核核心部分,包括进程调度等
|-net ----------------------------网络协议
|-sound --------------------------音频ALSA驱动相关


其中,跟设备驱动有关并且经常查阅的文件夹有:
init
include/linux, /asm-arm
drivers:
arch:
三.Makefile和 Kconfig

对于内核,Makefile分为5类:
Documentation/kbuild/makefiles.txt描述如下:

50 The Makefiles have five parts:

51

52 Makefile
总Makefile,控制内核的编译

53 .config
内核配置文件,配置内核时生成,如make menuconfig后

54 arch/$(ARCH)/Makefile
对应体系结构的Makefile

55 scripts/Makefile.* Makefile共用的规则

56 kbuild Makefiles
各子目录下的Makefile,被上层的Makefile调用。

先大概描述一下内核的编译过程:

首先配置内核,使用如下四命令之一:
make config(依据文本的最传统配置界面,不推荐使用)
make menuconfig(基于文本菜单的配置界面,推荐)
make xconfig(需要安装QT)
make gconfig(需要安装GTK+)
运行 make menuconfig后,出现如下界面:



配置工具首先分析与体系结构相对应的/arch/xxx/Kconfig文件,xxx通常为x86,arm等.
这个Kconfig文件除了本身包含一些体系结构相关的配置项和菜单之外,还source了一系列Kconfig文件,而这些Kconfig文件继续
source其他Kconfig文件,层层递归,配置工具根据这些Kconfig即可描绘出Linux的分层结构.

执行make menuconfig选择好配置项之后,配置工具会生成一个一个.config文件,而这个文件记录了一些编译宏的值,如下:
==============================================================================================================

#

# Automatically generated make config: don't edit

# Linux kernel version: 2.6.36

# Sun Jul 31 05:18:24 2011

#

CONFIG_ARM=y

CONFIG_SYS_SUPPORTS_APM_EMULATION=y

CONFIG_GENERIC_GPIO=y
...

==============================================================================================================
细心爱专研的同学可能会发现了,这个文件和 kernel/arch/xxx/configs 下边的 xxx_defconfig 内容差不多,
实际上arch/xxx/configs/xxx_defconfig是一个默认的的配置文件,

知识补充:

1. 如果kernel根目录.config不存在,运行make config/menuconfig时的默认设置由固化在各个Kconfig文件中各项目的默认值决定。

2. 如果.config存在,运行make config/menuconfig时的默认设置即是当前.config的设置,若对设置进行了修改,.config将被更新。

3. arch/arm/defconfig是一个默认的配置文件,make defconfig时会根据这个文件生成当前的.config。

4. arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。

5. make oldconfig的作用是备份当前.config文件为.config.old,如若make config/menuconfig设置不当可用于恢复先前的.config。

通常.config的内容会比xxx_defconfig 多,这是因为在make menuconfig的时候,会有很多的通用的不需要选择的默认配置加入.

有了.config,执行make之后,简单来说,编译内核会把这些值赋给Makefile 文件的宏(其实赋值不准确,其实就是一个东西),这样从根目录下的Makefile文件进行层层递归编译.

抛去Kconfig和Makefile的语法不讲,Kconfig 和Makefile的作用如下:
Kconfig:
1.在makemenuconfig下可以配置选项;

2.在.config中确定CONFIG_XXX的的值。

为用户提供一个交互界面来选择如何配置并生成配置选项,

目标产物 .config

Makefile:
根据.config编译.c为.o, 并最终生成kernel编译产物 zImage.

总结

1一般我们会先将一份defconfig默认配置copy到内核跟目录下并改名为.config。
2.make menuconfig
1 由总Makefile决定编译的体系结构(ARCH).编译工具(CROSS_COMPILE),并知道需要进去哪些目录进行编译。
2由arch/$(ARCH)/Makefile,决定arch/$(ARCH)下还有的哪些目录和文件需要编译。
3知道了需要编译的目录后,递归的进入哪些目录下,读取每一个Kconfig的信息,生成了图形配置的界面。
4通过我们在图形配置界面中选项为[*]、[M]或者[]。
5保存并退出配置,会根据配置生成一份新的配置文件.config,并在同时生成include/config/auto.conf(这是.config的去注释版)。文件里面保存着CONFIG_XXXX等变量应该取y还是取m.
3.make
根据Makefile包含的目录和配置文件的要求,进去个子目录进行编译,最后会在各子目录下生成一个.o或者.a文件,然后总Makefile指定的连接脚本arch/$(ARCH)/kernel/vmlinux.lds生成vmlinux,并通过压缩编程bzImage,或者按要求在对应的子目录下编译成模块。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: