嵌入式Linux内核开发工程师必须掌握的三十道题
如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师。
1. Linux中主要有哪几种内核锁?(进程同步与互斥)
(1)自旋锁:非睡眠锁
(2)信号量:睡眠锁
2. Linux中的用户模式和内核模式是什么含义?(内存管理)
(1)用户模式:应用程序运行于用户模式,仅可以有限度的访问CPU及其他硬件资源
(2)内核模式:内核线程运行于内核模式,内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间
3. 怎样申请大块内核内存?(内存管理)
① vmalloc()用于申请大块内存,它的特点为虚拟地址连续,物理地址不一定连续
② kmalloc()用于申请小块内存 ,它基于slab实现的。
4. 用户进程间通信主要有哪几种方式?(进程间通信)
(1)管道(PIPE):仅父子进程间通信
(2)有名管道(FIFO):可用于任意进程
(3)共享内存(简单实用):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
(4)消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5)信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
(6)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(7)Socket:可用于不同机器进程间的通信
5. 通过伙伴系统申请内核内存的函数有哪些?(内存管理)
① 伙伴算法的思想是:把内存中连续的空闲叶框空间看做空闲叶框块,并按照它们的大小(连续叶框的数目)分成10组,
第0组:每个元素都代表由一个2^0个叶框组成的空闲叶框块
第1组:每个元素都代表由一个2^1个叶框组成的空闲叶框块
...
第9组:每个元素都代表由一个2^9个叶框组成的空闲叶框块
每组中的空闲叶框块用其自身的page结构连接为双向链表;然后使结构free_area_struct的next和prev分别作为各个链表的头、尾指针;最后把各组的free_area_struct结构以组的序号为下标保存在数组free_area[]中
注:伙伴算法的目的是在分配时合理分配,以尽量减少内存碎片
② 内核函数__get_free_page()用于物理叶框的分配
6. 通过slab分配器申请内核内存的函数有?(内存管理)
① kmalloc():通用缓冲区
② kmem_cache_alloc():专用缓冲区
③ slab思想:把若干页框合在一起形成一个大存储块--slab,斌仔这个slab中只存储一类数据
7. Linux的内核空间和用户空间是如何划分的(以32位系统为例)(内存管理)
(1)Linux将4G的地址划分为用户空间和内核空间两部分。通常0-3G为用户空间,3G-4G为内核空间,但他们的本质都为虚拟内存空间,都需要通过页表进行转换为实际的物理地址。
8. vmalloc()申请的内存有什么特点?(内存管理)
① vmalloc()和kmalloc()是内核内存分配函数,malloc()是用户进程内存分配函数
② vmalloc()是通过页表动态分配的内存,其虚拟地址空间连续,但物理地址空间不一定连续
③ kmalloc()是通过直接映射区分配内存,可以保证物理空间连续,但其所能分配的空间有限
注:内存只有在要被DMA访问的时候才需要物理上连续。
④ kmalloc()和get_free_page()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。
⑤ vmalloc比kmalloc要慢
9. 用户程序使用malloc()申请到的内存空间在什么范围?(内存管理)
malloc()函数分配的内存空间在0~3G之间,即Linux用户空间
10. 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?(内存管理)
① 运行于虚拟地址模式
② MMU的作用:
(1)将虚拟地址转化为物理地址
(2)访问权限管理
11. ARM处理器是通过几级页表进行存储空间映射的(内存管理)
① Linux操作系统使用三级页表结构:页目录(Page Dicretory, PGD)、中间页目录(Page Midlle Dicretory, PMD)和页表(Page Table,PTE)
② ARM处理器通过二级页表进行映射
12. Linux是通过什么组件来实现支持多文件系统的?(文件系统)
虚拟文件系统
13. Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)(文件系统)
(1)struct file
(2)struct file_operation
(3)struct super_block
(4)struct inode
14. 对文件或设备的操作函数保存在那个数据结构中?(文件系统)
struct file_operation
15. Linux中的文件包括哪些?(文件系统)
普通文件、目录文件、链接文件、设备文件
16. 创建进程的系统调用有哪些?(进程管理)
① fork:子进程获得一个父进程的副本,子进程有自己的数据区和堆栈区,以及系统堆栈(内核堆栈),子进程拥有自己独立的内存空间(拥有独立的页表)
② vfork:与fork不同,vfork并不把父进程复制到子进程中,而只是用复制指针的方法使子进程与父进程的资源实现共享,子进程和父进程共享内存空间
17. 调用schedule()进行进程切换的方式有几种?(进程管理)
18. Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的?(进程管理)
Linux调度是根据weight来确定优先权的,而weight是由静态优先级和动态优先级组合计算出来的值
weight = [counter + (20 - nice)]
19. 进程调度的核心数据结构是哪个?(进程管理)
struct runqueue
20. 如何加载、卸载一个模块?(内核基本知识)
① insmod
② rmmod
21. 模块和应用程序分别运行在什么空间?(内存管理)
模块运行于内核空间,应用运行于用户空间
22. Linux中的浮点运算由应用程序实现还是内核实现?(内存管理)
由应用程序实现,浮点数计算位于库函数中,而库函数只能由应用程序链接
23. 模块程序能否使用可连接的库函数?(内存管理)
模块程序运行于内核空间,不能链接库文件
24. TLB中缓存的内容是什么?(内存管理)
TLB(Translation lookaside buffer)即旁路转换缓冲, 称为页表缓冲,当线性地址第一次被转换为物理地址时,将线性地址与物理地址存放到TLB中,用于下次访问到这个地址时,加快转换速度
25. Linux中有哪几种设备?(设备驱动)
字符设备,块设备,网络接口设备
26. 字符设备驱动程序的关键数据结构是哪个?(设备驱动)
struct file_operation
27. 设备驱动程序包括哪些功能函数?(设备驱动)
① open
② read
③ write
④ ioctl
⑤ release
⑥ llseek
28. 如何唯一标识一个设备?(设备驱动)
主设备号+次设备号
29. Linux通过什么方式实现系统调用?(Linux系统基本知识)
① Linux通过软中断(swi)实现系统调用
② 以ARM平台为例,系统调用工作原理是
(1)进程先用适当的值填充寄存器(R7),
(2)然后调用一个特殊的指令(swi),
(3)这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置(vector_swi),
(4)这位置的代码会根据寄存器(R7)的值从表sys_call_table中查找相应的函数。
30. Linux软中断和工作队列的作用是什么?(中断处理)
① Linux软中断和工作队列的作用是中断延迟处理(中断下半部分处理)
(1)软中断是一种“可延迟函数”的总称,它不能睡眠、不能阻塞。他处于中断上下文,不能进程切换,不能被自己打断,只能被硬件中断
(2)工作队列中的函数处于进程上下文,它可以睡眠,能被阻塞。能够在不同的进程间切换完成不同的工作。
嵌入式Linux内核开发工程师必须掌握的三十道题的更多相关文章
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识
驱动开发读书笔记. 0.06 嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- Linux内核开发进阶书籍推荐(不适合初学者)
Linux内核开发进阶书籍推荐(不适合初学者) 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上家里的一些事情,一直没能找到闲暇,今天终于有些时间,希望可以完成 ...
- Linux内核开发
Linux内核开发 https://www.cnblogs.com/pugang/p/9728983.html 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上 ...
- 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导【转】
本文转载自:https://my.oschina.net/freeblues/blog/596448 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导 buildroot 是 ...
- 制作嵌入式linux内核
拿到一个嵌入式linux内核代码,首先make distclean 接下来,如果在x86平台,就直接make menuconfig,如果是在ARM平台,就直接make menuconfig ARCH= ...
- 嵌入式Linux应用开发完全手册之环境搭建
@ 目录 0.下载源配置 1.电脑BIOS启动虚拟化 2.linux网卡查看与IP设置 3.windows NAT虚拟网络配置 4.修改 Ubuntu 的 mountd 端口 5.vim设置 6.Mo ...
- 如何参与Linux内核开发(转)
本文来源于linux内核代码的Document文件夹下的Hoto文件.Chinese translated version of Documentation/HOWTO If you have any ...
随机推荐
- pt-summary pt-mysql-summary工具
2个percona的工具还真挺好用的. pt-summary# Percona Toolkit System Summary Report ###################### Date | ...
- spark机器学习从0到1主成分分析-PCA (八)
PCA 一.概念 主成分分析(Principal Component Analysis)是指将多个变量通过线性变换以选出较少数重要变量的一种多元统计分析方法,又称为主成分分析.在实际应用场合中,为 ...
- 9.2 Go 文件IO操作
9.2 Go 文件IO操作 1.1.1. bufio包 带有缓冲区的IO读写操作,用于读写文件,以及读取键盘输入 func main() { //NewReader返回一个结构体对象指针 reader ...
- Django模板之自定义过滤器/标签/组件
自定义步骤: 1. 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2. 在app应用中创建templatet ...
- LinkedList详解-源码分析
LinkedList详解-源码分析 LinkedList是List接口的第二个具体的实现类,第一个是ArrayList,前面一篇文章已经总结过了,下面我们来结合源码,学习LinkedList. 基于双 ...
- MySQL InnoDB索引介绍以及在线添加索引实例分析
引言:MySQL之所以能成为经典,不是没有道理的,B+树足矣! 一.索引概念 InnoDB引擎支持三种常见的索引:B+树索引,全文索引和(自适应)哈希索引.B+树索引是传统意义上的索引,构造类似二叉树 ...
- SICP 题解集合
1.1(略) 1.2 biwascheme> (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7))) => -0.24666 ...
- Poj1753 翻转棋子
这个题就是用枚举举遍所有情况,然后一个一个深搜看看是不是符合条件,符合条件直接退出,不符合则继续, 由于表格只有16个所以可以得知最多的步数只能是16,所以可以根据步数从0到16依次枚举, 第一个符合 ...
- vue过渡动画样式
在进入/离开的过渡中,会有 6 个 class 切换. v-enter:定义进入过渡的开始状态.在元素被插入之前生效,在元素被插入之后的下一帧移除. v-enter-active:定义进入过渡生效时的 ...
- CVE-2016-3714-ImageMagick 漏洞利用
漏洞简介:/etc/ImageMagick/delegates.xml 将%s,%l加入到command里造成了命令执行 利用方式: poc代码: push graphic-context viewb ...