嵌入式开发网站集锦!
国内站点:
电子设计信息网,尽管是个业界新秀,但潜力无量!这里能带给你无限精彩和希望!
http://www.edires.net/
华恒公司的主页,里面有很多的相关资料,有待大家去发现
http://www.hhcn.com/chinese/embedlinux-res.html
SkyEye嵌入式硬件仿真项目
www.skyeye.org
http://gro.clinux.org/projects/skyeye/
公社的SkyEye项目专栏
http://www.linuxfans.org/nuke/modul...=viewforum&f=58
Pday水清木华,一个国内看嵌入式新闻的好地方!
http://www.pday.com.cn/
中国单片机公共实验室
http://www.bol-system.com/
中国Linux论坛的嵌入式版,有很多开发板原理图的资料
http://openarm.linuxforum.net/
嵌入开发网
http://www.embed.com.cn/
微芯力科技
http://www.winsilicon.com
驱动开发网之嵌入式版块,挺综合的一个网站
http://www.driverdevelop.com/index.php
国外站点
Linux设备网站,由Rick Lehrbaum创建和维护,是一个嵌入式Linux入门网站,其中包含嵌入式Linux行业的每日新闻、完整系列的快速参考指南、由重要开发者撰写的大量文章,还包括一个交互论坛。
http://www.linuxdevices.com/
下载嵌入式Linux交叉编译工具链的好地方——SnapGear Embedded Linux Distribution Home Page
http://www.snapgear.org/snapgear/index.html
http://www.uclinux.org/pub/uClinux/...lf-tools/gcc-3/
嵌入式Linux联盟(ELC),一个非盈利性的厂商中立的同业工会,其目标是在整个嵌入式、应用和设备市场中发展和推广Linux。
www.embedded-linux.org
Beyond Logic公司主页,提供了许多嵌入式Linux系统开发的资料。
http://www.beyondlogic.org
嵌入式Linux期刊(ELJ,Embedded Linux Journal),主要关注Linux和其他开源软件在嵌入式系统中的应用。 其中有很多业界领导者为ELJ撰写文章。
embedded.linuxjournal.com
有几本写嵌入式Linux系统的书
http://www.embeddedlogic.com/ELSweb/booklinks.html
有关PowerPC体系的嵌入式
www.mvista.com
www.denx.de/e/index1.php
IXP4XX Open Source Developers Guide
http://ixp4xx-osdg.sourceforge.net/
uClinux/ARM项目
http://adam.kaist.ac.kr/~hschoe/notice.html
个人主页
一个业余爱好者代礼周的个人主页,都是实践出来的
http://www.lomx.net/index.htm
D_J嵌入式个人主页,有很多资料!
http://staff.ustc.edu.cn/~wangzhuo/index.html
renbagshoes的个人主页,有些资料可能你会用的到!
http://timity.nease.net
嵌入式Linux操作系统
小型化的嵌入式Linux版本
uClinux —— 在没有 MMU 的系统上运行的 Linux。目前支持 Motorola 68K、MCF5206 和MCF5207 ColdFire 微处理器。
http://www.uclinux.org/index.html
Etlinux —— 设计用于在小型工业计算机,尤其是 PC/104 模块上运行的 Linux 的完全分发版
http://www.prosa.it/etlinux/index.html
Tiny Linux ── 可以运行在 386 上的 Linux 分发版。
http://tiny.seul.org/en/
ThinLinux ── 面向专用的照相机服务器、X-10 控制器、MP3 播放器和其它类似的嵌入式应用的最小化的 Linux 分发版。
www.thinlinux.org
LRP(Linux Route Project)
http://www.linuxrouter.org
Peeweelinux一个小的嵌入式Linux发行版
http://freshmeat.net/projects/peeweelinux
具有实时扩展功能的嵌入式Linux版本
RT-Linux主页
http://www.fsmlabs.com
http://www.rtlinux.com
RTAI
http://www.rtai.org
嵌入式GUI
Microwindows由Century Software的CEO GregHaerr主持开发的一个公开源码(LGPL)的项目。Microwindows致力于为一些小型设备和平台提供现代图形窗口环境。Microwindows支持许多硬件平台,移植性很强。Microwindows的主要目的之一便是运行在嵌入式Linux上,并且提供了基于Win32/X的两套API接口。
http://www.microwindows.org
http://microwindows.org
MiniGUI由原清华大学教师魏永明先生开发,是中国人做的得较好的*软件之一。MiniGUI是一种面向嵌入式系统或者实时系统的公开源码(LGPL)的图形用户界面支持系统。它主要运行于Linux控制台,实际可以运行在任何一种具有POSIX线程支持的POSIX兼容系统上。
http://www.minigui.org
飞漫软件的MiniGUI项目
http://www.minigui.com/company/cindex.shtml
Qt/Embedded是著名的QT库开发商Trolltech正在进行的面向嵌入式系统的QT版本。Qt/Embedded对于各种硬件接口到GUI工具包提供了完整的图形栈。Qt/Embedded的API同Qt/X11和Qt/Windows的相同,但它并不是基于X11库的。Qt/Embedded是公开源码(LGPL)项目。
http://www.trolltech.com
OpenGUI基于一个用汇编实现的x86图形内核,提供了一个快速的、32位的、高层的C/C++图形接口。OpenGUI也是一个公开源码(LGPL)项目。OpenGUI提供了二维绘图原语,消息驱动的API和BMP文件格式支持。
http://www.tutok.sk/fastgl
PicoGUI是一个可以工作在包括手持式设备等各种硬件上的小型的、可移植的、基于客户/服务器结构的GUI。同XWindow系统一样,它具有客户—服务器结构的灵活性,但又不同于XWindow系统,它将字体、BMP文件、控件以及一些应用程序所需要的其它的一些资源直接集成在服务器。虽然减少了系统的灵活性,但在速度上有了很大的提高,并且减小了程序大小。
http://picogui.org
Tiny-X是一个为嵌入式系统而开发的紧缩型的X Window服务器。它由SuSE赞助,由XFree86的核心成员Keith Packard开发。Tiny-X的目标是可以在小内存或几乎无内存的情况下良好运行。
http://www.pps.jussieu.fr/~jch/software/kdrive.html
PIXIL提供嵌入式在高级因特网中应用程序的应用。它虽然是为商业化准备的,但它提供GPL协议下的版本,区别是没有技术支持。
http://www.pixil.org
NxZilla - Mozilla on NanoX
http://nxzilla.sourceforge.net
SimpleDirectMedia Layer is a cross-platform multimedia library designed toprovide low level access to audio, keyboard, mouse, joystick, 3Dhardware via OpenGL, and 2D video framebuffer. It is used by MPEGplayback software, emulators, and many popular games, including theaward winning Linux port of "Civilization: Call To Power."
http://www.libsdl.org/index.php
GtkFB: GTK+ for the Linux Framebuffer
http://www.linuxdevices.com/articles/AT9024868021.html
嵌入式Linux与Java
Java 2 Micro Edition(J2ME官方站点)
http://www.javasoft.com/j2me/
waba为小设备提供一个编程平台。它被定义为一种语言,一个虚拟机,一个类文件格式以及功能类的设置。
http://wabasoft.com/products.shtml
Kaffeis a clean room implementation of the Java virtual machine, plus theassociated class libraries needed to provide a Java runtimeenvironment. The Kaffe virtual machine is free software, licensed underthe terms of the GNU General Public License.Kaffe is a great choice asa base for virtual machine education and/or research, or if you need avirtual machine as an integral component of an open source or freesoftware Java distribution.
http://www.kaffe.org
Wonka(一个java虚拟机,超小)
http://www.acunia.com/wonka
嵌入式综合性网站 http://www.eg3.com (英文)
丰富的产品介绍、丰富的链接(嵌入式领域)。
http://altair.ihep.su/~kulemzin/index.html (英文)
为嵌入式开发人员提供大量的信息资源。
http://www.embedded-directory.com (英文)
嵌入式产品、工具介绍,包括硬件、软件、开发工具、开发服务商、测试设备、单板、处理器、信号处理器、分析仪等。
http://www.siliconpenguin.com (英文)
嵌入式Linux资源网站
http://cs-www.bu.edu/pub/ieee-rts/Home.html (英文)
IEEE计算机协会实时系统技术分会主页,提供该组织研究文档、实时系统研究组织名录以及书刊、杂志、产品的链接。
http://www.es-mag.com (英文)
欧洲关于嵌入式设计的杂志《EmbeddedSystems》网站
http://www.esofta.com (英文)
按处理器提供嵌入式产品、工具索引介绍。
奔微实时操作系统--KarlOS微内核
KarlOS 是一种小型且可靠的实时内核,特别是针对嵌入式系统而设计。内核自身能被非常灵活地修改到任一平台,因为它用于硬件抽象层(HAL)来隐藏任一硬件的特定功能,以至于可以协调内核的功能。同时KarlOS象一些传统的内核,用于平台抽象层(PAL)技术。
http://www.embeddedtechnology.com (英文)
包含大量的嵌入式产品、开发工具、产品提供商介绍。
http://www.realtime-info.com (英文)
实时系统综合性信息网站,《Real-Time Magazine》杂志主办者。提供实时操作系统及其它相关产品购买指导,实时技术研究组织机构介绍,业界新闻和重要活动消息发布,《Real-Time Magazine》杂志网上介绍。
http://www.electronic-forecast.com (英文)
提供嵌入式工业市场、产品研究信息,向用户提*品购买指导。
http://www.primenet.com/~magpub/ (英文)
实时系统杂志网站,内容广泛。
http://www.ifi.unizh.ch/groups/ailab/links/embedded.html (英文)
提供大量的嵌入和实时系统链接资源。
http://www.forthinc.demon.co.uk/info/links/index.htm (英文)
提供丰富的嵌入式开发链接。
http://www.embedded-systems-messe.de (英文)
嵌入式产品展览会Internet发布网站。
http://www.embeddedinternet.com (英文)
嵌入式产品展览Internet发布。
Windows CE下载区
微软最新Windows CE.Net 4.1下载试用。
http://www.embedded.com (英文)
美国一家关于嵌入式系统的综合性网站,《EMBEDDED SYSTEMS》杂志主办者。提供嵌入式产品和工具购买指导,嵌入式产品Demo下载,业界新闻及各类活动报道,包含大量的资源链接和嵌入式开发文章,以及丰富的业界广告。
嵌入式Linux 嵌入式LINUX硬件板卡供应商
嵌入式LINUX硬件板卡供应商嵌入式LINUX开发套件供应商
嵌入实时操作系统 http://linux-embedded.com/links.php3 (英文)
提供嵌入式Linux链接
http://www.cs.umd.edu/~fwmiller/etc/realtime/code.html (英文)
实时软件概要
嵌入论坛 白云黄鹤站
白云黄鹤站嵌入版,国内较热闹的嵌入开发论坛,很值得拜访
科大瀚海风云嵌入式论坛
中国科技大学嵌入式论坛
星运网络-----电子工程师论坛
电子相关方面论坛,目前内容较少
民间团体 嵌入式Linux
主要是关于嵌入式Linux的内容
北京 Linux 俱乐部
主要是关于linux的内容
清华AKA
主要是关于linux的内容,有一些嵌入式系统的介绍
操作系统开发者
主要是关于linux的内容
链接资源 可编程逻辑器件网站
可编程逻辑器件网站致力于PLD/FPGA及VHDL技术在中国的推广。
电子网站之家
各地各类电子网站!电子网站大全!
IPANEL 嵌入式浏览器网站
详细介绍IPANEL嵌入式浏览器性能指标,用途等
科研团体 中国单片机公共实验室
内容主要集中在8位单片机,有一些值得一看的资料
中科院计算所RTOS主页
嵌入式系统软件研究组的主页,内容不多,但值得一看
开发工具 http://www.idiom.com/free-compilers/ (英文)
免费编译器目录
http://www.delorie.com/gnu/docs/gcc/gcc_44.html (英文)
介绍用GNU CC构造交叉编译器
http://www.gnu.org (英文)
GNU *软件组织
个人主页 iMCU--网络单片机
8月20日,全面改版,新版正式运行。目前尚有部分功能未完成。永久域名:http://imcu.126.com
电子网站大全
电子网站大全
开放的ColdFire网站 (英文)
完全开放原码,电路图的个人ColdFire网站。包括Free的TCPIP原码,uClinux和uCOS操作系统等等
嵌入式系统及器件论坛
内容少了点
51单片机世界
网站内容与网站名称描述相同,首页链接了大部分内容
汉东单片机实验室
关于单片机的个人网站中,是目前内容较丰富的一个
嵌入式RTOS
内容主要集中在嵌入式实时操作系统
单片机家园
一个单片机方面的个人网站。
嵌入式Linux个人网站
内容较少,仅一些文章和资源推荐!
电子工程师园地
有一些单片机和处理器的内容,主要是8051系列和X86系列,嵌入领域内容不多,内容有点杂
嵌入系统
主要内容包括MCS51/96系列和X86系列,BIOS的网络资源,简单的实时操作系统介绍,还有部分开发人员联合开发的实时操作系统介绍
电子工程师
内容主要集中在C51系列单片机
美国一位大学副教授的个人主页 (英文)
关于嵌入式处理器方面的个人工作项目介绍,有很多源码。
单片机 电子世纪
电子基础 mcu技术 mcu论坛 软件下载 数据手册 帮你开发 mcu解密 程序设计 校友挚友 招聘&人才 电子英语
单片机技术网
介绍单片机技术,开发和应用的专业网站,有众多应用文章,电子网站联接,产品项目介绍和部分产品网上销售等。内容包括单片机,工业控制,仪器仪表,信息家电,IC卡应用,防盗监控等
处理器类 http://www.bdti.com (英文)
提供大量DSP处理器信息。
http://www.mdronline.com/events/epf99/ (英文)
嵌入式处理器论坛。
产品信息 闻亭公司DSP产品
主要是dsp仿真器。
奔微实时操作系统--KarlOS微内核
KarlOS是一种小型且可靠的实时内核,特别是针对嵌入式系统而设计。内核自身能被非常灵活地修改到任一平台,因为它用于硬件抽象层(HAL)来隐藏任一硬件的特定功能,以至于可以协调内核的功能。同时KarlOS象一些传统的内核,用于平台抽象层(PAL)技术。
北京灵思信息系统有限公司
定位于嵌入式linux技术服务和提供解决方案的公司
广州中杰嵌入式计算平台
提供基于嵌入式硬件平台的产品级到系统级的完整解决方案,以满足用户嵌入式应用需求。
测试工具 http://www.rstcorp.com/marick/faqs/tools.htm (英文)
分类介绍各种测试工具产品。
http://www.stqe.net (英文)
软件测试资源网站。
http://www.testingstuff.com (英文)
一个介绍了大量测试工具的个人网站。
http://www.methods-tools.com/tools/frames_testing.html (英文)
提供大量的测试工具列表,包含简介与链接。
http://www.dirac.org/linux/writing/lkmpg/2.6/lkmpg-2.6.0.html
2. Linux Device Drivers, 3rd Edition
By Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini
http://linuxdriver.co.il/ldd3/
3. Writing Linux kernel modules
http://www.staerk.de/thorsten/index.php/Writing_Linux_kernel_modules
1. Building Embedded Linux System(英文)
http://oss.lzu.edu.cn/modules/wfdownloads/visit.php?cid=6&lid=87
2. 构建嵌入式Linux系统(中文)
http://oss.lzu.edu.cn/modules/wfdownloads/visit.php?cid=6&lid=51
转自:http://blog.chinaunix.net/u/21948/showart_354391.html
一、门户网站
1 ChinaUnix
网址: http://www.chinaunix.net
描述: C版块和shell版块很不错
C/C++论坛:http://bbs.chinaunix.net/forumdisplay.php?fid=23
shell论坛:http://bbs.chinaunix.net/forumdisplay.php?fid=24
man文档:http://man.chinaunix.net
2 中国Linux论坛
网址: http://www.linuxforum.net/
描述: 嵌入式Linux技术提高
Linux嵌入技术:http://www.linuxforum.net/forum/postlist.php?Cat=&Board=embedded
Linux内核技术:http://www.linuxforum.net/forum/postlist.php?Cat=&Board=linuxK
Linux设备驱动程序:http://www.linuxforum.net/forum/postlist.php?Cat=&Board=driver
C/C++编程版:http://www.linuxforum.net/forum/postlist.php?Cat=&Board=program
3 The ARM Linux Project
网址: http://www.arm.linux.org.uk/
描述: Linux for all ARM based machine
4 ARM官方网站
网址: http://www.arm.com/
描述: 提高ARM水平的最佳地方。文档和技术笔记均为英语,慢慢锻炼。
Document:http://www.arm.com/documentation/
Software:http://www.arm.com/community/software.php?PageTitle=Software&Categories=4&display=3
5 The Linux Kernel Archives
网址: http://www.kernel.org/
描述: Linux Kernel官方网站
6 IBM developerWorks
网址: http://www-128.ibm.com/developerworks/cn/
描述: 技术文档低中高级很丰富,作为系统学习的参考补充。
7 SourceForge
网址: http://sourceforge.net/
描述: 开源软件的入口。
U-boot:http://sourceforge.net/projects/uboot/
8 Linux fans
网址: http://www.linuxfans.org/nuke/index.php
描述: 国内很出名的Linux站点,人气很高。
二、技术博客
1 陈莉君
网址: http://www.lupaworld.com/26540
http://www.kerneltravel.net/
描述: 操作系统(Linux)研究。《深入理解Linux内核》的译者。kerneltravel里面关于kernel有很多精彩的文章,入门深入都可以在这里找到资料,可以讨论提高。
2 飞翔,嵌入式Linux
网址: http://blog.chinaunix.net/u/30686/index.html
描述: 嵌入式Linux方向
3 cnsLinux
网址: http://blog.chinaunix.net/u/13329/index.php
描述: Linux与程序设计
4 todaygood
网址: http://blog.chinaunix.net/u/24474/
描述: 嵌入式Linux方向
5 嵌入式Linux博客圈
网址: http://blog.chinaunix.net/group/group_25.html
描述: 我建立的嵌入式Linux方向的博客圈
6 Richard Stevens
网址: http://www.kohala.com/start/
描述: Richard Stevens的个人主页。
三、资料下载
1 Free Datasheet PDF Download
网址: http://www.ic-on-line.cn/
描述: 硬件芯片Datasheet可以在此下载
四、开发板厂商
1 北京恒颐
网址: http://www.hyesco.com/
2 华恒科技
网址: http://www.hhcn.com/chinese/cnindex.html
3 广州联智
网址: http://www.devicegate.com/
4 周立功单片机
网址: http://www.zlgmcu.com/home.asp
五、开发工具
1 GNU AS: Using AS---the GNU Assembler
http://sourceware.org/binutils/docs-2.16/as/index.html#Top
2 GNU LD: Using LD---the GNU Linker
http://www.gnu.org/software/binutils/manual/ld-2.9.1/html_mono/ld.html
3 GNU MAKE
http://www.gnu.org/software/make/manual/make.html
4 GNU GCC: Using the GNU Compiler Collection
http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/
5 GNU GDB: Debugging with GDB
http://sourceware.org/gdb/current/onlinedocs/gdb_toc.html
6 GNU CVS
http://ximbiot.com/cvs/manual/
7 VIM
英文:http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
中文:http://vcd.gro.clinux.org/doc/usr_toc.html
8 几本重要的书
《Using and Porting the GNU Compiler Collection》
http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html
《Linkers and Loaders》
http://www.iecc.com/linker/
9 交叉编译工具链
http://www.codesourcery.com/gnu_toolchains/arm
备注:CodeSourcery公司提供的GNU Tools交叉编译工具,性能优越。我现在使用的是arm-2007q1,编译了U-boot-1.2.0,并且成功移植到s3c2410(2007-09-19)
六、程序设计
1 《The Art of UNIX Programming》
http://www.faqs.org/docs/artu/
2 《UNIX Programming FAQ》(中文版)
http://www.linuxforum.net/books/upfaq/book1.htm
PS: 这是从super兄(实际上只发过一次邮件交流过哦)的博客上摘录的,他的博客地址是(http://blog.chinaunix.net/u/21948/),主要是嵌入式方面的日志。记得刚上CU的时候因为找嵌入式方面的资源,跑到他的博客上,发现他也在学嵌入式,不过到现在他长进很大,可我还只是学了毛皮。回想起来,可能是这段时间东学学、西弄弄,没有一个主线,所以得静下心来好好学习和研究啦。
1. HOWTO BUILD A CROSS COMPILER WITH EMERGE !(gentoo)
http://dev.gentoo.org/~vapier/CROSS-COMPILE-HOWTO
2. Very Simple Guide for Building Cross Compilers Tips(Recommend)
http://www.ifp.uiuc.edu/~nakazato/tips/xgcc.html
3.cross compiler mini howto
http://linux.bytesex.org/cross-compiler.html
4. How to build a cross compiler for Linux/MIPS
http://www.village.org/villagers/imp/build.html
5. Building a cross-compiler
http://www.nongnu.org/thug/cross.html
6. Cross Compiling Gcc for PowerPC(like 2)
http://www.pages.drexel.edu/~sg64/stuff/cross-compile.htm
7. ARM cross-compiling howto(Recommend)
http://www.ailis.de/~k/archives/19-ARM-cross-compiling-howto.html
8. Building and Testing gcc/glibc cross toolchains
http://www.kegel.com/crosstool/
9. Building the x86_64 cross-compiling toolchain(Recommend)
http://home.ix.netcom.com/~ejohns/glfs-amd64/toolchain.html
10. Building a GCC Cross Compiler for the PowerPC
http://www.cs.duke.edu/~irwin/gcc_ppc.html
11. The PARISC-Linux Cross Compiler How TO
http://www.parisc-linux.org/toolchain/PA-Linux-XC-HOWTO-01.html
12. Cross compiling a 64-bit PowerPC Linux Kernel
http://wiki.ppckernel.org/w/Cross_compiling_a_64-bit_PowerPC_Linux_Kernel
13. x86 -> Alpha Cross Compiler HOWTO(Recommend)
http://www.cse.unsw.edu.au/~cgray/crossdev/x86-alpha-xcc.html
14. HOWTO Cross Compile(gentoo)
http://gentoo-wiki.com/HOWTO_Cross_Compile
15. Building a GNU/Linux ARM Toolchain (from scratch)
http://www.schnozzle.org/~coldwell/toolchain/
[转帖] 嵌入式Linux驱动程序开发要点
转自:一塌糊涂的BLOG
在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。
字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。
每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问驱动程序。
系统调用时操作系统内核与应用程序之间的接口,设备驱动程序是操作系统内核与机器硬件之间的接口。设备驱动程序是内核的一部分,它完成以下功能:
●对设备初始化和释放
●把数据从内核传送到硬件和从硬件读取数据
●读取应用程序传送给设备文件的数据和回送应用程序请求的数据
●检测和处理设备出现的错误
MTD(MemoryTechnologyDevice)设备是闪存芯片、小型闪存卡、记忆棒之类的设备,它们在嵌入式设备中的使用正在不断增加。MTD驱动程序是在Linux下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用MTD驱动程序的优点在于他们能更好的支持、管理给予闪存设备,有基于扇区的擦除和读/写操作的更好的接口。
驱动程序结构
Linux的设备驱动程序可以分为3个主要组成部分:
1. 自动配置和初始化子程序,负责监测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。
2.服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进行运行环境有关的函数。
3.中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。
在系统内部,I/O设备的存/取通过一组固定的入口点来进行,这组入口点是由每个设备的驱动程序提供的。具体到Linux系统,设备驱动程序所提供的这组入口点由一个文件操作结构来向系统进行说明。file_operation结构定义于linux/fs.h文件中。
struct file_operation{
int (*lseek)(struct inode *inode, struct file *filp, off_t off, int pos);
int (*read)(struct inode *inode, struct file *filp, char *buf, int count);
int (*write)(struct inode *inode, struct file *filp, const char *buf, int count);
int (*readdir)(struct inode *inode, struct file *filp, struct dirent *dirent, int count);
int (*select)(struct inode *inode, struct file *filp, int sel_type, select_table *wait);
int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned int arg);
int (*mmap)(void);
int (*open)(struct inode *inode, struct file *filp);
int (*release)(struct inode *inode, struct file *filp);
int (*fasync)(struct inode *inode, struct file *filp);
};
file_operation结构中的成员几乎全部是函数指针,所以实质上就是函数跳转表。每个进程对设备的操作都会根据major、minor设备号,转换成对file_operation结构的访问。
常用的操作包括以下几种:
●lseek, 移动文件指针的位置,只能用于可以随机存取的设备。
●read, 进行读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误;否则,返回实际读取的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必须是inode-i_blksize的倍数。
●write, 进行写操作,与read类似
●readdir, 取得下一个目录入口点,只有与文件系统相关的设备程序才使用。
●select, 进行选择操作。如果驱动程序没有提供select入口,select操作会认为设备已经准备好进行任何I/O操作。
●ioctl, 进行读、写以外的其他操作,参数cmd为自定义的命令
●mmap, 用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用
●open, 打开设备准备进行I/O操作。返回0表示打开成功,返回负数表示失败。如果驱动程序没有提供open入口,则只要/dev/driver文件存在就认为打开成功。
●release, 即close操作。
在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operation结构中函数实现。不需要的函数接口可以直接在file_operation结构中初始化为NULL。file_operation变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operation结构中的函数指针。
Linux对中断的处理
在Linux系统里,对中断的处理是属于系统核心部分,因而如果设别与系统之间以中断方式进行数据交换,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。它们被定义为:
#i nclude <linux/sched.h>
int request_irq(unsigned int irq,
void (*handler)(int irq, void dev_id, struct pt_regs *regs),
unsigned long flags,
const char *device,
void *dev_id);
void free_irq(unsigned int irq, void *dev_id);
参数irq表示所要申请的硬件中断号;handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号;dev_id为申请时告诉系统的设备标识;regs为中断发生时的寄存器内容;device为设备名,将会出现在/proc/interrupts文件里;flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序还是慢速处理程序。快速处理程序运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外,其他中断都没有被屏蔽。在Linux系统中,中断可以被不同的中断处理程序共享。
作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们被定义为:
#i nclude <linux/kernel.h>
void *kmalloc(unsigned int len, int priority);
void kfree(void *obj);
参数len为希望申请的字节数;obj为要释放的内存指针;priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。