一些零碎知识点的索引
- 前言
- 操作系统(主要是纯Linux系统级的)
- Linux内存管理
- Linux中的并发与同步
- Linux中的中断与异常
- Linux 进程 、用户线程、内核线程
- 并不是所有内核线程都可以访问用户空间
- 通过结构体成员的指针找到其结构体的指针 container_of
- 内置模块
- 驱动程序中的mmap与应用程序中的mmap
- /proc/devices、/dev 区别
- Linux系统不是硬实时系统的原因
- Linux驱动编写中几个结构体:struct inode、struct file、struct file_operations、struct cdev的区别和联系
- 操作系统如何实现跨进程共享?一个真正的系统的进程地址空间是怎样的?
- 为什么空指针访问会导致错误?
- 用户空间的程序不能轻易访问内核代码的操作系统层面解读
- Linux系统中进程、线程、内核线程、用户进程、轻量级进程的概念
- Linux进程的休眠与唤醒(sleep wait_event_interruptible)
- 线程持有锁进入临界区后,能被抢占
- 断言
- 抢占发生的时机
- Linux内核线程运行时,使用什么内存描述符
- Linux进程描述符task_struct存放在哪
- current宏
- clone函数与调用
- 调用fork后,父子进程的资源关系
- 中断的属性,是进程的一部分吗
- 中断的嵌套,中断与临界区
- ARM与操作系统(操作系统与ARM硬件相关的部分)
- 编程语言
- 编译、链接、动静态库
- 调试
前言
在看书和看资料的过程中,有一些知识点当时看明白了,但是过段时间忘记后想再去查找时,总是忘了当初是在哪里看到的了,因此建立索引。
操作系统(主要是纯Linux系统级的)
Linux内存管理
slab的着色
http://www.360doc.com/content/12/0828/15/7982302_232808690.shtml
写时复制的应用场景
(1)内核对可执行文件的BSS段的处理:《现代操作系统第三版》428
内核高端内存
概念介绍:
https://www.lmlphp.com/user/57907/article/item/1551459/
https://www.zhihu.com/question/280526042
使用:
只有alloc_pages才可以分配高端内存,其他不行。《Linux内核设计与实现》193
栈
内核栈的大小是固定的:《Linux内核设计与实现》203
查看一个进程的地址空间分布(代码、数据、栈)
《Linux内核设计与实现》254
匿名映射
《Linux内核设计与实现》258
Linux中用户空间调用malloc实际调用什么(brk mmap)
《Linux设备驱动详解 4.0》 P261
malloc中“请求调页”的应用:《Linux设备驱动详解 4.0》 P262
Linux中1GB的内核空间中的进一步分区
《Linux设备驱动详解 4.0》 P257
Linux中的并发与同步
内核中可能造成并发执行的原因
《Linux内核设计与实现》135
自旋锁、互斥锁、信号量的区别和使用
https://blog.csdn.net/zgaoq/article/details/109637812
https://zhuanlan.zhihu.com/p/297929103
https://www.pianshen.com/article/19331651955/
如果临界区是中断或者软中断上下文,不能使用互斥锁:《Linux设备驱动详解 4.0》 P184
自旋锁 的临界区不能被抢占,也不能被阻塞,自旋锁的死锁情况(递归使用一个自旋锁)
http://t.zoukankan.com/hehehaha-p-6332892.html
自旋锁的临界区能否被中断打断:《Linux设备驱动详解 4.0》 P171,但是这种不能被中断打断不是自旋锁生来就有,是指我们在调用自旋锁时要禁止本地中断《Linux内核设计与实现》P148
通过自旋锁保证不同进程之间驱动程序的互斥:《Linux设备驱动详解 4.0》 P172
信号量
尝试获得信号量:会引起阻塞,不能在非进程上下文使用
持有信号量的临界区:可以被抢占,可以阻塞。
哪些情况不允许阻塞,哪些调用可能引起阻塞
非进程上下文(中断上下文、tasklet、内核定时器) ,自旋锁临界区 《Linux设备驱动详解 4.0》 P262
哪些调用可能引起阻塞: kmalloc、copy to user、copy form user
如果是基于多线程的并发,某个线程调用可能会引起阻塞的系统调用其实没关系,因为调度程序会让其他线程继续占用CPU运行,如果是基于事件的并发(只有一个主线程),则不允许阻塞,因为阻塞会浪费大量的CPU资源。
《操作系统导论》294有相关论述
Linux中的中断与异常
中断处理程序有单独的栈
《Linux内核设计与实现》P99
中断处理程序返回用户空间或内核空间
《Linux内核设计与实现》P102
硬中断、软中断、信号的区别
《Linux设备驱动详解 4.0》 P234
软中断和tasklet中不允许睡眠
《Linux设备驱动详解 4.0》 P233
Linux系统取消了中断的嵌套
《Linux设备驱动详解 4.0》 P160
Linux 进程 、用户线程、内核线程
并不是所有内核线程都可以访问用户空间
《Linux内核设计与实现》P124
通过结构体成员的指针找到其结构体的指针 container_of
《Linux设备驱动详解 4.0》 P154
内置模块
《Linux设备驱动详解 4.0》 P97
内置表示一开始就有,不用insmod。
驱动程序中的mmap与应用程序中的mmap
《Linux设备驱动详解 4.0》 P137
/proc/devices、/dev 区别
cat /proc/devices 可以查看系统中注册的设备。
ls /dev 查看系统中已经包含的设备。
一个是注册,一个是已经包含。比如我在驱动程序中手动(不通过udev,udev会自动创建设备实体,嵌入式系统中busybox集成了udev的轻量版本mdev)注册某个设备,insmod后可以在/proc/devices中看到,但是我没有通过mknod 具体进行创建,这时/dev中就看不到,必须创建得到实体后才能看到。
Linux系统不是硬实时系统的原因
主要是有些区域不能被抢占,比如中断上下文,自旋锁的临界区
《Linux设备驱动详解 4.0》 P57
Linux驱动编写中几个结构体:struct inode、struct file、struct file_operations、struct cdev的区别和联系
答:https://blog.csdn.net/weixin_42031299/article/details/124558537
操作系统如何实现跨进程共享?一个真正的系统的进程地址空间是怎样的?
答:《操作系统导论》187、188
为什么空指针访问会导致错误?
答:《操作系统导论》187
用户空间的程序不能轻易访问内核代码的操作系统层面解读
答:《操作系统导论》188
Linux系统中进程、线程、内核线程、用户进程、轻量级进程的概念
答:https://cloud.tencent.com/developer/article/1339562
Linux进程的休眠与唤醒(sleep wait_event_interruptible)
https://blog.csdn.net/ZHONGCAI0901/article/details/120348014
https://www.linuxprobe.com/linux-process-sleep-wake.html
https://blog.csdn.net/zhizhengguan/article/details/121512054
线程持有锁进入临界区后,能被抢占
《操作系统导论》225说能被抢占,但没说发生这种抢占的时机是什么,Linux说不定不可以。
注意说的是持有锁进入临界区后,在获取锁和释放锁这两个过程中是不可能被抢占的,因为这是原子操作。
一个体会:实际上持有锁进入临界区可以被抢占我觉得也正常,因为临界区代码是应用程序自己写的,如果恶意在临界区中死循环,岂不是控制了整个系统?
一个问题:对于Linux,持有锁进入临界区后被抢占是属于几种抢占发生的时机中的哪一种呢?
回答:https://zhuanlan.zhihu.com/p/339378819
断言
《操作系统导论》215页
抢占发生的时机
自我体会:
(1)用户程序可以自己调用schedule()申请重新调度,比如我们在12衔接中断处理时,驱动的read函数中调用
wait_event_interruptible(button_waitq, ev_press);
该函数就会把线程状态从可以运行变为TASK_INTERRUPTIBLE,然后调用schedule(),由于线程已经变成了TASK_INTERRUPTIBLE,所以自然调度器会运行其他线程。
(2)一个线程的时间片用到一半,会被抢占吗?
答:感觉应该不会,因为抢占需要操作系统来完成,而操作系统通过时钟中断来处理,每个时间片结束才会引发时钟中断。但是我觉得线程在时间片一半时虽然不会被抢占,但可以自己调用schedule()申请重新调度,问题是调度是不是始终都是以时间片为同步信号的?
《Linux内核设计与实现》53
一个问题:对于Linux,持有锁进入临界区后被抢占是属于几种抢占发生的时机中的哪一种呢?
回答:https://zhuanlan.zhihu.com/p/339378819
Linux内核线程运行时,使用什么内存描述符
《深入理解Linux内核》第三版 357页
Linux进程描述符task_struct存放在哪
《深入理解Linux内核》第三版 89页
《Linux内核设计与实现》52
current宏
《深入理解Linux内核》第三版91页
clone函数与调用
最原始是clone系统调用,C库在其上封装了clone函数,《深入理解Linux内核》第三版121页
调用fork后,父子进程的资源关系
最开始父子共用一个用户态堆栈,写时复制才分配新的用户态堆栈《深入理解Linux内核》第三版121页
父子进程有各自的内核栈、task_struct、thread_info,《深入理解Linux内核》第三版123页
中断的属性,是进程的一部分吗
中断仅仅是一段内核控制的程序执行流,比进程更加轻便,不是进程的一部分。《深入理解Linux内核》第三版136页
中断的嵌套,中断与临界区
大部分情况下中断应该允许嵌套,在进入临界区时应该关闭中断。《深入理解Linux内核》第三版136页
ARM与操作系统(操作系统与ARM硬件相关的部分)
ARM七种运行模式中,什么时候运行在系统模式
网上解释:系统模式是为了OS在其他特权模式下访问用户模式的寄存器而设立的
SPI与I2C的优缺点分析
《普中28335》403
编程语言
堆和栈中数组越界的问题
https://www.365jz.com/article/23996
编译、链接、动静态库
第三期关于libjpeg的使用
文章:https://blog.csdn.net/hsqyc/article/details/88056983?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-88056983-blog-125115562.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-88056983-blog-125115562.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1
编译优化导致的编译乱序,导致并发问题,解决办法(编译屏障)
《Linux设备驱动详解 4.0》 P161
volatile的具体作用,对并发的用处
《Linux设备驱动详解 4.0》 P163
《Linux内核设计与实现》P182
调试
段错误 segment fault
https://zhuanlan.zhihu.com/p/205579221