日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

基于Linux系統(tǒng)核心的漢字顯示嘗試( 四 )


但是,由于Framebuffer的驅(qū)動(dòng)很多,修改每一個(gè)驅(qū)動(dòng)的xxxx_putc()函數(shù)和xxxx_putcs( )函數(shù)會(huì)是一項(xiàng)不小的工作,而且,改動(dòng)驅(qū)動(dòng)程序后,每種驅(qū)動(dòng)的測(cè)試也是很麻煩的,尤其是對(duì)于有硬件加速的顯卡,修改和測(cè)試會(huì)更不容易 。
那么,存不存在一種不需要修改顯卡驅(qū)動(dòng)程序的方法呢?
經(jīng)過一番努力,我們發(fā)現(xiàn),可以在調(diào)用xxxx_putcs( )或xxxx_putc()函數(shù)輸出漢字之前,修改vga字庫的指針使其指向所需顯示的漢字在漢字字庫中的位置,即把一個(gè)漢字當(dāng)成兩個(gè)vga ASCII字符輸出 。也就是說,在內(nèi)核中存在兩個(gè)字庫,一個(gè)是原有的vga字符字庫,另一個(gè)是漢字字庫,當(dāng)我們需要輸出漢字的時(shí)候,就把vga字庫的指針指向漢字字庫的相應(yīng)位置,漢字輸出完之后,再把該指針指向vga字庫的原有位置 。
這樣一來,我們只需要修改fbcon.c和console.c,其中console.c負(fù)責(zé)維護(hù)雙倍緩沖區(qū),把每一個(gè)字符的信息存入附加的緩沖區(qū);而fbcon.c負(fù)責(zé)利用雙倍緩沖區(qū)中附加的信息,調(diào)整vga字庫的指針,調(diào)用底層的顯示驅(qū)動(dòng)程序 。
這里還有幾個(gè)需要注意的地方∶
1. 由于屏幕重繪等原因,調(diào)用底層驅(qū)動(dòng)xxxx_putc( )和xxxx_putcs()的地方有多處 。我們作了兩個(gè)函數(shù)分別包裝這兩個(gè)調(diào)用,完成替換字庫、調(diào)用xxxx_putcs( )或xxxx_putc( )、恢復(fù)字庫等功能 。
2.為了實(shí)現(xiàn)向上滾屏(shift pageup)時(shí)也能看到漢字,我們需要作另外的修改 。
Linux在設(shè)計(jì)虛擬終端的時(shí)候,提供了回顧被卷出屏幕以外的信息的功能,這就是用熱鍵來向上滾屏(shift pageup) 。當(dāng)前被使用的虛擬終端擁有一個(gè)公共的緩沖區(qū)(soft back),用來存放被滾出屏幕以外的信息 。當(dāng)切換虛擬終端的時(shí)候,公共緩沖區(qū)的內(nèi)容會(huì)被清除而被新的虛擬終端使用 。向上滾屏的時(shí)候,顯示的是公共緩沖區(qū)中的內(nèi)容 。因此,如果我們想在向上滾屏的時(shí)候看到漢字,公共緩沖區(qū)也必須加倍,以確保沒有信息丟失 。當(dāng)滾出屏幕的信息向公共緩沖區(qū)填寫的時(shí)候,必須把相應(yīng)的附加信息也填寫進(jìn)公共緩沖區(qū)的附加區(qū)域 。這就要求fbcon.c必須懂得利用公共緩沖區(qū)的附加信息 。
當(dāng)然,有另外一種偷懶的方法,那就是不允許用戶向上滾屏,從而避免對(duì)公區(qū)緩沖區(qū)的處理 。
3.把不同的編碼方式(GB、BIG5、日文和韓文)寫成不同的module,以實(shí)現(xiàn)動(dòng)態(tài)加載,從而使得擴(kuò)展新的編碼方式不需要重新編譯核心 。
小結(jié)
通過這次針對(duì)Linux核心的探索,我們發(fā)現(xiàn),目前Linux的核心設(shè)計(jì)中,完全沒有考慮到雙字節(jié)編碼字符的顯示 。我們?cè)谶@種情況下摸索出一套解決核心下漢字顯示的方法,并編碼實(shí)現(xiàn)了該方案.
遵循核心的GPL版權(quán)聲明,我們同時(shí)公布了實(shí)現(xiàn)這一技術(shù)的源代碼,當(dāng)然,這些改動(dòng)仍然是GPL的.如果能對(duì)研究核心的朋友有所幫助,減少一些大家對(duì)核心的神秘感,將是我們最大的收獲 。
但是對(duì)核心和中文化來說,這僅僅是一種嘗試,遠(yuǎn)不是終點(diǎn).這種改動(dòng)多少帶有一些hack的色彩,不太可能融合進(jìn)權(quán)威的核心里去.我們?nèi)栽诜e極探索圓滿解決這一問題的方法,相信這一結(jié)果必然需要通過國(guó)內(nèi)外Linux群體的共同努力才能實(shí)現(xiàn).我們也非常歡迎大家和我們共同討論這一問題.
測(cè)試
本文實(shí)現(xiàn)的Kernel Patch文件(patch.kernel.chinese)可以從http://www.turbolinux.com.cn下載 。Cd /usr/src/(該目錄下應(yīng)有Linux核心源程序所在的目錄linux/) patch -p0 -b < patch.kernel.chinese make menuconfig 請(qǐng)選擇Console drivers選項(xiàng)中的

〔*〕 Double Byte Character Display Support(EXPERIMENTAL)
〔*〕 Double Byte GB encode (module only)
〔*〕 VESA VGA graphics console
<*> Virtual Frame Buffer support (ONLY FOR TESTING!)

推薦閱讀