科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基于Linux系统核心的汉字显示的尝试 (2)

基于Linux系统核心的汉字显示的尝试 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在阐述基于Linux核心的汉字显示的技术细节之前,有必要介绍一下原有linux的工作机制。这里主要涉及到两部分的知识,就是Linux下终端和帧缓冲的实现。

作者:syn 来源:赛迪网技术社区 2007年10月21日

关键字: 操作系统 汉字显示 核心 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

其中tty是指向tty_struct结构的指针,这个结构里面存放着关于这个tty的所有信息(请参照linux/include/linux/tty.h)。Tty_struct结构中定义了通用(或高层)tty的属性(例如宽度和高度等)。

在do_con_write( )函数中用到了tty_struct结构中的driver_data变量。 driver_data是一个vt_struct指针。在vt_struct结构中包含这个tty的序列号(我们正使用tty1,所以这个序号为1)。Vt_struct结构中有一个vc结构的数组vc_cons,这个数组就是各虚拟终端的私有数据。

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 

. . . . . 

}

要访问虚拟终端的私有数据,需使用vc_cons〔currcons〕.d指针。这个指针指向的结构含有当前虚拟终端上光标的位置、缓冲区的起始地址、缓冲区大小等等。 "hello, world.\n"中的每一个字符都要经过conv_uni_to_pc( ) 这个函数转换成8位的显示字符。这要做的主要目的是使不同语言的国家能把16位的UniCode码映射到8位的显示字符集上,目前还是主要针对欧洲国家的语言,映射结果为8位,不包含对双字节(double byte)的范围。

这种UNICODE到显示字符的映射关系可以由用户自行定义。在缺省的映射表上,会把中文的字符映射到其他的字符上,这是我们不希望看到也是不需要的。所以我们有两个选择∶

1不进行conv_uni_to_pc( )的转换。

2加载符合双字节处理的映射关系,即对非控制字符进行1对1的不变映射。我们自己定制的符合这种映射关系的UNICODE码表是direct.uni。

要想查看/装载当前系统的unicode映射表,可使外部命令loadunimap。 经过conv_uni_to_pc( )转换之后,"hello, world.\n"中的字符被一个一个地填写到tty1的缓冲区中。然后do_con_write( )调用下层的驱动,把缓冲区中的内容输出到显示器上(也就相当于把缓冲区的内容拷贝到VGA显存中去)。

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

*)draw_to-(u16 *)draw_from, y, draw_x);

之所以要调用底层驱动,是因为存在不同的显示设备,其对应VGA显存的存取方式也不一样。 上面的Sw->con_putcs( )就会调用到fbcon.c中的fbcon_putcs()函数(con_putcs是一个函数的指针,在Framebuffer模式下指向fbcon_putcs()函数)。也就是说在do_con_write( )函数中是直接调用了fbcon_putcs()函数来进行字符的绘制。比如说在256色模式下,真正负责输出的函数是:

void fbcon_cfb8_putcs(struct vc_data *conp, 
struct display *p,const unsigned short *s, int count, int 

yy, int xx)
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章