日知
juzejian
这个作者很懒,什么都没留下…
展开
-
go语言
从学校里开始,一直是C语言的狂热支持者,刚开始工作的两年也一直是使用C,后来这七八年因为工作关系,主要使用java,间或一些C++。但C语言的简洁一直让我着迷。 刚才看了许式伟同学关于go的介绍(infoQ中文站上),许同学称go将取代java成为以后排名第一的语言,另外也由于go语言那些鼎鼎大名的作者们(其中包括C语言的作者),忽然对go语言充满兴趣。golang.org居然连不上,从...2012-09-06 01:23:23 · 180 阅读 · 0 评论 -
google的翻译功能
刚才试用google translate,发现一些非常惊讶的功能:1. 英译中时,在英文输入框的右下角有一个喇叭标记,可以读出输入的单词,这个一直就有,今天忽然发现在输入框左下角有一个麦克风标记,点一下后弹出一个音量框,对着她念一个英文单词,她就能输入进去,并且准确率还不低,这个功能真的非常不错,对于一些会念不会写的单词非常有用。对应后台应该有一个非常不错的语音识别系统 2. 中译英时...2011-11-12 20:15:43 · 179 阅读 · 0 评论 -
终于注册成功windows azure账号了
过程真是一波三折,几次都要放弃了,还好最终成功。不罗嗦了,下面说过程。 今天在写一篇云计算环境中隔离与访问的文章,需要参考一下各个云平台的资料。查Windows Azure时,无意中发现Windows Azure可以免费试用90天,那还不用?注册!谁知刚开始注册就返回错误,服务器故障,晕,看来这是MS的噱头,不可用,继续找资料。 过了一会儿,一篇中文页面中有一个注册链接,再试下,没...2011-11-12 13:27:25 · 4035 阅读 · 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 评论 -
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 评论 -
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 评论 -
ucore-project5: mm(4)
时隔近20天,终于搞定了一个问题。使用linker script设置内核起始地址为0xC0000000后,在没有启用分页的情况下,终于让加载到0x100000的内核成功运行起来了。内核代码正常运行,时钟中断正常。 ucore lab2 project5中首先设置了一个临时gdt,将base地址设置为-0xC0000000,这样在后续所有地址访问中,地址都会与这个base地址相加,相当于减去...2012-01-09 00:31:03 · 115 阅读 · 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(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: 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(1)
project5到project9主要处理内存管理。 其中project5是一个大工程,内部分为5个小工程,本次主要针对第一个小工程进行分析。 在project3.1中,就已经使用了ld的linker script,直接在其中指定链接时的一些配置。比如起始代码的符号,起始地址值,某个段的align值,以及可以定义一些变量。 在project5中,起始地址改为汇编函数kern...2011-12-19 01:30:50 · 102 阅读 · 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-project4: 内核态和用户态切换(2)
用户态到内核态切换相对比较简单。用户态切换到内核态时,需要切换堆栈,堆栈地址在当前task的tss段中,因此需要先建立好一个task,并为内核态的ss和esp赋好值。 仍然使用中断切换到内核态,中断处理函数中,首先将保存在新堆栈中的老堆栈的esp取出来,然后在老堆栈的esp指针指向位置之上建立一个trapframe(不包括ss和esp值),然后将新堆栈中的这一堆内容拷贝过来,然后给tf赋值...2011-12-18 13:14:19 · 148 阅读 · 0 评论 -
ucore-project4: 内核态和用户态切换(1)
终于又回来了。内核态和用户态切换比较麻烦,今天解决了一个bug,搞定了从内核态切换到用户态。 x86中,从高优先级代码切换到低优先级代码的唯一方法就是使用ret或iret返回指令,而从低优先级切换到高优先级的方法是int或call调用指令。这几个指令在跨优先级过程中,都会进行堆栈切换。而切换的目的堆栈,对于int/call指令,是记录在当前task的tss段中,对于ret/iret指令,是...2011-12-18 12:24:50 · 287 阅读 · 0 评论 -
python学习:从新手到专家阅读笔记(5)
import模块或包import用来导入一个module,或module中的一些名字:可以是变量,可以是函数,也可以是类import从sys.path中定义的路径中查找module,sys.path是一个路径的列表 python的模块与erlang的模块有些类似,也是一个文件,访问其中成员是也是模块作为前缀访问成员,不同的是erlang使用“模块名:成员名”访问,而python使用...2011-10-30 14:11:45 · 76 阅读 · 0 评论 -
unix发展史看软件开发
读Dennis Ritchie写的unix演变史,结合当前做的项目,有很多感触。 1. 文件系统Dennis Ritche写的unix演变中,非常强调文件系统的作用。文件系统是什么?文件系统是一个可自由命名的、可持久的数据库。计算机系统最主要的信息就是数据,代码也是数据,而文件系统作为一种数据库,就是整个计算机系统的核心。文件系统组织了所有的信息,包括console、真正的文件、net...2011-11-13 01:15:55 · 81 阅读 · 0 评论 -
ucore
在看xv6的过程中,在硬盘上翻资料的时候,在xv6文档目录下发现去年九月份下载下来的ucore,这是清华大学的老师们(陈渝等)在参考xv6等的基础上循序渐进组织的一系列实验,从开始的启动、设备管理,到进程管理、内存管理、文件系统等,以及后续提供的网络管理,go语言支持,android libc支持,arm支持,x86-64支持等等,个人认为这个更加适合os的学习。再说,母校的不支持,还支持什么呢?...2011-11-18 00:05:46 · 612 阅读 · 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 评论 -
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
中断处理程序总算调进去了,刚才调试主要有两个问题:1. outb时,两个参数反了,输出参数放在了后面,而端口号放在了前面。究其原因,是直接抄ucore代码的后果。我的outb函数定义时,参数顺序与AT&T的outb指令参数顺序一样,输入值在前,输出值在后,而ucore的定义把他们反过来了,所以所有ucore调用outb的地方,都是端口在前,而输出数值在后。 2. %ds/%es...2011-12-05 07:55:25 · 92 阅读 · 0 评论 -
电路图
刚才在看怎样初始化时钟芯片8253。cpu通过执行out指令,往时钟芯片的某些寄存器写入特定的数值,就可以配置时钟芯片的三个时钟,让他们分别干不同类型的事。时钟芯片三个时钟可以分配配置处于六种模式中的一种,提供不同的功能。 为什么out指令往某个特定端口写入特定值,就可以完成特定的事呢?cpu的地址线、数据线管脚分别练到各种设备的不同管脚,当往某个地址输出某个特定值时,实际上就是调整了这些...2011-12-04 00:46:28 · 205 阅读 · 0 评论 -
我的操作系统的方向
做操作系统到底是为了什么呢? 好玩,当然是一个很重要的目的,对它很有兴趣。不过后续要做成一个什么样子的呢?做OS是很耗时间的工作,Linus让linux可以工作,花费了整整一年的全职时间,这是建立在一个定义良好、文档丰富的操作系统界面的基础上,紧紧是让一些用户态程序可以在这个基础上运行起来。 如果要自己定义一个语言,自己设计一个全新的界面,基本上要耗费几年的时间,做出来的东西还不一...2011-12-03 11:14:36 · 240 阅读 · 0 评论 -
ucore-project4: interrupt -- 内嵌汇编在-Os优化时出错分析
为了打印数字,将printf添加进去,结果打印出来乱码,并且是原来正确的、没有用printf打印出来的代码也变成了乱码。 使用readelf -e查看编译出来的kernel文件(kernel.out),发现代码是正确的,打印代码引用的打印字符串的地址处的确放着正确的打印字符串。 需要看到加载到内存后是什么样子,看来应该是读取内核到内存中出错了。不过以前读取内核没有问题啊?查看了以前...2011-11-28 02:54:11 · 177 阅读 · 0 评论 -
宇宙如何运行
刚刚看一个科普节目:how the universe works 我们看到的巨大的太阳,是由几十亿恒星组成的银河系中普通的一个恒星,它与银河系中心距离25000光年,非常遥远。而银河系只是整个宇宙目前发现的几千亿星系中非常普通、非常小的星系,离我们最近的仙女座星系大小都是银河系的两倍。 星系并不单单由恒星组成,恒星只是其中很少的一部分,星系由尘埃、气体等组成,恒星只是其中很多尘埃、...2011-11-27 13:13:44 · 116 阅读 · 0 评论 -
ucore-project3.1: kernel monitor shell
project3实际上是两个工程,project3.1在project3的基础上添加了一个内核控制台的能力,为此添加了读取键盘/串口的能力,可以读取命令,然后查询某些内核信息,包括内核参数,调用堆栈等。 到目前为止,还没有启用中断,所以读取键盘都是cpu主动轮询的。 简单处理,只做串口的,不做键盘。发现还是串口处理最简单:只要知道一个数据IO端口,一个状态IO端口就可以了。 ...2011-11-27 01:08:57 · 134 阅读 · 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-project2: loadkernel(2)
反编译了C代码生成的elf文件,发现每个inline函数都很长,前面准备栈帧、参数,后面leave、ret,占用了大量空间。编译时使用gcc的-Os,大小立刻从6百多字节降到4百多,ok了 ...2011-11-23 07:42:42 · 69 阅读 · 0 评论 -
ucore-project2: loadkernel(1)
本工程很简单,就是在启动完成后,从第一个硬盘的第二个分区开始,加载8个分区到内存0x10000处。 本工程总是运行出错,C代码进不去,出现和proj1那样16进制代码重复运行的问题。第一反应就是跳转到32位时出错了,看了很多遍代码,没有问题,仔细对比了proj1和proj2的代码,尤其是启动部分代码,也没有问题。proj2和proj1唯一变化的就是在后面加了读硬盘的代码,会不会这些代码有错...2011-11-22 07:30:50 · 92 阅读 · 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-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 评论 -
x86系统C语言函数调用时的内存分布
好久不用,很多内容都忘了。刚刚复习了一下,再写一遍:32位x86系统C函数调用时的内存分布。 每个C语言函数在运行过程中,在栈顶对应一个栈帧。想想堆栈是一个地址由上往下增长的线性内存(为什么要由上往下增长?后面说明),栈帧的顶端地址位于esp寄存器,栈帧底部地址由ebp寄存器保存(当然,这个说法不准确,ebp再往下还有这个函数的参数,后面详细说明)。结构如下所示(每行4字节): 0...2011-11-19 13:01:02 · 159 阅读 · 0 评论 -
python学习:从新手到专家阅读笔记(4)
类在python中,可以使用class关键字定义类class Person: def setName(self, name): self.name = name def getName(self): return self.name def greet(self): print "hello fro...2011-10-30 12:59:45 · 78 阅读 · 0 评论 -
python学习:从新手到专家阅读笔记(3)
作用域有全局作用域和函数内的局部作用域。作用域实际上就是一个不可见的字典dict,每个变量实际上都是该字典中的一项,变量名实际上就是key,真正的变量值就是value。 python中的变量与lua中的作用域不同,lua中的变量,不管是在函数内声明的还是在函数外声明的,默认都是在全局作用域的,除非使用local关键字修饰变量。而python中,在函数外声明的是全局作用域的,而在函数内声...2011-10-30 09:18:24 · 76 阅读 · 0 评论 -
python学习:从新手到专家阅读笔记(2)
赋值可以给多个变量同时赋值,使用一个元组(tuple)给多个变量同时赋值:x,y = 1,2 布尔值False,None,0,"",(),[],{}都被认为是假,其他的一切都是真,包括True。实际上,False=0,True=1 语句块语句块以:开始,以缩进表示 条件语句if num>0: do somethingelif num &l...2011-10-29 00:19:03 · 77 阅读 · 0 评论 -
分布式系统之分布式中间件zeroMQ
zeroMQ,又称0MQ,是一个非常简单的通信库,它扩展了传统BSD socket能力,提供简单的基于消息的通信。zeroMQ不解析消息体,没有序列化能力,或者说你可以使用任何第三方序列化库比如google的protocol buffer。 iMatix公司,AMQP协议的制定者,在2010年退出了AMQP工作组,其CEO Pieter Hintjens 认为AMQP从根本上就有不可修改的...2011-09-25 21:28:45 · 324 阅读 · 0 评论 -
jar in jar loader中如何处理jar包中的jar包的加载
上一篇“如何将jar包中的jar文件添加到classpath中”里,讲了URLClassloader无法处理jar包中的jar,实际上就是无法处理“jar:file:/F:/share/ec2/test1.jar!/test.jar”这种类型的URL实际上是URL中嵌套了URL。那么jar in jar loader中的JarRsrcLoader是怎么处理这种情况的呢?很简单,JarRsrcLoa...2011-09-25 00:14:35 · 1400 阅读 · 0 评论 -
如何将jar包中的jar文件添加到classpath
有时我们会遇到这种情况:一堆jar文件看着麻烦,要做成一个可执行jar文件(java -jar myjar.jar xxx方式执行的jar)时,希望把所有依赖的jar包打包到可执行jar文件中,可是如何将jar文件中的jar自动加到classpath中呢? 第一反应,最直接的方法有两个:1. 将外层的jar文件解压到一个临时目录中,通过URLClassloader加载解压出的jar文件...2011-09-24 01:20:28 · 10854 阅读 · 0 评论 -
rrdtool
rrdtool是Round Robin Database Tool的缩写,提供了一种固定空间大小的循环存储,用来存储时间序列分布的数据。 rrdtool可以生成一个rrd文件,将一些数据源(DS)保存在这个文件中,同时可以保存数据源经聚合后生成的归档数据。 rrdtool在把数据保存到文件中后,可以将数据从中取出来,也可以根据某些数据进行绘图。...2011-09-22 23:30:15 · 86 阅读 · 0 评论 -
openstack
openstack分为三部分,第一部分叫nova,提供了虚拟计算服务,类似亚马逊的EC2,第二部分叫swift,提供分布式对象存储服务,类似亚马逊的S3,第三部分叫glance,提供镜像服务,这个在亚马逊中没有一个对应的单独服务。 其中glance可以使用swift作为后台存储,也可以使用其他存储作为后台存储。 ...2011-09-22 00:50:05 · 55 阅读 · 0 评论 -
知音体
刚才看张小花同学的《史上第一混搭》,学到一个词:知音体。 知音体指的是用煽情的标题来吸引读者的标题。名称源于《知音》杂志,其创始人胡勋壁先生提出要提倡“人情美、人性美”。 题外话,史上第一混搭延续张小花一贯幽默诙谐风格,让人合不上嘴 ...2011-09-18 19:20:08 · 496 阅读 · 0 评论