1 / 5
文档名称:

LINUX嵌入式操作系统知识点复习.doc

格式:doc   大小:165KB   页数:5页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

LINUX嵌入式操作系统知识点复习.doc

上传人:莫比乌斯 2022/10/25 文件大小:165 KB

下载得到文件列表

LINUX嵌入式操作系统知识点复习.doc

文档介绍

文档介绍:该【LINUX嵌入式操作系统知识点复习 】是由【莫比乌斯】上传分享,文档一共【5】页,该文档可以免费在线阅读,需要了解更多关于【LINUX嵌入式操作系统知识点复习 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。嵌入式LINUX操作系统知识点复****br/>背)嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁剪,对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统。
通常把进行嵌入式系统开发的PC机称为宿主机,把嵌入式系统的机器称为目标机。
)在目标机上嵌入某种功能较强且占用内存较少的操作系统,用户程序在该操作系统支持下运行,这种操作系统称为嵌入式操作系统。
带操作系统的嵌入式系统,在编制较为复杂和高端应用程序时,用户程序会显得比较简单,而不带操作系统的嵌入式系统,在系统稳定性、实时性等方面要高于带操作系统的,但不太适用于编制较为复杂的用户程序。
目前的嵌入式操作系统主要有Linux、WindowsCE、eCos、VXWorks等几种。
ARM处理器是一种低功耗、高性能的32位RISC处理器。
在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
shell脚本是一个包含一系列命令序列的文本文件。
×)shell脚本编程与C语言编程的区别。
vi是一个Linux系统下的文本编辑器,可通过它来编写程序代码。
gcc是Linux下的程序编译工具,它可将C语言源程序编译链接成可执行文件。
gcc通过后缀来区别输入文件的类别,。
在Linux下,gcc进行编译链接的缺省操作是链接成动态库,要链接成静态库需要加上“-static”的参数。
动态库链接与静态库链接的区别。
gdb是Linux下的程序调试工具,它可启动被调试程序、让被调试程序在断点处停住、可检查程序状态。
需要用gdb调试的程序,在用gcc编译时需要加上“-g”的参数。
MakeFile文件描述了整个工程的编译、链接等规则,它是make文件执行时所必需的文件。
×)分析一个具体的MakeFile文件。
在Linux中的文件编程可使用系统调用和C语言库函数两种方法。
熟悉系统调用方式,文件的读、写等操作。
日历时间是指从1970年1月1日0点到目前所经过的秒数。
进程是一个具有一定独立功能的程序的一次运行活动。
子进程的创建、进程等待等操作。
×进程间的通信是为了数据传输、资源共享、通知事件、进程控制等。
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。
×)一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。
数据被一个进程读出后,将被从管道中删除。
管道包括无名管道PIPE和有名管道FIFO两种,前者用于父进程和子进程间的通信,后者用于同一系统中的任意两个进程间的通信。
关闭管道只需要将两个文件描述符关闭即可,可使用普通的close函数进行关闭。
必须在系统调用fork()前调用pipe()创建无名管道,否则子进程将不会继承文件描述符。
×以下条件为可产生信号:按下某个按键、硬件产生异常、进程用kill函数将信号发送给另一个进程、用户用kill命令将信号发送给其他进程。
×对信号的处理有三种方式:忽略信号、执行用户希望的动作、执行系统默认动作。
×使用工alarm函数可以设置一个时间值,当所设置的时间到了时,产生SIGALRM信号。
pause函数使调用进程挂起直到捕捉到一个信号。
共享内存是被多个进程共享的一部分物理内存,它是进程间共享数据的一种最快的方法。
创建共享内存使用shmget函数,映射共享内存使用shmat函数。
当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离,使用shmdt函数。
消息队列是一个消息的链表,可以把消息看作一个记录,具有特定的格式。
信号量主要用于保护临界资源,进程可根据它判断是否能够访问某些共享资源,还可用于进程同步。
线程是一种非常节俭的多任务操作方式,运行于一个进程中的多个线程,它们之间使用相同的地址空间,一个线程的数据可直接为其它线程所用,非常快捷方便。
编写Linux下的多线程程序,,即在gcc中加入参数“-Lpthread”。
线程的创建,线程间的各类参数传递。
线程的正常退出方式有return和pthread_exit。
线程等待。
×线程终止有正常终止和非正常终止两种情况,如何保证线程终止时能顺利地释放自己所占用的资源。
Linux由用户空间和内核空间两部分组成。
内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断方式能够完成从用户空间到内核空间的转移。
)Linux的内核架构。
SCI是系统调用接口,它为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核空间的桥梁。
PM是进程管理,它的重点是创建和停止进程,并控制它们之间的通信,同时负责进程的调度。
VFS是虚拟文件系统,它隐藏了各种文件系统的具体细节,为文件操作提供了统一的接口。
MMU内存管理单元,它的主要作用是控制多个进程安全地共享内存区域。
NS是网络协议栈,它提供了丰富的网络协议的具体实现。
Arch是与内核构架相关的内核代码,它对多种CPU构架提供了支持。
DD是设备驱动,它用于控制特定的硬件设备,Linux内核中有大量代码都在设备驱动程序中。
Linux内核源代码采用树形结构进行组织,把功能相关的文件都放在同一个子目录下。
)内核配置编译的步骤为:清除临时文件、中间文件和配置文件;确定目标系统的软硬件配置情况;使用“makeconfig”或“makemenuconfig”进行配置;编译内核“makebzImage”;编译模块“makemodules”。
在内核配置中,选项为“*”号的项目将会编译进内核中,选项为“M”的项目将会编译成模块,选项为空的项目将不会被编译。
)项目编译进内核和编译成内核模块的区别。所有组件都编译进内核会导致两个问题:一是生成的内核文件过大,二是如果要添加或删除某个组件需要重新编译整个内核。编译成内核模块时,模块本身并不被编译进内核文件,可根据需求,在内核运行期间进行动态的安装或卸载。
×内核模块的加载(insmod\modprobe)、卸载(rmmod)、查看(lsmod)等操作。
内核模块与应用程序的区别:应用程序从main函数开始执行任务,一直到结束后应用程序从内存中消失;内核模块是先在内核中注册自己以便服务于将来的某个请求,初始化函数结束时,模块仍然存在于内核中,直到卸载函数被调用,模块才从内核中消失。
×内核打印printk与常规打印printf的区别。printk函数在内核中使用,printf函数在应用程序中使用;printk允许根据严重程度,通过附加不同的“优先级”来对消息分类。
物理地址是指出现在CPU地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
逻辑地址是程序代码经过编译后在汇编程序中使用的地址。
线性地址(虚拟地址),是与CPU的位宽相关的地址,在32位CPU架构下,可以表示4G的地址空间。
×CPU要将一个逻辑地址转换为物理地址需要两步:首先CPU利用段式内存管理单元将逻辑地址转换成线性地址,再利用页式内存管理单元把线性地址最终转换为物理地址。
在Linux系统的内存管理中,逻辑地址与线性地址是保持一致的。
在Linux系统中,巧妙地把段机制给绕过去,而完全利用了分页机制。
Linux系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,大小为3G,用户看到的都是虚拟地址,而看不到实际的物理地址,这样用户程序可用比实际物理内存更大的地址空间。
Linux将4G的虚拟地址空间分为两个部分:用户空间和内核空间。用户空间从0到3G,内核空间从3G到4G。用户进程可通过系统调用或中断的方式访问内核空间。
进程的创建、程序载入、动态内存分配等操作都会分配内存给进程,它分配的仅仅是虚拟地址,而不是物理地址。
×实际的物理内存只有当进程真正地去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页”异常而进入分配实际页框的程序。
内核空间是由内核负责映射,它不会跟着进程改变,是固定的。
)内核空间分布。
直接内存映射区,从3G开始最大到896M的线性地址空间,它与物理地址之间存在固定的线性关系。
动态内存映射区,由vmalloc进行分配,线性空间连续,物理空间不一定连续。
永久内存映射区,对于896M以上的高端内存,可使用该区域来访问。
固定映射区,它当中的每个地址项都服务于特定的用途,一般是外部硬件设备的映射地址。
时钟中断由系统的定时硬件以周期性的时间间隔产生,其频率由内核根据HZ来确定,HZ是一个与体系结构无关的常数,在X86平台下,默认值为1000。
内核定时器用于控制某个函数在未来的某个特定时间执行,函数仅执行一次,不循环执行。
每当时钟中断发生,全局变量jiffies就加1,该变量记录了自Linux启动后时钟中断发生的次数,所以可利用它来计算不同事件间的时间间隔。
)嵌入式系统开发流程:硬件系统设计、BootLoader移植、Linux内核移植、驱动程序开发、协议栈开发、应用程序开发、QT图形化应用开发及网络应用开发、产品测试及发布。
交叉工具链。
一个嵌入式系统分为三个层次。
引导加载程序BootLoader。
Linux内核Kernel。
根文件系统RootFilesystem。
BootLoader是在操作系统运行之前运行的一段小程序,通过这段小程序可以初始化硬件设备,为调用操作系统做好准备。它类似于PC中的BIOS程序。
每种不同的CPU体系结构都有不同的BootLoader,除此以外,它还依赖于具体的嵌入式板级设备的配置。
BootLoader的启动过程可分为单阶段和多阶段两种,从固态存储设备上启动的BootLoader大多采用两阶段模式。
)在两阶段的BootLoader中,第一阶段(stage1)的作用是:初始化硬件设备、为stage2准备RAM空间、复制stage2代码到RAM空间、设置堆栈、跳转到stage2的入口去执行;第二阶段(stage2)的作用是:初始化下一阶段要用的硬件设备、把内核映像和根文件系统映像读到RAM中、跳转到内核的入口去执行。
根文件系统是Linux启动时使用的第一个文件系统,它由一系列目录组成,目录中包括了应用程序、C库、相关的配置文件等。
)制作根文件系统的步骤:创建根文件系统的目录、创建设备文件、安装/etc、编译内核模块、安装内核模块、配置BusyBox、编译安装BusyBox、制作Ramdisk。
文件系统的选择要根据存储设备的硬件特性、系统需求等来确定,在嵌入式Linux系统中,常用的文件系统有:jffs2、yaffs、cramfs、ramdisk、ramfs等。
驱动程序就是使硬件能够在操作系统中正常工作的软件。
在Linux下,驱动程序分为三类:字符设备驱动、块设备驱动、网络接口驱动。
×字符设备是一种按字节来访问的设备,字符驱动负责驱动字符设备,它可实现open、close、read、write等系统调用。
块设备驱动在Linux下与字符设备驱动仅仅是驱动和内核的接口不同。
网络接口驱动负责发送和接收数据报文。
驱动程序的安装可选择为内核模块方式或直接编译进内核。
字符设备通过字符设备文件来存取。
主设备号用来反映设备类型,次设备号用来区分同类型的设备。
主设备号的获取有静态申请和动态分配两种方法。
静态申请主设备号时,一旦选定的主设备号与已有的设备号冲突,驱动程序将无法注册。
不论使用何种方法分配设备号,都要在不再使用它们时释放这些设备号。
在Linux系统中,有3种重要的数据结构:Structfile、Structinode、Structfile_operations。
Structfile代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的structfile,它由内核在打开文件时创建,在文件关闭后释放。
Structinode用来记录文件的物理上的信息,一个文件可以对应多个file结构,但只有一个inode结构。
Structfile_operations是一个函数指针的集合,定义能在设备上进行的操作。
×,字符设备使用structcdev进行描述。
×字符设备的注册分为三个步骤:分配cdev、初始化cdev、添加cdev。
×字符设备驱动中,内核提供了专门的函数用来访问用户空间的指针:copy_from_user()和copy_to_user()。
×字符设备的注销使用cdev_del函数来完成。