嵌入式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 ...
随机推荐
- Anaconda3中的Jupyter notebook添加目录插件
学习python和人工智能的相关课程时安装了Anaconda3,想在Jupyter notebook中归纳整理笔记,为了方便日后查找想安装目录(Table of Contents, TOC)插件,查找 ...
- Java开发架构篇《初识领域驱动设计DDD落地》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 DDD(Domain-Driven Design 领域驱动设计)是由Eric Eva ...
- vue在钩子中引用方法不成功
在组建创建成功后调用methods里的方法fn1,失败,提示not a function: created(){ getData(){} } solution: created(){ this.get ...
- H3C S5500三层交换机划分Vlan与H3C路由组网
基本属性: vlan特性:三层互通,两层隔离.三层交换机不同vlan之间默认是互通的,两次交换机不同vlan是隔离的. vlan IP:就是定义一个vlan下所有机器的网关地址,该vlan下的机器网关 ...
- 通俗易懂描述dubbo工作原理
关于dubbo的描述就不再赘述,直接进入主题,那就是dubbo的工作原理.dubbo分为服务提供者和服务消费者,主要的工作内容有以下几点:提供者暴露服务.消费者引入服务.提供者和消费者和注册中心之间的 ...
- 【Java_SSM】(三)maven中的配置文件setting的配置
这篇博文我们介绍两方面:如何修改setting.xml文件及相应配置(本文maven版本为3.5.0) (1)首先打开maven文件目录--conf,会看见如下目录 (2)复制setting.xml文 ...
- [PHP学习教程 - 文件]001.高速读写大数据“二进制”文件,不必申请大内存(Byte Block)
引言:读写大“二进制”文件,不必申请很大内存(fopen.fread.fwrite.fclose)!做到开源节流,提高速度! 每天告诉自己一次,『我真的很不错』.... 加速读写大文件,在实际工作过程 ...
- 2020 网鼎杯wp
2020 网鼎杯WP 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录 AreUSerialz 知识点:反序列化 打开链接直接给出源码 <?php include ...
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- Vue 全选/取消全选,反选/取消反选
这是一个组件: <template> <div> <div> <input type="checkbox" v-model="i ...