CUSE 实现的 tty 控制台。

cai posted @ 2012年7月17日 01:03 in 未分类 with tags TTY CUSE CJK SDL LINUX , 2914 阅读

Linux 内核本身的 TTY 控制台代码十分的 bugy,  当然,能工作而已。

不过,最关键的问题是不支持 国际化。 不支持矢量字体,事实上在我打补丁前,都不能显示 CJK 字符。

TTY 暴露给用户空间的接口事实上也就是 /dev/ttyXX 字符设备。 XX 从 0 到 63

如果能在用户空间实现了 tty 设备,然后由用户空间的程序绘制图形到 /dev/fb0 不也就实现了控制台了么?!而且是 user mode 的!

意味着我们可以用 FreeType2 使用矢量字体,甚至可以用 Pango 进行多国语言的排版!

但是要如何实现在用户空间这边搞 tty设备呢? tty 设备虽然最大的用处类似 pipe , 在显示设备和cli 程序的 stdout 直接建立连接,但是包行了一系列的 ioctl 来实现各种特殊功能包括 ncurses 。这就不是 pipe 能实现的。如果简单的用  /dev/pts/ 来模拟,也会有问题。 pts 和 tty 之间还是有许多不相同的地方,而且如果要在 pts 实现,那做这个 pts master 的进程就只能是 pid 1 了,因为 agettty 就是 pid 1 fork  出来的。pts 只能父子继承。

所以得寻求替代方案,幸运的是,我们有 CUSE. 由 FUSE 提供的另一种强大功能。CUSE 能在  user space 实现一切字符设备的操作功能,于是我提出实现一个 Userspace TTY Daemon, aka uttyd .

uttyd 启动的时候将原有的 /dev/tty* 全部删除,然后自己建立新的 /dev/ttyXX 节点,当然  uttyd  要在 agetty 之前启动。

然后后续运行 agetty 的时候利用的 tty 就是 uttyd 实现的了。

uttyd 在内部实现了一个支持 UTF-8 的 VT100 兼容控制台,利用 SDL 在framebuffer 上直接绘图。

 

为何用 SDL 呢? SDL 足够轻量,而且可以在 X 环境下调试,如果是在 framebuffer 下,自动的使用 /dev/fb0 而不需要修改程序。

uttyd 利用 fontconfig 进行字体配置,并使用 FreeType2 进行渲染,最后用 SDL 绘制到屏幕上。

只要你系统里安装了中文字体,你就能实现中文控制台。

 

 

Avatar_small
cai 说:
2012年7月17日 16:50

现在还有一些问题, CUSE 如何实现 ioctl 还一头雾水。

Avatar_small
依云 说:
2012年7月17日 18:13

貌似很不错耶。

Avatar_small
cai 说:
2012年7月18日 13:35

https://github.com/microcai/utty 代码在这里 ,虽然缺乏一些特性, 但是已经能工作了

Avatar_small
依云 说:
2012年7月18日 16:07

编译出来个 utty,不知道怎么用…

Avatar_small
cai 说:
2012年7月21日 20:52

... ... 直接执行啦 utty 先运行起来
然后执行 agetty --noclear utty 38400

Avatar_small
依云 说:
2012年7月21日 21:49

有大量问题:
1. 中文显示为方框
2. 不支持颜色
3. zsh 命令提示符显示混乱,特别是右边的
4. 执行 Vim 后没反应了
6. 那个鼠标指针显示在那里有什么用呢
7. 有条包含 SDL 的错误信息
8. Ctrl-C 掉 agettty 后,那个 tty 自动重置了?

总之呢,还很不完善,期待能日用的版本 :-)

Avatar_small
cai 说:
2012年7月23日 13:40

额。。。 恩。可惜 tty ioctl 方面的文档很不全

Mike 说:
2012年7月25日 07:24

嗯。。。FreeBSD 用戶期待移植過來。。。

Mike 说:
2012年7月25日 07:26

6. FreeBSD 可以在tty下用光標復制粘貼文本

Avatar_small
依云 说:
2012年9月03日 21:34

更新后又用不了了,运行了没反应……

Avatar_small
cai 说:
2012年9月17日 02:40

额,本来这次更新就只是代码清理,运行不了的。等等吧。最近没空 :)


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter