当前位置:文档之家› Linux内核与驱动开发实验教材

Linux内核与驱动开发实验教材

内核与驱动开发实验教材中程在线实验一嵌入式开发环境的建立实验目的掌握嵌入式开发环境的构建,熟悉课程实验的开发板掌握安装交叉编译工具的安装方法掌握的烧写方法掌握的编译方法实验内容安装交叉编译工具编译烧写生成映像基础知识交叉编译工具嵌入式系统的开发中,开发环境被称为主机。

因为嵌入式目标系统的资源局限性,不可能完成构建系统的任务,所以需要主机使用交叉编译工具来构建目标系统。

实验使用交叉编译器,与桌面系统采用的编译器是不同,因为实验开发板采用的是处理器。

编译器将使用下列工具,与通常在平台上使用的工具不同,交叉编译工具编译处理的执行文件只能够在平台上运行。

嵌入式系统构建一个嵌入式系统从软件的角度看通常可以分为四个层次:.引导加载程序()。

引导加载程序是系统加电后运行的第一段软件代码。

. 内核。

特定于嵌入式板子的定制内核以及内核的启动参数。

. 文件系统。

包括根文件系统和建立于内存设备之上文件系统。

通常用来作为。

.用户应用程序。

特定于用户的应用程序。

主要的功能有:初始化硬件,初始化, , , , 。

启动,这是最重要的功能,保存内核映像到中,并跳转到内核起始地址。

映像下载,下载内核映像和文件系统到,下载只能通过以太网进行。

如命令完成文件下载。

内存控制,如命令可以烧写。

机中的引导加载程序由(其本质就是一段固件程序)和位于硬盘中的(比如,和等)一起组成。

在完成硬件检测和资源分配后,将硬盘中的读到系统的中,然后将控制权交给。

的主要运行任务就是将内核映象从硬盘上读到中,然后跳转到内核的入口点去运行,也即开始启动操作系统。

