音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

介紹Linux 升級的漢子顯示解決方法

出處:互聯(lián)網(wǎng)    發(fā)布于:2011-09-04 12:47:00

    我們先來了解下Linux 的歷史背景和一些功能。inux 操作系統(tǒng)是UNIX 操作系統(tǒng)的一種克隆系統(tǒng)。它誕生于1991 年的10 月5 日(這是次正式向外公布的時間)。以后借助于Internet 網(wǎng)絡,并經(jīng)過全世界各地計算機愛好者的共同努力下,現(xiàn)已成為今天世界上使用多的一種UNIX 類操作系統(tǒng),并且使用人數(shù)還在迅猛增長。   Linux 操作系統(tǒng)的誕生、發(fā)展和成長過程始終依賴著以下五個重要支柱:UNIX 操作系統(tǒng)、MINIX 操作系統(tǒng)、GNU 計劃、POSIX 標準和Internet 網(wǎng)絡。   下面主要根據(jù)這五個基本線索來追尋一下Linux 的開發(fā)歷程,它的醞釀過程,初的發(fā)展經(jīng)歷。首先分別介紹其中的四個基本要素(UNIX、MINIX、GNU 和POSIX,Internet 的重要性顯而易見,所以不用對其羅嗦),然后根據(jù)Linux 的創(chuàng)始人Linus Toravlds 從對計算機感興趣而自學計算機知識,到心里開始醞釀編制一個自己的操作系統(tǒng),到初Linux 內核0.01 版公布,以及從此如何艱難地一步一個腳印地在全世界hacker 的幫助下推出比較完善的1.0 版本這段時間的發(fā)展經(jīng)過,也即對Linux 的早期發(fā)展歷史進行詳細介紹。


    在闡述基于Linux的漢字顯示的技術細節(jié)之前,有必要介紹一下原有l(wèi)inux的工作機制。這里主要涉及到兩部分的知識,就是Linux下終端和幀緩沖的實現(xiàn).

    控制臺(console)

    通常我們在linux下看到的控制臺(console)是由幾個設備完成的。分別是/dev/ttyN(其中tty0就是/dev/console,tty1,tty2就是不同的虛擬終端(virtual console)).通常使用熱鍵alt Fn來在這些虛擬終端之間進行切換。所有的這些tty設備都是由linux/drivers/char/console.c和vt.c對應。其中console.c負責繪制屏幕上的字符,vt.c負責管理不同的虛擬終端,并且負責提供console.c需要繪制的內容。Vt.c把不同虛擬終端下需要交給console.c繪制的內容放到不同的緩存中去。Vt.c管理著這樣一個緩沖區(qū)的數(shù)組,并且負責在其間切換,以指定哪一個緩沖區(qū)是被激活的。你所看到的虛擬終端就對應著被激活的緩沖區(qū)。Console.c同時也負責接收終端的輸入,然后把接收到的輸入放到緩沖區(qū)。

    幀緩沖(framebuffer)

    Framebuffer是把顯存抽象后的一種設備,可以通過這個設備的讀寫直接對顯存進行操作。這種操作是抽象的,統(tǒng)一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節(jié)。這些都是由Framebuffer設備驅動來完成的。

    Framebuffer對應的源文件在linux/drivers/video/目錄下??偟某橄笤O備文件為fbcon.c,在這個目錄下還有與各種顯卡驅動相關的源文件。在使用幀緩沖時,Linux是將顯卡置于圖形模式下的.

    我們以一個簡單的例子來說明字符顯示的過程。我們假設是在虛擬終端1(/dev/tty1)下運行一個如下的簡單程序。

   main ( )

   {

   puts("hello, world.\n");

   }

   puts函數(shù)向缺省輸出文件(/dev/tty1)發(fā)出寫的系統(tǒng)調用write(2)。系統(tǒng)調用到linux里面對應的函數(shù)是console.c中的con_write(),    con_write()終會調用do_con_write( )。在do_con_write( )中負責把"hello, world.\n"這個字符串放到tty1對應的緩沖區(qū)中去。

   do_con_write( )還負責處理控制字符和光標的位置。讓我們來看一下do_con_write()這個函數(shù)的聲明。

   static int do_con_write(struct tty_struct * tty, int

   from_user, const unsigned char *buf, int count) 其中tty是指向tty_struct結構的指針,這個結構里面存放著關于這個tty的所有信息(請參照linux/include/linux/tty.h)。Tty_struct結構中定義了通用(或高層)tty的屬性(例如寬度和高度等)。

   在do_con_write( )函數(shù)中用到了tty_struct結構中的driver_data變量。

   driver_data是一個vt_struct指針。在vt_struct結構中包含這個tty的序列號(我們正使用tty1,所以這個序號為1)。Vt_struct結構中有一個vc結構的數(shù)組vc_cons,這個數(shù)組就是各虛擬終端的私有數(shù)據(jù)。

   static int do_con_write(struct tty_struct * tty, int

   from_user,const unsigned char *buf, int count)

   {

   struct vt_struct *vt = (struct vt_struct *)tty->

   driver_data;/我們用到了driver_data變量

   currcons = vt->vc_num; file:/我們在這里的vc_nums就是1

   }

   要訪問虛擬終端的私有數(shù)據(jù),需使用vc_cons〔currcons〕.d指針。這個指針指向的結構含有當前虛擬終端上光標的位置、緩沖區(qū)的起始地址、緩沖區(qū)大小等等。

   "hello, world.\n"中的每一個字符都要經(jīng)過conv_uni_to_pc( )

    這個函數(shù)轉換成8位的顯示字符。這要做的主要目的是使不同語言的國家能把16位的UniCode碼映射到8位的顯示字符集上,目前還是主要針對歐洲國家的語言,映射結果為8位,不包含對雙字節(jié)(double byte)的范圍。

    這種UNICODE到顯示字符的映射關系可以由用戶自行定義。在缺省的映射表上,會把中文的字符映射到其他的字符上,這是我們不希望看到也是不需要的。所以我們有兩個選擇∶

   1不進行conv_uni_to_pc( )的轉換。

   2加載符合雙字節(jié)處理的映射關系,即對非控制字符進行1對1的不變映射。我們自己定制的符合這種映射關系的UNICODE碼表是direct.uni。

   要想查看/裝載當前系統(tǒng)的unicode映射表,可使外部命令loadunimap。

   經(jīng)過conv_uni_to_pc( )轉換之后,"hello, world.\n"中的字符被一個一個地填寫到tty1的緩沖區(qū)中。然后do_con_write( )調用下層的驅動,把緩沖區(qū)中的內容輸出到顯示器上(也就相當于把緩沖區(qū)的內容拷貝到VGA顯存中去)。

    sw->con_putcs(vc_cons〔currcons〕.d, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x);

    上面的Sw->con_putcs( )就會調用到fbcon.c中的fbcon_putcs()函數(shù)(con_putcs是一個函數(shù)的指針,在Framebuffer模式下指向fbcon_putcs()函數(shù))。也就是說在do_con_write( )函數(shù)中是直接調用了fbcon_putcs()函數(shù)來進行字符的繪制。比如說在256色模式下,真正負責輸出的函數(shù)是void fbcon_cfb8_putcs(struct vc_data *conp, struct display *p,const unsigned short *s, int count, int yy, int xx)
  
    顯示中文

    比如說我們試圖輸出一句中文∶putcs(你好\n );(你好的內碼為0xc4,0xe3,0xba,0xc3)。這時候會怎么樣呢,有一點可以肯定,"你好"肯定不會出現(xiàn)在屏幕上,原因有∶中沒有漢字字庫,中文顯示就是無米之炊了.

    1在負責字符顯示的void fbcon_cfb8_putcs( )函數(shù)中,原有操作如下∶對于每個要顯示的字符,依次從虛擬終端緩沖區(qū)中以WORD為單位讀?。ǖ臀蛔止?jié)是ASCII碼,高8位是字符的屬性),由于漢字是雙字節(jié)編碼方式,所以這種操作是不可能顯示出漢字的,只能顯示出xxxx_putcs()是一個一個VGA字符。
 
   要解決的問題∶

   確保在do_con_write( )時uni□pc轉換不會改變原有編碼。一個很直接的實現(xiàn)方式就是加載一個我們自己定制的UNICODE映射表,loadunimapdirect.uni,或者直接把direct.uni置為的缺省映射表。



  

版權與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關法律責任。

本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。

如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網(wǎng)聯(lián)系,否則視為放棄相關權利。

OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術客服:

0571-85317607

網(wǎng)站技術支持

13606545031

客服在線時間周一至周五
9:00-17:30

關注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!