1. 驱动开发

1.1 Linux驱动程序的功能是什么?

1.2 内核程序申请内存使用什么函数?

解读:

void *kmalloc(size_t, size, gfp_t flags)
- 申请连续的物理内存这对于要进行DMA的设备十分重要但大小不能超过128KB其中16B是被页描述符占用了
- 较常用的flag有GFP_ATOMIC分配内存的过程是一个原子过程GFP_KERNEL正常分配内存GFP_DMA给DMA控制器分配内存
- 对应的内存释放函数为void kfree(const void *objp)

void *kzalloc(size_t size, gfp_t flags);
- kzalloc()相对于kmalloc()只是额外增加了_GFP_ZERO标志除了申请内存外还会对申请到的内存清零
- 对应的释放函数也是kfree()

void *vmalloc(unsigned long size);
- 申请虚拟地址连续的内存空间但其对应的物理内存不一定连续因此对申请的内存大小没有限制
- 对应的内存释放函数为void vfree
- 注意vmalloc()和vfree()可以睡眠因此不能再中断上下文调用

1.3 内核程序中申请内存和应用程序申请内存有什么区别?

内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的是函数malloc

1.4 自旋锁和信号量在互斥使用时需要注意什么,在中断服务程序里面的互斥是使用自旋锁还是信号量?

1.5 驱动卸载异常可能是由什么原因引起的?

可能是由进程在使用该模块

1.6 Linux中引入模块机制有什么好处?

1.7 Linux设备驱动程序中,使用哪两个函数进行中断处理程序的注册和注销?

1.8 写一个中断服务程序注意点

1.9 Linux系统打开设备文件,进程可能处于三种基本状态,如果多次打开设备文件,驱动程序应该实现什么?

互斥

1.10 简述static对于工程模块化的作用

static可以让全局变量或函数的作用域限制在当前模块,不会与其他模块发生冲突。因为在嵌入式系统中,一个程序可能是很多程序员共同完成的,在定义变量及函数的过程中,可能会重名,给系统集成带来麻烦

1.11 并发是什么?驱动里面为什么要有互斥控制,如何实现?

1.12 Linux内核有哪些同步方式?

1.13 在一个多任务嵌入式系统中,有一个CPU可直接寻址的32寄存器REGn,地址为0x1F000010,编写一个安全的函数将寄存器REGn的指定位反转?

void bit_reverse(uint32_t nbit){
	*((volatile unsigned int *)0x1F000010) ^= (0x01 << nbit)
}

2 操作系统

2.1 Linux系统的组成部分?

2.2 Linux内核的组成部分

2.3 内存管理MMU的作用?

2.4 常见的操作系统进程调度策略

2.5 满足短作业优先又不会发生饥饿现象的算法是什么

高响应比优先

2.6 I/O子系统层次结构

从上到下

2.7 逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别

2.8 操作系统的内存分配一般有哪几种方式,各有什么优缺点?

2.9 用户空间与内核空间有哪些通信方式?

方式 解释
系统调用SCI 用户空间进程通过系统调用接口访问指定的内核空间数据
信号 内核空间出现一些异常时会发送信号给用户空间进程
proc文件系统 是一种特殊的伪文件系统,是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到这个目录树中,用户可通过echo和cat这样的命令对系统信息进行修改和查询
共享内存mmap 将内核空间的地址映射到用户空间
netlink 类似socket的通信方式,可以读写大量数据

2.10 用户进程调用read()/write() API时,内核做了哪些事情?

read()/write() -> kernel -> sys_read()/sys_write()->fop.read()->fop.write()

2.11 系统调用的作用

2.12 BootLoader、Linux内核、根文件系统的关系?

2.13 BootLoader的启动过程大多可以分为哪两个阶段?

2.14 Linux下查看内存使用情况的命令?

2.15 在Linux里面用gcc编译程序时,分为哪4个阶段?

2.16 什么是死锁?产生死锁的原因是什么?

2.17 死锁的四个必要条件是什么?

2.18 死锁的处理方法?

2.19 怎么预防死锁?

2.20 硬链接和软链接的区别

2.21 虚拟内存是什么?

虚拟内存是内存管理的一种技术,使得应用程序认为自己拥有连续的内存空间,而实际上它对应的物理内存是不连续的,甚至还有一部分对应着外部磁盘存储器,在需要时再进行数据交换。

2.22 内存零头、外零头、内零头

2.23 64位的计算机有哪些优点?

2.24 中断分为哪两种?

2.25 Linux系统的挂起、待机、休眠?

2.26 Linux关机、重启的命令有哪些?

2.27 Linux目录结构:/use,/tmp,/etc目录的作用?

2.28 简述实时操作系统和非实时操作系统的区别

2.29 常用的实时操作系统有哪些,非实时

2.30 Linux内核的调度策略有哪些?

2.31 块与页有什么关系

块是操作系统读写硬盘的最小单位,页是操作系统读写内存的最小单位

2.32 简述处理器在读内存过程中,CPU、MMU、cache、内存如何协同工作?

2.33 ARM CPU上的地址转换涉及哪三个概念

2.34 MMU的和不同MMU的操作系统由哪些?带MMU和不带MMU的CPU有哪些

2.35 为什么uboot要关掉cache

cache主要用来加快CPU读取内存中指令的速度,但在CPU初始化时,内存并未准备就绪,直接进行数据读取,势必导致指令取址异常

2.36 内核函数mmap的实现原理

mmap函数能够实现把一个文件映射到一个内存区域,使得我们可以像读写内存一样读写文件,比单纯地调用read/write函数要快上许多。我们可以把内存中的内容拷贝到一个文件中实现内存备份,也可以把文件映射到内存来恢复某些服务。

2.37 默认的Linux系统,从后台启动进程,应在命令的结尾加上&

2.38 ps跟top有什么区别

2.39 写出下列常用命令