一些零碎知识点的索引

2023-05-16

一些零碎知识点的索引

  • 前言
  • 操作系统(主要是纯Linux系统级的)
    • Linux内存管理
      • slab的着色
      • 写时复制的应用场景
      • 内核高端内存
      • 查看一个进程的地址空间分布(代码、数据、栈)
      • 匿名映射
      • Linux中用户空间调用malloc实际调用什么(brk mmap)
      • Linux中1GB的内核空间中的进一步分区
    • Linux中的并发与同步
      • 内核中可能造成并发执行的原因
      • 自旋锁、互斥锁、信号量的区别和使用
      • 哪些情况不允许阻塞,哪些调用可能引起阻塞
    • Linux中的中断与异常
      • 中断处理程序有单独的栈
      • 中断处理程序返回用户空间或内核空间
      • 硬中断、软中断、信号的区别
      • 软中断和tasklet中不允许睡眠
      • 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硬件相关的部分)
      • ARM七种运行模式中,什么时候运行在系统模式
      • SPI与I2C的优缺点分析
  • 编程语言
      • 堆和栈中数组越界的问题
  • 编译、链接、动静态库
      • 编译优化导致的编译乱序,导致并发问题,解决办法(编译屏障)
      • volatile的具体作用,对并发的用处
  • 调试
      • 段错误 segment fault

前言

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一些零碎知识点的索引 的相关文章

