Posts Tagged ‘linux’
在mutt中使用Gmail地址簿
这又是关于mutt的记事。公司的IT着实非常落后,至今我们仍在使用微软的Office outlook作邮件客户端。没有gmail,没有webmail,倒是直到上周才为每位员工购买了一款叫做Good的Android软件来查看邮件。可是无论怎样,mutt一直是我钟爱的一款邮件客户端。它已经长在我的手指上。现在在公司的开发机器上我已经可以使用IMAP和SMTP收发邮件,也可以在mutt中使用全公司的LDAP来查找地址,所以,整个功能跟低效的Outlook没有区别,处理邮件的速度却比使用Outlook提高了至少两倍。特别是遇到跟工程师之间通信需要贴代码或者发git patch的时候尤其如此。当通过mutt使用自己的gmail的时候,我遇到了一问题,就是Gmail本身并没有提供LDAP接口用来查询地址,于是我无法套用使用公司邮件的配置来查找地址了。昨天在github上发现了一个perl脚本可以解决这个问题。
Gmail提供了API可以帮助外部应用程序取得地址簿中的数据。Ajnasz的这个脚本可以取得地址簿数据并且用查询字符串匹配,从而找到联系人的邮件地址。但是,但是原来的脚本有一个小问题——无法使用中文或者日语姓名作为查询字符串。自己动手,丰衣足食。我在原代码的基础只添加了两行代码,现在查询中文姓名也没有问题了。如果你有兴趣可以从这里拿到代码。
git clone git://github.com/jcadam/Google-Contacts-for-Mutt.git gc-mutt
这个脚本需要一个简单的配置文件用来取得Gmail数据的访问权限。你可以仿照下面这个例子做自己的配置文件。
$ vi ~/.google.ini
[account] email = 'youraccount@gmail.com' password = 'Passw0rd'
为了防止其他用户访问你的文件增强安全,你可将文件的属性设置成所有者只读。
$ chmod 400 ~/.google.ini
进入contacts.pl脚本所在目录,然后不带任何参数运行这个脚本,你就可以得到整个Gmail联系人名簿。可以先测试一下。
$ cd$ ./contacts.pl
接着,在PATH变量中的任何一个目录中,通常是/usr/local/bin/或者~/bin,建立一个Shell helper了查询数据。
$ vi ~/bin/contracts
#!/usr/bin/env bash
${HOME}/github/gc-mutt/contacts.pl ${1}
然后告诉mutt查询联系人时使用这个helper脚本查询。在~/.muttrc中添加如下一行即可。
set query_command="~/bin/contacts '%s'"
测试一下。在mutt中新建邮件(m),在To:栏中直接输入联系人的名字,比如”Mark Brown”,
然后按”ctrl-t”查找地址簿。
mutt会自动查询地址布并且取回Mark的邮件地址。
嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。
- Tags: contact, gmail, linux, mutt
- Posted in Linux tips
- 2 Comments
Gmail证书变更导致的msmtp错误
大约一年前我写了《通过mutt使用gmail》,之后因为更换新机器有没有时间再将
mutt等工具配置起来;今天重新在新的gentoo系统上配置Mutt使用gmail却发现原
来的方法出错了。
错误消息如下
msmtp: TLS certificate verification failed: the certificate hasn’t got a known issuer.
很显然,google将gmail的cert变更了。单纯的使用msmtp确认一下:
% msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
SMTP server at smtp.gmail.com ([74.125.53.109]), port 587:
mx.google.com ESMTP r20sm18086225wam.17
TLS certificate information:
Owner:
Common Name: smtp.gmail.com
Organization: Google Inc
Locality: Mountain View
State or Province: California
Country: US
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Validity:
Activation time: 2010年04月23日 05時02分45秒
Expiration time: 2011年04月23日 05時12分45秒
Fingerprints:
SHA1: 1A:6F:48:8F:BE:5B:FD:92:D8:12:30:F9:22:CE:84:49:B3:43:BD:2C
MD5: 60:39:DE:FB:0A:D9:9E:43:26:E7:75:AC:60:48:A1:B0
Capabilities:
SIZE 35651584:
Maximum message size is 35651584 bytes = 34.00 MB
STARTTLS:
Support for TLS encryption via the STARTTLS command
AUTH:
Supported authentication methods:
PLAIN LOGIN
之前使用过的Thwate Server已经过期了,Issuer字段变成了由google之间给
cert。:(
幸好,修复这个错误非常容易,在debain或者ubuntu系统上可以安装
ca-certificates包来修复这个错误。
# sudo apt-get install ca-certificates # dpkg -s ca-certificates | grep Version Version: 20090814
然后,只要更改~/.msmtprc文件就可以了,将tls_trust_file改正为
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
gentoo用户需要将这个文件download下来,并且重新指定tls的位置:
http://sysinf0.klabs.be/usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt?f=download;dist=etch;component=main;arch=i386;pkg=ca-certificates;ver=20070303
P.S. 博客并不适合用来记录这样内容,但是,前一篇gmail相关文章已经贴到了博
客,照例还是帖一篇上来吧,各位见谅。
嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。
- Tags: gmail, linux, mutt, software
- Posted in Linux tips
- No Comments
Linux内核代码阅读序列(10)-内存模型 之二
内存区段
x86结构CPU上采用了一种叫内存区段的方式来寻址,这样做最大的好处就是可以保护内存中的内容不被非法访问,在这种内存模型中某个地址可以被表示成两部分,线性地址由这两部分计算得出。
LinearAddress = BaseAddress of Segmentation + Offset
其中,段基值存储在段基值寄存器当中,其值总是指向当前正在使用的内存区域的基地址;在x86处理器的32位保护模式中,一个区段的大小时4GB;这是因为32位CPU上,段基值寄存器的位宽是32位(2^32=4G)。x86的原始设计包含三个段基址寄存器,
- CS Register:CodeSeg 指令段基址寄存器
- DS Register:DataSeg 数据段基址寄存器
- SS Register:StackSeg 栈段基址寄存器
同时,x86结构上将一个被叫做段描述符(Segmentation Descriptor)的东西存储在两个表(GDT和LDT)之中,需要使用时从表中取出段描述符来找到线性地址;因为Linux操作系统最初的设计目标就是支持x86结构的计算机,所以,Linux内核在构建内存模型的时候也采取了内存区段的方式,但是,为了简化设计和提高可以执行,内核的做法是只保留一个存储段描述符的表(GDT)和一个段基址寄存器,从而让所有的段都开始于同一个位置,而段的大小也正好成为4GB,也就是一般情况下的整个线性地址空间的大小。正因为如此,在大多数情况下,逻辑地址就可以直接被看作线性地址来使用,而逻辑地址到线性地址的转换事实上时内核或者CPU在对用户透明的情况下完成的,这个转换过程不需要特别注意。需要注意的是这里提到的这些名词,以及那个小学算数一般的地址计算方法。此外,Linux内核代码使用的内存区段和若干个宏也最好记住,因为你知道,好记性对一个程序员来说真tmd重要。
| Name | Macro | Base | Limit | G | S | Type | DPL |
| KernelCodeSeg | __KERNEL_CS | 0×00000000 | 0xffffffff | 1 | 1 | 0xa | 0 |
| KernelDataSeg | __KERNEL_DS | 0×00000000 | 0xffffffff | 1 | 1 | 0×10 | 0 |
| UserCodeSeg | __USER_DS | 0×00000000 | 0xffffffff | 1 | 1 | 0xa | 3 |
| UserDataSeg | __USER_DS | 0×00000000 | 0xffffffff | 1 | 1 | 0×10 | 3 |
线性地址在使用上的划分
普通的x86结构计算机上,从用户的角度看,线性地址是一个连续内存区域。它的最小地址是0x0000 0000,而最大地址是0xffff ffff。这个区域在概念上被分成两个部分,一部分是会根据不同的进程切换而改变的userspace区域,而另一部分,则在系统启动后一直不变的kernel space区域。这个位置的分界点可在内核代码中通过PAGE_OFFSET宏来定义,而PAGE_OFFSET却来自于内核编译的配置文件.config中的CONFIG_PAGE_OFFSET。在x86结构上,它被定义为0xC000 0000;这意味着,用户空间的大小时3GB,而内核仅有1GB可以使用。
|<--- 3GB ---->|<---- 1GB ---->|
+--------------------------------+----------------+
| userspace | kernel space |
+--------------------------------+----------------+
PAGE_OFFSET
(0xC000 0000)
内核在系统启动时被Bootloader——x86结构上常用的是GRUB/2——装载到线性地址的0xC000 0000位置以后,而这个线性地址通常被映射到物理地址的0x0010 0000,也就是物理地址最初的1M以后,关于这里点的证明此后详述。在线性地址空间中,紧随内核装载位置之后,Linux会利用一段内存区域来加载物理内存管理需要使用的数据结构,这个区域的大小一般根据系统上可以使用的RAM的大小而改变,而其装载在物理内存中的位置会根据体系结构的不同而改变,但通常会避开前16M,因为最初的16M被用来给ISA设备提供DMA支持,这是物理内存管理中另外一个恼人的地方,且听下下回分解吧。此前提到的这两个区域都时直接的物理内存映射区域,具体的位置用内核宏定义来说的话应该时开始于PAGE_OFFSET,而结束于(VMALLOC_START-VMALLOC_OFFSET)。-_-!!! 抱歉,又说火星语了,但是除此以外还真没有好的描述语言。
VMALLOC_OFFSET(0x0080 0000)
¥ | ¥
+-----------+----------------+---+-------------------+
|KernelImage|PhysicalMMStruct|Gap| vmalloc Add Space |
+-----------+----------------+---+-------------------+
^ |
| VMALLOC_START
PAGE_OFFSET
(0xC000 0000)
显而易见,VMALLOC_START = SizeOf(PhysicalMMStruct) + VMALLOC_OFFSET。后续的线性地址空间被用以支持内核函数vmalloc(),使用这个函数可以申请在线性地址空间连续的却事实上在物理地址上可能不连续的内存区域;如果在支持HIGH_MEM的系统上,在两个PAGE的间隔以后,会有一块区域来支持将高地址转化到低地址的函数kmap(),这个区域的开始位置是PKMAP_BASE。为什么要转换呢?下下下下回分解…再接下来,还需要划分一片区域来支持编译时就需要定位的内存模块,比如APIC,这段区域采用固定映射(Fixed Mapping)的方式,将线性地址映射到物理地址,所以,利用链接器脚本或者其他方法可以在编译时确认代码被装载的位置;这片内存区域的开始位置是FIXADDR_START,而结束位置时FIXADDR_TOP;FIXADDR_TOP是0xffff f000,而FIXADDR_START会根据宏__FIXADDR_START计算得出。
+--------------------+---+--------------+-------------------------+---+
| vmalloc Add Space |Gap|kmap Add space|Fixed Virtual Add Mapping|Gap|
+--------------------+---+--------------+-------------------------+---+
| VMALLOC_END | | |
| PKMAP_BASE | FIXEADDR_TOP
VMALLOC_START FIXADDR_START
正是因为前面提到vmalloc(),kmap()和固定映射地址,内核物理内存区域管理中用到的ZONE_NORMAL的大小才受到限制,而不能占据整个1GB空间。这个限制通过宏定义VMALLOC_RESERVE体现出来,这个值在不同的体系结构上有所不同,但是在x86结构上,它被定义为128MB,理所当然的,ZONE_NORMAL可以使用的线性地址空间大小就变成了1GB - 128MB = 896MB。
嘿~,如果您喜欢我的博客,您可以通过RSS.链接将本博客的最新文章传输到您喜欢的阅读器。
- Tags: kernel, linux
- Posted in Linux kernel
- No Comments



