微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 如何构造嵌入式Linux系统

如何构造嵌入式Linux系统

时间:05-23 来源:EDN 点击:
设备驱动程序

  设备驱动程序在Linux内核中扮演着特殊的角色,它们是一个个独立的"黑盒子",使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节。用户操作通过一组标准化的调用完成,而这些调用是和特定的驱动程序无关的。设备驱动程序提供的功能是同外设进行数据传送。设备包括三种类型:字符设备、块设备和网络接口。每个模块通常实现其中一种类型,相应地,模块可分为字符模块(char module)、块模块(block module)和网络模块(network module)三种。然而这种分类方式并不是十分严格,程序员可以构建一个大的模块,在其中实现不同类型的设备驱动程序。三种类型的设备如下:

  字符模块

  字符设备是能够象字节流(比如文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少需要实现open、close、read和write的系统调用。字符终端(dev/console)和串口(/dev/ttySO以及设备类型)就是字符设备的两个例子,它们能够用流抽象很好地表示。

  块设备

  和字符设备一样,块设备也是通过/dev目录下的文件系统节点被访问的。块设备(例如磁盘)上能够容纳文件系统。在大多数Unix系统中,块设备包括整数个块,而每块包含1KB或2的几次幂字节的数据。Linux允许应用程序如字符设备那样读写块设备,可以一次传递任意多字节的数据。因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核和驱动程序的接口不同。块设备的接口必须支持挂装(mount)文件系统。

  网络接口

  任何网络事务都要经过一个网络接口,即一个能够和其它主机交换数据的设备。通常接口是个硬件设备,但也可能是个纯软件设备,比如回环(loopback)接口。网络接口由内核中的网络子系统驱动,负责发送和接收数据包,它必须了解每项事务是如何映射到实际传送的数据包的。尽管Telnet和FTP连接都是面向流的,它们都使用了同一个设备,但这个设备看到的只是数据包,而不是独立的流。

  在Linux里,除了直接修改系统内核的源代码,把设备驱动程序加进内核以外,还可以把设备驱动程序作为可加载的模块,由系统管理员动态的加载和卸载,使之成为内核的一部分。Linux的模块可以用C语言编写,用gcc编译成目标文件(不进行链接,作为*.o文件存在),为此需要在gcc命令行里加上-c的参数。由于在不链接时,gcc只允许一个输入文件,因此一个模块的所有部分都必须在一个文件里实现。编译好的模块*.o放在 / lib / modules / xxxx/misc下(x
xxx表示内核版本),然后用depmod -a使此模块成为可加载模块。模块用insmod命令加载,用rmmod命令来卸载,并可以用lsmod命令来察看所有已经加载的模块的状态。编写模块时必须提供两个函数,一个是init_module(void),供insmod在加载的时候自动调用,负责进行设备驱动程序的初始化工作。Init_module返回0表示初始化成功,返回负数表示失败。另一个函数是void cleanup_module(void),载模块卸载时调用,负责进行设备驱动程序的清除工作。在成功的向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射成一个特别文件,其它程序社用这个设备的时候,只要对此特别文件进行操作就可以了。

  结 语

  本文主要论述了如何构造嵌入式Linux系统,设计和实现一个完整并且小巧使用的嵌入式Linux系统是一个非常复杂的过程。由于嵌入式Linux是由标准Linux裁减而来的,所以需要对Linux的内核有深入的了解。本文所构建的一个小型嵌入式Linux系统,已成功运用于S3C2410 。所欠缺的是构建的内核还不够小,原因可能是存在一些不必要的硬件驱动程序以及库的裁减不够理想导致的。今后的工作主要集中在对外设模块和库的裁减上,以及开发一些特定硬件的驱动程序。 参考文献: 1 魏永明,骆刚,姜军译。Linux设备驱动程序(第二版)。中国电力出版社,2002 2 赵炯著。Linux内核完全注释,2004 3 冯永红,朱善君。裁剪Linux技术分析。2001嵌入式系统及单片机国际学术交流会论文集,2001 本文于2004年8月30日收到。刘新朝:研究生,研究方向为微机控制。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top