Btrfs关键代码解析

Btrfs关键代码解析
Btrfs关键代码解析

第四章Btrfs关键代码解析

4.1 Tree of root tree介绍

为了管理所有的树,btrfs采用Tree of tree root来保存所有树的根节点,(super_block->s_fs_info = tree_root(structbtrfs_root), tree_root->fs_info = fs_info(structbtrfs_fs_info)),也就是btrfs_fs_info结构,其定义为:fs/btrfs/ctree.h

802 structbtrfs_fs_info {

803 u8 fsid[BTRFS_FSID_SIZE];

804 u8 chunk_tree_uuid[BTRFS_UUID_SIZE];

805 structbtrfs_root *extent_root;

806 structbtrfs_root *tree_root;

807 structbtrfs_root *chunk_root;

808 structbtrfs_root *dev_root;

809 structbtrfs_root *fs_root;

810 structbtrfs_root *csum_root;

图Tree of root tree

超级块记录着一个分区的整体信息,Btrfs磁盘super_block结构用btrfs_super_block来描述。

//磁盘中的super block

u8csum[BTRFS_CSUM_SIZE];

/* the first 4 fields must match structbtrfs_header */

u8fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */

__le64 bytenr; /* this block number */

__le64 flags;

/* allowed to be different from the btrfs_header from here own down */

__le64 magic;

__le64 generation;

__le64 root; #root树的根节点位置

__le64 chunk_root; #chunk树的根节点位置

__le64 log_root; #log数的根节点位置

FS Tree 管理文件相关的元数据,如inode,dir等;Chunk tree管理设备,每一个磁盘设备都在Chunk Tree中有一个item;Extent Tree管理磁盘空间分配,btrfs每分配一段磁盘空间,便将该磁盘空间的信息插入到Extent tree。查询Extent Tree将得到空闲的磁盘空间信息;checksum Tree 保存数据块的校验和;Tree of tree root保存很多BTree的根节点。比如用户每建立一个快照,btrfs便会创建一个FS Tree。

4.2 Btrfs基本结构

btrfs使用b+树数据结构,树的内部节点和页节点使用3种数据类型:btrfs_header, btrfs_disk_key, btrfs_item. 每个节点都是一个extent, 内部节点和页节点大小可以不一样. 每个节点都以btrfs_header开头,内部节点就是{key,value}数组,key是btrfs_disk_key, value就是指针,逻辑磁盘位置. 页节点同样包括相通的key,value,不过位置是key一块,value一块..而且key是btrfs_item。

图btrfs基本结构

其中btrfs_header结构体为:

u8 csum[32]; # extent的校验码

u8 fsid[16]; #文件系统的uuid

__le64 blocknr; #此节点的逻辑磁盘位置

__le64 flags; #

u8 chunk_tree_uid[16]; #chunk tree的uuid,可能是dev的uuid

__le64 generation; #transaction id

__le64 owner; # 节点有多个父节点

__le32 nritems; #

u8 level; # 在树中的层数,0表示leaf

btrfs_disk_key结构体为:

#对于不同的树结构,这3个成员有不同的意义,反正他们代表一个节点的key __le64 objectid;

u8 type;

__le64 offset;

btrfs_item结构体为:

#叶子节点使用的(key, item) item可能是具体的数据结构,可能是无结构数据.. structbtrfs_disk_key key;

__le32 offset;

__le32 size;

4.3 btrfs_fill_super介绍

在文件系统加载时,其中重中之重的函数是btrfs_fill_super,顾名思义主要用于填充superblock数据结构。这个函数脉络非常清晰,主要做了如下工作:

1. 填充superblock的数据成员,比如:sb->s_magic = BTRFS_SUPER_MAGIC;

2. 填充superblock的操作函数,比如:sb->s_op = &btrfs_super_ops;

3. 用函数open_ctree创建树形结构,然后把树根填入超级块的文件系统私有信息中,如下:

tree_root = open_ctree(sb, f s_devices, (char *)data);

sb->s_fs_inf o = tree_root;

4. 用btrfs_iget拿到inode,d_alloc_root拿到dentry作为

5. 构造出根目录数据结构,并填入超级块。

inode = btrfs_iget(sb, &key, tree_root->f s_inf o->f s_root, NULL);

root_dentry = d_alloc_root(inode);

sb->s_root = root_dentry;

open_ctree是其中最复杂的函数,利用磁盘上超级块中存储的信息和我们前面介绍的数据结构,建立了一整套btrfs使用的树形数据结构填充在超级块中,如图:

图btrfs文件创建过程

到此为止,我们构建了一个btrfs的超级块,其中包含:

1. btrf s所要使用的一整套树形结构。

2. btrf s超级块中的操作函数。

3. 创建了一个根目录。

这样操作系统内核想要使用和控制btrfs,通过btrfs的超级块就可以了。通过这个函数的运行流程,可以看出Btrfs文件系统创建文件的一个流程

Nginx源代码解析

Nginx源代码解析 1.Nginx代码的目录和结构 nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明: ├─auto 自动编译安装相关目录 │├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等 │├─lib 程序依赖的各种库,包括md5,openssl,pcre等 │├─os 针对不同操作系统所做的编译配置目录 │└─types ├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等 ├─contrib ├─html index.html └─src 源码目录 ├─core 核心源码目录,包括定义常用数据结构、体系结构实现等 ├─event 封装的事件系统源码目录 ├─http http服务器实现目录 ├─mail 邮件代码服务器实现目录 ├─misc 该目录当前版本只包含google perftools包 └─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。2.基本数据结构 2.1.简单的数据类型 在core/ngx_config.h 目录里面定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型。 typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t; 其中ngx_int_t,nginx_flag_t,都映射为intptr_t;ngx_uint_t映射为uintptr_t。 这两个类型在/usr/include/stdint.h的定义为: /* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

Linux操作系统源代码详细分析

linux源代码分析:Linux操作系统源代码详细分析 疯狂代码 https://www.360docs.net/doc/126466783.html,/ ?:http:/https://www.360docs.net/doc/126466783.html,/Linux/Article28378.html 内容介绍: Linux 拥有现代操作系统所有功能如真正抢先式多任务处理、支持多用户内存保护虚拟内存支持SMP、UP符合POSIX标准联网、图形用户接口和桌面环境具有快速性、稳定性等特点本书通过分析Linux内核源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新 第部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 /asm-generic/smplock.h 107 /asm-i386/atomic.h 108 /asm- i386/current.h 109 /asm-i386/dma.h 109 /asm-i386/elf.h 113 /asm-i386/hardirq.h 114 /asm- i386/page.h 114 /asm-i386/pgtable.h 115 /asm-i386/ptrace.h 122 /asm-i386/semaphore.h 123 /asm-i386/shmparam.h 124 /asm-i386/sigcontext.h 125 /asm-i386/siginfo.h 125 /asm-i386/signal.h 127 /asm-i386/smp.h 130 /asm-i386/softirq.h 132 /asm-i386/spinlock.h 133 /asm-i386/system.h 137 /asm-i386/uaccess.h 139 //binfmts.h 146 //capability.h 147 /linux/elf.h 150 /linux/elfcore.h 156 /linux/errupt.h 157 /linux/kernel.h 158 /linux/kernel_stat.h 159 /linux/limits.h 160 /linux/mm.h 160 /linux/module.h 164 /linux/msg.h 168 /linux/personality.h 169 /linux/reboot.h 169 /linux/resource.h 170 /linux/sched.h 171 /linux/sem.h 179 /linux/shm.h 180 /linux/signal.h 181 /linux/slab.h 184 /linux/smp.h 184 /linux/smp_lock.h 185 /linux/swap.h 185 /linux/swapctl.h 187 /linux/sysctl.h 188 /linux/tasks.h 194 /linux/time.h 194 /linux/timer.h 195 /linux/times.h 196 /linux/tqueue.h 196 /linux/wait.h 198 init/.c 198 init/version.c 212 ipc/msg.c 213 ipc/sem.c 218 ipc/shm.c 227 ipc/util.c 236 kernel/capability.c 237 kernel/dma.c 240 kernel/exec_do.c 241 kernel/exit.c 242 kernel/fork.c 248 kernel/info.c 255 kernel/itimer.c 255 kernel/kmod.c 257 kernel/module.c 259 kernel/panic.c 270 kernel/prk.c 271 kernel/sched.c 275 kernel/signal.c 295 kernel/softirq.c 307 kernel/sys.c 307 kernel/sysctl.c 318 kernel/time.c 330 mm/memory.c 335 mm/mlock.c 345 mm/mmap.c 348 mm/mprotect.c 358 mm/mremap.c 361 mm/page_alloc.c 363 mm/page_io.c 368 mm/slab.c 372 mm/swap.c 394 mm/swap_state.c 395 mm/swapfile.c 398 mm/vmalloc.c 406 mm/vmscan.c 409

mysql源代码分析

Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍。 BUILD 这个目录在本系列的上篇文章中我们仔细看过,内含各种平台的编译脚本,这里就不仔细说了。 client 这个目录下有如下比较让人眼熟的文件: , , , ,等等,如果你编译一下就会发现那些眼熟的程序也出现了,比如mysql。明白了吧,这个目录就是那些客户端程序所在的目录。这个目录的内容也比较少,而且也不是我们阅读的重点。 Docs 这个目录包含了文档。 storage 这个目录包含了所谓的Mysql存储引擎(storage engine)。存储引擎是数据库系统的核心,封装了数据库文件的操作,是数据库系统是否强大最重要的因素。Mysql实现了一个抽象接口层,叫做handler(sql/,其中定义了接口函数,比如:ha_open, ha_index_end, ha_create等等,存储引擎需要实现这些接口才能被系统使用。这个接口定义超级复杂,有900多行:-(,不过我们暂时知道它是干什么的就好了,没必要深究每行代码。对于具体每种引擎的特点,我推荐大家去看mysql的在线文档:

应该能看到如下的目录: * innobase, innodb的目录,当前最流行的存储引擎 * myisam, 最早的Mysql存储引擎,一直到innodb出现以前,使用最广的引擎。 * heap, 基于内存的存储引擎 * federated, 一个比较新的存储引擎 * example, csv,这几个大家可以作为自己写存储引擎时的参考实现,比较容易读懂 mysys 包含了对于系统调用的封装,用以方便实现跨平台。大家看看文件名就大概知道是什么情况了。 sql 这个目录是另外一个大块头,你应该会看到,没错,这里就是数据库主程序mysqld所在的地方。大部分的系统流程都发生在这里。你还能看到, , ,等等,分别实现了对应的SQL命令。后面我们还要经常提到这个目录下的文件。 大概有如下及部分: SQL解析器代码: , , , 等,实现了对SQL语句的解析操作。

如何看懂源代码--(分析源代码方法)

如何看懂源代码--(分析源代码方法) 4 推 荐 由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪,可是这个速度本人表示非常不满意,先去找了下资 料, 觉得不错... 摘自(繁体中文 Traditional Chinese):http://203.208.39.132/translate_c?hl=zh-CN&sl=en&tl=zh-CN&u=http://ww https://www.360docs.net/doc/126466783.html,/itadm/article.php%3Fc%3D47717&prev=hp&rurl=https://www.360docs.net/doc/126466783.html,&usg=AL kJrhh4NPO-l6S3OZZlc5hOcEQGQ0nwKA 下文为经过Google翻译过的简体中文版: 我们在写程式时,有不少时间都是在看别人的代码。 例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,就会“噜看噜苦(台语)”不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限的时间下,不免会对庞大的源代码解读感到压力。网路上有一篇关于分析看代码的方法,做为程式设计师的您,不妨参考看看,换个角度来分析。也能更有效率的解读你想要的程式码片段。 六个章节: ( 1 )读懂程式码,使心法皆为我所用。( 2 )摸清架构,便可轻松掌握全貌。( 3 )优质工具在手,读懂程式非难事。( 4 )望文生义,进而推敲组件的作用。( 5 )找到程式入口,再由上而下抽丝剥茧。( 6 )阅读的乐趣,透过程式码认识作者。 程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。 对大多数的程式人来说,撰写程式码或许是令人开心的一件事情,但我相信,有更多人视阅读他人所写成的程式码为畏途。许多人宁可自己重新写过一遍程式码,也不愿意接收别人的程式码,进而修正错误,维护它们,甚至加强功能。 这其中的关键究竟在何处呢?若是一语道破,其实也很简单,程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。这是来自于人类内心深处对于陌生事物的原始恐惧。 读懂别人写的程式码,让你收获满满 不过,基于许多现实的原因,程式人时常受迫要去接收别人的程式码。例如,同事离职了,必须接手他遗留下来的工作,也有可能你是刚进部门的菜鸟,而同事经验值够了,升级了,风水轮流转,一代菜鸟换菜鸟。甚至,你的公司所承接的专案,必须接手或是整合客户前一个厂商所遗留下来的系统,你们手上只有那套系统的原始码(运气好时,还有数量不等的文件)。 诸如此类的故事,其实时常在程式人身边或身上持续上演着。许多程式人都将接手他人的程式码,当做一件悲惨的事情。每个人都不想接手别人所撰写的程式码,因为不想花时间去探索,宁可将生产力花在产生新的程式码,而不是耗费在了解这些程式码上。

Redis源代码分析

Redis源代码分析 一直有打算写篇关于redis源代码分析的文章,一直很忙,还好最近公司终于闲了一点,总算有点时间学习了,于是终于可以兑现承诺了,废话就到此吧,开始我们的源代码分析,在文章的开头我们把所有服务端文件列出来,并且标示出其作用: adlist.c //双向链表 ae.c //事件驱动 ae_epoll.c //epoll接口, linux用 ae_kqueue.c //kqueue接口, freebsd用 ae_select.c //select接口, windows用 anet.c //网络处理 aof.c //处理AOF文件 config.c //配置文件解析 db.c //DB处理 dict.c //hash表 intset.c //转换为数字类型数据 multi.c //事务,多条命令一起打包处理 networking.c //读取、解析和处理客户端命令 object.c //各种对像的创建与销毁,string、list、set、zset、hash rdb.c //redis数据文件处理 redis.c //程序主要文件 replication.c //数据同步master-slave sds.c //字符串处理 sort.c //用于list、set、zset排序 t_hash.c //hash类型处理 t_list.c //list类型处理 t_set.c //set类型处理 t_string.c //string类型处理 t_zset.c //zset类型处理 ziplist.c //节省内存方式的list处理 zipmap.c //节省内存方式的hash处理 zmalloc.c //内存管理 上面基本是redis最主要的处理文件,部分没有列出来,如VM之类的,就不在这里讲了。 首先我们来回顾一下redis的一些基本知识: 1、redis有N个DB(默认为16个DB),并且每个db有一个hash表负责存放key,同一个DB不能有相同的KEY,但是不同的DB可以相同的KEY;

Hadoop源代码分析(完整版)

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。 GoogleCluster: https://www.360docs.net/doc/126466783.html,/archive/googlecluster.html Chubby:https://www.360docs.net/doc/126466783.html,/papers/chubby.html GFS:https://www.360docs.net/doc/126466783.html,/papers/gfs.html BigTable:https://www.360docs.net/doc/126466783.html,/papers/bigtable.html MapReduce:https://www.360docs.net/doc/126466783.html,/papers/mapreduce.html 很快,Apache上就出现了一个类似的解决方案,目前它们都属于Apache的Hadoop项目,对应的分别是: Chubby-->ZooKeeper GFS-->HDFS BigTable-->HBase MapReduce-->Hadoop 目前,基于类似思想的Open Source项目还很多,如Facebook用于用户分析的Hive。 HDFS作为一个分布式文件系统,是所有这些项目的基础。分析好HDFS,有利于了解其他系统。由于Hadoop的HDFS和MapReduce 是同一个项目,我们就把他们放在一块,进行分析。 下图是MapReduce整个项目的顶层包图和他们的依赖关系。Hadoop包之间的依赖关系比较复杂,原因是HDFS提供了一个分布式文件系统,该系统提供API,可以屏蔽本地文件系统和分布式文件系统,甚至象Amazon S3这样的在线存储系统。这就造成了分布式文件系统的实现,或者是分布式文件系统的底层的实现,依赖于某些貌似高层的功能。功能的相互引用,造成了蜘蛛网型的依赖关系。一个典型的例子就是包conf,conf用于读取系统配置,它依赖于fs,主要是读取配置文件的时候,需要使用文件系统,而部分的文件系统的功能,在包fs中被抽象了。 Hadoop的关键部分集中于图中蓝色部分,这也是我们考察的重点。

算法设计与分析(详细解析(含源代码)

常用算法设计方法 要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。 算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。 通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。 算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。 一、迭代法 迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0; (2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0; (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为: 【算法】迭代法求方程的根 { x0=初始近似根; do { x1=x0; x0=g(x1);/*按特定的方程计算新的近似根*/ } while ( fabs(x0-x1)>Epsilon);

