- 1 驱动开发
- 1.1 Linux驱动程序的功能?
- 1.2 内核程序中申请内存使用什么函数?内核程序中申请内存和应用程序中申请内存有什么区别?
- 1.3 Linux中引入模块机制有什么好处?
- 1.4 写一个中断服务程序需要注意哪些地方?
- 1.5 Linux内核有哪些同步方式?
- 1.6 什么是并发和并行?驱动里面为什么要有互斥控制?
- 1.7 自旋锁和信号量区别?在中断服务程序中使用自旋锁还是信号量?
- 2 操作系统
- 2.1 Linux系统的组成部分?Linux内核的组成部分?
- 2.2 常见的操作系统进程调度策略有哪些?
- 2.3 操作系统的内存分配一般有哪几种方式,各有什么优缺点?
- 2.4 用户空间与内核空间有哪些通信方式?
- 2.5 内存管理MMU的作用?
- 2.6 MMU的和不用MMU的操作系统有哪些?带MMU的和不带MMU的CPU有哪些?
- 2.7 内核函数mmap的实现原理?
- 2.8 Linux系统的挂起、待机、休眠?
- 2.9 简述实时操作系统和非实时操作系统的区别?举例?
- 2.10 简述处理器在读内存过程中,CPU、MMU、cache、内存如何协同工作?
- 2.11 硬链接与软链接的区别?
- 2.12 虚拟内存是什么?
- 2.13 Linux目录结构,`/usr`、`/tmp`、`/etc`目录的作用?
- 2.14 文件类型
- 3 常用命令整理
- 3.1 Linux终端命令
- 3.1.1 系统信息查看命令(uname)
- 3.1.2 显示和配置网络属性命令(ifconfig)
- 3.1.3 查询命令(help、man、--help)
- 3.1.4 APT 下载工具(apt)
- 3.1.5 文件压缩与解压(tar)
- 3.1.6 链接文件命令(ln)
- 3.1.7 磁盘管理(fdisk,mkfs)
- 3.1.8 查询进程信息?ps跟top的区别?
- 3.1.9 Linux下查看内存使用情况的命令?
- 3.1.10 查询内存剩余的命令(free)
- 3.1.11 杀死进程的命令(kill)
- 3.1.12 查看当前系统可使用的信号
- 3.1.13 查找文件或目录的路径(whereis)
- 3.1.14 Linux关机、重启的命令?
- 3.1.15 缺省的Linux系统中,从后台启动进程,应在命令的结尾加上
- 3.2 uboot 常用命令及环境变量
- 3.2.1 uboot 环境变量
(1)对设备初始化和释放资源;
(2)把数据从内核传送到硬件和从硬件读取数据;
(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;
(4)检测和处理设备出现的错误(底层协议);
(5)用于区分具体设备的实例。
答案
内核程序中申请内存使用 kmalloc()、kzalloc()、vmalloc() 函数,应用程序申请内存用的函数是malloc。
区别简述:
(1)kmalloc/kzalloc直接分配连续的物理地址(虚拟地址也是连续的)。
(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。
(4)malloc是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在do_page_fault异常(缺页中断)处理中完成的。
kmalloc()、kzalloc()、vmalloc()函数分析
(1)void *kmalloc(size_t size, gfp_t flags);
①申请连续的物理内存,申请的内存大小不能超过128KB。
②较常用的flags(分配内存的方法)有:
- GFP_ATOMIC —— 分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断;
- GFP_KERNEL —— 正常分配内存;
- GFP_DMA —— 给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)。
③对应的内存释放函数为void kfree(const void *objp)。
(2)void *kzalloc(size_t size, gfp_t flags);
① kzalloc()相对kmalloc()只是额外增加了__GFP_ZERO标志,除了申请内存外,还会对申请到的内存内容清零。
②对应的释放函数也是kfree()。
(3)void *vmalloc(unsigned long size);
①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。
②对应的内存释放函数为void vfree(const void *addr)。
注意
vmalloc()和vfree()可以睡眠,因此不能在中断上下文调用。
(1)应用程序在退出时,可以不管资源的释放或者其他的清除工作,而把这些任务交给模块退出函数(exit)。
(2)模块机制有助于缩短模块的开发周期,因为模块的安装和卸载都很方便。
(1)中断服务程序应该尽可能短,把能放在底半部(tasklet、workqueue)的任务尽量放在底半部。
(2)中断服务程序中不能有阻塞操作,因为中断期间是完全占用CPU的,不存在内核调度,中断被阻塞住,其他进程将无法推进。
(3)中断服务程序的返回值要用操作系统定义的宏,而不能用自己定义的。
(4)中断服务程序不能有不可重入的操作,如浮点数计算、printf()等。
原子操作、自旋锁、读写锁、顺序锁、信号量等。
1.6 什么是并发和并行?驱动里面为什么要有互斥控制?并发和并行
并发指的是应用能够交替执行不同的任务。其实,并发有点类似于多线程的原理,并非是同时执行多个任务,而是系统在快速地切换多个任务,达到"同时执行效果"。任一个时刻点上只有一个程序在处理机上运行。
并行指的是应用能够同时执行不同的任务。
两者区别:一个是交替执行,一个是同时执行。
并发所带来的的问题
并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量)的访问很容易导致竞态。
解决竞态问题的途径是保证对共享资源的互斥访问。
访问共享资源的代码区域被称为临界区,临界区需要用某种互斥机制加以保护,常见的有原子操作、信号量、自旋锁等。
(1)使用自旋锁的进程不会睡眠, 而使用信号量的进程会睡眠。
(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。
Linux系统的组成部分
Linux内核、Linux文件系统、Linux shell、Linux应用程序。
Linux内核的组成部分
(1)第一种分类方式:内存管理子系统、进程管理子系统、文件管理子系统、I/O管理子系统。
(2)第二种分类方式:进程调度(SCHED)、进程间通信(IPC)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)。
(1)先来先服务(FCFS)。
(2)短进程优先(SPF)。
(3)高响应比优先(HRN)。 – 满足短作业优先又不会发生饥饿现象的调度算法
(4)时间片轮转(RR)。
(5)多级反馈队列(RRWMF)。
(6)最高优先权优先(FPF)。
解读:
(1)先来先服务(FCFS):每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
(2)短进程优先(SPF):从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
(3)高响应比优先(HRN):在短作业优先的基础上,使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。
(4)时间片轮转(RR):将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片,时间到了之后将它送往就绪队列的末尾。接着调度下一个队首进程……如此循环。
(5)多级反馈队列(RRWMF):
①设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,第i + 1个队列的时间片要比第i个队列的时间片长一倍。
②当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,如此下去,当一个长进程从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
③仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
(6)最高优先权优先(FPF):把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种:
①非抢占式优先权算法:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。
②抢占式优先权调度算法:系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。
(1)分页存储管理:优点是不需要连续的内存空间,且内存利用率高(只有很小的页内碎片);缺点是不易于实现内存共享与保护。
(2)分段存储管理:优点是易于实现段内存共享和保护;缺点是每段都需要连续的内存空间,且内存利用率较低(会产生外部碎片)。
(3)段页式存储管理:优点是不需要连续的内存空间,内存利用率高(只有很小的页内碎片),且易于实现段内存共享和保护;缺点是管理软件复杂性较高,需要的硬件以及占用的内存也有所增加,使得执行速度下降。
(1)虚拟内存。有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。为了使用虚拟内存,操作系统通常要设置一个交换分区(通常是硬盘),通过将不活跃的内存中的数据放入交换分区,操作系统可以腾出其空间来为其它的程序服务。虚拟内存是通过虚拟地址来实现的。
(2)内存保护。根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。
(1)用MMU的操作系统有:Windows、MacOS、Linux、Android;不用MMU的操作系统有:FreeRTOS、VxWorks、UCOS。
(2)带MMU的CPU有:Cortex-A系列、ARM9、ARM11系列;不带MMU的CPU有:Cortex-M系列(STM32就是使用M系列内核)。
mmap函数能够实现把一个文件映射到一个内存区域,使得我们可以像读写内存一样读写文件,比单纯地调用read/write函数要快上许多。我们可以把内存中的内容拷贝到一个文件中实现内存备份,也可以把文件映射到内存来恢复某些服务。
解读: 实现共享内存是mmap函数的主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存,是一种进程间通信方式。
(1)挂起:CPU、内存工作,而硬盘、显示器等外部设备停止工作。
(2)待机:只对内存供电,CPU、外设停止工作。
(3)休眠:CPU、内存、外设停止工作,内存中的数据保存在硬盘中。
区别
(1)实时操作系统:是可抢占式内核,响应外部事件尽可能快且响应时间具有确定性。
(2)非实时操作系统:非可抢占式内核,响应外部事的时间没有保证。
举例
(1)实时:Vxworks、μCOS、eCOS、QNX、MQX、Nucleus、FREERTOS、RTLinux、RTEMS、RT-Thread。
(2)软实时或非实时:WinCE、Linux。
(1)CPU内核发出VA向TLB请求页表项,它缓存最近查找过的VA对应的页表项,如果TLB中刚好缓存了该VA对应的页表项则直接返回给CPU;否则就由MMU去物理内存中读出页表项保存在TLB中,同时返回给CPU内核。(TLB可以减少访问物理内存的次数)
(2)MMU首先检查页表项中的权限位,如果没有访问权限,就引发一个异常给CPU内核;有权限则检查是否允许缓存(页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志)。
(3)如果不允许cache则MMU直接发出PA从物理内存中读取数据到CPU内核。
(4)如果允许cache,则MMU以VA为索引到cache中查找是否缓存了要读取的数据,如果是则直接返回给CPU内核;如果不是则MMU发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。
(1)链接:是给系统中已有的某个文件指定另外一个可用于访问它的名称,链接也可以指向目录。即使我们删除这个链接,也不会破坏原来的文件或目录。
(2)硬链接:引用的是文件在文件系统中的物理索引(inode),当你移动或删除原文件时,硬链接不会被破坏。硬链接只能引用同一文件系统中的文件。
(3)软链接:就是新建一个文件(inode),这个文件专门用来指向别的文件(类似Windows中的快捷方式),若移动或删除原文件,则相应的软链接不可用。软链接可以跨文件系统,也可以对一个不存在的文件名或目录名进行链接。
虚拟内存是内存管理的一种技术,使得应用程序认为自己拥有连续的内存空间,而实际上它对应的物理内存是不连续的,甚至还有一部分对应着外部磁盘存储器,在需要时再进行数据交换。
2.13 Linux目录结构,/usr、/tmp、/etc目录的作用?(1)Linux目录结构:
(2)/usr:是Unix Software Resource的缩写,也就是Unix操作系统软件资源所放置的目录,而不是用户数据。
(3)/tmp:让一般使用者或者是正在执行的程序暂时放置档案的地方。
(4)/etc:系统主要的设定档案几乎都放置于这个目录,例如人员的账号密码档案、各种服务器的起始档案。一般是供给使用者查阅的,只有root用户有权限修改。FHS建议不要放置可执行档案在这个目录中。
- 普通文件,一些应用程序创建的,比如文档、图片、音乐等等;
d 目录文件;
c 字符设备文件,Linux 驱动里面的字符设备驱动,比如串口设备,音频设备等;
b 块设备文件,存储设备驱动,比如硬盘,U 盘等;
l 符号连接文件(软链接),相当于 Windwos 下的快捷方式;
s 套接字文件;
p 管道文件,主要指 FIFO 文件。
uname [选项]
-s 内核操作系统名称;
-m 计算机类型。
3.1.2 显示和配置网络属性命令(ifconfig)
ifconfig interface options | address
interface,网络接口名称,比如 eth0 等。
up,开启网络设备。
down,关闭网络设备。
add IPv6地址,设置网络 IPv6地址。
netmask 掩码地址,子网掩码。
# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255 // 给eth0网卡配置IP地址,加上子掩码,加上个广播地址
route add default gw 192.168.5.1 //设置网关
3.1.3 查询命令(help、man、–help)
- help 命令:只能查询shell内置命令。
- –help 命令:只能查询linux外部命令。
- man 命令:
即可以帮助查询linux内置命令,也可以查询linux外部命令。man查询的内容比其余两个命令内容都多。
man 1 xxx 查询 Linux shell 命令, man 2 xxx 查询 API, man 3 xxx 查询库函数。
- 查看本地软件是否可以更新:sudo apt-get update
- 检查依赖关系:sudo apt-get check
- 软件安装:sudo apt-get install package-name
- 软件更新:sudo apt-get upgrade package-name
- 卸载软件:sudo apt-get remove package-name
tar -vcjf test1.tar.bz2 test1
tar -vczf test1.tar.gz test1
tar -vxjf test1.tar.bz2
tar -vxzf test2.tar.gz
创建软连接 ln –s 源文件 目标文件;
创建硬连接 ln 源文件 目标文件;
复制软链接文件cp -d 源文件 目标文件,表示复制链接文件而不是它指向的源文件;
- 磁盘分区命令 fdisk
- 格式化命令 mkfs
mkfs – t vfat /dev/sdb1
查询进程号的命令
top:命令用于动态地监视进程活动与系统负载等信息;
ps -aux:查看系统中所有进程, 此命令长配合grep过滤输出结果。
ps跟top的区别
(1)ps看到的是命令执行瞬间的进程信息;而top可以实时地持续监视,不断更新进程状态。
(2)ps只是查看进程信息,而top还可以监视系统性能,如CPU负载、内存消耗。
(3)另外top还可以操作进程,如改变优先级(命令r)和关闭进程(命令k)。
查看内存使用情况的命令
(1)ps -aux;
(2)free;
(3)vmstat;
(4)top;
(5)cat/proc/meminfo。
free -m -> #-/+ buffers/cache: 6458 1649 -> 6458M为真实使用内存1649M为真实剩余内存(剩余内存+缓存+缓冲器)。
3.1.11 杀死进程的命令(kill)kill:通过进程ID来结束进程,“kill -9 PID”;killall:通过进程名字结束进程,“killall -9 name”
3.1.12 查看当前系统可使用的信号kill -l
3.1.13 查找文件或目录的路径(whereis)whereis
3.1.14 Linux关机、重启的命令?(1)关机命令:halt、shutdown -h 时间、init0、poweroff。
(2)重启命令:reboot、shutdown -r 时间、init6。
注意:shutdown可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上所有登录用户提示一条警告信息,还允许用户设置一个缓冲时间。
&
3.2 uboot 常用命令及环境变量 3.2.1 uboot 环境变量baudrate:波特率
ethaddr:定义以太网接口的mac的地址
severip:定义tftp服务器端的ip地址;
ipaddr:本地ip地址
bootargs:传递给linux内核的命令行参数
bootcmd:自动启动时执行的命令



