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是一个默认的的配置文件,
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,或者按要求在对应的子目录下编译成模块。
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,或者按要求在对应的子目录下编译成模块。
相关文章推荐
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一)内核的相关基础概念【转】
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核的相关基础概念
- 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
- linux设备驱动归纳总结(一):内核驱动的相关基础概念
- linux设备驱动归纳总结(二):模块的相关基础概念
- XMPP协议相关基础概念(Strophe学习笔记)
- cocos2d学习 -- 相关基础概念
- linux设备驱动归纳总结(二):模块的相关基础概念
- linux设备驱动归纳总结(二):模块的相关基础概念
- Linux设备驱动程序——Linux设备驱动程序——内存和I/O基础知识学习:(2)内核中相关基础知识学习
- linux设备驱动归纳总结(二):模块的相关基础概念
- J2EE学习笔记一:相关概念和基础知识