本系列将题型分门别类,重要的地方用星号标注,帮助大家打好基础。第五章Linux操作系统专题一、Linux内核的组成Linux内核主要由五个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信。2、Linux系统的组成Linux系统一般有四个主要部分:内核、外壳、文件系统和应用程序。3、用户空间和内核之间的通信方式有哪些?1)系统调用。用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;2)司机。用户空间进程可以使用封装的系统调用接口访问驱动设备节点,与运行在内核空间的驱动程序进行通信;3)共享内存mmap。在代码中调用该接口,实现内核空间和用户空间的地址映射。在实时性要求高的项目中首选,节省复制数据的时间和其他资源,但缺点是不易控制;4)copy_to_user()、copy_from_user()是调用驱动中的接口,实现用户空间和内核空间的数据拷贝操作,适用于实时性要求不高的项目。以及:procfs(/proc)sysctl(/proc/sys)sysfs(/sys)netlinksocket4、系统调用和普通函数调用的区别系统调用:1、使用INT和IRET指令,内核和应用程序使用不同的栈,所以有一个堆栈切换,从用户态切换到内核态,这样就可以使用特权指令来控制设备2.依赖于内核,不保证可移植性3.用户空间和内核上下文之间的切换,开销大4.它是操作系统的入口点。普通函数调用:1、使用CALL和RET指令,调用时没有堆栈切换。2、良好的平台移植性。3、属于过程调用,调用成本小。4.一个普通函数函数的调用5.内核态和用户态的区别内核态,操作系统运行在内核态——运行操作系统程序用户态,应用程序只能运行在用户态——当一个进程在执行用户自己的代码时运行用户程序在用户运行态(userstate),此时的权限级别是最低的,也就是3级,这是普通用户进程运行的权限级别。大多数用户直接面对的程序都运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用而在内核代码中执行时,它处于内核运行态(kernelstate),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。6.bootloader、kernel、root文件的关系。启动顺序:bootloader->linuxkernel->rootfile->appBootloader是bootloader的全称,也就是第一段代码。主要用于初始化处理器和外设,进而调用Linux内核。Linux内核完成系统初始化后,需要挂载某个文件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。(一个嵌入式Linux系统从软件的角度可以分为四个部分:引导加载程序(Bootloader)、Linux内核、文件系统、应用程序。)7、Bootloader启动的两个阶段:Stage1:汇编语言1)基本的硬件初始化(关闭看门狗和中断,MMU(带操作系统),CACHE。配置系统工作时钟)2)准备RAM空间用于加载stage23)将内核映像和文件系统映像复制到RAM4)设置堆栈指针sp5)跳转到条目stage2的要点Stage2:c语言1)初始化本阶段要用到的硬件设备(leduart等)2)检测系统的内存映射3)加载内核镜像和文件系统镜像4)设置启动内核的参数化嵌入式系统中广泛使用的非易失性存储器通常是Flash,而Bootloader位于存储器的最前端,所以系统上电或复位后最先执行的程序就是Bootloader。8、linux下查看内存状态的命令1)查看进程:top2)查看内存:free3)cat/proc/meminfo4)vmstat如果公司服务器用户较多,可以使用top命令查看是哪个同事使用哪个命令,做什么,使用了多少CPU。9.一个程序从开始到结束的完整过程(四个过程)Pre-Processing,Compiling,Assembly,Linking10.什么是堆、栈、内存泄漏和内存溢出?堆栈由系统操作,程序员无法操作。所以内存泄漏指的是堆内存泄漏。堆内存是指程序从堆中分配的内存,大小不限(内存块的大小可以在程序运行时确定),使用后必须显式释放。应用程序通常使用malloc和new等函数从堆中分配一块内存。使用后,程序必须负责调用free或delete来释放内存块,否则内存不能再次使用。内存溢出:你请求分配的内存超过了系统可以给你的,系统不能满足需求,所以发生溢出。内存越界:已经向系统申请了一块内存,但是在使用内存的时候,超出了申请的范围(一般在使用特定大小的数组时会出现内存越界)。内存溢出问题是C语言或C++语言的固有缺陷。不检查数组边界,也不检查类型安全。众所周知,用C/C++语言开发的程序可以直接访问内存和寄存器,因为目标代码离机器内核很近。这个特性大大提高了C/C++语言代码的性能。只要代码编码得当,C/C++应用程序在执行效率上肯定比其他高级语言要好。但是C/C++语言更容易出现内存溢出问题。11、死锁产生的原因和条件产生死锁的主要原因有:(1)由于系统资源不足。(2)进程运行和推进的顺序不合适。(3)资源分配不当等??。如果系统资源充足,能够满足进程的资源请求,发生死锁的可能性很低;否则,将因争夺有限资源而陷入僵局。其次,进程运行的进度顺序和速度不同,也有可能出现死锁。这四个条件是死锁的必要条件。只要系统死锁,这些条件就一定成立,只要不满足上述条件之一,就不会发生。僵局。(1)互斥条件:一种资源一次只能被一个进程使用。(2)请求和持有条件:当一个进程因请求资源而阻塞时,它会持有获得的资源。(3)非剥夺条件:进程获得的资源在用完之前不能强行剥夺。(4)循环等待条件:多个进程形成首尾相连的循环等待资源关系。12、硬链接和软链接链接操作实际上是给系统中一个已经存在的文件赋予另一个名字,可以用来访问它。对于这个新的文件名,我们可以分配不同的访问权限来控制信息的共享和安全。如果链接指向一个目录,用户可以使用链接直接进入链接的目录,而无需输入大量的路径名。而且,即使我们删除这个链接,原来的目录也不会被破坏。1>硬链接硬链接只能引用同一文件系统中的文件。它是指文件在文件系统中的物理索引(也称为inode)。当您移动或删除原始文件时,硬链接不会断开,因为它指的是文件的物理数据,而不是文件在文件结构中的位置。硬链接文件不需要用户访问原始文件,也不会泄露原始文件的位置,这有助于文件的安全性。如果您删除具有相应硬链接的文件,该文件将一直保留,直到删除对它的所有引用。2>软链接(symboliclink)软链接其实就是新建一个文件,专门用来指向其他文件(也就是windows下很接近快捷方式的文件)。软链接产生了一个新的文件,但是这个文件的作用是指向某个文件。如果删除了软链接文件,则表示不需要该链接,与原实体文件无关。但是,如果原文件被删除,相应的软链接将不可用。13.在计算机中,32位和64位有什么区别?64位计算有两个主要优势:可以在更大范围内进行整数运算;它可以支持更大的内存。64位操作系统下虚拟内存空间的大小:地址空间的大小不是2^32,也不是2^64,一般都是2^48。因为不需要2^64那么大的寻址空间,太大的空间只会造成资源的浪费。所以64位Linux一般用48位来表示虚拟空间地址,用40位来标识物理地址。14、中断和异常的区别内部中断:同步中断(异常)是cpu内部的电信号产生的中断。它必须是可控的。外部中断:异步中断是由CPU外围设备产生的电信号引起的中断,其发生的时机是不可预测的。15.中断是如何产生的?中断处理流程请求中断→响应中断→关闭中断→保留断点→识别中断源→保护场景→中断服务子程序→恢复场景→从中断返回。16、Linux操作系统挂起、休眠、关机相关命令。关机命令包括halt、init0、poweroff和shutdown-htime。关机是最安全的重启命令。reboot、init6、shutdown-rtime在linux命令中,其中reboot是重启,shutdown-rnow是立即停止再重启。具体可用参数可以百度。17.说说linux下的一个编译器优化选项:添加:-o18。在数据缓存的情况下,DMA数据链路为:peripherals-DMA-DDR-cache-CPU19。Linux命令1、改变文件属性的命令:chmod(chmod777/etc/squid运行命令后,squid文件夹(目录)的权限会变为777(可读、可写、可执行))2、命令在文件中找到匹配的字符串:grep3。找到当前目录:pwd4。删除目录:rm-rf目录名5.删除文件:rm文件名6.创建目录(文件夹):mkdir7。创建文件:也可以创建touch8、vi、vim文件名9.查看进程对应的端口号1.先查看进程pidps-ef|grep进程名2.通过pidnetstat-nap|grep查看占用的端口进程pid20,硬实时系统和软实时系统软实时系统:Windows和Linux系统一般都是软实时,当然有补丁内核可以做成硬实时系统,但是这不是商业化的。硬实时系统:对时间要求高,在限定时间内不管完成与否都必须返回。VxWorks、uCOS、FreeRTOS、WinCE、RT-thread等实时系统;21.MMU基础现代操作系统普遍采用虚拟内存管理(VirtualMemoryManagement)机制,这需要MMU(MemoryManagementUnit,内存管理单元)的支持。一些嵌入式处理器没有MMU,无法运行依赖虚拟内存管理的操作系统。也就是说:操作系统可以分为两类,一类使用MMU,一类不使用。使用MMU的有:Windows、MacOS、Linux、Android;不使用MMU的有:FreeRTOS、VxWorks、UCOS……相应的:CPU也可以分为两类,有MMU的和没有MMU的。带MMU:Cortex-A系列、ARM9、ARM11系列;不带MMU:Cortex-M系列...(STM32是M系列,不带MMU,不能跑Linux,只能跑一些UCOS,FreeRTOS等)。MMU负责将虚拟地址(virtualaddress)转换为物理地址(physicaladdress)。转换过程比较复杂,可以自行百度。
