摘要: 之前介绍过一种使用乘法指令优化无符号除法的方式(见hacker's delight笔记), 今天介绍一种使用位运算做有符号除法(除数限制为2的幂). 这种方式要求底层支持有符号与无符号右移指令.记32位被除数为M, 除数为2**N(2的N次幂, N<32), 商为res, 无符号右移指令为ZextS 阅读全文
posted @ 2018-10-17 00:22 Five100Miles 阅读(581) 评论(0) 推荐(0) 编辑
摘要: 1. 优化方向 1.1 减少数据拷贝1.1.1 尽量减少数据拷贝次数,采用指针而非实际数据传参1.1.2 内核与用户态间数据拷贝注意使用cache,与不带cache的性能可相差10倍(具体参见内存山图) i.e. 鱼眼特性拷贝用户态5400kb的YUV只需6ms,从海思解码帧存(内核态分配地址)拷贝 阅读全文
posted @ 2018-06-27 19:57 Five100Miles 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 在上一节我们讨论了用户态向内核申请内存的接口(系统调用), 发现内核仅仅是判断进程的虚拟地址空间是否足够划分出新的区间, 实际并未分配物理内存. 这是因为内核分配内存的机制是仅当进程实际使用该地址后才为其分配物理内存, 借此提升物理内存使用率. 本节我们就来看看内核究竟是如何分配物理内存的.以32b 阅读全文
posted @ 2018-06-27 19:48 Five100Miles 阅读(817) 评论(0) 推荐(0) 编辑
摘要: 用到第三方库使用printf打印调试信息的时候往往需要重定向日志到文件, 但如果没有源码或修改点较多时就比较麻烦. 这里提供两个重定位方法:1. 修改值为1的文件描述符默认printf打印指向标准输出stdout(fd=1), 最终指向终端. 因此可以关闭值为1的文件描述符再打开另一文件, 之后pr 阅读全文
posted @ 2018-05-27 15:02 Five100Miles 阅读(3551) 评论(0) 推荐(0) 编辑
摘要: 内核目录下可以使用make cscope快速生成对应架构的数据库, 仅这点就把渣渣si甩了一条街. 其实实现原理很简单, cscope是通过读取cscope.files中文件列表建立的数据库, 因此只要控制cscope.files的输入即可实现不同架构下建立的不同cscope.out. 我们先来看看 阅读全文
posted @ 2018-05-19 14:06 Five100Miles 阅读(457) 评论(0) 推荐(0) 编辑
摘要: 之前分析errno的实现时有讲过系统调用的实现, 但是写到一半烂尾了, 于是决定重新挖个坑(- -!). 假设我们调用了一个open(), 从pc指向open()入口到pc执行open()的后一条指令中间究竟发生了什么. 首先明确第一点, 当我们调用open()时并不是直接调用系统调用open, 而 阅读全文
posted @ 2018-04-18 22:32 Five100Miles 阅读(2465) 评论(0) 推荐(0) 编辑
摘要: 刚来公司时候看到前人写的python脚本用来生成比较报告, 心中技痒. 正好服务器端没有BC, 脚本用不了. 于是东施效颦, 也写了一个.用的都是原生的svn命令, 自然效果是比不上用BC生成的报告(BC显示的是行内差异, svn只能比较行间差异).更新: 最近终于发现乱码的原因了, svn dif 阅读全文
posted @ 2018-04-16 16:22 Five100Miles 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 关于rcu的内容本来想放在内核锁介绍里, 后来发现要解释的内容太多了, 索性就分成几章. 本章来分析rcu的实现. 5. rcu Added on 2017.12.20之前看rcu代码时一直没有弄明白rcu_node的分布, 直到最近看到https://lwn.net/Articles/305782 阅读全文
posted @ 2018-04-10 22:20 Five100Miles 阅读(1122) 评论(0) 推荐(0) 编辑
摘要: 今天讨论下内核常见锁的机制与实现分析. 第一个问题内核何时会发生临界资源的竞争访问? 对于非抢占UP(uni processor)内核只有一种情况会发生竞争, 即高优先级异常/中断处理函数抢占内核线程的cpu并访问了临界资源. 如果内核开启抢占还会引发另一种可能, 即在中断返回或系统调用返回时另一线 阅读全文
posted @ 2018-04-10 22:16 Five100Miles 阅读(1291) 评论(0) 推荐(0) 编辑
摘要: 使用if (exp(a) || exp(b)) 当exp(a)结果为true时exp(b)就不会计算 但使用if (exp(a) + exp(b)) 即使exp(a)结果为true也会计算exp(b) 小技巧 看到内核里用到的 阅读全文
posted @ 2018-03-25 16:05 Five100Miles 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 很久以前挖的坑, 现在还没填上, 也许以后再详细分析吧. kprobe是内核提供的代码跟踪工具, 其使用方法见Documentation/kprobes.txt, 此处做个简要说明. kprobe允许你在任何内核程序位置动态打断并收集调试信息. 你可以在几乎热河内核代码地址陷入中断, 指定断点触发时 阅读全文
posted @ 2018-03-25 15:59 Five100Miles 阅读(2747) 评论(0) 推荐(0) 编辑
摘要: 当我们在linux编写用户态程序时并不需要考虑进程间是如何切换的, 即使当我们编写驱动程序时也只需调用一些阻塞接口来让渡cpu. 但是cpu究竟是如何切换进程的, 在进程切换过程中需要做什么, 今天我们通过分析内核schedule()的实现来看下内核是如何完成进程切换的. 先看下几个相关的数据结构: 阅读全文
posted @ 2018-03-25 15:48 Five100Miles 阅读(1641) 评论(0) 推荐(0) 编辑
摘要: 在上一节ptmalloc源码分析中我们提到dlmalloc向系统申请内存的方式有两种, 对应Linux系统下分别是sbrk()与mmap()系统调用. 本节我们就来看下brk()/sbrk()与mmap()/munmap()的实现, 作为切入点来一窥内核内存管理的特点. 在正文开始之前我们先大致描述 阅读全文
posted @ 2018-02-28 00:34 Five100Miles 阅读(1169) 评论(0) 推荐(0) 编辑
摘要: 之前写过关于内存管理的几篇文章, 但是比较零碎, 网上很多文章又偏于理论或者局限一块内容, 少有一个系列的分析. 一直想自己写个, 正好借助这次培训机会写篇文章, 从源码分析申请内存之后到实际访问内存之间系统究竟做了什么, 探讨一下源码作者如此设计内存管理模块的目的与意义. 暂时规划分四部分完成: 阅读全文
posted @ 2018-02-27 21:47 Five100Miles 阅读(1909) 评论(1) 推荐(1) 编辑
摘要: 在stackoverflow上看到这个问题 http://stackoverflow.com/questions/22758232/why-is-access-once-so-complex 原答主已经回答的很仔细了,不过还不够直观,这里做个试验 在arm平台上编译并截取main()的汇编 R0与R 阅读全文
posted @ 2018-02-22 22:17 Five100Miles 阅读(972) 评论(0) 推荐(0) 编辑
摘要: 以前测试hisi解码器数据时候写的demo 阅读全文
posted @ 2018-02-22 21:42 Five100Miles 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 1. linux下文件转码(GB2312转UTF8)vim打开文件后set fileencoding=utf-8 适用打开单个文件修改的情况iconv -f GBK -t UTF-8 input -o output 使用iconv转码, 适用脚本中批处理生成带BOM的UTF8文本echo -e -n 阅读全文
posted @ 2018-02-22 21:13 Five100Miles 阅读(532) 评论(0) 推荐(0) 编辑
摘要: 原文见http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html#Atomic-Builtins All of the routines are are described in the Intel documentation t 阅读全文
posted @ 2018-02-22 16:50 Five100Miles 阅读(245) 评论(0) 推荐(0) 编辑
摘要: errno是线程安全的吗? 假设有A, B两个线程都执行系统调用, 其中A返回EIO, B返回EAGAIN, 在判断返回值时是否会引起混淆? 简单的通过man errno就可以获取答案: errno is thread-local; setting it in one thread does not 阅读全文
posted @ 2018-02-22 16:01 Five100Miles 阅读(863) 评论(0) 推荐(0) 编辑
摘要: 最近重构代码, 移植了ffmpeg源码, 有人问了两个问题: 1. MIN_CACHE_BITS的含义, 读取码值时为什么要判断该值 2. get_ue_golomb_long()的含义 这里简要分析下代码(原理性东西比如什么是哥伦布编码就不说了). 先来看下show_bits_long()(def 阅读全文
posted @ 2018-02-22 15:57 Five100Miles 阅读(559) 评论(0) 推荐(0) 编辑
摘要: 平时使用vim时一般使用vimsession打开工程, 为图方便vimsession与源码不放在一个目录, 当需要shell访问文件时需要手动cd到源码目录(虽然可以vim里调用外部shell来解决, 但编译时还是不方便). 比如工程目录在~/workspace, 源码目录在~/source, 当从 阅读全文
posted @ 2018-02-22 15:48 Five100Miles 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 现在公司服务器上用的vimrc. 脚本最后几个插件几乎没怎么用到, 实际上熟读Practical Vim Edit Text at the Speed of Thought后除了ctags和cscope基本不需要其它插件. 将don't repeat yourself贯彻始终才是关键. 阅读全文
posted @ 2018-02-22 15:46 Five100Miles 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 这篇文章是对AAPCS文档的简单翻译, 因之前要讲课又没在网上找到中文版, 就决定尝试自己翻译一下, 个人理解不保证翻译正确性. 所有拿捏不准的地方全部保留英文(一来方便读者对上下文理解, 二来防止前面翻译出错引起后面误导), 部分不重要章节省略翻译, 一些有疑惑的术语列举如下: variant 个 阅读全文
posted @ 2018-02-22 15:21 Five100Miles 阅读(1386) 评论(0) 推荐(0) 编辑
摘要: 第一章 概述略. 第二章 基础知识 2.1 操作最右侧的位元x & (x - 1) 将最右侧置位的比特位置零, 该表达式可用来判断x是否为2的幂.x | (x + 1) 将最右侧置零的比特位置位.x & (x + 1) 将最右位起始的连续的1比特位置零, 如果最右位非1则不变, 该表达式可用来判断x 阅读全文
posted @ 2018-02-22 15:20 Five100Miles 阅读(2945) 评论(0) 推荐(2) 编辑
摘要: Foreword Vim is highly configurable. However, customization is a personal thing, so I’ve tried to avoid recommending what should or should not go into 阅读全文
posted @ 2018-02-22 15:20 Five100Miles 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以SIGSEGV为例, 详细分析信号使用方法, 内核信号的发送与接收机制. 1. 信号处理例程 以下是一 阅读全文
posted @ 2018-02-22 13:53 Five100Miles 阅读(3398) 评论(0) 推荐(0) 编辑