自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 理解驱动程序(个人理解)

理解驱动程序最重要的一句话是,寄存器是软件控制硬件的唯一途径。所以如何控制显卡,答案就是靠读写显卡提供的寄存器。 通过什么读写呢?据我所知的目前的显卡驱动,基本没有用低效的端口 IO 的方式读写。现在都是通过 MMIO 把寄存器映射的内核地址空间,然后用内存访问指令(也就是一般的 C 语言赋值语句)来访问。具体可以参考”内核内存映射,MMIO “的相关资料。...

2018-08-30 18:31:47 873 1

原创 CPU 的核心数与线程数量是什么关系?(个人理解)

 1==>  简单点说,处理器核数(包括超线程数)是一种执行资源,资源数量就是核数个数。2==>  应用程序的线程数就是服务请求数。3==> 而操作系统的作用是如果用有限的资源来服务好应用程序的请求,这就是进程调度的功能。4==> 一般情况下,服务请求线程会“相对公平” 地分配到核上运行,并且在时间片上轮流使用的,即并发执行 (不一定是并行执行)比如系统...

2018-08-30 18:28:29 8619 1

原创 计算机字符编码原理 (个人理解)

 没有中介,只有翻译。 就像两个国家人民交流一样,只需要找一个懂两国语言的翻译就可以了。而所有公认的编码,都是有标准的编码规则,所以在软件世界里,每个翻译都是全球通。下面是“好”字在UTF-8编码下转换成GBK编码的过程,每个过程都有显示它的存储字节(详见od命令输出): TTc:Test ttc$ echo "好" > utfTTc:Test ttc$ file u...

2018-08-30 18:27:19 1032

原创 为什么不使用 cmake 反而使用 Makefile ?

1、使用 cmake 增加学习成本(小项目)2、makefile 这么简单都搞不清楚的脑子,还指望搞得清 cmake ?3、cmake 是解决多个编译器的兼容问题,我又不支持 gcc 之外的编译器。4、关键是解决什么问题?你要给白痴用,用 cmake 还要多敲键盘;你要理解构建过程,cmake 多加个间接层,不是更难搞明白?5、你说,你要不出问题吧,cmake 还需要额外安装,还要多敲一行指令;你...

2018-06-26 10:08:13 5670 4

原创 %rbp 寄存器不再有特殊的 帧指针的含义了?

1 ==>  64 位平台下, %ebp 扩展的寄存器 %rbp,只有在 -O0 不优化的编译条件下 ,还具有 帧指针的特殊含义。2 ==> 因为大部分的程序,都加了优化编译选项:-O2,这几乎是普遍的选择。在这种优化级别,甚至更低的优化级别-O1,都已经去除了帧指针,也就是%ebp中再也不是保存帧指针,而且另作他途。在x86-32时代,当前栈帧总是从保存%ebp开始,空间由运行时决定...

2018-06-26 10:07:20 3074 1

原创 锁有什么不同?本质是什么?(底层相同,上层逻辑不同)

