
Low-level
文章平均质量分 95
imred
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。
展开
-
Linux:在使用UEFI固件的计算机上内核是如何被启动的
启动计算机通常不是一件难事:按下电源键,稍等片刻,你就能看到一个登录界面,再输入正确的密码,就可以开启一天的网上冲浪之旅了。但偶尔这件事没那么顺利,有时候迎接你的不是熟悉的登录界面,而是一个令人生畏的命令提示符界面,一闪一闪的提示符告诉你:“你碰到麻烦了”。于是你对着错误提示查找解决方法,按照网页上的步骤,你对着提示符输入并执行了几条你完全不理解的命令,计算机又能正常启动了,但同时你发现你那存有大学舍友糗照的硬盘分区被清空了。原创 2023-08-05 16:12:08 · 2416 阅读 · 0 评论 -
关于指令、数据、程序和进程的一些思考
从动态链接库说起关于指令和数据的思考实际上是从写一个汇编语言课设开始的,当时要在Windows下写一个截获键盘操作的win32程序,老师推荐了一本《Windows环境下32位汇编语言程序设计》。(实际上这个课设就是这本书上的一个例子) 截获键盘操作就是要靠钩子函数,而使用钩子函数必须使用动态链接库。关于动态链接库,《设计》中有如下叙述: 如果有多个程序用到同一个动态链接库,Windows在物理原创 2015-12-13 19:32:28 · 1938 阅读 · 0 评论 -
DMA中的四种控制信号:DRQ、DACK、HRQ、HLDA
使用DMA方式进行数据传输时,主要有四种控制信号:DRQ(DMA Request)、DACK(DMA Acknowledgment)、HRQ(Hold Request)和HLDA(Hold Acknowledgment),如下图所示: 每种控制信号的作用为: DRQ:外设向DMA控制器(DMAC,DMA Controller)提出的要进行DMA操作的申请信号。 DACK:DMA控制器向发出原创 2016-01-27 17:00:10 · 13423 阅读 · 0 评论 -
可编程DMA控制器——Intel 8257介绍
(原文地址http://mediatoget.blogspot.in/2013/01/programmable-dma-controller-intel-8257.html) Intel 8257是一种控制DMA(Direct Memory Access)操作的芯片,它可以将数据直接在IO设备和内存之间进行交换,而不需要经过CPU,所以它的数据传输速率可以很快。 8257有以下特点: 825翻译 2016-01-28 16:48:59 · 6196 阅读 · 0 评论 -
80x86处理器保护模式下的分段机制
(本文为《深入理解Linux内核》笔记) 对于80x86处理器,我们要区分以下三种地址: 逻辑地址:由段地址和段内偏移两部分组成。 线性地址(虚拟地址):将逻辑地址进行解释得到的地址形式,它是一个32位无符号整数,值的范围为0x00000000到0xffffffff可对4GB的空间进行寻址。之所以又称为虚拟地址,是因为后来的虚拟存储技术,使得线性地址并不会直接对应到相应的物理地址,而要经原创 2016-02-13 16:37:14 · 1775 阅读 · 0 评论 -
kernel 源码中的 likely() 和 unlikely()
这两个都是宏,展开形式如下:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)(现在的源代码中可能还加入了ftrace的功能,用于统计预测成功率,改善程序性能,参见ftrace简介) __builtin_expect(!!(x), 1)用来表示程序员预测x值为1的原创 2016-07-24 11:17:05 · 618 阅读 · 0 评论 -
Intel 64汇编指令集中的LOCK指令前缀
(译自intel 64-ia-32-architectures-software-developer-instruction-set-reference-manual) LOCK指令前缀会设置处理器的LOCK#信号(译注:这个信号会使总线锁定,阻止其他处理器接管总线访问内存),直到使用LOCK前缀的指令执行结束,这会使这条指令的执行变为原子操作。在多处理器环境下,设置LOCK#信号能保证某个处理器翻译 2016-07-22 13:52:30 · 12274 阅读 · 0 评论 -
排队自旋锁(Ticket spinlocks)
(译自http://lwn.net/Articles/267968/,作者Jonathan Corbet) 自旋锁是Linux内核中最底层的互斥机制。因此,它们对内核的安全和性能有很大的影响,人们花很大力气去优化各种自旋锁的实现(不同的硬件体系结构会有不同的实现)也就不足为奇了。但是我们的优化之路还没有走到终点,一个合并到2.6.25版本内核的patch告诉我们能做的还有很多。 在x86架构上的翻译 2016-07-24 22:55:15 · 1953 阅读 · 0 评论 -
kernel 源码中的 ACCESS_ONCE()
ACCESS_ONCE()也是一个宏,宏定义如下: #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))它还有一堆注释,不仔细看的话会很令人困惑,先放在这里,下面再解释: /* * Prevent the compiler from merging or refetching accesses. The compiler原创 2016-07-26 11:22:28 · 1955 阅读 · 1 评论