一些零碎知识点的索引

一些零碎知识点的索引

前言

在看书和看资料的过程中,有一些知识点当时看明白了,但是过段时间忘记后想再去查找时,总是忘了当初是在哪里看到的了,因此建立索引。

操作系统(主要是纯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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值