已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. 为什么要选择LINUX:(1) 面向服务,网络功能强大(2) 源码开放,可移植性强(3) 有大公司的支持,Intel,IBM,ARM(4) 一个全新的世界(5) 学术研究必不可少的平台(源码、算法、对比实验)2. LINUX的驱动程序:(1) LINUX下对外设的访问只能通过驱动程序,uClinux下可以在应用层直接访问外设,操作寄存器,但是无法处理中断,DMA,抢占,原子操作等(2) LIUNX对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序Open,release,read,write,ioctl (3) 驱动程序是内核的一部分,可以使用中断,DMA等操作注: uClinux是linux2.0核心的分支,是针对没有MMU管理单元的微控制器,uClinux不是实时操作系统(4)驱动程序需要在用户态和内核态之间传递数据(5)对于复杂的应用可以考虑是用mmap3. 在驱动程序中通过devfs_register()函数创建设备文件系统的特点;系统启动的时候mount设备文件系统;所有需要的设备节点都由内核自动管理,/dev目录下只有挂载的设备。4.设备驱动程序的作用:(1)设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为其它部分提供使用设备的能力和方法。(2)设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。5.设备驱动程序是内核代码的一部分;驱动程序的地址空间是内核的地址空间,应用程序通过操作系统的系统调用执行相应的驱动程序函数,中断则直接执行相应的中断程序代码。6. linux内核加载过程:通常,linux内核是经过gzip压缩之后的映像文件(1) bootloader 复制压缩内核到内存空间(2) 内核自解压(3) 运行文件7.编译完成的linux内核在哪里:(1)./vmlinux,elf格式未压缩(2)arch/arm/boot/compressed/vmlinux,压缩以后的elf内核8.在ARM体系结构下,用户态对应了ARM的USR模式,内核态对应了SVC模式、 多数操作系统都把内核和运行在其上的应用程序分为两个层次管理:“内核态”和“用户态”9.GCC是linux下的编译器:(1)可以编译内核,应用程序,bootloader&其它OS(2)ASNI C,GUN C,C99最初linux是一种只可以运行在PC机上免费的UNIX操作系统,如今linux已发展成为一种强大的操作系统10.我们可以使用crosstool,它是一个专门建立编译工具链的脚本,可以在很大程序上简化我们的工作。11.构建toolchains必须的组件:Linux内核源码;gcc; glibc; glibc_linuxthreads POSIX线程序库;binutils。Binutils中的常用工具:Addr2line把程序地址转换为文件名和行号;As主要用来编译gcc输出的汇编文件,产生的目标文件由连接器ld连接;Ld连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用;Objcopy把一种目标文件中的内容复制到另一种类型的目标文件中;Objdump显示一个或者更多目标文件的信息;Readelf显示elf格式可执行文件的信息;Strip丢弃目标文件中的全部或者特定符号。12. linux内核被设计为必须使用GNU的C编译器gcc来编译,而不是任何一种C编译器都可以使用。13. linux内核主体使用 GUN C。linux内核源码庞大,结构复杂:(1) 对linux2.4内核的统计:1万个文件,6百万行代码(2) 对linux2.6内核的统计:1.5万个文件,6百万行代码 内核编程习惯(技巧)不同于应用程序。14. 每一个进程(或应用程序)都通过MMU建立独立寻址空间用户空间。一个进程是不可以随便修改(或者访问)另一个进程中的数据和代码的。进程之间要想运行数据交互,要么经过内核传递,要么通过内核映射共享内存。15. linux的设备文件以文件的形式存在/dev目录设备文件是特殊文件,使用LS/dev-1命令可以看到。主设备号标识设备对应的驱动程序,一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法,系统增加一个驱动程序就要赋予它一个主设备号,这一赋值过程在驱动程序的初始化过程中。16. 设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数。17. 给程序一个它们可以请求设备驱动程序的名字,这个名字必须插入到目录/dev中,并与驱动程序的主设备号和次设备号相连。18. 动态分配的主设备号不能保证总是一样的无法事先创建设备节点;可以读取/proc/devices读取cat/proc/devices;利用脚本动态创建设备文件节点。19. linux设备的分类:(1) 字符设备(2) 块设备(3) 网络设备20. 为实现这种用户文件操作到设备操作的转换,虚拟文件系统向下为设备驱动提供了一个标准化的文件操作实现接口。这个接口由include/linux/fs.h 文件中的file_operations结构定义,设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。在设备驱动程序中file_operations结构体变量需在驱动程序加载时,向内核注册该结构体变量,这样用户对设备文件的操作就会通过虚拟文件系统转换为对驱动程序注册的file_operations结构中相应的接口函数调用。21. Linux 下 devfs、sysfs、udev linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。一、devfsdevfs是在2.4内核就出现了,它是用来解决linux中设备管理混乱的问题,你查看一下/dev下的设备文件就知道其中有许多是空的(也就是没有对应的硬件的),但是它们却必须存在,所以这给linux设备管理带来了很多麻烦,为了解决这个问题,linux内核开发人员开发了devfs,并用一个守护进程devfsd来做一些与以前硬件驱动兼容的事情。 devfs和sysfs都是和proc一样,是一个虚拟的文件系统,向devfs注册的驱动程序,devfs将会在/dev下建立相应的设备文件;但是为了兼容,devfsd这个守护进程将会在某个设定的目录中建立以主设备号为索引的设备文件,如果不这么做,以前的许多应用将不能运行。在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应 sdb;没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。二、sysfssysfs是Linux 2.6所提供的一种虚拟档案系统。这个档案系统不仅可以把装置(devices)和驱动程式(drivers)的资讯从kernel space输出到user space,也可以用来对装置和驱动程式做设定。sysfs的目的是把一些原本在procfs中的,关于装置的部份独立出来,以装置阶层架构(device tree)的形式呈现。这个档案系统由Patrick Mochel所写,稍后Maneesh Soni撰写 sysfs backing store path,以降低在大型系统中对内存的需求量。sysfs一开始以ramfs为基础,也是一个只存在于内存中的档案系统。ramfs是在2.4核心处于稳定阶段时加入的。ramfs是一个优雅的实做,证明了要在当时仍很新的虚拟档案系统(VFS)下写一个简单的档案系统是多么容易的一件事。由于ramfs的简洁以及使用了VFS,稍后的一些内存形式的档案系统都以它作为开发基础。sysfs刚开始被命名成ddfs(Device Driver Filesystem),当初只是为了要对新的驱动程式模型除错而开发出来的。它在除错时,会把装置架构(device tree)的资讯输出到procfs档案系统中。但在Linus Torvalds的急切督促下,ddfs被转型成一个以ramfs为基础的档案系统。在新的驱动程式模型被整合进 2.5.1 核心时,ddfs 被改名成driverfs,以更确切描述它的用途。在2.5核心开发的次年,新的驱动程式模型和driverfs证明了对核心中的其他子系统也有用处。kobjects被开发出来,作为核心物件的中央管理机制,而此时driverfs也被改名成sysfs。正因为devfs上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟 devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互。该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。用户空间的工具 udev就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且 udev不存在devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。三、udevudev是一种工具,它能够根据系统中的硬件设备的状况动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下,使用 udev后,在/dev下面只包含系统中真实存在的设备。它于硬件平台无关的,位于用户空间,需要内核sysfs和tmpfs的支持,sysfs为 udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间。22.字符设备驱动程序要解决的主要问题:输出:LED的linux驱动程序设计s34c2410平台上的源码输入:按键驱动程序设计23.关于OS移植层次:跨体系结构的移植、同体系结构下的移植、平台的移植24.read(),write(),ioctl(),open(),close()是一个字符设备驱动程序最基本的需要由驱动程序的作者完成的函数。25.Bootloader是在操作系统内核运行之前运行的一段小程序,通常每种CPU体系结构都有不同的Bootloader。没有Bootloader的linux也可以工作。26.源代码分析vivi的启动过程: (1)vivi 从 vivi/arch/s3c2410/head.s开始 (2)配置PLL,SDRAM,IO,中断等27.MMU内存管理单元:(1)虚拟地址到物理地址的映射(2)存储器访问权限(3)控制cache注:开始MMU之前必须创建转换表(TLB)28.init/main.c中的start_kernel 函数,进入到了linux内核代码中。29.最小硬件系统不仅是事个硬件系统的核心部分,它的构成对软件系统也有重要的影响,其构成决定了处于软件系统最底层的Bootloader的设计,同时它也是嵌入式操作系统正常运行的基础。30.接口的基本功能: 数据传输与缓冲功能 设备寻址与操控功能 信号格式与数据格式转换功能31.I/O接口入其编址方式: 统一编址方式 独立编址方式32.I/O设备的控制方法 程序控制法 中断控制法 直接存储器DMA控制法33. 软中断: 1)、软中断是在编译期间静态分配的。 2)、最多可以有32个软中断。 3)、软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序。 4)、可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为 可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保护其数据结构。 5)、目前只有两个子系统直接使用软中断:网络和SCSI。 6)、执行时间有:从硬件中断代码返回时、在ksoftirqd内核线程中和某些显示检查并执行软中断的代码中。34.当发生异常嵌套时,这些异常之间可能会发生冲突。解决方法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈)或者切换到其它处理器模式下。35中断处理流程: 1)进入_irq_svc时,为中断返回填充栈内数据 2)占先式(可剥夺)内核的预处理 3)get_irqnr_and_base得到中断向量 4)进入C的中断处理函数asm_do_IRQ 5)占先式内核的调度处理 6)中断返回36. 当程序需要进行对多个文件的读/写时,如果某个文件没有准备好,则系统就会牌读/写阻塞状态,影响其它文件的读写。为了避免读/写阻塞,一般可以在应用程序中使用poll() 或 select()函数。poll()函数返回时,会给出一个“文件是否可读写”的标志,应用程序根据不风吹草动的标志读/写相应的文件,来实现非阻塞的读写。poll()函数通过poll()系统调用,调用对应设备驱动的poll()接口函数。poll()接口函数通过返回不同的标志,告诉主进程文件究竟是否可读写。这些返回标志及其含义在include/asm/poll.h37. 触摸屏按其技术原理可分为矢量压力传感式、电阻式、电容式、红外线式和表面声波式五类,其中电阻式触摸屏在嵌入式系统中用的较多。38 在file_operations结构体中: *owner指向拥有该结构的模块,内核使用该指针维护模块使用计数; 方法llseek()用来修改文件当前位置,并将新位置作为结果返回。Loff_t是在Linux中定义的长偏移量,出错时返回负值; 方法read()从设备中读取数据,函数返回非负值表示成功读取的字节数; 方法write()向设备中写入数据,函数返回非负值表示成功写入的字节数; 方法poll()是系统调用poll() 和 select()在驱动中的实现,用户程序可以用这两个系统调用来查询设备是否可以读写,或是否处于某种状态。如果poll() 为空,则驱动设备会被认为既可读又可写,返回值是一个状态掩码;方法ioctl()为系统调用ioctl()提供了一种执行设备特定命令的方法;方法mmap()将设备内存映射到进程地址空间,这意味着它提供给用户空间的程序是一种直接访问物理地址空间的手段,使得应用程序读写设备地址不再需要用户空间与内核空间的数据复制过程,提高了数据处理的效率。mmap()方法对于帧缓冲这类设备的数据访问特别有用;方法open()用于打开设备,open()操作是对设备的第一个操作;方法release()在关闭文件时调用。39.在内核中,经常会因为某些条件不满足而需要挂起当前进程,直到条件满足了才继续执行。等待队列就是这样一种机制,它与其他的事件唤醒机制配合用于驱动的阻塞型I/O操作。 等待队列的使用流程如下:1) 声明一个等待队列2) 把当前进程加入等待队列3) 将进程态设置为TASK-INTERRUPTIBLE或TASK-UNINTERRUPTIBLE4) 调用schedule()让出CPU5) 检测所需资源是否可用,若是,则把当前进程从等待队列中删除,否则返回340poll()系统调用接口函数当程序需要进行对多个文件的读写时,如果某个文件没有准备好,则系统就会处于读写阻塞的状态,影响其他文件的读写。为了避免读写阻塞,一般可以在应用程序中使用poll()或select()函数。poll()函数返回时,会给出一个“文件是否可读写”的标志,应用程序根据不同的标志读写相应的文件,来实现非阻塞的读写。poll()函数通过poll()系统调用,调用对应设备驱动的poll()接口函数。poll()接口函数通过返回不同的标志,告诉主进程文件究竟是否可读写。这些返回标志及其含义在include/asm/poi.h中定义。41poll()函数返回标志的含义如下:POLLIN如果设备可以无阻塞地读,就返回该值POLLRDNORM“通常”的数据已经准备好,可以读了,就返回该值,通常的做法会返回(POLLIN|POLLRDNORMP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026文化工程面试题目及答案
- 2026武汉科技面试题及答案
- 2026现象认知面试题及答案大全
- 2026消防驻场面试题及答案
- 2026抽烟的面试题及答案
- 医用耗材供应链管理SPD管理键问题总结2026
- 医院职业卫生管理制度
- 2026年城市数字孪生平台合规性审计方法
- 养老护理员技师模拟试题(含答案)
- 2026年新能源汽车电池管理系统优化
- 电气工程施工进度及保证措施
- 《U20Mn2SiCrNiMo贝氏体钢钢轨技术条件》
- 机场申办控制区通行证准入考试题库
- 国企集团公司各岗位廉洁风险点防控表格(廉政)范本
- 虎扑产品体验分析报告
- 短期临时用工协议
- ISO14001-2015 环境手册和程序文件汇编
- 无单放货担保函
- 打印设备维护服务投标方案
- 第二十章-颅内和椎管内血管性疾病
- 聚焦于人:人力资源领先战略
评论
0/150
提交评论