锁就是锁而已,避免多个线程对同一个共享的数据并发修改带来的数据混乱。锁要解决的大概就只有这 4 个问题:“谁拿到了锁” 这个信息存在哪里(可以是当前 class,当前 instance 的 markword,还可以是某个具体的 Lock 的实例)谁能抢到锁的规则(只能有一个人抢到 - Mutex; 能抢有限多个数量- Semphore; 自己可以反复抢- 重入锁, 读可以反复抢到但是 写独占 -读...

2018-06-26 10:02:35 439

原创 TCP/IP 感悟

计算机网络的数据传输,是由N个离散的数据单元(IP包)组成的,再去回忆关于TCP连接的概念,TCP的面向连接,而数据单元IP包却是离散的,而TCP也是由IP包来承载的,那意味着TCP报文也是离散的,既然是离散的,又谈何连接呢?TCP连接是一种逻辑概念,通信双方通过离散的IP包交互,分享了彼此的序列号、缓存大小等参数,彼此就可以认为和对方是连接的。而在这个逻辑连接上传输数据,

2018-01-15 18:34:13 199

原创 怎样理解阻塞非阻塞与同步异步的区别?(个人理解)

怎样理解阻塞非阻塞与同步异步的区别?首先这是不同层次的问题……一个网络包从应用程序A发到另一台电脑上的应用程序B,需要经历:从A的业务代码到A的软件框架从A的软件框架到计算机的操作系统内核从A所在计算机的内核到网卡从网卡经过网线发到交换机等设备,层层转发,到达B所在计算机的网卡从B所在计算机的网卡到B所在计算机的内核从B所在计算机的内核到B的程序的用户空间从B的软件框架到B的业务代码

2017-08-20 02:05:24 356

原创 Lua 5.3 源文件加载

Lua 5.3 load加载script 入口luaL_loadfile 宏 提供加载一个 lua 脚本文件的功能。#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL)LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,

2017-08-20 02:02:39 2168

原创 Lua5.3 虚拟机指令分析(十)表相关指令

Lua5.3 虚拟机指令分析(十)表相关指令OP_NEWTABLEOP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */创建一个新表,结果存放在A所在的栈位置,表的数组大小为B,表的Hash大小为C. TTcs-Mac-mini:OpCode ttc$ cat tOP_NEWTABLE.lua local a = {}a[

2017-08-20 01:58:37 335

原创 Lua5.3 虚拟机指令分析(八)循环

Lua5.3 虚拟机指令分析(八)循环whileLua 处了 for 循环之外的其它各种循环(while)都使用关系和逻辑指令,配合JMP 指令来完成。TTcs-Mac-mini:OpCode ttc$ cat tOP_WHILE.lualocal a = 0; while(a < 10) do a = a + 1; end print(a)TTcs-Mac-mini:OpC

2017-08-20 01:57:54 355

原创 Lua5.3 虚拟机指令分析(六)不定参数

Lua5.3 虚拟机指令分析(六)不定参数OP_VARARGOP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */TTcs-Mac-mini:OpCode ttc$ cat tOP_VARARG.luaf1 = function(...) endf1(10,20,...)TTcs-Mac-mini:OpCode ttc

2017-08-20 01:57:12 365

原创 Lua5.3 虚拟机指令分析(五)函数调用

Lua5.3 虚拟机指令分析(五)函数调用OP_CLOSUREOP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */TTcs-Mac-mini:OpCode ttc$ cat tOP_CLOSURE.luafunction f1() endTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CL

2017-08-20 01:56:30 432

原创 Lua5.3 虚拟机指令分析(四)分支与跳转

Lua5.3 虚拟机指令分析(四)分支与跳转EQ 、LT、LE、TEST、TESTEST 五个分支指令必须与后面的紧挨的 JMP 指令看做一体。当条件成立时,继续运行;条件不成立时,跳转到指定位置。OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A - 1) */OP_EQ,/* A B C if ((RK(B) =

2017-08-19 09:10:25 410

原创 Lua5.3 虚拟机指令分析(三)表达式运算

Lua5.3 虚拟机指令分析(三)表达式运算二元运算TTcs-Mac-mini:OpCode ttc$ cat tOP_Arith.lua local t = 1t = t + 1t = t - 1t = t * 1t = t / 1t = t % 1t = t ^ 1t = t // 1t = t & 1t = t | 1t = t ~ 1t = t << 1t = t

2017-08-19 09:08:03 288

原创 Lua5.3 虚拟机指令分析(二)赋值指令

Lua5.3 虚拟机指令分析(二)赋值指令Lua VM 是基于寄存器结构实现的,也就是说,每段 Lua  chunk 代码都被翻译为一组对256 个寄存器的操作指令。这有点类似于我们为Lua编写 C 扩展。 C 函数通常是从 lua_State 中取出参数逐个记录在 C 的局部变量中,然后利用C 代码直接对这些值进行操作。可以类比 把寄存器类比于 Lua 的寄存器。它们的确有相似之处, C 中的局

2017-08-19 09:06:25 436

原创 Lua5.3 虚拟机指令分析(一)概述

Lua5.3 虚拟机指令分析(一)概述概述Lua VM 使用的是 Register based VM。 指令都是在已经分配好的寄存器中存取操作数。 add a b c 将 寄存器 b 与 寄存器 c 中的值相加,结果存在 寄存器 a 中。 标准的三地址指令,每条指令的表达能力很强,并有效的减少了内存赋值操作。#if LUAI_BITSINT >= 32typedef unsigne

2017-08-19 09:03:32 1477

原创 Lua5.3 VM 分析(八)For 循环

Lua5.3 VM 分析(八)For 循环Lua 支持两种 for 循环,一种是 C 语言系 的 数字循环,另外一种支持 迭代器。 stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end for v = e1, e2, e3 do block endLua 手册中使用下列操作模拟。 do local var, l

2017-08-19 07:45:21 644

原创 Lua5.3 VM 分析(七)生成闭包

Lua5.3 VM 分析(七)生成闭包在Lua 中,函数是一等公民。一切代码都是函数,准确的说是闭包。当我们执行一段程序时,其实就是调用一个函数。加载一个库,也是调用一个函数。加载一个Lua 源文件,里面即使定义了很多 Lua 函数,但是 它整体依旧是单个函数。所以,每段完整的字节码都是一个Lua 函数。而每个函数里可以附有很多个函数原型 Proto。函数原型 Proto 没有放在常量表中,而是单

2017-08-19 07:44:24 341

原创 Lua5.3 VM 分析(四)分支和跳转

Lua5.3 VM 分析(四)分支和跳转Lua VM 定义了 OP_EQ、OP_LT、OP_LE、OP_TEST、OP_TESTSET 五种分支操作。这五个分支指令必须与 之后的 跳转指令 JMP 看做一个整体解释。也就是说:当条件成立时,继续运行;条件不成立时,跳转到指定位置。如果条件成立跳转到L1, 否则跳转到L2: L1: success() jmp exit L2:

2017-08-19 07:43:09 554

原创 Lua5.3 VM 分析(三)表达式运算

Lua5.3 VM 分析(三)表达式运算二元运算+、-、*、%、^、/、//、&、 |、\~、\<\<、>> 这 12 种二元运算 OP_ADD、OP_SUB、OP_MUL、OP_DIV、OP_POW、OP_MOD、OP_IDIV、OP_BAND、OP_BOR、OP_BXOR、OP_SHL、OP_SHR ### vmcase(OP_ADD) { TValu

2017-08-19 07:40:44 776

原创 Lua5.3 VM 分析(二)表处理

Lua5.3 VM 分析(二)表处理luaV_gettableluaV_gettable 函数实现了Table类型的读操作,可能触发元方法。/* ** Main function for table access (invoking metamethods if needed). ** Compute 'val = t[key]' */voidluaV_gettable(lua_State

2017-08-19 07:32:46 315

原创 Lua5.3 VM 分析(一)字节码运行

Lua5.3 VM 分析(一)字节码运行luaV_execute 是Lua VM 执行一段字节码的入口。Lua VM 就是一个状态机,从当前调用栈上次运行点开始解释字节码指令,直到下一个 C 边界跳出点(可以是函数执行完毕,也可以是一次协程 yield 操作)。Lua 函数部分typedef struct CallInfo { StkId func; /* function index in

2017-08-19 07:27:41 876

原创 Lua 5.3 源码分析 (七) 闭包 Closure

Lua 5.3 源码分析 (七) 闭包 Closure概述闭包(Closure)在函数式编程中是一个重要概念,如果说 C+ + 的面向对象编程是把一组函数绑定到特定的数据类型上的话,那么闭包就是把一组数据绑定到特定的函数上。当调用 counter 后,会得到一个函数。这个函数每调用一次,返回值会加一。 我们把这个返回的你们函数记作一个计数器。counter 可以产生多个计数器,每个都独立计算

2017-08-18 11:46:21 804

原创 Lua 5.3 源码分析(六) 字符串 Table

Lua 5.3 源码分析 (六) 表 Tabletypedef union TKey { struct { TValuefields; int next; /* for chaining (offset for next node) */ } nk; TValue tvk;} TKey;/* copy a value into a key without messi

2017-08-18 11:31:26 374

原创 Lua 5.3 源码分析(五)字符串 TString

Lua 5.3 源码分析 (五) 字符串 TStringtypedef struct TString { CommonHeader; lu_byte extra; /* reserved words for short strings; "has hash" for longs */ unsigned int hash; size_t len; /* number of char

2017-08-18 11:20:27 669

原创 Lua 5.3 源码分析(四)线程 lua_State

Lua 5.3 源码分析(四)线程 lua_StateLua 的THREAD 类型定义如下图: /* ** ‘per thread’ state */ struct lua_State { //1 Lua 类型公共头部 CommonHeader; //2 global_State *l_G

2017-08-18 11:16:51 1272

原创 Lua 5.3 源码分析(三) 全局状态机global_State

Lua 5.3 源码分析(三) 全局状态机global_State/*** 'global state', shared by all threads of this state*/typedef struct global_State { //Version const lua_Number *version; /* pointer to version number */

2017-08-18 10:55:55 948

原创 Lua 5.3 源码分析(二)值 TValue

Lua 5.3 源码分析(二)值 TValue抽象数据类型(Abstract Data Type)ADTunion Value { GCObject *gc; /* collectable objects */ void *p; /* light userdata */ int b; /* booleans */ lua_CF

2017-08-18 10:45:13 671

原创 Lua 5.3 源码分析(一)类型系统

Lua 5.3 源码分析(一)类型系统数据类型/*** basic types*/#define LUA_TNONE (-1)#define LUA_TNIL 0#define LUA_TBOOLEAN 1#define LUA_TLIGHTUSERDATA 2#define LUA_TNUMBER 3#define LUA_TSTRI

2017-08-18 10:31:17 1732 1

原创 Lua 5.3 源码分析(十)线程的执行与中断

Lua 5.3 源码分析(十)线程的执行与中断Lua 的程序运行时以线程为单位的。每个Lua 线程可以独立运行直到自行中断,把中断的信息留在状态机中。每条线程的执行互不干扰,可以独立延续之前中断的执行过程。Lua 线程和系统线程无关,所以不会为每条 Lua 线程创建独立的系统堆栈,而是利用自己维护的线程栈,内存开销也就远小于系统线程。Lua 是一门嵌入式语言,和 C 语言混合编程是一种常态。 一旦L

2017-08-18 09:56:57 1112

原创 保护机制(个人理解)

保护机制概述:         保护机制是可靠的多任务运行环境所必须的。它可用于保护各个任务免受相互之间的干扰。在软件开发的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误。当程序对错误内存空间执行一次非期望的引用,保护机制可以阻止这种操作并且报告此类事件。          保护机制可以被用于分段和分页机制。处理器寄存器的2个比特位定义了当前执行程序的特权级,称为当前特权级

2016-09-13 14:19:40 2131

原创 分页机制(个人理解)

1.概述:   分页机制是80X86 内存管理机制的第二部分。它在分段机制的基础上完成了虚拟(逻辑)地址到物理地址转换的过程。分段机制把逻辑地址转换成线性地址,而分页机制则把线性地址转换成物理地址。 分页机制可以用于任何一种分段机制。 处理器分页机制会把线性地址空间(段已经映射到其中)划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页帧( 也叫页框)上。 分页机制几种页面级保护措施,可和

2016-09-01 12:17:00 4483

原创 分段机制(个人理解)

          分段机制可用于实现多种系统设计。这些设计范围从使用分段机制的最小功能来保护程序的平坦模型,到使用分段机制创建一个可同时可靠地运行多个程序(或任务)的具有稳固操作环境的多段模型。         多段模型能够利用分段机制全部功能提供由硬件增强的代码,数据结构,程序和任务的保护措施。通常,每个程序(或任务)都是用自己的段描述符以及自己的段。对程序来说段能够完全是私有的,或者是程...

2016-08-30 14:50:25 3029 2

原创 80x86系统寄存器以及系统指令(个人理解)

 80x86 系统寄存器和系统指令 为了协助处理器执行初始化和控制系统操作,80x86 提供了一个标志寄存器EFLAGS和几个系统寄存器,除了一些通用状态标志外,EFLAGS 中还包含几个系统标志。 这些系统标志用于控制任务切换,中断处理,指令跟踪以及访问权限。 系统寄存器用于内存管理和控制处理器操作, 含有分段和分页处理机制系统表的基地址,控制处理器的比较比特标志位。 标志寄存器:  ...

2016-08-28 20:28:15 3008

原创 工程师的好坏在于怎么提取出有效的需求,去掉不需要解决的问题

工程师的好坏在于怎么提取出有效的需求,去掉不需要解决的问题,大部分厂商雇不起好的工程师来解决问题

2016-07-18 22:27:51 374

原创 lab2 物理内存管理

物理内存管理: 1. 连续内存分配 (地址生成,碎片管理,伙伴系统)      2.非连续内存分配2.1 段式存储管理2.2 页式存储管理2.3快表(TLB)多级页表2.4 段页式存储管理

2016-07-14 09:58:28 510

原创 lab1的实验练习答案

# Lab1 report## [练习1][练习1.1] 操作系统镜像文件 tos.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中每一条相关命令和命令参数的含义,以及说明命令导致的结果)bin/tos.img | 生成tos.img的相关代码为 | (TOSIMG):(TOSIMG): (kernel) (bootblock)|(bootblock) | (

2016-06-28 10:48:30 2187

原创 成为架构师的感悟(个人)

** 当你成长到对前沿或先进技术只保持少量关注时,当你头疼如何高速高质低成本完成任务时,当你后悔需求挖掘深度不够时,当你面对任何代码时都充满敬畏时,架构师职位不远了。因为你还得学会如何用最深入浅出的,或优雅或粗俗的语言,去描述这个最复杂的逻辑将创造最美好的未来,最好让田边老农、朝阳大妈都能明白,都能支持时,不好意思,还没完。 最后,必须加入对工程师背景的我们而言,实在难以

2016-06-23 09:32:52 627

原创 二叉树的链式存储实现

//// BiTree.h// Algorithms&Data_structures//// Created by TTc on 15-2-3.// Copyright (c) 2015年 TTc. All rights reserved.//#ifndef __Algorithms_Data_structures__BiTree__#define __Algorithms_D

2016-05-25 17:06:45 664 1

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