Open Geekiter opened 5 months ago
对设备初始化和释放
进行内核与硬件的数据交互
检测和处理设备出现的错误
kmalloc()
kzallo()
vmalloc()
解读:
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()可以睡眠,因此不能再中断上下文调用
内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的是函数malloc
可能是由进程在使用该模块
互斥
static可以让全局变量或函数的作用域限制在当前模块,不会与其他模块发生冲突。因为在嵌入式系统中,一个程序可能是很多程序员共同完成的,在定义变量及函数的过程中,可能会重名,给系统集成带来麻烦
void bit_reverse(uint32_t nbit){ *((volatile unsigned int *)0x1F000010) ^= (0x01 << nbit) }
高响应比优先
从上到下
分页机制
I/O地址
物理地址
read()/write() -> kernel -> sys_read()/sys_write()->fop.read()->fop.write()
虚拟内存是内存管理的一种技术,使得应用程序认为自己拥有连续的内存空间,而实际上它对应的物理内存是不连续的,甚至还有一部分对应着外部磁盘存储器,在需要时再进行数据交换。
块是操作系统读写硬盘的最小单位,页是操作系统读写内存的最小单位
cache主要用来加快CPU读取内存中指令的速度,但在CPU初始化时,内存并未准备就绪,直接进行数据读取,势必导致指令取址异常
mmap函数能够实现把一个文件映射到一个内存区域,使得我们可以像读写内存一样读写文件,比单纯地调用read/write函数要快上许多。我们可以把内存中的内容拷贝到一个文件中实现内存备份,也可以把文件映射到内存来恢复某些服务。
1. 驱动开发
1.1 Linux驱动程序的功能是什么?
对设备初始化和释放
进行内核与硬件的数据交互
检测和处理设备出现的错误
1.2 内核程序申请内存使用什么函数?
kmalloc()
kzallo()
vmalloc()
解读:
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的指定位反转?
2 操作系统
2.1 Linux系统的组成部分?
2.2 Linux内核的组成部分
2.3 内存管理MMU的作用?
2.4 常见的操作系统进程调度策略
2.5 满足短作业优先又不会发生饥饿现象的算法是什么
高响应比优先
2.6 I/O子系统层次结构
从上到下
2.7 逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别
分页机制
,那么线性地址使用页变换后就是物理地址。如果没有启用分页机制,那么线性地址就是物理地址。I/O地址
,ARM下的物理地址
,在x86下,外设的I/O地址是独立的,即有专门的指令访问外设I/O,I/O地址就是“总线地址”,而RAM地址就是“物理地址”。在ARM下,I/O和RAM同一编址,但linux为了统一各个平台,仍然保留了这个概念2.8 操作系统的内存分配一般有哪几种方式,各有什么优缺点?
2.9 用户空间与内核空间有哪些通信方式?
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 写出下列常用命令