如果你面临两个同样善良的求婚者,他们都想与你共度一生。其中一位富有,另一位相对贫穷。我要告诉你的是,无论贫穷的那位多么帅气、多么能讨你欢心,你最好还是选择富有的那位。这并不是因为富有的男人能给你更好的物质生活,也并非要你变得虚荣。而是因为,富有的男人有更多的选择权,但他却选择了你,这说明他愿意为你拒绝其他可能。
If you are faced with two equally kind suitors who both want to spend their lives with you. One of them is rich, the other is relatively poor. What I'm telling you is that no matter how handsome and pleasing the poor one is, you're better off with the rich one. This is not because rich men can give you a better material life, nor does it mean that you become vain. It's because a rich man has more options, but he chose you, which means he's willing to reject other options for you.
If you are faced with two equally kind suitors who both want to spend their lives with you. One of them is rich, the other is relatively poor. What I'm telling you is that no matter how handsome and pleasing the poor one is, you're better off with the rich one. This is not because rich men can give you a better material life, nor does it mean that you become vain. It's because a rich man has more options, but he chose you, which means he's willing to reject other options for you.
[哇]【中英双语阅读:I Remember, I Remember我记得,我记得】#双语美文#
I Remember, I Remember我记得,我记得
By Thomas Hood托马斯·胡德
I remember, I remember
The house where I was born,
The little window where the sun
Came peeping m at morn;
He never came a wink too soon,
Nor brought too long a day,
But now I often wish the night
Had borne my breath away I
我记得,我记得
我出生的那所房屋,
还有那扇小窗,
清晨太阳向里面窥探。
它从不提前一瞬来临,
也不使人感到白天太长。
可现在我却常常希望,
黑夜能使我安息长眠!
I remember, I remember
The roses red and white,
The violets, and the lily-cups,
Those flowers made of light !
The lilacs where the robin built,
And where my brother set
The laburnum on his birth-day,--
The tree is living yet !
我记得,我记得
那红色的和白色的玫瑰,
还有紫罗兰和百合花瓣,
那些光彩斑斓的花朵!
那知更鸟筑巢的紫丁香,
我弟弟在他生日那天
将金链花种在它旁边--
这棵树至今生机勃勃!
I remember, I remember
Where I was used to swing,
And thought the air must rush as fresh
To swallows on the wing;
My spirit flew in feathers then,
That is so heavy now,
And summer pools could hardly cool
The fever on my brow!
我记得,我记得
我常去荡秋千的地方,
心想那扑向飞翔着的燕子的清风
必定是同样地令人心旷神怡,
我的心啊,那时犹如插翅飞翔,
现在却沉重无比,
即使夏日的水潭也难以
消退我额头上的高热!
I remember, I remember
The fir-trees dark and high;
I used to think their slender tops
Were close against the sky:
It was a childish ignorance,
But now 't is little joy
To know I'm further off from heaven
Than when I was a boy.
我记得,我记得
那些枞树苍郁而高耸,
我常思量它们纤细的树梢
几乎紧贴着天空,
那是孩子的天真无知,
但现在我却很少欢乐,
由于知道自己离开天国
比儿时更加遥远。
I Remember, I Remember我记得,我记得
By Thomas Hood托马斯·胡德
I remember, I remember
The house where I was born,
The little window where the sun
Came peeping m at morn;
He never came a wink too soon,
Nor brought too long a day,
But now I often wish the night
Had borne my breath away I
我记得,我记得
我出生的那所房屋,
还有那扇小窗,
清晨太阳向里面窥探。
它从不提前一瞬来临,
也不使人感到白天太长。
可现在我却常常希望,
黑夜能使我安息长眠!
I remember, I remember
The roses red and white,
The violets, and the lily-cups,
Those flowers made of light !
The lilacs where the robin built,
And where my brother set
The laburnum on his birth-day,--
The tree is living yet !
我记得,我记得
那红色的和白色的玫瑰,
还有紫罗兰和百合花瓣,
那些光彩斑斓的花朵!
那知更鸟筑巢的紫丁香,
我弟弟在他生日那天
将金链花种在它旁边--
这棵树至今生机勃勃!
I remember, I remember
Where I was used to swing,
And thought the air must rush as fresh
To swallows on the wing;
My spirit flew in feathers then,
That is so heavy now,
And summer pools could hardly cool
The fever on my brow!
我记得,我记得
我常去荡秋千的地方,
心想那扑向飞翔着的燕子的清风
必定是同样地令人心旷神怡,
我的心啊,那时犹如插翅飞翔,
现在却沉重无比,
即使夏日的水潭也难以
消退我额头上的高热!
I remember, I remember
The fir-trees dark and high;
I used to think their slender tops
Were close against the sky:
It was a childish ignorance,
But now 't is little joy
To know I'm further off from heaven
Than when I was a boy.
我记得,我记得
那些枞树苍郁而高耸,
我常思量它们纤细的树梢
几乎紧贴着天空,
那是孩子的天真无知,
但现在我却很少欢乐,
由于知道自己离开天国
比儿时更加遥远。
牛掰!在mailing list里整了一堆patch拍上去之后终于完成了这个目标。在stm32f469上跑了fastboot + kernel xip + userspace xip。
buildroot内置支持这个平台的xip,但它使用的是片上flash + initramfs的做法,只能是概念验证。我这里用qspi flash放内核/dtb和rootfs,都xip了。
++++
图一是内存使用,kernel起来之后只用了2-3M内存,支持了一些驱动,没有网络,没有block层,也没有一些关键的设备驱动诸如sdio,USB。但kernel在这些方面的内存使用是保守的。通过一个体力活的修改static内存使用和devicetree内存使用,内核自己的内存使用是能拉到1M以内的。一个几乎彻底瘫痪什么都干不了的内核大约可以压缩到500-700KB的内存使用。
图二是usespace xip;使用了elf fdpic的可执行文件格式。这个格式的elf较好的解决了nommu上动态链接的问题,因为地址是实模式这是uclinux的一个大麻烦,如果包多的时候需要全局考虑内存地址空间问题。而如果都使用static link系统的可执行程序会bloat很多。
rootfs使用cramfs,是一个有文件大小和总大小限制的紧凑的文件系统。最原始的开发者的torvalds本人,在transmeta工作时开发的。这个文件系统可以支持压缩和xip,但很快因为没有使用使用者而被抛弃了。直到大约2017年前后,内核4.15时merge了Linaro的Nicolas Pitre的新版本。而新版本里最重要的意义就是支持在nommu系统上跑xip(也支持mmu系统)。
新版的cramfs驱动还支持通过mtd-rom(虚拟)设备直接把硬件地址映射的flash(并口或spi nor)虚拟成mtd设备挂载,跳过block layer。在这种模式下,cramfs驱动可以直接mmap可执行程序(调用mtd的mmap),不实际载入ram,包括动态链接库。当然制作这种文件系统镜像时,可执行程序不得压缩,这是mkcramfs工具的工作。
buildroot缺省支持的nommu arm的可执行程序格式是flat,也支持cramfs系统镜像放在flash上,但是这个格式不支持xip,可执行程序还是要载入内存,那这样就不如用squashfs了。
buildroot最初是支持fdpic的,但是随着blackfin平台灰飞烟灭,因为这个平台也是uclinux最大的和几乎唯一有商业支持的平台,fdpic支持也被buildroot扔掉了,虽然arm工具链支持这个特性。但是因为它能xip,一些执着的在stm32和nxp imxrt上跑uclinux的人,包括靠这个吃饭的emcraft,都在继续努力让buildroot更好的支持ELF fdpic。邮件组里可以看到一些讨论和patch work,只是review的非常慢,还没有merge。
anyway有这个支持,在低内存系统上使用可以相当放肆了。比如busybox就不用剪裁什么了,需要的工具都搞进去,反正flash很便宜。
图三是Nicholas Pitre在lwn.net上发的雄文shrinking the kernel with a hammer里的极限结果;以仅仅能boot系统为目标在开机时给mem=768K参数,把系统拉起来了。他深度修改了内核,uclibc/busybox。
++++
uclinux仍然在这样一些方面很有吸引力:
1 性能牛逼的网络协议栈,
2 可以使用物美价廉性能牛逼的WiFi模块而不是iot那种跑1-2Mbps就上吐下泻的,
3 有各种文件系统支持而不是只能用极其瘸腿的little fs和fat,
4 有数量惊悚的传感器驱动可用,
5 有牛逼的USB设备协议栈,
6 太多工具可用了,一些轻量级的脚本语言开发速度不要太快,比在MCU的IDE上吭哧吭哧的写C和调试,开发效率至少是一量个数量级的提升。
buildroot内置支持这个平台的xip,但它使用的是片上flash + initramfs的做法,只能是概念验证。我这里用qspi flash放内核/dtb和rootfs,都xip了。
++++
图一是内存使用,kernel起来之后只用了2-3M内存,支持了一些驱动,没有网络,没有block层,也没有一些关键的设备驱动诸如sdio,USB。但kernel在这些方面的内存使用是保守的。通过一个体力活的修改static内存使用和devicetree内存使用,内核自己的内存使用是能拉到1M以内的。一个几乎彻底瘫痪什么都干不了的内核大约可以压缩到500-700KB的内存使用。
图二是usespace xip;使用了elf fdpic的可执行文件格式。这个格式的elf较好的解决了nommu上动态链接的问题,因为地址是实模式这是uclinux的一个大麻烦,如果包多的时候需要全局考虑内存地址空间问题。而如果都使用static link系统的可执行程序会bloat很多。
rootfs使用cramfs,是一个有文件大小和总大小限制的紧凑的文件系统。最原始的开发者的torvalds本人,在transmeta工作时开发的。这个文件系统可以支持压缩和xip,但很快因为没有使用使用者而被抛弃了。直到大约2017年前后,内核4.15时merge了Linaro的Nicolas Pitre的新版本。而新版本里最重要的意义就是支持在nommu系统上跑xip(也支持mmu系统)。
新版的cramfs驱动还支持通过mtd-rom(虚拟)设备直接把硬件地址映射的flash(并口或spi nor)虚拟成mtd设备挂载,跳过block layer。在这种模式下,cramfs驱动可以直接mmap可执行程序(调用mtd的mmap),不实际载入ram,包括动态链接库。当然制作这种文件系统镜像时,可执行程序不得压缩,这是mkcramfs工具的工作。
buildroot缺省支持的nommu arm的可执行程序格式是flat,也支持cramfs系统镜像放在flash上,但是这个格式不支持xip,可执行程序还是要载入内存,那这样就不如用squashfs了。
buildroot最初是支持fdpic的,但是随着blackfin平台灰飞烟灭,因为这个平台也是uclinux最大的和几乎唯一有商业支持的平台,fdpic支持也被buildroot扔掉了,虽然arm工具链支持这个特性。但是因为它能xip,一些执着的在stm32和nxp imxrt上跑uclinux的人,包括靠这个吃饭的emcraft,都在继续努力让buildroot更好的支持ELF fdpic。邮件组里可以看到一些讨论和patch work,只是review的非常慢,还没有merge。
anyway有这个支持,在低内存系统上使用可以相当放肆了。比如busybox就不用剪裁什么了,需要的工具都搞进去,反正flash很便宜。
图三是Nicholas Pitre在lwn.net上发的雄文shrinking the kernel with a hammer里的极限结果;以仅仅能boot系统为目标在开机时给mem=768K参数,把系统拉起来了。他深度修改了内核,uclibc/busybox。
++++
uclinux仍然在这样一些方面很有吸引力:
1 性能牛逼的网络协议栈,
2 可以使用物美价廉性能牛逼的WiFi模块而不是iot那种跑1-2Mbps就上吐下泻的,
3 有各种文件系统支持而不是只能用极其瘸腿的little fs和fat,
4 有数量惊悚的传感器驱动可用,
5 有牛逼的USB设备协议栈,
6 太多工具可用了,一些轻量级的脚本语言开发速度不要太快,比在MCU的IDE上吭哧吭哧的写C和调试,开发效率至少是一量个数量级的提升。
✋热门推荐