随机推荐

  • xp系统登录不上ftp服务器,在XP中顺利登录FTP服务器

    董师傅教你 xff1a 通过系统设置解决在IE7 0中直接输入FTP地址无法登录服务器问题 最近 xff0c 笔者新装了Windows XP系统 xff0c 系统自带的IE版本为7 0 在IE地址栏中输入内网FTP地址 xff0c 如ftp
  • linux内核模块签名,如何签名内核模块Ubuntu 18.04

    问题描述 我是使用Ubuntu的新手 我正在尝试安装Genymotion xff0c 以便可以访问Android模拟器 为了使用Genymotion xff0c 需要我有VirtualBox 我已经安装了VirtualBox xff0c 但
  • 常用的几种API获取ip地理位置的使用方法

    最近公司让做一个用户登录 付费的时候记录操作人的地理位置 搜了很多帖子 xff0c 一开始用的淘宝的api xff0c 但是用了一段时间发现 xff0c 这个api当获取的次数多了之后 xff0c 就报404了 xff0c 导致很多记录没有
  • java部分匹配字符串_关于字符串:在Java中匹配子字符串

    我有一个输入数据存储在arraylist中 在遍历列表时 xff0c 输出是 Input 0 Overcast 1 High 2 Normal 3 Weak Input 0 Rainy 1 Mild 2 High 3 Strong Inpu
  • Ubuntu20.04LTS环境docker+cephadm方式部署Ceph 17.2.5

    Ubuntu20 04LTS环境docker 43 cephadm方式部署Ceph 17 2 5 1 前言2 环境准备2 1 主机信息2 2 NTP时间同步2 3 关闭 iptable 和 firewalld2 4 关闭 SElinux2
  • java如何解析xml?

    技术点 xff1a getResourceAsStream方法 xff0c dom4j的SaxReader解析xml 例 xff1a 1 加载磁盘xml文件到内存中 InputStream package com example utils
  • python识别数字论文_Python3使用tesserocr识别字母数字验证码的实现

    一 背景 最近有个需求是从一个后台的留言网站爬取留言数据 xff0c 后台管理网站必然涉及到了登录 xff0c 登录就有个验证码的问题必须得解决 xff0c 由于验证码是从后端生成的 xff0c 并且不了解其生成规则 xff0c 那就只能通
  • 用jsonserve和axios做交互_vue中axios对json-server提供的多层json数据如何增删改?

    问题描述 使用json server将json变成一个服务 xff0c 可以根据后缀不同获取到不同的数据 xff0c 而axios可以对数据进行操作 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • Linux下redis基本安装配置(CentOS7)

    1 下载 http redis io download 2 上传安装包 3 开始安装 rpm ivh jemalloc 3 6 0 1 el7 x86 64 rpm rpm ivh redis 4 0 8 1 el7 remi x86 64
  • 更新计算机策略命令,组策略更新命令

    对于Windows 2000域来说 xff0c 如果你想让新修改的计算机策略立即生效的话 xff0c 可以依次单击 开始 运行 命令 xff0c 打开系统运行对话框 xff0c 并在其中输入字符串命令 cmd xff0c 单击 确定 按钮后
  • 嵌入式安卓项目笔记

    前言 xff1a 时间2021年7月电子科大人文交流月课程 嵌入式安卓系统开发 的大作业 项目描述 基于VM虚拟机Ubuntu 18 04 参考老师所给的suspendmonitor例程 xff0c 实现USB插拔监控驱动 43 APP用户
  • (一)DSP28335

    前言 xff1a 用于记录一些在学习实验室48V无人机项目所用的DSP28335时的一些心得体会 xff0c 主要参考资料是普中科技的那个资料手册 1 通信相关 区分开串口通信与串行通信 xff0c 串口通信 xff08 Serial Co
  • arm中的程序计数器PC

    在cpu中 xff0c 一条指令的执行简单的划分为 xff1a 取指 译码 执行 xff0c 三个部分 pc中存放的是下一条将要 执行 的指令的地址 xff0c 这里的执行并不是取指 译码 执行中的第三个步骤 xff0c 而是指的将存放于内
  • 韦东山第一期课程内容概要

    韦东山第一期课程内容概要 1一个嵌入式程序要运行所需的东西1 1第一条指令 b reset1 2 reset要完成的事件1 2 1设置开门狗1 2 2设置时钟1 2 3判断启动方式并设置堆栈1 2 4代码重定位 1 3执行main函数 12
  • 韦东山第一二期衔接课程内容概要

    韦东山第一二期衔接课程内容概要 0 使得一个裸板Jz2440能运行linux应用程序的过程1 uboot启动内核总结1 1 u boot分析之编译体验1 2 u boot分析之Makefile结构分析1 3 u boot分析之源码第一阶段1
  • 嵌入式总线与通信

    嵌入式总线与通信 I2C通信I2C通信的特点I2C通信协议I2C硬件连接I2C在一条数据线SDA上如何实现双向传输 xff1f xff08 如何实现半双工 xff09 SOC上的I2C通用硬件接口I2C接口与接口之间的连接I2C设备在整个A
  • jquery为动态dom元素绑定点击事件(比如动态生成的表格)

    js为动态dom元素绑定点击事件 需要给页面动态加载还未出现的元素添加事件时 xff0c 可以用jQuery的on xff0c live xff0c delegate来绑定事件 叫做委派事件 比如控制的动态生成的表格 xff0c 给一列中的
  • 嵌入式Arm+Linux中断与异常全流程讲解

    嵌入式ARM 43 Linux中断全流程讲解 ARM处理器级别的中断 异常 ARM的异常类型CPU如何检测到异常信息 进入异常处理后怎么返回前置知识 xff1a 流水线 xff0c 指令周期 xff0c 机器周期 xff0c 时钟周期复位
  • Linux设备树

    Linux设备树 1 设备树的引进与体验字符设备驱动程序的三种写法使用设备树时对应的驱动编程只想使用设备树不想深入研究怎么办 本文章基于韦东山关于设备树的课程以及自己的一些想法 xff0c 目录结构和韦东山老师的视频结构相同 1 设备树的引
  • 一些零碎知识点的索引

    一些零碎知识点的索引 前言操作系统 xff08 主要是纯Linux系统级的 xff09 Linux内存管理slab的着色写时复制的应用场景内核高端内存栈查看一个进程的地址空间分布 xff08 代码 数据 栈 xff09 匿名映射Linux中