学习
juzejian
这个作者很懒,什么都没留下…
展开
-
日知其所无
学习要持之以恒才见成效,坚持每天学习,每天必有一篇博文,只记录当天新学到的内容,以“日知”为分类。以此为记,希望我能做到。 学习内容包括:分布式存储和监控,NoSQL,关系数据库,所有其他每天学到的新东西 2011-09-05~2011-10学习计划,分布式存储和监控...2011-09-05 06:49:38 · 127 阅读 · 0 评论 -
ucore-project1: boot(1)
改了一下Makefile,可以看到编译命令了(很简单,把变量V定义成空就可以了。。。) 这个project很简单,就是把cpu内存初始化一下,然后直接端口IO的方式在屏幕上打印helloworld。 看了bootasm.S和bootmain.c,他们主要做这些事儿: 先看bootmain.c,就是通过in/out指令,把helloworld在屏幕上打印出来。打印的入口函数式...2011-11-19 03:00:41 · 157 阅读 · 0 评论 -
gcc嵌入汇编语法
以前学gcc嵌入汇编时的一些笔记,看一下对gcc的嵌入汇编比较有用处: 1· 格式:asm ( "以回车或分号分隔的汇编指令" : 以逗号分隔的输出操作数 : 以逗号分隔的输入操作数 : 以逗号分隔的受影响的寄存器或内存 ) 2·输出操作数表示汇编指令执行结果,输入操作数表示汇编指令执行时的输入值; 3·每个输出和输入操作数都是分为两部分:“限定符” (C表达式),其中输出...2011-11-19 13:12:51 · 105 阅读 · 0 评论 -
ucore-project1: boot(2),去掉sign
•sign主要的作用是创建一个启动扇区,在第511、512个字节上分别写上0x55和0xAA。为此需要为编译系统专门写这么一个四五十行的C工具。•在shell里很难处理二进制数据,大部分处理二进制数据的都是怎么将二进制数据以ascii的形式展示出来,包括od,objdump等等,而反过来处理的很少•还好有xxd,xxd正常也是展示二进制数据,但xxd –...2011-11-20 12:08:40 · 141 阅读 · 0 评论 -
ucore-project1: boot(3),终于搞定了
哈哈,终于解决了昨天搞到半夜快三点没有搞定的问题:在C语言代码中无法使用串口输出的问题! 说到底很简单,把COM1输出端口号搞错了,把0x3F8写成了0x3B8,结果就死活不出来。实际上昨晚还有最初还有另外一个问题:gdt中的segment descriptor创建出错,本来应该是((type & 0x0F) | 0x90),结果写成了((type & 0x0F) &...2011-11-20 12:49:40 · 144 阅读 · 0 评论 -
ucore-project2: loadkernel(1)
本工程很简单,就是在启动完成后,从第一个硬盘的第二个分区开始,加载8个分区到内存0x10000处。 本工程总是运行出错,C代码进不去,出现和proj1那样16进制代码重复运行的问题。第一反应就是跳转到32位时出错了,看了很多遍代码,没有问题,仔细对比了proj1和proj2的代码,尤其是启动部分代码,也没有问题。proj2和proj1唯一变化的就是在后面加了读硬盘的代码,会不会这些代码有错...2011-11-22 07:30:50 · 92 阅读 · 0 评论 -
ucore-project2: loadkernel(2)
反编译了C代码生成的elf文件,发现每个inline函数都很长,前面准备栈帧、参数,后面leave、ret,占用了大量空间。编译时使用gcc的-Os,大小立刻从6百多字节降到4百多,ok了 ...2011-11-23 07:42:42 · 69 阅读 · 0 评论 -
ucore-project3: loadkernel
昨天开始project3,本project是真正做一个有驱动、提供printf、strlen等功能的、可简单初始化的elf内核,然后通过MBR中的简单bootloader解析elf文件头,将elf内核以program header table中指定的位置载入内存。 今天完成文件的载入,在载入过程中,bootloader因为解析elf文件头,并完成elf内核的加载,导致虽然使用了gcc的文件...2011-11-25 22:58:59 · 87 阅读 · 0 评论 -
ucore-project3.1: kernel monitor shell
project3实际上是两个工程,project3.1在project3的基础上添加了一个内核控制台的能力,为此添加了读取键盘/串口的能力,可以读取命令,然后查询某些内核信息,包括内核参数,调用堆栈等。 到目前为止,还没有启用中断,所以读取键盘都是cpu主动轮询的。 简单处理,只做串口的,不做键盘。发现还是串口处理最简单:只要知道一个数据IO端口,一个状态IO端口就可以了。 ...2011-11-27 01:08:57 · 134 阅读 · 0 评论 -
宇宙如何运行
刚刚看一个科普节目:how the universe works 我们看到的巨大的太阳,是由几十亿恒星组成的银河系中普通的一个恒星,它与银河系中心距离25000光年,非常遥远。而银河系只是整个宇宙目前发现的几千亿星系中非常普通、非常小的星系,离我们最近的仙女座星系大小都是银河系的两倍。 星系并不单单由恒星组成,恒星只是其中很少的一部分,星系由尘埃、气体等组成,恒星只是其中很多尘埃、...2011-11-27 13:13:44 · 116 阅读 · 0 评论 -
ucore-project4: interrupt -- 内嵌汇编在-Os优化时出错分析
为了打印数字,将printf添加进去,结果打印出来乱码,并且是原来正确的、没有用printf打印出来的代码也变成了乱码。 使用readelf -e查看编译出来的kernel文件(kernel.out),发现代码是正确的,打印代码引用的打印字符串的地址处的确放着正确的打印字符串。 需要看到加载到内存后是什么样子,看来应该是读取内核到内存中出错了。不过以前读取内核没有问题啊?查看了以前...2011-11-28 02:54:11 · 177 阅读 · 0 评论 -
ucore-project4: interrupt
中断处理程序总算调进去了,刚才调试主要有两个问题:1. outb时,两个参数反了,输出参数放在了后面,而端口号放在了前面。究其原因,是直接抄ucore代码的后果。我的outb函数定义时,参数顺序与AT&T的outb指令参数顺序一样,输入值在前,输出值在后,而ucore的定义把他们反过来了,所以所有ucore调用outb的地方,都是端口在前,而输出数值在后。 2. %ds/%es...2011-12-05 07:55:25 · 92 阅读 · 0 评论 -
ucore-project4: interrupt -- 搞定第一个中断:timer
修改了代码中的一个bug,时钟终端终于正常了。 project4是一个很大的工程,包括了6个小工程。今天完成的是第一个工程:添加中断,初始化pic(8259A)和pit(8253)。第二个工程project4.1主要添加了用户态段和一个TSS段,重新初始化gdt,并加载了一个TSS第三个工程project4.1.1实现用户态和内核态的切换,主要通过修改int中断,在中断处理函数中修...2011-12-05 23:56:21 · 148 阅读 · 0 评论 -
ucore-project4: interrupt--x86 cpu复习
离上次更新ucore工程已经过去6天了。这几天工作比较忙,经常加班,回家一般23点多了。另外x86 cpu知识忘得差不多了,优先级切换、段式、页式内存访问和保护等记不起来,project4也没法继续做下去。周末终于有时间把x86文档啃了一下(25366821-pentium4-V3A-System-Programming-Guide.pdf),终于又捡起来些。 这是以前学习x86时记的一些...2011-12-11 20:04:41 · 117 阅读 · 0 评论 -
准备承接infoQ的一些翻译的工作
好好练练英语,看英文资料还是太慢,严重影响计算机的学习。 同时强迫自己每天看一些英文资料,了解外面正在发生什么:不找点事逼一下自己,没法长期主动做一些困难的事。 争取每天翻译一篇news,每周一篇artical...2012-09-05 22:29:53 · 164 阅读 · 1 评论 -
ucore
在看xv6的过程中,在硬盘上翻资料的时候,在xv6文档目录下发现去年九月份下载下来的ucore,这是清华大学的老师们(陈渝等)在参考xv6等的基础上循序渐进组织的一系列实验,从开始的启动、设备管理,到进程管理、内存管理、文件系统等,以及后续提供的网络管理,go语言支持,android libc支持,arm支持,x86-64支持等等,个人认为这个更加适合os的学习。再说,母校的不支持,还支持什么呢?...2011-11-18 00:05:46 · 612 阅读 · 0 评论 -
jQuery.post获取不到中文数据的问题
PHP直接返回页面时,可以返回中文数据,但使用jQuery.post从服务器获取数据时,所有的中文信息都丢了,变成了null。数据库使用的是sqlite3。 一系列试验后,还是GB2312和UTF-8打架的原因。jQuery、PHP的json_encode都是使用utf-8的,默认情况下,通过sqlite3.exe创建的数据库文件中,使用和操作系统一致的编码(GB2312),浏览器也是GB...2012-05-13 23:10:46 · 258 阅读 · 0 评论 -
DHT:分布式哈希表
分布式哈希表(DHT,Distributed Hash Table)用来在一群节点中实现(key, value)的关系映射。在类似Cassandra、bitcomet等分布式系统中使用了DHT。DHT是一个不存在中心点的、提供key->value查询功能的分布式系统,关于key到value的映射信息分布式地保存在多个节点上,数据的变化和节点的变化只会影响到部分节点,不会对所有节点产生影响...2011-09-06 00:03:39 · 813 阅读 · 0 评论 -
libmemcached的一致性hash算法
memcached的客户端用了一致性hash来定位每个服务器所在位置。以libmemcached库为例,在memcached_server_by_key函数中,首先根据hashkit中指定的哈希算法从key中计算出一个哈希值来,然后根据如下算法,从所有的节点中找到一个离自己最近的节点:如果哈希值在最后一个节点上,或在最后一个节点和倒数第二个节点之间的话,则返回第一个节点否则返回哈希值后...2011-09-07 00:32:47 · 142 阅读 · 0 评论 -
ucore-project4: 内核态和用户态切换(1)
终于又回来了。内核态和用户态切换比较麻烦,今天解决了一个bug,搞定了从内核态切换到用户态。 x86中,从高优先级代码切换到低优先级代码的唯一方法就是使用ret或iret返回指令,而从低优先级切换到高优先级的方法是int或call调用指令。这几个指令在跨优先级过程中,都会进行堆栈切换。而切换的目的堆栈,对于int/call指令,是记录在当前task的tss段中,对于ret/iret指令,是...2011-12-18 12:24:50 · 287 阅读 · 0 评论 -
ucore-project4: 内核态和用户态切换(2)
用户态到内核态切换相对比较简单。用户态切换到内核态时,需要切换堆栈,堆栈地址在当前task的tss段中,因此需要先建立好一个task,并为内核态的ss和esp赋好值。 仍然使用中断切换到内核态,中断处理函数中,首先将保存在新堆栈中的老堆栈的esp取出来,然后在老堆栈的esp指针指向位置之上建立一个trapframe(不包括ss和esp值),然后将新堆栈中的这一堆内容拷贝过来,然后给tf赋值...2011-12-18 13:14:19 · 148 阅读 · 0 评论 -
ucore-project4: 内核态和用户态切换(3)
这是内核态和用户态切换的最后一篇,也是project4的最后一篇了。 完成了使用call gate进行用户态到内核态的切换,使用lret进行内核态到用户态的切换的实验。这是project4.1.2的内容。 内核态到用户态的切换比较麻烦一些,首先将用户态段selector给ds,es,fs,gs赋值,将用户态栈的selector压栈,然后ebp压栈。因为c编译器会再函数开头将ebp压...2011-12-18 15:16:30 · 206 阅读 · 0 评论 -
ucore-project5: mm(1)
project5到project9主要处理内存管理。 其中project5是一个大工程,内部分为5个小工程,本次主要针对第一个小工程进行分析。 在project3.1中,就已经使用了ld的linker script,直接在其中指定链接时的一些配置。比如起始代码的符号,起始地址值,某个段的align值,以及可以定义一些变量。 在project5中,起始地址改为汇编函数kern...2011-12-19 01:30:50 · 102 阅读 · 0 评论 -
ucore-project5: mm(2)
看内核刚进入时加载临时gdt的代码:lgdt __gdtdesc - KERNBASE.datagdt:...__gdtdesc: .word 0x17 .long gdt-KERNBASE 其中KERNBASE = 0xC0000000。在lgdt指令中,使用了__gdtdesc的真实物理地址,而在__gdtdesc中,使用了gdt的真实物理地...2011-12-20 00:27:28 · 102 阅读 · 0 评论 -
ucore-project5:mm(3)
paging由x86 cpu控制寄存器中的三个bit控制:CR0 bit31:PG位,控制是否启用pagingCR4 bit4:PSE位,页大小扩展,允许4M大小的页面CR4 bit5:PAE位,物理地址扩展 先看32位的paging处理,就是PSE=PAE=0,而PG=1时的情况。 一个线性地址被分为3部分,第一部分是页目录表项索引,高10位(bit31-bit22)...2011-12-21 23:29:15 · 110 阅读 · 0 评论 -
ucore-project5: linker script
要对内核进行页映射,首先要知道内核在内存中的位置和内核的大小。内核在内存中的位置很好知道,因为是启动代码拷贝进去的,而内核的大小就不好知道了,只有最后将各个obj文件组合成内核文件的ld命令才知道。而ld命令的命令行参数很难定义参数告诉代码,此时就需要链接器脚本linker script了。ld使用命令-T指定链接器 linker script功能很强大,可以告诉链接器应该怎么干活儿,除了...2011-12-22 00:00:29 · 101 阅读 · 0 评论 -
ucore-project5: mm(4)
时隔近20天,终于搞定了一个问题。使用linker script设置内核起始地址为0xC0000000后,在没有启用分页的情况下,终于让加载到0x100000的内核成功运行起来了。内核代码正常运行,时钟中断正常。 ucore lab2 project5中首先设置了一个临时gdt,将base地址设置为-0xC0000000,这样在后续所有地址访问中,地址都会与这个base地址相加,相当于减去...2012-01-09 00:31:03 · 115 阅读 · 0 评论 -
Builder模式
学习rabbitmq,在看其java client api文档时,讲到AMQP类的请求、应答描述符都有builder类,符合Builder模式,让创建协议对象更加简单,允许使用不变的状态创建他们。 一直没有系统学习设计模式,从网上查了一下Builder模式的讲解,中文资料中讲builder模式的基本是人云亦云,拿着翻译的半通不通的所谓中文标准定义,按照自己的例子理解一番,然后写一个简单的小...2012-01-21 22:17:56 · 82 阅读 · 0 评论 -
后续生活规划
惭愧,刚浏览了xiaotie的一些博客,作为和他同一年入学的校友,同样都是在一个非IT专业读到了硕士,2003年同一年毕业,到现在已经工作10年了。相比较而言,现在收入可能多一点,但生活远远没有他充实,同时也没有他的竞争力(在技术上)。现在天天机械地工作,开会,为领导几句话疲于奔命,忍受他们无知的指挥,自己整天不知做什么。生活很空虚,心里很空虚,不知道自己的价值在哪里,引以为豪的技术已经放下很久了...2012-05-11 00:21:05 · 142 阅读 · 0 评论 -
css样式表中的样式覆盖顺序
刚才写zenktodo的时候,通过动态添加class的方式修改一个div的样式,总是不起作用。 #navigator { height: 100%; width: 200; position: absolute; left: 0; border: solid 2 #EEE;}.current_block { bo...2012-05-13 15:42:35 · 1790 阅读 · 0 评论 -
json解析
哈哈,如果返回http消息头中指定了“Content-Type: application/json”的话,jQuery回调函数中传入的data是直接解析后的json对象,如果不指定Content-Type(就是用默认的),jQuery回调函数中传入的data是string字符串。 不看文档没常识。仔细看了jQuery.ajax()的文档,里面有非常详细的说明。jQuery.ajax()...2012-05-13 20:47:11 · 103 阅读 · 0 评论 -
go语言
从学校里开始,一直是C语言的狂热支持者,刚开始工作的两年也一直是使用C,后来这七八年因为工作关系,主要使用java,间或一些C++。但C语言的简洁一直让我着迷。 刚才看了许式伟同学关于go的介绍(infoQ中文站上),许同学称go将取代java成为以后排名第一的语言,另外也由于go语言那些鼎鼎大名的作者们(其中包括C语言的作者),忽然对go语言充满兴趣。golang.org居然连不上,从...2012-09-06 01:23:23 · 180 阅读 · 0 评论