自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

哈尼的博客

通俗易懂说网络

  • 博客(348)
  • 收藏
  • 关注

原创 深入理解操作系统(9)第四章:处理器体系结构(1)Y86指令集+逻辑设计(包括:ISA/存储器/HCL/冒险/CISC,RISC/verilog/逻辑门/组合电路/多路复用器/ALU/(典型)硬件寄存

深入理解操作系统(9)第四章:处理器体系结构(1)前沿+Y86指令集+逻辑设计和HCL(包括:ISA/Y86指令集/存储器/HCL/冒险/CISC,RISC/指令编码/verilog/逻辑门/(字级)组合电路/(字级)多路复用器/四路复用器/ALU/硬件寄存器/典型寄存器文件)1. 前沿1.1 ISA(指令集体系结构)1.1.1 ISA作用1.1.2 ISA模型1.2 本章目标:1.2.1 为什么要了解处理器设计?1.3 Y86指令集1.3.1 什么是Y86指令集1.3.2 Y86指令集特点1.3.3 Y8

2021-11-26 17:37:00 196

原创 深入理解操作系统(8)第三章:程序的机器级表示(4)struct,union+浮点代码(包括:理解指针/gdb/传值和引用/缓冲区溢出/蠕虫和病毒

深入理解操作系统(8)第三章:程序的机器级表示(4)struct,union+浮点代码(包括:理解指针/gdb/传值和引用/缓冲区溢出/蠕虫和病毒1. 异质的数据结构1.1 struct1.2 union1.2.1 union 应用场景1.3 对齐1.3.1 数据对齐的优点:1.3.2 Linux数据对齐策略2. 在机器级程序中将控制与数据结合起来2.1 理解指针2.1.1 理解指针2.1.2 参数传递(传值和引用)2.2 使用GDB调试器2.3 内存越界引用和缓冲区溢出2.3.1 缓冲区溢出2.3.2 蠕

2021-11-23 17:34:15 385

原创 深入理解操作系统(7)第三章:程序的机器级表示(3)过程+数组分配和访问(包括:过程定义/栈帧/转移控制call,leave,ret/寄存器使用惯例/过程示例汇编/cltq指令

深入理解操作系统(7)第三章:程序的机器级表示(3)过程+数组分配和访问(包括:过程定义/栈帧/转移控制call,leave,ret/寄存器使用惯例/过程示例汇编/cltq指令1. 过程1.1 过程调用的定义1.2 栈帧结构1.2.1 栈的作用1.2.2 栈帧1.2.3 esp ebp 寄存器1.3 转移控制1.3.1 过程调用和返回的指令:call leave ret1.3.2 call 指令1.3.3 ret 指令1.3.4 leave 指令1.4 寄存器使用惯例1.4.1 惯例:1.4.2 被调用者保

2021-11-19 11:41:28 392

原创 深入理解操作系统(6)第三章:程序的机器级表示(2)控制(包括:条件码CF,ZF,SF,OF/set指令/判断条件的典型指令/跳转指令jump/直接跳转和间接/循环do-while,while,for

深入理解操作系统(6)第三章:程序的机器级表示(2)控制(包括:条件码CF,ZF,SF,OF/set指令/判断条件的典型指令/跳转指令jump/直接跳转和间接/循环do-while,while,for说明1. 控制1.1 条件码1.1.1 最有用的条件码是:1.1.2 设置条件码的指令(lea不改变条件码)1.1.3 cmp test只设置条件码,不改变寄存器1.2 访问条件码1.2.1 set 指令操作1.2.2 c判断条件的典型指令序列1.2.3 指令的同义名(一条机器指令有多个名字)1.2.4 a-b

2021-11-17 18:03:04 414

原创 深入理解操作系统(5)第三章:程序的机器级表示(1)intel历史+程序编码+算术和逻辑操作(包括:机器级代码/汇编指令特性/反汇编/8个常用寄存器/操作数的三种类型/lea/移位sall,shll)

深入理解操作系统(5)第三章:程序的机器级表示(1)intel历史+程序编码+算术和逻辑操作(包括:8086由来/汇编/摩尔定律/机器级代码/汇编指令特性/objdump/汇编指令/反汇编/8个常用寄存器/操作数的三种类型/lea指令/移位操作sall,shll)1. 前言1.1 现代编译器的优点1.2 理解汇编代码的重要性1.3 编译器的优化1.4 精通细节是理解更深和更基本概念的先决条件2. 历史观点-Intel处理器发展2.1 intel历史(8086由来)2.2 IA32-Intel32位体系结构2

2021-11-13 18:02:40 517

原创 深入理解操作系统(4)第二章:信息的表示和处理(3)整数运算+浮点数(包括:溢出/模运算/时钟周期/字符编码/补码)

深入理解操作系统(4)第二章:信息的表示和处理(3)整数运算+浮点数(包括:溢出/模运算/时钟周期/字符编码/补码)1. 整数运算1.1 无符号加法1.1.1 两个非负整数的和可能会溢出(算术运算溢出)1.1.2 无符号运算可以被看做一种形式的模运算。1.1.3 例子:1.1.4 阿尔贝群1.2 补码加法1.2.1 负溢出1.3 补码的非1.4 无符号乘法1.5 补码乘法1.6 乘以常数1.7 乘以2的幂1.8 除以2的幂2. 浮点数3. 第二章总结问题:1. 两个正数相加可能会得出一个负数2. 比较

2021-11-09 09:33:37 179

原创 深入理解操作系统(3)第二章:信息的表示和处理(2)整数表示(包括:有符号,无符号的二进制表示/反汇编器/-12345表示/反汇编器/C语言默认有符号/零扩展,符号扩展/截断数字/建议不使用无符号数)

深入理解操作系统(3)第二章:信息的表示和处理(2)整数表示(包括:有符号,无符号的二进制表示/反汇编器/-12345表示/反汇编器/C语言默认有符号/零扩展,符号扩展/截断数字/建议不使用无符号数)1. 整型数据类型大小2. 无符号和二进制补码编码2.1 无符号的二进制表示 B2Uw2.2 有符号的二进制表示 B2Tw2.2.1 有趣的数字(0 -1 最大最小有/无符号数)2.2.2 12345 和 -12345的二进制表示2.2.3 反汇编器3. 有符号数和无符号数之间的转换4. C中的有符号与无符号数

2021-11-06 10:47:25 176

原创 深入理解操作系统(2)第二章:信息的表示和处理(1)信息存储(包括:有符号数和无符号/字节/虛拟地址空间/字/大小端 字节序/字符编码/逻辑运算/位运算/移位运算左移右移)

深入理解操作系统(2)第二章:信息的表示和处理(1)信息存储(包括:有符号数和无符号/字节/虛拟地址空间/字/大小端 字节序/字符编码/逻辑运算/位运算/移位运算左移右移)1. 概述1.1 二进制表示原因1.2 无符号 二进制补码 浮点数2. 信息的存储2.1 基本概念:2.1.1 最小的可寻址的存储器单位-字节2.1.2 虚拟存储器2.1.3 c指针:2.2 十六进制表示法2.2.1 字2.3 数据大小2.4 寻址和字节顺序2.4.1 大小端2.4.2 反汇编器2.4.3 typedef2.4.4 siz

2021-11-04 21:11:38 467

原创 深入理解操作系统(1)第一章:计算机系统漫游(包括:位/比特/系统组成/CPU指令操作/缓存/分层结构/操作系统两个基本功能/并发/上下文/虛拟地址空间)

深入理解操作系统(1)第一章:计算机系统漫游(包括:位/比特/系统组成/CPU指令操作/缓存/分层结构/操作系统两个基本功能/并发/上下文/虛拟地址空间)1. 信息就是位 + 上下文1.1 hello.c1.2 一切都是比特:1.3 上下文:2. 程序被其他程序翻译成不同的格式2.1 hello.c 到 a.out2.2 编译系统的四个阶段:预处理,编译,汇编,链接3. 了解编译系统如何工作大有益处3.1 优化程序性能3.2 理解链接时出现的错误3.3 避免安全漏洞4. 处理器读并解释存储存在存储器中的指令

2021-11-03 10:15:03 88

原创 Linux程序设计(23)第十二章:POSIX线程

Linux程序设计(23)第十二章:POSIX线程1. 线程2. 多线程请参考我的多线程系列博客:linux的代码适用于任何一种线程库,因为这些代码是基于POSIX标准的,该标准普遍适用于所有线程库。1. 线程线程是进程内部的一个控制序列2. 多线程请参考我的多线程系列博客:多线程https://blog.csdn.net/lqy971966/category_8850399.html...

2021-10-28 15:40:27 6

原创 多线程(19)线程分离/脱离,结合 pthread_detach

多线程(19)线程分离/脱离,结合 pthread_detach 1. 线程的两种状态——可结合、可分离1.1 可结合态(线程的默认属性):1.2 分离态2. 线程分离函数:pthread_detach2.1 pthread_detach 的两种用法:3. 创建分离线程伪代码:4. pthread_attr_XXX 系列api1. 线程的两种状态——可结合、可分离线程分为两种状态:可结合态和分离态;默认情况下,线程被创建成可结合的。1.1 可结合态(线程的默认属性):这种状态下的线程是能够被其他进程

2021-10-27 17:48:53 38

原创 Linux程序设计(22)第十一章:进程和信号

Linux程序设计(22)第十一章:进程和信号 1. 启动新进程 system2. wait3. 僵尸进程4. 信号5. 信号集进程:正在执行的程序。1. 启动新进程 systemlinux system 和 execl 函数对比https://blog.csdn.net/lqy971966/article/details/110532718Linux exec 系列函数:execl execv等https://blog.csdn.net/lqy971966/article/details/11

2021-10-27 10:21:25 5

原创 Linux程序设计(21)第十章:调试:常用调试技巧,gdb,断言assert,valgrind

Linux程序设计(21)第十章:调试:常用调试技巧,gdb,断言assert,valgrind1. 常用调试技巧2. gdb3. 断言 assert3.1 功能:3.2 assert 是一个宏,不是函数3.3 例子:3.4 debug release版本区别3.5 -DNDEBUG 关闭断言 例子4. 内存调试 valgrind1. 常用调试技巧程序调试的5个步骤:测试:找出错误固化:让错误可重现定位:定位错误原因,代码处修改:修改代码验证:确定是否修改成功2. gdb通俗易懂说GDB

2021-10-26 17:23:30 8

原创 Linux程序设计(20)第九章:开发工具(1)make makefile,源代码控制系统:SCCS RCS CVS Subversion,patch tar

Linux程序设计(20)第九章:开发工具(1)make makefile,源代码控制系统:SCCS RCS CVS Subversion,patch tar1. make Makefile1.1 代码例子2. 源代码控制系统:SCCS RCS CVS Subversion3. 发行软件3.1 patch 工具3.2 tar 工具1. make Makefilemakefile[一]:编译选项,debug/release版本https://blog.csdn.net/lqy971966/article

2021-10-26 10:46:19 3

原创 Linux程序设计(19)第七章:数据管理(1)内存管理

Linux程序设计(19)第七章:数据管理(1)内存管理1. 内存管理1.1 分配大量内存1.2 交换空间1.3 虚拟内存1.4 OOM1.5 内存滥用1.6 空指针1.7 realloc calloc2. 文件锁定2.1 原子操作锁文件(全局锁)和区域锁文件2.1.1 创建锁文件2.1.2 open 锁文件例子2.2 锁文件2.2.1 协调性锁文件2.3 区域锁(文件段锁定)2.3.1 背景:2.3.2 两种方式(fcntl 和 lockf)2.4 fcntl 例子2.4.1 fcntl 必须使用 rea

2021-10-19 14:55:34 2

原创 Linux程序设计(18)第五章:终端(1)temios结构 虚拟控制台 伪终端 PTY

Linux程序设计(18)第五章:终端(1)temios结构 虚拟控制台 伪终端 PTY1. temios结构2. 虚拟控制台3. 伪终端 PTY1. temios结构行编辑:是否允许用退格键进行编辑。缓存:是立即读取字符,还是等待一段可配置的延迟之后再读取它们。回显:允许控制字符的回显,例如读取密码时。回车/换行(CR/LF):定义如何在输入/输出时映射回车/换行符,比如打印5字符时应该如何 处理。2. 虚拟控制台Linux提供了虚拟控制台的功能,一组终端设备共享PC电脑的屏幕、键盘和鼠标

2021-10-14 17:43:41 2

原创 Linux程序设计(17)第四章:Linux环境(2)环境变量:getenv putenv environ 时间和日期 用户信息:getuid getgid 主机信息:gethostname unam

Linux程序设计(17)第四章:Linux环境(2)环境变量:getenv putenv environ 时间和日期 用户信息:getuid getgid 主机信息:gethostname uname 系统日志:syslog1. 环境变量1.1 定义:1.2 API: getenv putenv1.2.1 getenv putenv 代码例子1.3 environ1.3.1 environ 代码例子2. 时间和日期2.1 gmtime 例子2.2 ctime 例子3. 用户信息 getuid getgid

2021-10-14 16:49:06 2

原创 Linux程序设计(16)第四章:Linux环境(1)程序参数 getopt POSIX

Linux程序设计(16)第四章:Linux环境(1)程序参数 getopt POSIX 1. 命令行参数1.1 POSIX 标准中关于程序名、参数的约定:1.2 选项 长选项 选项字符串1.2.1. 选项:1.2.2 长选项1.2.3 选项字符串2. getopt2.1 getopt 背景2.2 getopt api 和 参数2.3 代码示例1. 命令行参数命令行程序设计的首要任务是解析命令行参数。对参数采用了一种比较通俗的定义:命令行上除命令名之外的字符串。参数由多项构成,项与项之间用空白符彼此

2021-10-11 20:30:28 2

原创 Linux程序设计(15)第三章:标准I/O库(7)错误处理 perror strerror /proc文件系统 和 fcntl mmap

Linux程序设计(15)第四章:标准I/O库(5)错误处理 perror strerror /proc文件系统 和 fcntl mmap1. strerror perror2. proc 文件系统3. fcntl4. mmap4.1 定义:4.2 作用:4.3 映射空间位置4.4 vm_area_struct 结构4.5 mmap内存映射原理4.5.1 第一步:进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域4.5.2 第二步:内核调用系统调用函数mmap(区别于用户态mmap),实现文件物理

2021-10-11 16:18:42 2

原创 Linux程序设计(14)第三章:标准I/O库(6)扫描目录: opendir closedir readdir telldir seekdir

Linux程序设计(14)第四章:标准I/O库(4)扫描目录: opendir closedir readdir telldir seekdir1. opendir closedir readdir2. 例子-扫描目录1. opendir closedir readdir#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);struct dirent *readdir(DIR *dir

2021-10-09 17:00:25 1

原创 Linux程序设计(13)第三章:标准I/O库(5)sprintf fprintf rewind remove mkdir rmdir chdir getcwd

Linux程序设计(13)第四章:标准I/O库(3)sprintf fprintf rewind remove mkdir rmdir chdir getcwd1. printf sprintf fprintf2. rewind 指向文件开头3. remove 就是删除文件4. mkdir rmdir 创建/删除目录5. chdir getcwd 改变/获取文件目录1. printf sprintf fprintfint printf(const char *format,...);int sprin

2021-10-09 16:37:56 1

原创 Linux程序设计(12)第三章:标准I/O库(4) fgetc getc getchar fgets 和 fputc putc putchar fputs

Linux程序设计(12)第四章:标准I/O库(2) fgetc getc getchar fgets 和 fputc putc putchar fputs1. fgetc getc getchar2. fputc putc putchar fputs1. fgetc getc getcharint fgetc(FILE *stream);int getc(FILE *stream);int getchar();char *fgets(char *str, int n, FILE *stream)

2021-10-09 15:22:34 5

原创 Linux程序设计(11)第三章:标准I/O库(3) fopen fread fwrite fclose fflush fseek ftell feof

Linux程序设计(11)第四章:标准I/O库(1) fopen fread fwrite fclose fflush fseek ftell feof 1. 标准I/O库2. stdin stdout 和 stderr3. fopen fread fwrite flose fflush fseek feof3.1 fopen3.2 fread3.3 fwrite3.4 fclose3.4.1 fclose 使所有尚未写出的数据都写出3.5 fflush3.6 fseek3.7 ftell3.8 feof

2021-10-09 15:22:01 8

原创 Linux程序设计(10)第三章:文件操作(2)其他文件管理有关的系统调用 lseek,fstat/stat/lstat,dup

Linux程序设计(10)第三章:文件操作(2)其他文件管理有关的系统调用 lseek,fstat/stat/lstat,dup1. lseek1.1 原型1.2 参数:1.3 返回值1.4 代码例子:1.5 lseek 和 fseek 作用相同2. fstat stat 和 lstat 系统调用2.1 原型2.1 fstat2.1 stat 和 lstat2.3 struct stat2.4 例子(获取文件大小 ):3. dup 和dup2 系统调用1. lseeklseek 系统调用对文件描述符fi

2021-10-09 15:21:13 4

原创 Linux wc命令及统计文件夹下文件及文件夹个数

wc命令及统计文件夹下文件及文件夹个数1. 统计文件夹下文件及文件夹个数2. wc 命令:2.1 参数:2.2 例子:1. 统计文件夹下文件及文件夹个数统计当前目录下文件的个数(不包括目录)$ ls -l | grep "^-" | wc -l//普通文件以-开头统计当前目录下文件的个数(包括子目录)$ ls -lR| grep "^-" | wc -l查看某目录下文件夹(目录)的个数(包括子目录)$ ls -lR | grep "^d" | wc -l//普通文件夹以d开头2.

2021-09-03 09:33:54 16

原创 硬盘知识:硬盘结构、盘片、磁道、扇区、柱面、磁头数、寻址模式

硬盘知识:硬盘结构、盘片、磁道、扇区、柱面、磁头数、寻址模式1. 硬盘是啥?1.1 硬盘1.2 硬盘结构2. 盘片 磁头 磁道 柱面 扇区 圆盘2.1 内外圈扇区的大小变化:2.2 例子说明:1.44MB的3.5英寸软盘3. 磁盘容量4. 寻址模式:CHS(也称3D) 和 LBA4.1 CHS(也称3D)4.1.1 chs的缺点1:容量有限4.1.2 chs的缺点2:新的磁盘寻址难4.2 LBA1. 硬盘是啥?1.1 硬盘硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片

2021-09-01 16:10:04 16

原创 Linux内核设计与实现(19)第十九章:可移植性

Linux内核设计与实现(19)第十九章:可移植性1. linux移植性非常好2. 字长 位2.1 字长2.2 位2.3 内核编码中字长准则3. 数据类型3.1. 不透明类型3.2. 长度确定的类型3.2.1 内核空间的长度确定的类型3.2.2 用户空间的长度确定的类型3.3 char 类型4. 数据对齐4.1. 通过指针转换类型时, 不要转换长度不一样的类型4.2. 对于数组, 按照基本数据类型进行对齐4.3. 对于联合体, 长度最大的数据对齐就可以了4.4. 对于结构体, 保证结构体中每个元素能够正确对

2021-08-20 15:07:08 28

原创 Linux内核设计与实现(18)第十八章:内核调试

Linux内核设计与实现(18)第十八章:内核调试1. 内核态调试难点1.1 KDB 调试1.2 解决:1.2.1 输出 LOG(printk)1.2.2 oops1.2.3 主动触发 bug1.2.3.1 panic1.2.4 神奇的系统请求键1.2.5 其他:gdb 和 kdb1. 内核态调试难点内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态。也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态。内核调试的难点大致有以下几个:1.重现bug困难 如果能够重现一

2021-08-20 13:50:13 14

原创 Linux内核设计与实现(17)第十七章:设备与模块

Linux内核设计与实现(17)第十七章:设备与模块1. 设备类型,内核模块,内核对象,sysfs2. 设备类型2.1 块设备,字符设备,网络设备2.1. 伪设备3. 内核模块3.1 动态加载:3.2 带参数的内核模块3.3 内核模块的位置3.4 内核模块相关操作4. 内核对象4.1 统一设备模型4.2 kobject 简介4.3 ktype4.4 kset4.5 kobject ktype 和 kset 之间的关系4.6 kref5. sysfs 虚拟文件系统5.1 定义:5.2 kobject 和 sy

2021-08-20 11:31:29 16

原创 Linux内核设计与实现(16)第十六章:页高速缓存和页回写

Linux内核设计与实现(16)第十六章:页高速缓存和页回写1. 缓存2. 写缓存常见的有3种策略(不缓存,写透缓存,回写)3. 缓存回收的策略4. 页高速缓存4.1 定义:4.2 大小:4.3 提高I/O性能,页高速缓存的条件4.4 实现5. 页回写5.1 回写线程 flusher5.2 触发回写的3种情况5.3 回写历史发展:5.3.1. 膝上型计算机模式5.3.2. bdflush 和 pdflush (2.6版本前 flusher 线程的实现方法)5.3.3. flusher 线程1. 缓存缓

2021-08-19 17:37:33 13

原创 Linux内核设计与实现(15)第十五章:进程地址空间

Linux内核设计与实现(15)第十五章:进程地址空间1. 虚拟地址空间2. 内存描述符 mm_struct2.1 内存描述符 mm_struct2.2 内核线程没有进程地址空间2.3 进程是用户进程还是内核线程3. 分配进程地址空间4. 虚拟内存区域(VMA)5. 地址空间和页表5.1 页表:5.2 3级页面(PGD PMD PTE)1. 虚拟地址空间定义:地址空间就是每个进程所能访问的内存地址范围,是一段连续的虚拟内存空间. 每个进程都有唯一的地址空间,彼此之间互不干扰 背景(为什么需要虚拟地

2021-08-19 16:56:16 11

原创 Linux内核设计与实现(14)第十四章:块I/O层

Linux内核设计与实现(14)第十四章:块I/O层1. 字符设备和块设备1.1 字符设备1.2 块设备1.3 字符设备和块设备的区别2. 块和扇区2.1 块2.2 扇区2.3 块和扇区:2.4 查看扇区和块大小:fdisk3. 内核访问块设备的方法3.1 块和内存页3.2 内核中有2种方法来管理块和内存页之间的映射。3.3 缓冲区和缓冲区头3.3.1 缓冲区头 buffer_head3.3.2 缓冲区头作用:3.3.3 缓冲区和缓冲区头的缺点3.4 bio3.4.1 bio 背景:3.4.2 bio 优点

2021-08-19 16:10:22 27

原创 Linux内存管理之slab 2:slab API

Linux内存管理之slab 2:slab API1. kmem_cache_create1.1 kmem_cache_create (仅分配一个kmem_cache实例)未分配实际物理页1.2 slab 创建流程1.3 slab 与伙伴系统2. kmem_cache_alloc2.1 kmem_cache_create 和 kmem_cache_alloc 关系2.2 kmalloc 函数本质2.3 kfree 函数本质3. kmem_cache_zalloc (zero 清零)3.1 kmem_cach

2021-08-19 14:49:37 44

原创 Linux内核设计与实现(12)第十二章:内存管理

Linux内核设计与实现(12)第十二章:内存管理1. 页1.1 分页1.2 page 页内存消耗2. 区2.1 背景:2.2 区的作用:2.3 三个区3. 获取内存的方法3.1. 按页获取:最原始的方法,用于底层获取内存的方式3.1.1 GFP 标志3.2. 按字节获取:使用最多的方式(kmalloc()和vmalloc())3.2.1 kmalloc 和 vmalloc 区别在于:3.3 slab 层获取:效率最高的获取方法3.3.1 slab 背景:3.3.2 slab 层实现原理(内存池思想)3.3

2021-08-11 17:19:17 34

原创 Linux内核设计与实现(11)第十一章:定时器和时间管理

Linux内核设计与实现(11)第十一章:定时器和时间管理1. 内核对时间的使用概述:2. 系统时间2.1 实际时间2.2 定时器2.2.1 静态定时器2.2.2 动态定时器3. 基础概念大搜罗:HZ,节拍,jiffies,定时器中断,实时时钟3.1 HZ 赫兹3.2 节拍(tick)3.3 jiffies3.3.1 jiffies常用的一些运算3.3.2 回绕问题3.4 定时器中断:3.5 实时时钟4. 定时器执行流程4.1 伪代码实例5. 实现程序延迟的方法 schedule_timeout1. 内核

2021-08-11 15:18:00 25

原创 Linux内核设计与实现(10)第十章:内核同步方法

Linux内核设计与实现(10)第十章:内核同步方法1. 原子操作2. 自旋锁2.1 自旋锁2.2 自旋锁API2.3 自旋锁伪代码实现3. 信号量4. 互斥锁4.1 互斥体和信号量场景选择:4.2 互斥体和自旋锁场景选择:5. 完成变量(没用过)6. 大内核锁(已经弃用)7. 顺序锁(没用过)8. 禁止抢占9. 顺序和内存屏障9.1 内存屏障背景9.2 内存屏障例子说明9.3 详细参考:Linux RCU机制+内存屏障9.4 内存屏障API10. 总结1. 原子操作原子(atomic)本意是“不能被进

2021-08-11 11:13:41 21

原创 Linux内核设计与实现(9)第九章:内核同步介绍

Linux内核设计与实现(9)第九章:内核同步介绍1. 临界区,竞争条件,同步1.1 内核中造成并发的原因:2. 锁2.1 锁的种类:互斥锁,读写锁,自旋锁,递归锁2.2 死锁2.3.1 死锁定义2.3.2 常见死锁情形2.3.3 避免死锁:2.4 什么数据需要加锁3. 编写内核代码时,时时记着下面这些问题:1. 临界区,竞争条件,同步临界区:就是访问和操作共享数据的代码段。竞争条件: 多个执行线程处于同一个临界区。同步: 安排进程/线程执行的先后顺序就是同步目的:避免并发和防止竞争条件1.1

2021-08-10 19:21:46 41

原创 Linux内核设计与实现(8)第八章:中断下半部的处理

Linux内核设计与实现(8)第八章:中断下半部的处理1. 中断背景,定义;分类;上下部机制;中断号;中断上下文2. 中断上下半部机制背景:2.1 背景:2.2 解决:2.3 举例:用网卡收包来解释一下这两半2.4 上下半部划分原则3. 上半部:4. 下半部:4.1 下半部的三种实现方式:4.2 下半部实现机制之软中断4.2.1 定义,特点,应用,类型4.2.2 软中断执行函数4.3 下半部实现机制之 tasklet4.3.1 tasklet 背景:4.3.2 tasklet 出现:4.3.3 taskle

2021-08-10 15:35:41 40

原创 Linux内核设计与实现(7)第七章:中断处理

Linux内核设计与实现(7)第七章:中断处理1. 中断背景,定义;分类;上下部机制;中断号;中断上下文2. 中断相关函数2.1 注册中断的函数 request_irq2.2 释放中断的函数 free_irq2.3 中断处理程序的声明 intr_handler3. 中断处理机制3.1 中断处理流程图:4. 中断控制方法1. 中断背景,定义;分类;上下部机制;中断号;中断上下文详细参考之前的文章:Linux 中断https://blog.csdn.net/lqy971966/article/detai

2021-08-10 11:18:54 37

原创 Linux内核设计与实现(5)第五章:系统调用

Linux内核设计与实现(5)第五章:系统调用1. 系统调用1.1 定义1.2 作用(四个作用)1.3 用户程序,系统调用,内核,硬件设备的调用关系1.4 printf()函数调用过程1.5 系统调用命名2. Linux上的系统调用实现原理2.1 调用过程2.2.1 通知内核调用一个哪个系统调用2.2.2 用户程序把系统调用的参数传递给内核2.2.3 用户程序获取内核返回的系统调用返回值1. 系统调用1.1 定义系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设

2021-08-09 16:58:13 20

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除