- 博客(43)
- 收藏
- 关注
原创 Tokyo Cabinet TCHDB源码阅读——关于变长变量的高效存取(节约存储空间)
在TC中,很多地方为了节约存储空间,在保存变量时不会直接存放变量类型长度的值(比如4字节或8字节的值)到文件中,它会探测变量用来表示值的有效字节数,然后把这些有意义的字节保存起来,在后面读取该变量时,TC会把该变量的所有有效字节都读出来,从而计算出该变量所表示的值。为了实现这个功能,TC的做法是:把变量的每个字节当成一个有符号数,最高位仅做为符号位使用,前面7位才用来表示真正的值,这样一来,文
2010-05-07 18:14:00
2604
原创 Tokyo Cabinet TCHDB源码阅读——delayed record pool和tchdbputasyncimpl相关函数代码注释
在TCHDB结构中跟异步写操作相关的成员有以下几个: bool async; /* whether asynchronous storing is called */TCXSTR *drpool; /* delayed record pool */TCXSTR *drpdef; /* deferred records of the delayed
2010-05-07 17:03:00
2387
原创 Tokyo Cabinet TCHDB源码阅读——tchdbput及相关函数代码注释
tchdbput用于向数据文件写入一条记录(record),写入的模式有很多种,比如覆盖写(overwrite)、追加写(append)、加一个整数、加一个浮点数或者调用回调函数处理,然后把结果当作记录写入等等,这个函数在执行时是直接写入硬盘中的数据文件的,和它对应有一个异步写入的函数,名为tchdbputasync,此函数暂时把记录放于drp(delayed record pool)中,
2010-04-26 20:54:00
2563
原创 Tokyo Cabinet TCHDB源码阅读——tchdbnew、tchdbopen及相关函数代码
在此说明一下:我分析的TC版本是1.4.43,我的阅读流程主要是遵循对TC数据文件的标准操作流程进行分析,即打开数据文件->存放record->获取record->关闭数据文件,期间会涉及到一些相关函数,我会逐个分析。另外,按我粗浅的理解,我觉得TC不能称为一个完整意义上的数据库,它仅仅是一个存储引擎而已,它的所有操作最终都是针对系统中的一个普通文件进行的,因此以后的分析中,我把TC操
2010-04-24 12:18:00
3204
1
转载 Tokyo Cabinet的TCHDB数据结构
原帖网址:http://www.cppblog.com/converse/archive/2010/01/10/105317.html为了学习key-value数据库,我打算详细阅读Tokyo Cabinet这个存储引擎的源代码,目前网上已有了一些相关的原理分析资料,我转载的这篇文章原名叫《tokyocabinet1.4.19阅读笔记(一)hash数据库概述 》,写得很详细了,我把它贴在这里,
2010-04-24 12:05:00
2734
原创 linux内核地址空间与用户地址空间的差别
本文仅限在i386平台下讨论一般情况。1、用户线性地址空间范围0-3G,内核线性空间范围3G-4G。2、内核总是立即满足内核空间的物理内存分配,并且分配结果对所有进程可见;而对于用户空间的内存分配请求,linux总是先保留用户线性地址空间的一段区域,然后修改页表项使这段线性区域都指向一页内容全为0的全局只读物理页。当进程写入这段线性区域时,将会产生一个缺页异常,这时系统才会为对应的线性地址分配物理
2008-10-29 09:17:00
5548
转载 linux内核空间访问文件系统代码实现
本文代码是从互联网收集而来,我记录下来主要为学习方便,版权归原作者所有。以下代码实现了在linux内核空间打开、读、写文件等相关函数,有兴趣的可以研究一下并在此基础上扩展。 #include #include #include #include #include #include #include /* file I/O in kernel module*/
2008-10-28 17:34:00
4153
原创 分配连续物理内存的原因
在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条:1、DMA不使用页表机制,因此必须分配连续的物理内存。2、使用连续物理内存可以提高系统整体性能。上面第1条很容易理解,我主要说明下第2条: 在分页机制打开的情况下,系统访问内存的典型流程为: 1、根据提供的线性地址访问系统TLB,看是否能够命中(hit)。2、若访问TLB命中(hit),则可以直接得到
2008-10-22 09:31:00
3901
原创 linux虚拟内存管理简要总结
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> 以下讨论仅限i386平台,一般考虑典型情况linux内核对整个系统的物理内存是通过类型为struct page的数组mem_map来管理的。系统中的伙伴系统分配算法最终是通过操作这个数
2008-10-22 09:28:00
7724
2
原创 通过unregister_filesystem()函数学习linux单链表操作
通过unregister_filesystem()函数学习linux单链表操作基础介绍 在linux内核中,每一种注册了的文件系统都由一个类型为file_system_type的结构体来代表,该结构体中含有一个类型为file_system_type*的域next,linux正是通过这个next域把所有注册了的文件系统连接起来的,同时,linux还定义了一个指向链表中第一个元素的全局指针f
2008-10-15 15:14:00
1366
原创 linux启动代码之detect_memory()函数
本篇笔记主要针对平台i386进行讨论,我也是新手,不当之处,敬请指正。以下讨论中“/”代表“/内核源代码根目录/arch/x86/boot/”目录,我用到的内核源代码版本为2.6.26.5。在被bootloader加载到内存后, cpu最初执行的linux内核代码是/header.S文件中的setup函数,这个函数在做了一些准备工作后会跳转到boot目下文件main.c的main函数执行,
2008-10-13 15:34:00
5494
转载 MTTR介绍
原文:http://baike.baidu.com/view/1493498.htmMTRR是Memory Type Range Register的缩写,可翻译为存储区域类型寄存器,它规定了读写某段范围物理内存的策略,用于优化CPU数据传送性能。例如可将MTTR设为在显存的地址范围上使用“write-combining”策略,CPU能够在PCI/AGP总线上,将许多次少量的数据写入集合成一次大
2008-10-10 17:07:00
2255
原创 linux下禁止机箱蜂鸣方法
更改/etc/inputrc文件,找到set bell-style none这一行,把前面注释去掉,但这个只能解决控制台下命令补全或命令出错不发出蜂鸣声,要想完全不发出蜂鸣声,可以用下面的方法:加入xset b off于用户目下的.bashrc文件中。或者setterm -blength 0
2008-09-27 17:18:00
1144
原创 linux内核常用宏学习——BUILD_BUG_ON
/* Force a compilation error if condition is true */#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])如果条件为真则引起一个编译时错误。
2008-09-27 11:30:00
5887
原创 Linux代码阅读之header.S(一)
以下源代码来源于linux2.6.26.5的arch/x86/boot/header.S/* * header.S * * Copyright (C) 1991, 1992 Linus Torvalds * * Based on bootsect.S and setup.S * modified by more people than can be co
2008-09-24 17:07:00
3922
1
转载 one's complement & two's complement
一的补码(ones complement) 指的是:正数=原码,负数=反码 而二的补码(twos complement) 指的就是通常所指的补码
2008-09-24 09:37:00
6707
转载 The Kernel Boot Process
本文系转载,原文地址:http://duartes.org/gustavo/blog/post/kernel-boot-processThe previous post explained how computers boot up right up to the point where the boot loader, after stuffing the kernel image into
2008-09-23 14:44:00
3025
转载 How Computers Boot Up
本文系转载,原文地址:http://duartes.org/gustavo/blog/post/how-computers-boot-upThe previous post described motherboards and the memory map in Intel computers to set the scene for the initial phases of boot. B
2008-09-23 14:35:00
1560
转载 Motherboard Chipsets and the Memory Map
本文系转载,原文地址:http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map I’m going to write a few posts about computer internals with the goal of explaining how modern kernels work. I hope
2008-09-23 10:10:00
2378
3
转载 INT 15h系列介绍
本文系转载,原文地址:http://www.uruk.org/orig-grub/mem64mb.htmlINT 15h, AX=E820h - Query System Address MapReal mode only.This call returns a memory map of all the installed RAM, and of physicalmemo
2008-09-22 16:33:00
10239
2
转载 e820简介
本文系转载,原文地址:http://wangcong.org/blog/?p=320,其中附录部分为本人所加... e820是和BIOS的一个中断相关的,具体说是int 0x15。之所以叫e820是因为在用这个中断时ax必须是0xe820。这个中断的作用是得到系统的内存布局。因为系统内存会有很多段,每段的类型属性也不一样,所以这个查询是“迭代式”的,每次求得一个段。 我们看内核源代
2008-09-22 15:54:00
16560
转载 Linux启动代码分析
本文系转载,原文地址:http://blog.chinaunix.net/u/6071/showart_205152.htmlLinux启动代码分析Kernel: 2.6.10-rc2Finished: 01/01/05/* * Activate the first processor. */asmlinkage void __init start_kernel
2008-09-22 15:00:00
3680
原创 Windows存储设备驱动程序结构简介
Windows存储设备驱动程序结构简介Windows中的存储驱动程序符合“类(Class)/端口(Port)/小端口(Miniport)”结构:microsoft提供一个存储类驱动程序,它实现了对于所有的存储设备都共同的功能;microsoft也提供了一个存储端口驱动程序,它实现了对于特定总线而言共同的功能;OEM厂商提供小端口驱动程序,它们插入到端口驱动程序中,将windows与特定的实现连
2008-09-22 08:58:00
3307
原创 Linux虚拟内存组织结构浅析(二)
Linux虚拟内存组织结构浅析(二)在前一篇文章中我们介绍了Linux虚拟内存在逻辑上的组织结构,现在就让我们从源代码入手,从程序级仔细看看各个数据结构体的内部组成如何,源代码来自于最新的kernel2.6.26.5,分析过程中主要参考了《Understanding the linux virtual memory》这本书,有兴趣的朋友可以去阅读一下。 一、节点的数据表示在内核中,
2008-09-21 17:19:00
4163
原创 Linux虚拟内存组织结构浅析(一)
众所周知,linux内核支持绝大多数体系结构,因此linux内核必须采取一种与具体体系结构无关的方法来描述物理内存的组织结构,这个问题就是本系列文章要讨论的话题。 要理解linux虚拟内存在逻辑上的组织结构,我们首先要明白两个概念:UMA(Uniform Memory Access)、NUMA(Non Uniform Memory Access)。UMA指一致性内存访问,这是单CPU机器常
2008-09-20 10:48:00
4856
转载 C语言编译过程
编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件1.编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理伪指令主要
2008-09-18 17:24:00
1204
2
转载 Pageable kernel-mode drivers
Pageable kernel-mode driversBy default, the kernel loader will load all driver executables and any global data that you may have defined in your driver into nonpaged memory. Therefore, if you want y
2008-09-18 09:08:00
1143
原创 Windows DDK中经典的宏——CONTAINING_RECORD
在windows ddk中提供了一个经典的宏,其定义如下:#define CONTAININT_RECORD(address, type, field) / ((type*)((PCHAR)(address) - (PCHAR)(&((type*)0)->field)))这个宏用于取得内存中任何结构体的首地址,要提供的参数是:结构体中某个成员(field)的地址addres
2008-09-17 20:47:00
5974
1
翻译 卷的挂载过程
卷的挂载过程原文:The volume mount process is typically triggered by a request to open a file on a logical volume (that is, a partition or dynamic volume) as follows: A user application calls CreateFil
2008-09-17 18:43:00
2200
1
原创 CreateFile打开文件执行流程浅析
CreateFile打开文件的执行流程浅析 分析CreateFile这个函数打开文件的执行流程有助于我们理解windows操作系统在接收到用户打开文件请求后都会做哪些工作、它是如何找到驱动程序的、以及有哪些windows核心部件参与了打开文件的操作,这对我们开发windows驱动程序十分有益。下面我们以CreateFile打开文件C:/MYFILE.CPP来浅析这一过程,系统对象参考图例
2008-09-17 18:35:00
6021
1
翻译 Timing of File Operations In WDM driver
原文:You’ll be likely to want to read a disk file in a WDM driver while you’re initializing your device in response to an IRP_MN_START_DEVICE request. Depending on where your device falls in the initi
2008-09-12 10:03:00
998
转载 利用IoBuildDeviceIoControlRequest构造irp获得存储设备总线类型源代码
本代码演示用IoBuildDeviceIoControlRequest向下层存储设备的DeviceObject发送一个代码为IOCTL_STORAGE_QUERY_PROPERTY的IRP_MJ_DEVICE_IO_CONTROL的Irp获取到存储设备所在的总线类型。此代码来源于互联网,所有权归原作者所有。ULONG GetStorageDeviceBusType(IN PDEVIC
2008-09-08 16:29:00
5577
原创 重要函数学习:IoBuildDeviceIoControlRequest
重要函数学习:IoBuildDeviceIoControlRequest这个函数主要用来构造一个用于设备i/o控制请求的irp包,该irp包将被同步处理,其原型如下: 参数解释: IoControlCode 提供i/o控制请求所需的i/o控制码。这个i/o控制码可以在msdn中查询到。 DeviceObj
2008-09-08 15:53:00
6940
原创 利用ddk自带的工具build.exe编译windows驱动
1、在开始菜单中选择合适的Build Environments(选择的Build Environment一定要和编译好的驱动运行的平台相同),这一步就会在打开的cmd窗口中设置好环境变量。2、从DDK示例源代码目录拷贝makefile文件到你的驱动源文件目录中,并建立sources文件(可根据msdn帮助文件中的sources模板文件修改),其中makefile文件模板一般不用修改,修改sourc
2008-08-30 11:36:00
3071
原创 Windows驱动程序运行上下文简要分析
Windows驱动程序运行上下文简要分析 Windows驱动程序在内核态执行,作为驱动开发人员,我们有必要对驱动程序的执行环境有所了解,这将有助于我们正确合理地使用系统资源,从而避免产生一些难以检测的bug。 总体来说,windows驱动程序运行的上下文环境有如下四类:1、 请求系统服务线程的上下文在这种情况下,驱动程序直接在请求系统服务的那个线程上
2008-07-31 10:51:00
2536
转载 Windows 文件过滤驱动经验总结
原文地址:http://bbs.driverdevelop.com/htm_data/39/0701/98728.html 看了 ChuKuangRen 的第二版《文件过滤驱动开发教程》后,颇有感触。我想,交流都是建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少?只知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己。发自己心得的人无非是两种目的,一是引发一些讨
2008-07-30 09:06:00
1126
转载 USB存储设备单向控制的研究与实现
原文地址:http://www.ahcit.com/lanmuyd.asp?id=2170USB存储设备单向控制的研究与实现1 引言 计算机和计算机网络已经成为企业、政府和其它各种组织的重要信息载体和传输渠道,但是在享受计算机以及计算机网络所带来方便性的同时,信息安全也成为目前受到广泛关注的问题。美国联邦调查局(FBI)和计算机安全机构(CSI)等权威机构的研究证明了:超过80
2008-07-28 14:30:00
1585
转载 gcc inline
Inlining of functions is an optimization and it really “works” only in optimizing compilation. If you dont use -O, no function is really inline. 一个函数的inlining是一种优化,而它只会"work"在有优化选项的编译中。如果你没有(在
2008-07-28 14:21:00
2125
原创 c语言中的static和extern关键字总结
1、 概念基础:局部变量:函数内部定义的变量(包括定义在函数内部复合语句中的变量)。全局变量:定义在函数外部的变量。作用域:任何标识符(包括变量、函数名、符号常量及新的数据名)都有它的作用范围,此范围称为该标识符的作用域。比如符号常量的作用域是从定义符号常量的地方开始到包含这个#define命令(作用于该符号常量)的文件末尾或者遇到#undef命令(作用于该符号常量)为止。
2008-07-28 14:14:00
1713
原创 关于kmalloc、vmalloc及kmap
1、 kmalloc()是内核中最常见的内存分配方式,它最终调用伙伴系统的__get_free_pages()函数分配,根据传递给这个函数的flags参数,决定这个函数的分配适合什么场合,如果标志是GFP_KERNEL则仅仅可以用于进程上下文中,如果标志GFP_ATOMIC则可以用于中断上下文或者持有锁的代码段中。kmalloc返回的线形地址是直接映射的,而且用连续物理页满足分配请求,
2008-07-28 12:00:00
25194
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人