請問不用fbterm這些外掛中文終端,可以單獨使用ucimf麼(我的kernel打過patch可以直接顯示中文)?

141 views
Skip to first unread message

Ca

unread,
Aug 22, 2009, 6:00:56 AM8/22/09
to UCIMF
To 作者:

這個輸入法似乎默認就要配合 fbterm 這類外掛中文console,不知道可ucimf不可以單獨使用。
我的 kernel 打過這個很棒的 patch:http://blog.chinaunix.net/u/13265/showart.php?
id=1008020
使用framebuffer,不需要安裝任何外掛軟件內核就可以直接顯示中文,效果非常完美

因此我想要一個單獨的 console 輸入法,不要 fbterm 之類的東西。
不安裝 fbterm 不知道能不能直接使用?

Calvin
2009.8.22

Mat

unread,
Aug 22, 2009, 9:40:53 AM8/22/09
to uc...@googlegroups.com
Dear Calvin,

很高興收到你的來信 :-)

Very Great Job!!
相信你作的這份 patch 對建立完整中文 console 很有幫助,
這裡也非常感謝你為中文化的努力與貢獻。

UCIMF 是以外掛函式庫的形式,來協助應用程式增加輸入法的支援。
因此目前只要需要將主程式的鍵盤輸入截取給 libucimf, 同時準備 framebuffer 的環境,
就可以使用了。我方才寫了一個比較簡單的範例程式[1][2],大致驗證可以獨立使用。

此外,由於還沒有打上 patch 安裝實測過,尚不確定和這個 patch 過的 kernel framebuffer 是否完全相容? 若這
patch 沒有更動到 kernel framebuffer 的 API 的話,
我猜是相容的。

不過,我想依目前的狀況,還需要進一步討論和 kernel console 套接的方式和接合實作,才能真正讓這個理想推至實用。
目前我對 kernel 層的輸入輸出的實作尚不甚了解,或許我們可以先將相關的程式訊息提供出來,讓自己或是有興趣的人可以一起討論、嘗試...

參考資訊:
http://olvaffe.blogspot.com/2009/01/console-io.html
http://olvaffe.blogspot.com/2009/01/keyboard-in-console.html

sincerely, Mat.

[1]. http://code.google.com/p/ucimf/source/browse/console/dummy/console04.cpp
[2]. http://code.google.com/p/ucimf/source/browse/scripts/run2.sh

2009/8/22 Ca <calvi...@gmail.com>:

Ca

unread,
Aug 23, 2009, 8:26:26 PM8/23/09
to UCIMF
kernel中文顯示patch:
http://blog.chinaunix.net/u/13265/showart.php?id=1008020

不好意思沒有說明清楚,這個 patch 不是我寫的。
patch 只修改了 kernel 的 console 的字符顯示部分,并在 kernel 中嵌入了中文字體,沒有動 kernel 的
framebuffer 部分,因此不用擔心 patch 過的 kernel 跟 ucimf 相容的問題。

只需要一個單獨的 console 中文輸入法,能在登入之前自動啟動就完美了,這樣的話甚至 username 和 password 都可以用中
文。希望 ucimf 提供不依賴於 fbterm,只要開啟 framebuffer 就可以使用的獨立程式。你寫的兩個範例程式不知道如何使用?

Mat

unread,
Aug 27, 2009, 1:09:24 PM8/27/09
to UCIMF
Dear Calvin,

啊,很抱歉沒有將範例程式的部分交待的很清楚。

首先,這個範例程式需要 libucimf, 因此需要先行安裝 libucimf。
詳細指令請參閱用戶手冊[1]中的“安裝 UCIMF 軟體套件“一節。
若你是使用 Arch/Debian/Gentoo 的使用者的話,也可以使用相關的程式套件。

己有安裝 libucimf 的情況下,可以直接使用
g++ `pkg-config --cflags --libs libucimf` -o console04.exe
console04.cpp
再執行
./console04.exe
即可進行簡單的測試。

歡迎有興趣的人一起試試看,有問題也歡迎在一起討論 :-)

sincerely, Mat.

[1]. http://code.google.com/p/ucimf/wiki/UserManual

Calvin Ngei

unread,
Aug 29, 2009, 9:09:06 PM8/29/09
to uc...@googlegroups.com
compile 成功,在console裡面執行不論是普通用戶還是超級用戶,都不能調出輸入法,快捷鍵不起作用。已經安裝 libucimf。

2009/8/28 Mat <matli...@gmail.com>

Mat

unread,
Aug 30, 2009, 4:58:43 AM8/30/09
to uc...@googlegroups.com
若在執行前,先執行指令,
`sudo ucimf_keyboard`
是否能調出浮動視窗呢?

對了, 可以請問一下你的作業系統是那一套嗎?

sincerely, Mat.

2009/8/30 Calvin Ngei <calvi...@gmail.com>:

Calvin Ngei

unread,
Sep 1, 2009, 2:10:52 PM9/1/09
to uc...@googlegroups.com
仍然不出現輸入法視窗。
我的系統是 ubuntu 9.04,patch 過的 kernel 2.6.28-15

2009/8/30 Mat <matli...@gmail.com>

Mat

unread,
Sep 14, 2009, 5:57:51 AM9/14/09
to uc...@googlegroups.com
Dear Calvin Ngei,

很抱歉這麼久才回信。

我在 ubuntu 9.04 的 reduce 上遇到一些困難,加上正在嘗試的 debian packaging
的方法,相關的套件可能要再花一段時間來研究一下。

此外, 我在 qemu 上 patch 後的 kernel 執行失敗了。
想詢問一下有沒有現成的 PPA? 或是 patch 的編號跟 platform (amd64 or x86)

sincerely, Mat.

2009/9/2 Calvin Ngei <calvi...@gmail.com>:

Calvin Ngei

unread,
Sep 17, 2009, 2:11:41 AM9/17/09
to uc...@googlegroups.com
patch過的kernel,請從下面FTP地址下載,有source package和i386的binary package,適用於utunbu 9.04:

ftp://202.116.65.70/pub/ubuntu/dists/jaunty/main/binary-i386/kernel/

2009/9/14 Mat <matli...@gmail.com>

Mat

unread,
Oct 19, 2009, 3:18:07 AM10/19/09
to uc...@googlegroups.com
非常感謝你提供的 ubuntu package 連結!

這兩天試裝了這個 kernel package。
( normal.png: xterm-utf8 的顯示, test.png: ubuntu-9.04 中文kernel 的顯示 )

不過字型沒有正常顯示出來,不知道是否需要再額外增設字型或是其他設定?

sincerely, Mat.

2009/9/17 Calvin Ngei <calvi...@gmail.com>
normal.png
test.png

Calvin Ngei

unread,
Oct 19, 2009, 10:56:20 AM10/19/09
to uc...@googlegroups.com
需要開啟framebuffer,編輯啟動選單,增加 vga=791 之類。請檢查有沒有開啟framebuffer。
locale需要設定為 utf8,如 zh_CN.UTF-8、zh_HK.UTF-8、zh_TW.UTF-8、en_US.UTF-8 之類。如果不是utf8的locale,不能正常顯示中文。
開啟framebuffer、並且設定locale為utf8之後,console可直接顯示東亞文字(包括正體中文、繁體中文、日文、韓文)。

2009/10/19 Mat <matli...@gmail.com>

kou yu

unread,
Oct 20, 2009, 4:11:08 AM10/20/09
to uc...@googlegroups.com
看 mat 第二张图的显示,肯定是开启了 fb 的样子,但是不知道有没有设locale为utf8

2009/10/19 Calvin Ngei <calvi...@gmail.com>:

Mat

unread,
Oct 21, 2009, 11:04:45 AM10/21/09
to uc...@googlegroups.com
感謝兩位的回覆 :-)

今天又再測了一次,是 framebuffer, 也有開 locale , zh_TW.UTF-8 還是相同的結果。
看來要開程式碼看看了~

sincerely, Mat.

2009/10/20 kou yu <cky...@gmail.com>

Calvin Ngei

unread,
Oct 22, 2009, 3:56:12 AM10/22/09
to uc...@googlegroups.com
估計是你開啟其他的什麼程式干擾了顯示?
看附件我的console顯示截圖。
ubuntu 9.04,tty1登錄,framebuffer 1024x768,locale為 zh_TW.UTF-8
patch 過的 2.6.28-15 generic kernel(ftp中的那個)
kernel支持在console裡直接顯示簡體中文、繁體中文、日文、韓文,不依賴於任何外掛軟體。

2009/10/21 Mat <matli...@gmail.com>
1.png

kou yu

unread,
Oct 23, 2009, 1:42:13 AM10/23/09
to uc...@googlegroups.com
跟console字体有关吗

2009/10/22 Calvin Ngei <calvi...@gmail.com>:

Tai Qi Zou

unread,
Nov 8, 2009, 5:36:10 AM11/8/09
to UCIMF
kou yu,与console字体无关,可以把有关console字体的设置屏蔽掉,(因为在gentoo下默认consolefont设置
为"DEFAULT8*16"显示效果不好看,我直接屏蔽没有问题),这个补丁非常好,你可以用虚拟机安装一个全新的server版
ubuntu9.04(体积要求小),然后安装上面你下载的那个kernel ,再次启动时用w3m上网看中文网页非常完美,就是还没适合的输入法,非
常期待啊!

On Oct 23, 1:42 pm, kou yu <cky...@gmail.com> wrote:
> 跟console字体有关吗
>
> 2009/10/22 Calvin Ngei <calvin.n...@gmail.com>:


>
> > 估計是你開啟其他的什麼程式干擾了顯示?
> > 看附件我的console顯示截圖。
> > ubuntu 9.04,tty1登錄,framebuffer 1024x768,locale為 zh_TW.UTF-8
> > patch 過的 2.6.28-15 generic kernel(ftp中的那個)
> > kernel支持在console裡直接顯示簡體中文、繁體中文、日文、韓文,不依賴於任何外掛軟體。
>

> > 2009/10/21 Mat <matlinux...@gmail.com>


>
> >> 感謝兩位的回覆 :-)
>
> >> 今天又再測了一次,是 framebuffer, 也有開 locale , zh_TW.UTF-8 還是相同的結果。
> >> 看來要開程式碼看看了~
>
> >> sincerely, Mat.
>
> >> 2009/10/20 kou yu <cky...@gmail.com>
>
> >>> 看 mat 第二张图的显示,肯定是开启了 fb 的样子,但是不知道有没有设locale为utf8
>

> >>> 2009/10/19 Calvin Ngei <calvin.n...@gmail.com>:


> >>> > 需要開啟framebuffer,編輯啟動選單,增加 vga=791 之類。請檢查有沒有開啟framebuffer。
> >>> > locale需要設定為 utf8,如 zh_CN.UTF-8、zh_HK.UTF-8、zh_TW.UTF-8、en_US.UTF-8
> >>> > 之類。如果不是utf8的locale,不能正常顯示中文。
> >>> > 開啟framebuffer、並且設定locale為utf8之後,console可直接顯示東亞文字(包括正體中文、繁體中文、日文、韓文)。
>

> >>> > 2009/10/19 Mat <matlinux...@gmail.com>


>
> >>> >> 非常感謝你提供的 ubuntu package 連結!
>
> >>> >> 這兩天試裝了這個 kernel package。
> >>> >> ( normal.png: xterm-utf8 的顯示, test.png: ubuntu-9.04 中文kernel 的顯示 )
>
> >>> >> 不過字型沒有正常顯示出來,不知道是否需要再額外增設字型或是其他設定?
>
> >>> >> sincerely, Mat.
>

> >>> >> 2009/9/17 Calvin Ngei <calvin.n...@gmail.com>


>
> >>> >>> patch過的kernel,請從下面FTP地址下載,有source package和i386的binary
> >>> >>> package,適用於utunbu
> >>> >>> 9.04:
>
> >>> >>>ftp://202.116.65.70/pub/ubuntu/dists/jaunty/main/binary-i386/kernel/
>

> >>> >>> 2009/9/14 Mat <matlinux...@gmail.com>


>
> >>> >>>> Dear Calvin Ngei,
>
> >>> >>>>  很抱歉這麼久才回信。
>
> >>> >>>>  我在 ubuntu 9.04 的 reduce 上遇到一些困難,加上正在嘗試的 debian packaging
> >>> >>>> 的方法,相關的套件可能要再花一段時間來研究一下。
>
> >>> >>>>  此外, 我在 qemu 上 patch 後的 kernel 執行失敗了。
> >>> >>>>  想詢問一下有沒有現成的 PPA?  或是 patch 的編號跟 platform (amd64 or x86)
>
> >>> >>>>  sincerely, Mat.
>

> >>> >>>> 2009/9/2 Calvin Ngei <calvin.n...@gmail.com>:


> >>> >>>> > 仍然不出現輸入法視窗。
> >>> >>>> > 我的系統是 ubuntu 9.04,patch 過的 kernel 2.6.28-15
>

> >>> >>>> > 2009/8/30 Mat <matlinux...@gmail.com>


>
> >>> >>>> >> 若在執行前,先執行指令,
> >>> >>>> >> `sudo ucimf_keyboard`
> >>> >>>> >> 是否能調出浮動視窗呢?
>
> >>> >>>> >> 對了, 可以請問一下你的作業系統是那一套嗎?
>
> >>> >>>> >> sincerely, Mat.
>

> >>> >>>> >> 2009/8/30 Calvin Ngei <calvin.n...@gmail.com>:


> >>> >>>> >> > compile 成功,在console裡面執行不論是普通用戶還是超級用戶,都不能調出輸入法,快捷鍵不起作用。已經安裝
> >>> >>>> >> > libucimf。
>

> >>> >>>> >> > 2009/8/28 Mat <matlinux...@gmail.com>


>
> >>> >>>> >> >> Dear Calvin,
>
> >>> >>>> >> >>  啊,很抱歉沒有將範例程式的部分交待的很清楚。
>
> >>> >>>> >> >>  首先,這個範例程式需要 libucimf, 因此需要先行安裝 libucimf。
> >>> >>>> >> >>  詳細指令請參閱用戶手冊[1]中的“安裝 UCIMF 軟體套件“一節。
> >>> >>>> >> >>  若你是使用 Arch/Debian/Gentoo 的使用者的話,也可以使用相關的程式套件。
>
> >>> >>>> >> >>  己有安裝 libucimf 的情況下,可以直接使用
> >>> >>>> >> >>    g++ `pkg-config --cflags --libs libucimf` -o console04.exe
> >>> >>>> >> >> console04.cpp
> >>> >>>> >> >>  再執行
> >>> >>>> >> >>    ./console04.exe
> >>> >>>> >> >>  即可進行簡單的測試。
>
> >>> >>>> >> >>  歡迎有興趣的人一起試試看,有問題也歡迎在一起討論 :-)
>
> >>> >>>> >> >>  sincerely, Mat.
>

> >>> >>>> >> >>  [1].http://code.google.com/p/ucimf/wiki/UserManual

book

unread,
Dec 7, 2009, 2:20:02 PM12/7/09
to UCIMF
你的test.txt不能正确显示可能与文件格式有关,如果test.txt不是UTF-8格式,cat test.txt则显示乱码。
可以用iconv转码显示。例如你的test.txt是big5格式的话: iconv -f big5 -t utf-8 test.txt 就可以
在kernel patch
utf-8环境下正确显示。如果你使用gentoo linux,需要关闭consolefont deamon,否则它会替转掉fb内的中文字型。
执行 rc-update del consolefont boot
采用kernel patch方式支持中文显示优点是不用考虑安装任何中文终端程序,但目前还缺少输入法。

关于编译utf-8 cjk patch kernel,在gentoo linux下可以
layman -a gentoo-china
emerge cjk-sources
eselect kernel list
eselect kernel set linux-2.6.xx-cjk-x 选中kernel
genkernel --menuconfig all
选择framebuffer支持后编译kernel
修改grub menu.list启动新编译的utf-8 cjk patch kernel
然后关闭 consolefont daemon
rc-update del consolefont boot
rc-update del consolefont default
并且reboot到新kernel即可直接cat 任何utf-8格式中文txt,无需安装任何程序

如需阅读中文manpages还需要打utf-8补丁
layman -a gentoo-china
emerge groff-utf8
编辑/etc/man.conf文件,将
NROFF /usr/bin/nroff -mandoc
替换为
NROFF /usr/bin/groff-utf8 -Tutf8 -c -mandoc

kou yu

unread,
Dec 19, 2009, 11:49:06 AM12/19/09
to uc...@googlegroups.com
Good, 清晰明了的howto
3x :)

2009/12/8 book <nobo...@gmail.com>:

> --
>
> You received this message because you are subscribed to the Google Groups "UCIMF" group.
> To post to this group, send email to uc...@googlegroups.com.
> To unsubscribe from this group, send email to ucimf+un...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/ucimf?hl=en.
>
>
>

--
Best Regards

kou yu

unread,
Dec 19, 2009, 11:49:47 AM12/19/09
to uc...@googlegroups.com
补充一句,我用的就是gentoo,所以对我很有用:)

2009/12/20 kou yu <cky...@gmail.com>:

--
Best Regards

Mat

unread,
Jan 8, 2010, 1:53:26 AM1/8/10
to uc...@googlegroups.com
太好了,非常感謝 Book 兄跟 Kou Yu 的回覆及提示(還有維護這個 gentoo package 的人),我也裝成功了!!

拖了這麼久,我終於使用到傳說中的中文 kernel!
在跨年的這段時間,我於是花了一些時間研讀了一下 linux kernel 關於 tty, terminal, console
部分的程式碼,對於長久以來使用的純文字介面有了更深一層的認識。

雖然尚未完全掌握從何處下手,但這裡先將近期所得到的心得簡短備註起來,希望提供有興趣的人一些參考。


( 以下偏技術性內容 )
===================================================

1. TTY ( teletypewriter ) 跟 /dev/tty[1-6] 有關,但不完全是我們所使用的純文字介面
主要是描述字碼跟字符的抽象運作,但沒有字型、輸入跟相關的純文字介面的實作。

2. 我們所使用的純文字介面是 VT ( virtual terminal )
一般的 term ( terminal program ) 主要是一對字鍵式輸入裝置跟行列式字符顯示器的組合。
而 VT 的組合,是用 kbd 作輸入裝置,再加上以 vgacon ( or fbcon if framebuffer kernel
arguments given )
作為字符顯示器的組合。

從 ${KERN_SRC}/drivers/char/Makefile 也證實這一點
obj-$(CONFIG_VT) += vt_ioctl.o vc_screen.o selection.o keyboard.o

3. 在 term 下執行 `ps` 或是 ` ls -l /dev/fd/ ` 就可以觀察到 term 對應的輸入輸出
如 VT 或是 Framebuffer VT 下,是 /dev/tty[1-6]
而 fbterm, jfbterm, xterm, screen,... 及其他 user space 的 term 下,則是
/dev/pty/[0-9]+

4. PTY 跟 VT 相近,而跟 TTY 是不同層級的。
VT 的輸入跟顯示都是用 kernel 內容的實體 driver 來實現。
PTY 也是有一對字鍵式輸入裝置跟行列式字符顯示器的組合。
但 PTY 則是將輸入跟顯示作成虛擬的介面函式,讓 user space 的應用程式可以接過去實作。
因此, screen, xterm, fbterm, jfbterm,... 下都是 /dev/pty/[0-9]


5. "Console" 這個名詞主要是指顯示器。
在 linux kernel 下,是分類在 ${KERN_SRC}/drivers/video/console/
若已含輸入裝置的話,通常是用 term 來指稱。
VT 指定 console 的部分可以看 vt.c 下的 con_init()
相關變數名是 con_driver

6. 各元件所對應的程式碼的位置

TTY: ${KERN_SRC}/drivers/char/{ n_tty.c tty_audit.c tty_buffer.c
tty_io.c tty_ioctl.c tty_ldisc.c tty_port.c }
VT: ${KERN_SRC}/drivers/char/{ vt.c vt_ioctl.c }
CONSOLE: ${KERN_SRC}/drivers/video/console/{ fbcon.c fbcon_cw.c
fbcon_ud.c fbcon_ccw.c fbcon_rotate.c fbcondecor.c vgacon.c }
KBD: ${KERN_SRC}/drivers/char/keyboard.c

7. 鍵盤輸入觸發 VT 的流程

在 ${KERN_SRC}/drivers/char/keyboard.c 裡, VT 用
input_register_handle() 註冊一個鍵盤處理結構 kbd_handler 。
每當鍵盤觸發後,kbd_handler 自 kernel 收到事件後,接連呼叫 kbd_event() 的成員函式。然後傳遞下去:

kbd_event() -> kbd_rawcode() -> put_queue() ->
tty_insert_flip_char() + con_schedule_flip();

這個是在鍵盤事件進入 TTY 之前的函式傳遞流程。
在 tty_insert_flip_char() + con_schedule_flip() 後,就是 TTY 裡的字符處理。

8. VT 所使用的 kbd 和 X Window 現在所使用的 evdev 是兩個不同的來源
kernel 所註冊的 input_handler 可以用 `grep -Hr 'input_register_handle'` 找出所有的輸入來源。

9. TTY 裡的字符處理可以參考下列幾篇文章:

"linux设备驱动之控制台驱动"
http://blog.chinaunix.net/u1/51562/showart_1099404.html

"书写基于内核的linux键盘纪录器"
http://www.xfocus.net/articles/200208/425.html

其中"书写基于内核的linux键盘纪录器"有描述到截取輸入的地方和理由,同時也提供一個實際的程式運作。
非常有參考價值。

10. 一般 term 都會有輸入觸發顯示的交界,之前 trace 過的 jfbterm, fbiterm, fbterm, 及 boglterm
都有一個核心程序來處理輸入觸發輸出的交界。特徵通常是:
* 在一個迴圈裡
* 會有 FD_ISSET 及 select() 來偵測輸入狀態
* 有 if elif else... 或是 switch case 來過濾特殊的控制字元。
* 會有 flush, redraw, screen_, put_chars 之類的重繪指令

在 kernel 的 VT 裡,目前看到所看到的核心程序,很可能是在
${KERN_SRC}/drivers/char/vt.c 下的 do_con_write()

這個函式裡有 utf8 的解析,還有讀取 tty 的 buffer 資料,並判斷輸入的狀態。

===================================================
( 以上的資訊,是以 linux kernel 2.6.32 + cjk utf8 patch 的程式碼為主 )

就目前所接觸到的資訊,我認為為中文 kernel 加上輸入法的支援是可能的。

目前直覺想到的兩個方向是:

1. 在 kernel space 的 VT 裡作一個輸入法的 hook,
同時透過 API 與 user space 的函式庫交換輸入法運算及組字資訊。
( 不知道能不能作到,也許根本不可行 )

2. 一樣在 kernel space 的 VT 裡作一個輸入法的 hook,
但在 kernel space 裡內建極簡的查表函式及輸入法表格 ( ex: .cin 格式 )
同時也需要實作組字資訊的顯示

由於自己還沒有任何 linux kernel or module programming 的程式經驗, 目前還在學習等待的階段。
目前猜想這個工程可能會需要一些相關的資訊如:

* cin 的查表函式實作
* inline table 的 c 語言寫法
* kernel space <-> user space 的作法

若大家能願意提供、分享一些相關的資訊、或是範例程式,相關專案的訊息,那就太好了,相信這對有意參與實作的人都有不小的幫助 。

最新的情況大概是這樣,這裡先謝謝這段期間這些熱心朋友的建議及協助 :-)

sincerely, Mat.

2009/12/20 kou yu <cky...@gmail.com>

Reply all
Reply to author
Forward
0 new messages