而在嵌入式系统中,通常并没有像那样的固件程序(注,有的嵌入式也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由来完成。

在实验开发板(基于3C)的嵌入式系统中,系统在上电或复位时都从地址处开始执行,而在这个地址处安排的通常就是系统的程序。

简单地说,就是在操作系统内核运行之前运行的一段小程序。

通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

通常,是严重地依赖于硬件而实现的,特别是在嵌入式世界。

因此,在嵌入式世界里建立一个通用的几乎是不可能的。

尽管如此,我们仍然可以对归纳出一些通用的概念来,以指导用户特定的设计与实现。

内核是所有系统的中心软件组件。

整个系统的能力完全受内核本身能力的限制。

由于内核支持多个架构,由于架构的差异性,每种架构都有不同的团队在维护,所以必须根据架构来选择供应内核的网站。

见下表:架构最合适的内核网站下载方式等内核源代码目录树结构说明如下::包含和硬件体系结构相关的代码,每种平台占一个相应的目录。

和位相关的代码存放在目录下,其中比较重要的包括(内核核心部分)、(内存管理)、(浮点单元仿真)、(硬件相关工具函数)、(引导程序)、(总线)和(相关状态)。

:常用加密和散列算法(如、等),还有一些压缩和校验算法。

:关于内核各部分的通用解释和注释。

:设备驱动程序,每个不同的驱动占用一个子目录。

:各种支持的文件系统,如、、等。

:头文件。

其中,和系统相关的头文件被放置在子目录下。

:内核初始化代码(注意不是系统引导代码)。

:进程间通信的代码。

:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在*目录下。

:库文件代码。

:内存管理代码,和平台相关的一部分代码放在*目录下。

:网络相关代码,实现了各种常见的网络协议。

:用于配置内核文件的脚本文件。

:主要是一个的模块。

:常用音频设备的驱动程序等。

:实现了一个。

内核在系统启动期间进行的最后操作之一就是安装根文件系统。

根文件系统一直都是所有系统不可缺少的组件。

根文件系统的顶层目录说明见下表。

其中, , , , , 和,都是不可缺少的目录。

目录内容必要的用户命令(二进制文件)设备文件和其它特殊文件系统配置文件,包括启动文件用户主目录必要的链接库,包括链接库、内核模块安装点,用于暂时安装文件系统用来提供内核与进程信息的虚拟文件系统用户的主目录必要的系统管理员命令(二进制文件)在第二层包含对大多数用户都有用的应用程序和文件,包括服务器等。

暂时性的文件和目录下存放了很多常见的操作命令。

这些命令参数多、功能强,同样每个命令文件都比较大,这对嵌入式系统来说是不合适的。

因此嵌入式系统中,通常采用工具来实现的常见操作。

是一个集成了一百多个最常用命令和工具的软件,它甚至还集成了服务器和服务器,而软件大小仅1M左右。

常见的文件系统类型有::只读文件系统,未压缩。

多用于和较低速的(如无):只读文件系统,压缩,可用于较高速的。

:可读写文件系统,可支持压缩或不压缩,较适用于和容量较小的:可读写文件系统,未压缩。

较适用于实验步骤:安装把光盘目录\中的3.4.1 拷贝到虚拟机的系统中。

在文件所在目录进行解压缩,命令如下:3.4.1 –更改虚拟机系统的路径,把工具链加入到搜索路径中。

##在文件中加入下面语句:$3.4.1最后执行命令,使设置的路径信息生效。

命令如下:#检查是否安装成功。

输入如下命令,如果安装成功,将打印出正确的版本信息。

编译内核代码把光盘目录\中的2.6.13拷贝到虚拟机的系统中。

注意,具体文件名可能会根据版本的更新而发生变化。

在文件所在目录进行解压缩,命令如下:2.6.13 –内核配置,具体内核选项请参考光盘资料《用户手册》小节。

内核编译生成映像文件,在目录中。

可以将该文件烧写到开发板中。

写内核代码开机进入模式。

在出厂的时候已经预装入板子的中,设置跳线为启动,即可进入模式,安装驱动。

使用连接线连接开发板与系统主机,如果您是第一次使用,系统会提示您发现了新的设备,此时需要安装驱动。

具体安装步骤请参考光盘资料《用户手册》2.2.2小节。

启动光盘中的工具,在主菜单中选择功能号[],开始下载内核。

具体步骤请参考光盘资料《用户手册》3.1.3小节。

点击“>”选项,并选择相应的内核文件。

生成文件系统映象安装工具程序,把光盘中文件拷贝到虚拟机系统中。

在运行解压命令进行安装。

安装根文件系统目录树,把光盘中文件拷贝到虚拟机系统中。

在运行解压命令进行安装。

生成映像文件,使用命令制作文件系统映象。

映像的文件名为:。

独立实验(可选做)在完成上述实验后,学员可以根据刚才的实验内容,举一反三,独立完成如下实验。

独立完成烧写根文件系统映像的实验。

实验方法请参考光盘资料《用户手册》3.1.4小节。

独立完成的编译,的烧写实验。

实验方法请参考光盘资料《用户手册》第七章。

实验二编写内核模块程序实验目的掌握内核模块程序的框架掌握内核版本中内核模块的编译方法实验内容编写内核模块程序内核模块的程序的实验步骤:编写文件。

拷贝文件到开发板内核代码树的目录下。

修改开发板内核代码树的目录下的文件。

添加执行命令:回到目录下运行:在开发板内核代码树的目录下生成文件。

下载到开发板上。

并加载模块:卸载模块:相关知识版本内核模块的编译方法版本的内核编译需要内核代码树。

通用的文件为:#没有定义,则说明是直接从命令行调用的,#因此要调用内核构造系统。

($(),)$( ) 当前内核树所在目录$( ):$() $() $():$() $() $():* * .* * *:#如果已定义,则说明是从内核构造系统调用的,#因此可利用其内建语句。

:实验说明编写内核模块程序<><>(" ");(){( ", \");;}(){( ", \");}();();独立实验(可选做)环境下编译内核模块程序在虚拟机的系统中编写完成简单的文件, 使模块在虚拟机的系统中进行实验。

模块参数传递实验在内核模块程序中加入模块参数,通过加载命令传递模块参数到模块程序中。

实验三编写字符设备驱动程序实验目的掌握字符设备驱动的编写掌握阻塞型驱动程序的编写掌握引脚的控制方法实验内容编写字符设备驱动编写设备的字符驱动,主设备号为:。

字符驱动只支持方法,不提供等方法。

用户使用命令(参数可以选或,参数值用来指示第几个灯),可以控制灯的亮与灭。

编写阻塞型驱动程序实现字符设备的读写方法,并实现阻塞型。

使用一个静态字符数组做为循环数组,并设置两个静态全局变量和用来指示循环数组的使用情况。

在字符设备的读方法中,判断中是否有数据,如果有,就把数据读出。

并修改指示值和。

如果没有数据,即阻塞住当前进程。

在字符设备的写方法中,把数据写如中,并修改指示值和。

如果写满,即覆盖前面的数据。

相关知识驱动程序如何访问硬件。

如何操作硬件,需要查看开发板的原理图及所涉及的芯片的数据手册。

对于3C,在驱动程序中操作其寄存器时,不能使用物理地址,而要使用虚拟地址。

它们的转换关系非常简单:() (() ) 物理地址转换为虚拟地址() (() ) 虚拟地址转换为物理地址这些宏在内核3c中定义。

也可以使用内核3c中定义的宏,比如要访问的控制寄存器器(物理地址为),可以使用宏()。

引脚介绍开发板带有个用户可编程方式,如图所示硬件原理图,下表为对应的口。

序号名称端口3C的含、、……、八个端口。

八个端口的控制寄存器基本一致。

下面列出其控制寄存器。

:用于选择引脚功能。

:用于读写引脚数据。

:用于确定是否使用内部上拉电阻(为、、……、,没有寄存器)。

与在功能选择方面有所不同,中每一位对应一根引脚(共根引脚)。

当某位设为时,相应引脚为输出引脚,此时我们可以在中相应位写入或让此引脚输出低电平或高电平;当某位设为时,相应引脚为地址线或用于地址控制,此时无用。

一般而言通常设为全,以便访问外部存储器件。

我们暂时不必理会。

在寄存器操作方面完全相同。

中每两位控制一根引脚:表示输入、表示输出、表示特殊功能、保留不用。

用于读写引脚:当引脚设为输入时,读此寄存器可知相应引脚的状态是高是低;当引脚设为输出时,写此寄存器相应位可令此引脚输出低电平或高电平。

:某位为时,相应引脚无内部上拉;为时,相应引脚使用内部上拉。

的引脚、、、对应,在驱动程序中按照上述说明设置、这两个个寄存器,即可控制的亮灭。

内核给我们提供了两个函数来设置的控制寄存器和数据寄存器,非常方便,它们的代码在3c3c中:3c 设置引脚的功能(如输入,输出,中断等。

)3c 设置引脚电平设置引脚中断属性实验步骤设备驱动程序设备驱动程序提供了应用程序控制访问灯的接口。

<><><><><><><><><><><>""[] {3C,3C,3C,3C,};[] {3C,3C,3C,3C,};(*,*,,){() {::( > ) {;}3c([], );;:;}}{,,};(){;;(, );( < ) {( " ' \");;}((, ), , );( ; < ; ) {3c([], []);3c([], );}( " \");;}(){();(, );}();();阻塞型字符驱动程序通过编写一个模拟字符驱动程序,实现阻塞的功能。

相关主题