推荐chrome插件vimium

推荐chrome插件vimium

对于用惯了vim的人来说,能用vim的快捷键来浏览网页控制浏览器是一件很爽的事情。今天发现了了一个chrome的插件vimium让你彻底脱离鼠标,用键盘控制你的浏览器。试了下,要做一些其它复杂的操作(比如说注册帐号什么的)还是不得不用到鼠标,像阅读文章,文档,刷知乎,coding神马的纯键盘操作还是很舒服的。

vimium的快捷键已经贴在上面了,操作和vim很类似,shift + /显示帮助页面。项目地址

Linux 段错误调试

今天修改了一个段错误的bug。

第一步  用dmesg命令查看最近的段错误。

[Mon Sep 14 15:11:50 2015] class[4200]: segfault at 0 ip 00007fcac993dbdd sp 00007fcaca4f5ac8 error 4 in libzealot.so[7fcac98ea000+6c000]

segfault at 0   表示段错误发生的地址。这里是0,可以判断是给地址为0处读取或者写入一个值。也就是出现了空指针的问题

  • ip 00007fcac993dbdd   这是错误发生的时候ip的位置,根据这个值可以定位错误发生的位置。
  • sp 00007fcaca4f5ac8    这是错误发生的时候sp的位置。调试过程中没有用到。
  • error 4  错误类型,在这里等于4 也就是bit2 == 1 user-mode access,bit1 == 0 read access,bit0 == 0 no page found。 结合ip的值可以判断是因为访问了一个空指针(read)。
    /*
     * Page fault error code bits:
     *
     *   bit 0 ==    0: no page found       1: protection fault
     *   bit 1 ==    0: read access         1: write access
     *   bit 2 ==    0: kernel-mode access  1: user-mode access
     *   bit 3 ==                           1: use of reserved bit detected
     *   bit 4 ==                           1: fault was an instruction fetch
     */
  • libzealot.so[7fcac98ea000+6c000]   错误发生的动态库。7fcac98ea000表示这次动态库加载的内存基地址,6c000是大小。

第二部  反汇编

objdump -d zealot.so > zealot.dump

第三部 定位

0x00007fcac993dbdd   – 0x7fcac98ea000 = 0x53bdd。在zealot.dump中找53bdd 定位到代码

可以看到此处代码是 mov    (%rax),%rax 。此处rax为零导致段错。再去分析C代码,就可以找到问题。

 

注意  如果段错发生在动态库中,由于每次动态库加载的地址都不一样。 若 ip – 动态库基地址值不变,说明出问题的位置是同一处。

 

参考

http://stackoverflow.com/questions/2549214/interpreting-segfault-messages  

http://blog.163.com/longsu2010@yeah/blog/static/17361234820122761525799/  

 

 

MediaWiki

打算用MediaWiki搭建一个知识库,作为个人文档库,将博客里面写的东西整理后放入wiki永久保存。博客和wiki最主要的区别是wiki更有利于存档以及以后查看,而博客比较随意,可以记录任何事情。

这篇文章主要记录MediaWiki的基本用法,觉得一篇文章够用了,所以就没有添加Wiki的分类目录。

一 链接

内部链接

列表,元组,字符串互相转换

列表,元组,字符串之间的转化通过join(), str(), list(), tuple() 这四个函数实现。

  • 用list可以把字符串和元组转化为列表
>>> demo_str = 'test' 
>>> demo_tuple = ('t','e','s','t')
>>>demo_list = ['t','e','s','t']
>>> temp = list(demo_tuple)
>>> type(temp)
<type 'list'>
>>> temp = list(demo_str)
>>> type(temp)
<type 'list'>
Raspberry Pi Timer

Raspberry Pi Timer

The Physical (hardware) base address for the system timers is 0x7E003000.

树莓派的Timer共有7个寄存器 分别是

0x0   CS       System Timer Control/Status                 32
0x4   CLO    System Timer Counter Lower 32 bits    32
0x8   CHI     System Timer Counter Higher 32 bits    32
0xc   C0       System Timer Compare 0                       32
0x10 C1       System Timer Compare 1                       32
0x14 C2       System Timer Compare 2                       32
0x18 C3       System Timer Compare 3                       32

Raspberry Pi GPIO

Raspberry Pi GPIO

树莓派的共有54个GPIO 这54个GPIO通过 0x7e20 0000 – 0x7e20 00b0 这41 个寄存器控制 。有用的寄存器有:

1.GPFSEL ( GPIO Function Select)    共六个GPFSEL0 – GPFSEL6,每个GPFSEL控制10个GPIO pin ,即GPFSEL的0-29 bit 每3bit控制一个GPIO pin 30、31两个bit无用。作用是控制GPIO pin 的功能。 功能号:

Raspberry Pi GPU 编程

Raspberry Pi GPU 编程

要把我的操作系统移植到Raspberry Pi 上了,所以最近一直在看ARM的东西。找来找去只找到一个有点用的 http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/   剑桥大学的一份教程,虽然离一个完整的内核还差得很远,但对我还算是有点用。之前一直担心的GPU的问题也解决了,也是我找到的唯一一份和Raspberry Pi GPU编程相关的东西了。

PS2鼠标中断信号的处理

键盘数据已经可以正常接收了,鼠标的处理比键盘要稍微复杂一点。鼠标每次的信号是三个字节,第一字节0-2分别保存着鼠标左键右键中键是否按下的标志。3位一直为1。根据这个特性可以判断接收到的字节是否是鼠标第一字节的信号。4 5 两位分别表示鼠标 x,y位置是否发生位移。 6 7  是 x y溢出标志位。

80386寄存器(转载)

80386寄存器(转载)

写这篇文章,完全是因为学习保护模式需要这些知识,读者完全可以走马观花,大致看看有什么内容,知道需要的时候来查这篇文章就可以了,完全没有必要抵抗着困意非要把这篇文章认真看完,记住里面每一个寄存器里每一位的定义,但是以后的文章如果需要,一定要记得回来查查相关的内容。 80386共提供7种类型的32位寄存器,