最近看了矢泽久雄[日]的《计算机是怎样跑起来的》,把大学学到的知识又复习了一遍,主要包括计算机组成原理、操作系统、编程语言、数据库等知识。下面是我记录的一些书中的重点:
在C代码中插入寄存器时,需要添加头文件ap_shift_reg.h,如下图所示。这个案例中移位寄存器的深度为4(由DEPTH确定),这可以理解为4个寄存器级联。输出q取0号寄存器(由ADDR确定)输出。
1 前言 本文主要介绍SQLite虚拟机VDBE,为了更好地了解SQLite虚拟机,文中也加入了一些Lua虚拟机内容来对比学习,更好地了解不同虚拟机之间的异同。 1.1 预备知识 虚拟机设计需要编译原理相关理论基础,这里先简单温习下编译原理中的一些知识。 1.1.1 文法 (1) LR文法 1965年,D.knuth 首先提出了LR(K)文法及LR(K)分析技术。括号中的K 表示向右查看输入串符号的个数。对于大多数用无二义性上下文无关文法描述的语言都可以用相应的LR 分析器进行识别,而且这种方法还具
在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践。
在处理大型的数据集时,我们常常进行一些简单的检查,如稀有项(Unique items)的数量、最常见的项,以及数据集中是否存在某些指定的项。通常的做法是使用某种确定性的数据结构,如 HashSet(哈希集) 或 Hashtable(哈希表) 来达此目的。但是当我们所处理的数据集十分巨大时,这样的数据结构完全不可行,因为数据量太大,我们没有足够的存储空间。对于通常需要在一次传递(One pass)中处理数据并执行增量更新的流媒体应用(Streaming application)来说,这就变得更加困难。
对于嵌入式开发来讲,我们在日常中接触到概念都是 MCU ,MCU 和 CPU 的区别也就在于 MCU 集成了片上外围器件,CPU 不带外围器件,一个简单的例子就是 MCU 在芯片内集成了 Flash 和 RAM 用来存储程序和数据,对应的在我们个人 PC 的体现就是硬盘和内存条,因此两者的区别只是在于外围器件的集成与否,最本质的工作原理两者是互通的。
笔者非科班转行,两个月拿了十多个offer,其中包括了互联网大厂,央企,国企,银行等,下面看看都面了什么(部分回忆)。总之,在面试国企等企业时,会有一些有意思的问题,也会出现群面的场景。 1 阿里一面 指针和引用的区别 define和const 内联函数和define c++内存管理 栈和堆区别,全局变量和局部变量 c++多态,虚函数,纯虚函数 多态的好处 数据库索引,给一个语句问有没有用到索引,底层怎么实现的 B树和B+树 哈希冲突 说一说常见的排序算法和时间,空间复杂度 TCP,UDP,可靠传输,网络什
有许多已经使用了一段时间的功耗降低方法,这些方法都是成熟的技术。本章描述了一些低功耗设计的方法。
常用的分组加密模式有四种,分别是:电子密码本模式 (ECB)、加密分组链接模式 (CBC)、加密反馈模式 (CFB)和输出反馈模式 (OFB)。下面重点介绍这四种加密模式, 对其他的加密模式仅作简单的概括。
UVM 是 Universal Verification Methodology 的缩写,即通用验证方法学。它起源于 OVM(Open Verification Methdology),是由 Cadence, Mentor 和 Synopsys 联合推出的新一代的验证方法学。
当异常发生时,Linux内核给造成异常的进程发送一个信号,告知其发生了异常。比如,如果一个进程尝试除零操作,CPU会产生除法错误异常,相应的异常处理程序发送SIGFPE信号给当前进程,然后由其采取必要的步骤,恢复还是中止(如果该信号没有对应的处理程序,则中止)。
如果时序差的不多,在1NS以内,可以通过修改综合,布局布线选项来搞定,如果差的多,就得动代码。
源程序实际上就是一个由 0 和 1 组成的位(称为比特)序列,8个位被组成为一组,称为字节。
我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备。操作系统必须向设备发送命令,捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理 I/O 是我们接下来的重点。
通用异步收发器简称UART,即“Universal Asynchronous Receiver Transmitter”
在现代工业自动化系统中,PLC(Programmable Logic Controller,可编程逻辑控制器)被广泛应用于监控和控制各种设备和过程。而与之配套的通信协议也是至关重要的。其中,Modbus TCP 协议作为一种常见的通信协议,被广泛应用于工业领域。
#include<stdio.h> int main() { printf("hello, world\n"); return 0; }
现代的几乎所有的编程语言都离不开函数和参数的概念。而这个概念是编程语言级别的,而不是硬件级别的。也就是说硬件上本来没有函数的概念。只是函数的用的太普遍,硬件开始为函数准备专用的指令。
Selection Pushdown in Column Stores using Bit Manipulation Instructions
中 , 介绍了 调试进程 远程调用 远程进程 的 libc.so 动态库中的 mmap 函数 , 本博客继续对该远程调用过程进行一些补充 ;
如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿。在多CPU体系结构中,运行在两个CPU上的两个内核控制路径同时并行执行上面操作序列,有可能发生下面的场景:
1、奇偶效验:是一种最简单的效验方法。基本思想是:通过在编码中增加一个效验位来使编码中1的个数为奇数(奇效验)或者为偶(偶效验),从而使码距变为2。对于奇效验,可以监测出代码中奇数位错误的编码,不能发现偶数位错误编码。即当奇数位编码错误,也就是1变成0或0变成1,则编码中1的个数的奇偶性就发生变化,从而发现错误。
随着各种消费类设备智能化的巨大增长,这些应用正变得更加以数据为中心data-centric和计算密集型computation intensive。从IC设计的角度来看,这增强了早已经存在的power vs area trade-off的挑战。
软件系统性能的提升的重要方法之一是支持并发性编程,尤其是采用多核体系结构的时候。在全局数据库、云计算和区块链应用程序中,并发性对于实现容错和分布式服务也是至关重要的。然而,对并发性的掌握一直是令人畏惧的挑战之一。并发编程是困难的,要同时处理许多可能任务的非确定性行为,包括故障、操作系统、共享内存架构和异步。
欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》
SALT 项目使用了几种不同的隔离技术。SALT 的初始版本是在有工具支持自动插入隔离单元之前完成的。因此,我们在 RTL 中手动插入了这些单元格。
寄存器实验 先放一张 Proteus 总体仿真图,设计过程还是比较复杂的,需要考虑总体的布局,线路的排布等等。。。 我将原工程文件放在文末,需要可自取 [在这里插入图片描述] 实验要求 --- 基本要求 - 理解CPU运算器中寄存器的作用 - 设计并验证寄存器组(至少四个寄存器) - 利用寄存器或组合逻辑电路实现移位运算功能(至少含左移、右移、循环左移、循环右移四种运算功能) 扩展要求 - 实现更多的寄存器 - 实现多总线结构寄存器访问
时钟门控(Clock Gating)是一种在数字IC设计中某些部分不需要时关闭时钟的技术。这里的“部分”可以是单个寄存器、模块、子系统甚至整个SoC。
我们先来看一个问题,在Chrome浏览器里面通过开发者工具,打开浏览器里的Console,在里面输入“0.3 + 0.6”:
穷举测试向量, 就需要214=16384个测试矢量,对于一个有38个输入端口的16位的ALU来说,以10 MHz的速度运行完所有的测试矢量需要7.64个小时.
举一个简单的例子,在下班的高峰期,要从公司回到家里,开车走怎样的路线才能够耗时最短呢?最简单的想法,当然是把所有可能的路线一次一次的计算,根据路况计算每条路线所消耗的时间,最终可以得到用时最短的路线,即为最决路线,这样依次的将每一种路线计算出来,最终对比得到最短路线。搜索的速度与总路线数N相关,记为O(N),而采用量子搜索算法,则可以以O(sqrt(N))的速度进行搜索,要远快于传统的搜索算法。
机器语言一堆的0/1代码确实反人类,汇编语言指令繁杂 不同机器设备还有较大差异。比如x86架构的汇编指令一般有两种格式:
学会一个软技能,总结一篇文章就够了。 剩下要做的就是不停的练习,不停的尝试,本文是在学习这个仓库之后的极简总结中。 主要作为一个备忘录使用。
步骤2,3,4便是一次kprobe工作的过程,它的一个基本思路就是将本来执行一条指令扩展成执行kprobe->pre_handler--->指令--->kprobe-->post_handler这样三个过程。下面详细解释每个过程:
1) PLC为 CPU414-5H 冗余PLC , CP341(使用IM153-2), CP341主站硬件狗 Dongle ( 6ES7 870-1AA0-0YA0 )
《深入理解计算机系统》,这本书,我多次想要好好完整的读一遍,每次都是没有坚持下去,但是作为一个开发者,自己想要成为为数不多的大牛之一,所以打算这次把这本书完整的好好读一遍,并整理为相关的博客! 书的开头说了一句话:计算机系统是由硬件和系统软件组成,他们共同工作来运行应用程序。 我们通常接触更多的是应用程序级别的,很少关注系统以及系统和硬件的交互,但是如果自己能完全理解计算机系统以及它对应用程序的影响,那将会让我们在软件开发的路上走的更远,也同时可以避免很多问题的发生。 拿最简单的hello.c 程序来说,我
文件rust/compiler/rustc_passes/src/debugger_visualizer.rs是Rust编译器中的一个代码文件,它包含了与调试器可视化相关的功能。
本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,本专栏的优势在于:
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。 1、简单的内嵌汇编 例:
最初开始,指令一条一条顺序执行,后来当工艺进步了,CPU中的元件越来越多,而在原来的顺序执行的过程中,只有一条指令的某一个阶段在执行,如取指,取数据等等,其他元件都处于等待的状态,于是为了提高CPU吞吐量,以及指令并行的效率,于是PipeLine应运而生
单指令多数据(SIMD)范式称为列存数据库系统中优化查询处理的核心原则。到目前为止,只有LOAD/STORE指令被认为足够高效,可以实现预期的加速,并且认为需要尽可能避免GATHER/SCATTER操作。但是GATHER指令提供了一种非常灵活的方式用来将非连续内存位置的数据填充到SIMD寄存器中。正如本文讨论的那样,如果使用方法合适,GATHER会达到和LOAD指令一样的性能。我们概述了一种新的访问模式,该模式允许细粒度、基于分区的SIMD实现。然后,我们将这种基于分区的处理应用到列存数据库系统中,通过2个代表性示例,证明我们新的访问模式的效率及适用性。
(1)如果安装了VMware Tools,则使用CreateToolhelp32Snapshot、Process32Next扫描进程列表,查看是否有VMwareService.exe、VMwareTray.exe和VMwareUser.exe (2)查看网卡地址是否以00:0C:29开头,或查看其它硬件版本 (3)探测内存痕迹,搜索含有VMware的字符串 (4)Red Pill反虚拟机技术->漏洞指令sidt,根据返回的idtr值不同,在多核处理器上无效 (5)No Pill技术->漏洞指令sldt,主机系统上的LDTR值为0,虚拟机中不为0 (6)查看查询I/O通信端口,监视in指令,第二个操作数为VX (7)查看str指令,主机和虚拟机中返回值不一样,str指令用来从任务寄存器中检索段选择子
1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令
然后在文件最后,找到Add user logic here,然后在其后添加逻辑功能代码:
在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据。而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区。在使用vim的过程中离不开寄存器,而且我们很早就用到了寄存器,只是没有发现罢了。这篇文章将深入介绍寄存器,这样我们对之前使用的命令将会有更深的认识。
Hook 直译过来就是“钩子”的意思,是指截获进程对某个 API 函数的调用,使得 API 的执行流程转向我们实现的代码片段,从而实现我们所需要得功能,这里的功能可以是监控、修复系统漏洞,也可以是劫持或者其他恶意行为。
目前,在基于寄存器的同步设计中,除了ICG cell, 不期望设计中有其他latch ,所以在RTL 质量检查或综合阶段要对Latch 报警。
领取专属 10元无门槛券
手把手带您无忧上云