扫雷项目源代码详解

主函数所在处 package saolei.frame; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import saolei.tools.Tools; import saolei.menubar.Mymenubar; import saolei.panel.MybompPanel; import saolei.panel.MyfacePanel; public class MymineFrame extends JFrame{ private Mymenubar mymenubar;//菜单栏 private MyfacePanel myfacePanel;//笑脸lable private MybompPanel mybompPanel;//雷面板 private JPanel jPanel;//主面板用来装笑脸面板和雷面板 public Mymenubar getMymenubar() { return mymenubar; } public void setMymenubar(Mymenubar mymenubar) { this.mymenubar = mymenubar; } public MyfacePanel getMyfacePanel() { return myfacePanel; } public void setMyfacePanel(MyfacePanel myfacePanel) { this.myfacePanel = myfacePanel; } public MybompPanel getMybompPanel() { return mybompPanel; } public void setMybompPanel(MybompPanel mybompPanel) { this.mybompPanel = mybompPanel; } public MymineFrame(String s) { super(s);

Discuz!源代码分析

Discuz!源代码分析系列(1)--./include/common.inc.php 第一个文件当然是分析./include/common.inc.php这个文件,这个是Discuz的核心中的核心,基本上每次操作都include到了这个文件,下面就分七段来分析这个文件: Section One://定义PHP一些环境 error_reporting(0); //关闭所有错误提示信息,避免把错误信息泄露给用户。 set_magic_quotes_runtime(0); //关闭magic_quotes_runtime; 参见get_magic_quotes_runtime(), magic_quotes_runtime, magic_quote_gpc. //设置Discuz开始的时间 $mtime = explode(' ', microtime()); $discuz_starttime = $mtime[1] + $mtime[0]; //定义一些常量 define('SYS_DEBUG', FALSE); define('IN_DISCUZ', TRUE); define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7)); //获得绝对目录 //兼容4.1.0以下版本 if(PHP_VERSION < '4.1.0') { $_GET = &$HTTP_GET_V ARS; $_POST = &$HTTP_POST_V ARS; $_COOKIE = &$HTTP_COOKIE_V ARS; $_SERVER = &$HTTP_SERVER_V ARS; $_ENV = &$HTTP_ENV_V ARS; $_FILES = &$HTTP_POST_FILES; } 这一段基本上就是设置一下错误报告,把magic_quotes这个sick家伙给关了,然后定一个开始的时间,这样我们在论坛底部看到的Process Time就是通过这个开始的时间和一个结束的时间的差来计算的,然后定义一个IN_DISCUZ为真,这个IN_DISCUZ常量的作用就是在其他inc这样的包含文件中防止被非法引用,一旦没有这个常量的话就出现Access Denied 这样的字样然后退出。然后获得Discuz运行的绝对目录。接下来是判断PHP 的版本是4.1 以下还是以上,因为PHP以4.1为一个分界线,在4.1以下以$HTTP_GET_V ARS[‘xx’]这样的方式来得到get过来的值,而以后用$_GET来得到get过来的值,这样做的目的是为了无论是什么样的PHP版本,都能用$_GET这样的方式得到,有通用性~!

caffe源代码解析

caffe源码简单解析——Blob(1) November 26, 2014 caffe, 源码阅读, blob 使用caffe也有一段时间了,但更多是使用Python的接口,使用现有的ImageNet 训练好的模型进行图片分类。为了更好的了解caffe这个框架,也为了提高自己的水平,在对卷积神经网络有了一些研究之后,终于开始研读caffe的源码了,今天看了Blob类的一些内容,做个总结。 看过caffe官方文档的话,应该会知道,它可以分为三层:Blob、Layer、Net。Blob是一个四维的数组,用于存储数据,包括输入数据、输出数据、权值等等;Layer层则是神经网络中具体的各层结构,主要是计算的作用,在根据配置文件初始化结构后,前向计算结果,反向更新参数,都是它要做的,而它的输入和输出都是Blob数据;Net的话,就是多个Layer组合而成的有向无环图结构,也就是具体的网络了。Layer和Net的代码有待深入,尤其是Layer的代码,caffe 实现了差不多40种不同的Layer层,里面有不同的激活函数,这个要好好研究下。 Blob源码解析 #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" 从blob.hpp包含的四个头文件入手,其中caffe.pb.h是google protocol buffer 根据caffe.proto自动生成的,可以到src/caffe/proto/caffe.proto里看下caffe里面用到的各个数据的定义,比如BlobProto,Datum,NetParameter等。使用这个protocol buffer看起来确实方便,一方面可以用文本文件定义结构化的数据类型,另一方面可以生成查询效率更高、占空间更小的二进制文件,具体的教程可以看看这里。 在caffe/common.hpp,主要singleton化Caffe类,并封装了boost和CUDA随机数生成的函数,提供了统一的接口。而在caffe/syncedmem.hpp中,定义了以下的接口: inlinevoid CaffeMallocHost(void** ptr, size_t size) inlinevoid CaffeFreeHost(void* ptr) 主要是分配内存和释放内存的。而class SyncedMemory定义了内存分配管理和CPU与GPU之间同步的函数,也没啥特别的。 比较重要的是caffe/util/math_functions.hpp,这里面封装了很多cblas矩阵运算,真是密密麻麻,看的我眼花缭乱、如痴如醉。比如:

Linux内核源代码解读

Linux内核源代码解读!! 悬赏分:5 - 提问时间2007-1-24 16:28 问题为何被关闭 赵炯书中,Bootsect代码中有 mov ax , #BOOTSEG 等 我曾自学过80x86汇编,没有见过#的用法,在这为什么要用#? 另外, JMPI 的用法是什么?与JMP的区别是什么? 提问者: Linux探索者 - 一级 答复共 1 条 检举 系统初始化程序 boot.s 的分析 [转] 系统初始化程序 boot.s 的分析: 阚志刚,2000/03/20下午,在前人的基础之上进行整理完善 ******************************************************************************** ************** boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there. 当PC 机启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入0x7C00(31K;0111,1100,0000,0000),并开始执行此处的代码。这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自己装入到绝对地址0x90000(576K; 1001,0000,0000,0000,0000),再将其后的2k字节装入到地址0x90200(576.5k;1001,0000,0010,0000,0000)处,最后将核心的其余部分装入到0x10000(64k; 1,0000,0000,0000,0000). It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in it's own tables, and enable interrupts as needed. 然后,关掉所有中断,把系统下移到0x0000(0k;0000,0000,0000,0000,0000)处,改变到保护模式,然后开始系统的运行.系统必须重新在保护模式下初始化自己的系统表格,并且打开所需的中断. NOTE 1! currently system is at most 8*65536(8*64k=512k; 1000,0000,0000,0000,0000) bytes long. This should be no problem, even in the future. I want to keep it simple. This 512 kB kernel size should be enough - in fact more would mean we'd have to move not just these start-up routines, but also do something about the cache-memory

Nginx源代码分析

Nginx源代码分析 1.Nginx代码的目录和结构 nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明: ├─auto 自动编译安装相关目录 │├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等 │├─lib 程序依赖的各种库,包括md5,openssl,pcre等 │├─os 针对不同操作系统所做的编译配置目录 │└─types ├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等 ├─contrib ├─html index.html └─src 源码目录 ├─core 核心源码目录,包括定义常用数据结构、体系结构实现等 ├─event 封装的事件系统源码目录 ├─http http服务器实现目录 ├─mail 邮件代码服务器实现目录 ├─misc 该目录当前版本只包含google perftools包 └─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。2.基本数据结构 2.1.简单的数据类型 在core/ngx_config.h 目录里面定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型。 typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t; 其中ngx_int_t,nginx_flag_t,都映射为intptr_t;ngx_uint_t映射为uintptr_t。 这两个类型在/usr/include/stdint.h的定义为: /* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined

java版WorldWind源代码解析之一

Java版WorldWind源代码学习笔记该文档编写者系数学系毕业且未满一年工作经验的职场新人,java知识有限,对于新事物Worldwind刚接触不久,总结一下。不足之处,希望得到各位大师的指点。 刚开始,我看了一些WorldWind的相关简介,感觉从整体上给了WorldWind非常好的框架感,所以我将它拷贝了过来。之后,我们的研究就从大的框架转到细节去。毕竟,“研究”不只是看大的框架,还要将细节进行分析。我作为一个新手,对此也非常陌生,那么,就让我们一起来学习吧。不足之处请见谅。 首先,我们贴出官网上给出的WorldWind的源代码结构如下 ?gov.nasa.worldwind顶级包 ?gov.nasa.worldwind.awt 用于awt的组件 ?gov.nasa.worldwind.formats.gpx GPS轨道格式 ?gov.nasa.worldwind.formats.nmea GPS轨道格式 ?gov.nasa.worldwind.geom 几何与数学类 ?gov.nasa.worldwind.globes 地球、火星等星球的实现 ?https://www.360docs.net/doc/126466783.html,yers图层 ?https://www.360docs.net/doc/126466783.html,yers.Earth专用于地球的图层 WorldWindow和View接口 以下是WorldWindow接口: ?set/getModel(Model)

?set/getView(View) ?getSceneController(...) ?pick(java.awt.Point) ?set/getInputHandler(...) 以下监听器: ?PositionListener ?SelectListener ?RenderingListener ?repaint() View 接口: ?Fields ?Position, direction, field of view, altitude, heading, pitch, roll, ?Actions o apply() o goto(lat/lon/elev/altitude) o project(Point 3Dpoint) ?Compute

Linux 源代码分析

Linux内核(2.6.13.2)源代码分析 苗彦超 摘要: 1系统启动 1.1汇编代码head.S及以前 设置CPU状态初值,创建进程0,建立进程堆栈: movq init_rsp(%rip), %rsp,init_rsp定义 .globl init_rsp init_rsp: .quad init_thread_union+THREAD_SIZE-8 即将虚地址init_thread_union+THREAD_SIZE-8作为当前进程(进程0)核心空间堆栈栈底,init_thread_union定义于文件arch/x86_64/kernel/init_task.c中: union thread_union init_thread_union __attribute__((__section__(".data.init_task"))) = {INIT_THREAD_INFO(init_task)}; INIT_THREAD_INFO定义于文件include/asm-x86_64/thread_info.h中,初始化init_thread_union.task = &init_task,init_task同样定义于文件init_task.c中,初始化为: struct task_struct init_task = INIT_TASK(init_task); INIT_TASK宏在include/linux/init_task.h中定义。 全部利用编译时静态设置的初值,将进程0的控制结构设置完成,使进程0可以按普通核心进程访问。 init_task.mm = NULL; init_task.active_mm = INIT_MM(init_mm), init_https://www.360docs.net/doc/126466783.html,m = “swapper” INIT_MM将init_mm.pgd初始化为swapper_pg_dir,即init_level4_pgt,定义与head.S中。进程0的名称为swapper。 利用下述汇编代码跳转到C函数执行: movl %esi, %edi// 传递函数参数 movq initial_code(%rip),%rax jmp *%rax initial_code: .quad x86_64_start_kernel 开始执行文件arch/x86_64/kernel/head64.c中的C函数x86_64_start_kernel(char * real_mode_data),1.2函数x86_64_start_kernel(char * real_mode_data) 1设置全部中断向量初始入口为early_idt_handler,加载中断描述符idt_descr 2clear_bss():BSS段清0 3pda_init(0):设置处理器0相关信息(processor datastructure area ?),重置CR3为init_level4_pgt 4copy_bootdata:复制BIOS启动参数到操作系统变量x86_boot_params中,再复制启动命令行参数由x86_boot_params到saved_command_line中,用printk显示saved_command_line,从此不再 与实模式数据打交道 5cpu_set:设置CPU 0 开始工作标志 6处理“earlyprintk=”、“numa”、“disableapic”等命令行参数 7setup_boot_cpu_data():设置CPU信息结构boot_cpu_data,使用cpuid指令

传奇源码分析

传奇源码分析 中龙技术论坛https://www.360docs.net/doc/126466783.html, 2012年8月15号般若收录 2010年01月30日星期六下午 11:02 简述: 最近对高性能的服务器比较感兴趣,读过了DELPHI的Socker源码WebService及RemObject之后,高性能的服务器感兴趣。 你可能需要的以下知识才能更好的读懂一个商业源码: 1).SOCKET的I/O模型熟悉掌握。 2).面向对象技术的熟悉掌握。 3).Socket的API掌握。 4).多线程技术等。 5).一门熟悉的开发工具掌握,和多种语言的源码阅读能力。 我下的源码 LegendOfMir2_Server:共包含AdminCmd, DBSrv, GameGate, GameSvr,LoginGate, LoginSvr, SelGate七个工程文件。传奇的客户端源代码有两个工程,WindHorn和Mir2Ex。 我分析的, 主要是VC SQL版本的, DELPHI翎风源码不做分析, 另外下载了乐都WIL编辑器和乐都MPA地图编辑器这些工具. 传奇源码分析-客户端(WindHorn简述和传奇文件格式分析) DirectX类库分析(WindHorn): 1. RegHandler.cpp 注册表访问(读写)。 2. CWHApp派生CWHWindow,CWHWindow完成窗口的注册和创建。CWHWindow 派生出CWHDXGraphicWindow,CWHDXGraphicWindow调用CWHWindow完成创建窗口功能,然后再调用CreateDXG()来初始化DirectX。 3. WHDefProcess.cpp在构造函数中获得CWHDXGraphicWindow句 柄。 Clear函数中调用在后台缓存上进行绘图操作,换页至屏幕。 ShowStatus函数,显示状态信息。 DefMainWndProc函数,调用CWHDXGraphicWindow->MainWndProcDXG消息处理。 4. WHImage.cpp图象处理。加载位图,位图转换。优化处理。 5. WHSurface.cpp 主页面处理。 6. WHWilTexture.cpp 材质渲染。 WILTextureContainer: WIL容器类。m_pNext指向下一个WILTextureContainer,单链表。 7. WHWilImage.cpp 从Data目录中加载Wix文件(内存映射)。 8. WHDXGraphic.cpp 处理DirectX效果。

文件系统源码分析

fatfs文件系统源码分析 一、概述 1、目的 在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。 2、准备工作 在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。 二、源代码的结构 1、源代码组成 源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文件夹里共五个文件和一个文件夹。文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。 2、00readme.txt的说明 Low level disk I/O module is not included in this archive because the FatFs module is only a generic file system layer and not depend on any specific storage device. You have to provide a low level disk I/O module that written to control your storage device.主要是说不包含底层IO代码,这是个通用文件系统可以在各种介质上使用。我们移植时针对具体存储设备提供底层代码。接下来做了版权声明-可以自由使用和传播。然后对版本的变迁做了说明。

3、源代码阅读次序 先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。最后根据用户应用层程序调用函数的次序仔细阅读相关代码。 三、源代码阅读 1、integer.h头文件 这个文件主要是类型声明。以下是部分代码。 typedef int INT; typedef unsigned int UINT; typedef signed char CHAR;/* These types must be 8-bit integer */ 都是用typedef做类型定义。移植时可以修改这部分代码,特别是某些定义与你所在工程的类型定义有冲突的时候。 2、ff.h头文件 以下是部分代码的分析 #include “integer.h”使用integer.h的类型定义 #ifndef _FATFS #define _FATFS 0x007C 版本号007c,0.07c #define _WORD_ACCESS 0 //如果定义为1,则可以使用word访问。中间有一些看着说明很容易弄清楚意思。这里就不例举了。

相关主题
相关文档
最新文档