如何改造 Linux 虚拟终端显示文字
作者&投稿:佘冉 (若有异议请与网页底部的电邮联系)
将当前文字设置成英文:
命令行输入
LANG=en_US
回车
你说的是查看以前的命令输出吧:
Shift + PageUp/PageDown
(向上/下滚屏)
如果说的是查看以前自己输入过什么命令:
Up(上箭头)
或者
vim ~/.bash_history
必须使用 UTF-8 模式 ( 默认 vc->utf=1 即可 )
虚拟控制台的 vc_screenbuf 必须修改以为 glyph 提供至少 16bit 的空间。
图形控制台需要 vc_font包含更多的字符,不只是 255 个,并提供代码绘制双倍宽度的中文字形,字体中的字符按照 UNICODE
排列,这样 glyph 就是字符的 UNICODE 编码。
修改虚拟控制台
一开始,我的打算是 vc_screenbuf 修改为 unsigned long long* 类型,32bit 给字符属性,分别表示 16bit
终端前景色和背景色。glyph 则拥有 31bit 的空间 , 因为汉字的宽度为双倍的英文字母 ,其中 1 bit 用来表示双字符宽度。比如 '我' 会表达为
两个 '我',第二个'我'的最高位为 1:绘制任何字形的时候,只绘制字形的左半部分;如果发现最高位为 1
则绘制字体位图中的右半部分。这样同样的绘制代码可以适应英文字母和汉字。写入 vc_screenbuf 的时候,
如果是双倍宽度的字符,需要同时写入两份,第二份的最高位置 1 就可以。但是 vc_screenbuf
的格式已经被到处假定为每字符两个字节。如此修改导致牵一发动全身。许多艰涩难懂的代码都依赖 vc_screenbuf 是
每字符两个字节的设定,直接修改定义后,光是编译器能直接检测出来的就有百余个地方需要修改,还有更多的逻辑并不能被编译器检测出来。如此修改的后果就是会出现许多隐晦的错误,非常难于调式。挣扎后,为最终选择了另一条道路
:
为汉字重新分配一块 vc_unicode_screenbuf
vc_unicode_screenbuf 紧挨着 vc_screenbuf , 事实上 vc_screenbuf
在分配空间的时候,多分配了一倍的空间,多分配的空间充作 vc_unicode_screenbuf,因此 struct vc_data 里并没有添加
vc_unicode_screenbuf 成员。 vc_unicode_screenbuf 同样为每字符 2 个字节,并不包含字符属性,所以 2
个字节如数用来保存 glyph。vc_screenbuf 格式未变,所以 vgacon 不需要修改,这就减少了大量的工作量。向 vc_screenbuf
写入字符的时候,同时写入一份到 vc_unicode_screenbuf 。如果是汉字,由于其 glyph 大于 254 , 所以 vc_screenbuf
的那两个字符 ( 汉字双倍宽度 ) 实际写入的是 0xff 和 0xfe ( 故而上文提到是 glyph 大于 254 的字符 ,0xfe 被保留它用了
)。0xff 表示该字符的 glyph 要到 vc_unicode_screenbuf 提取,然后绘制左半部分;0xfe 表示该字符的 glyph 要到
vc_unicode_screenbuf 提取,然后绘制右半部分。对于 glyph 大于 254 但是又不是双倍宽度的字符,就不需要 0xfe
作陪了。比如屏幕上显示的文字是黑底白字的 “牛 B” , vc_screenbuf 的内容就是 “0x00ff, 0x0ffe, 0x0f42 ” ,
vc_unicode_screenbuf 的内容则是 “牛 , 牛 ,b”
。这是因为一个汉字为两倍的英文字母宽度。在屏幕文字缓冲区上也必须占用两个字符的位置。并且必须有一种机制能知道应该绘制左半部分和右半部分,我使用的就是 0xff
和 0xfe。
修改图形控制台绘制代码
要修改的地方只有 3 个。
struct console_font 添加 charcount 成员。将主线内核的字体设置为 charcount = 255。 主线内核带的字体都是
255 个 glyph 的,所以没有添加字符个数的必要。不过我们即将要添加的字体会有数万字符。
添加一个新的字体,复盖 UNICODE BMP 基本区域的所有符号。
修改字符绘制代码,添加 vc_unicode_screenbuf 的支持。
字符绘制代码的修改比较繁琐,代码分布在 drivers/video/console/ 下的多个文件中。fbcon_putc(s) 由由
vc->vc_sw->con_putc(s) 调用, fbcon_putc(s) 转而调用分散于 drivers/video/console/
的多个 puts 实现。因为终端要支持 console_rotate , decoration , timing , 故而每种模式下的绘制实现都是不同的。我拿
drivers/video/console/bitblt.c 最常用的不倾斜、不加装饰等的终端模式为例来讲解绘图部分的修改。由于中文字体为 16x16
点阵,是对齐的字体,故而其绘制代码为 bit_putcs_aligned() 原先的代码以 glyph 为下标到 vc->vc_font->data
获得字体数据,然后调用 fb_pad_aligned_buffer 执行块拷贝操作。我的修改很简单,原来获得字体数据的代码修改后放入 font_bits()
辅助函数。 在 font_bits 里,要判断 glyph 是否为 0xff 或者 0xfe, 如果不是,使用 glyph 为下标获得字体的左半部分后并返回。
如果是,则从 vc_unicode_screenbuf 获得真正的 glyph 数值,然后再依据现有的 glyph 是 0xff 还是 0xfe
去获得字体的右半部分还是左半部分返回。font_bits 获得字体数据后执行 fb_pad_aligned_buffer 块拷贝。需要修改的地方还有
drivers/video/console/fbcon_ccw.c fbcon_cw.c fbcon_ub.c 。依原理进行修改即可。
狄砌富马: 必须使用 UTF-8 模式 ( 默认 vc->utf=1 即可 ) 虚拟控制台的 vc_screenbuf 必须修改以为 glyph 提供至少 16bit 的空间. 图形控制台需要 vc_font包含更多的字符,不只是 255 个,并提供代码绘制双倍宽度的中文字形,字体中的字符按照 ...
叠彩区15195546941: 如何更改linux终端显示颜色 - ?
狄砌富马: 哪个?是wm下的模拟终端还是console?如果是模拟终端,配置随你的模拟软件不同而不同,konsole和gnome-terminal都是在上面的命令选项里的,自己找,其他的大部分是根据命令行参数来的,要加命令参数,一般是-bg 和 - fg来修改背景和字体的颜色,或者是配置文件,一般是rc后缀那种 如果是console那么就要靠设置PS1变量来了,因为这个变量很不直观,所以你还是google一下这个关键字好了.
叠彩区15195546941: 如何让linux虚拟机全屏显示 - ?
狄砌富马: Ctrl+Alt+Enter后,虚拟机倒是全屏了,但因为linux的显示率太小,所以只能占据屏幕的一部分! 故调整linux显示率即可: 右上角->系统设置->显示,将分辨率调整成显示器的分辨率就ok了! 注意: 分辨率大于显示器建议分辨率,则系统只能显示一部分,右侧或底部会出现滚动条, 而当分辨率设置太小时,当然就不能占据整个屏幕了! 调整分辨率后,Ctrl+Alt+Enter将虚拟机全屏显示,ok,linux也全屏了!
叠彩区15195546941: linux终端如何扩大显示屏,如下有两个框,我要把小框的内容扩展到大框,跟windows一样可以收缩?? - ?
狄砌富马: 安装VMware Tools 菜单——查看——自动调整大小....再看看别人怎么说的.
叠彩区15195546941: arm嵌入式linux如何实现在触摸屏上显示终端操作? - ?
狄砌富马: 这个是可以的,,因为本身Linux系统运行不需要gui,可以是终端模式,下面是实现的方法,1,驱动支持,内核必须支持LCD, USB, HID模块,2,busybox配置,etc/inittab文件,加上tty1::askfirst:-/bin/sh
叠彩区15195546941: 在虚拟机环境下,如何把linux分辨率调的高一点啊 - ?
狄砌富马: 在终端下,输入system-config-display进入显示设置 点第二个选项卡,选择LCD->选择你想选择的分辨率 再回到第一个选项卡,选择你想要的分辨率,按确定后,注销重新登录
叠彩区15195546941: 在virtual box上装了Linux整体页面窗口都很小 鼠标也很小 怎么改?分辨率已 - ?
狄砌富马: 虚拟机装的系统内,打开“显示”,然后调大小. 调的是屏幕大小,不是分辨率.
叠彩区15195546941: 虚拟机linux系统怎么全屏显示 - ?
狄砌富马: 原因:在vm中安装linux虚拟机不能全屏,是因为没有安装vmware tools.安装步骤: 1、打开vmware,先运行安装的Linux虚拟机,然后单击菜单栏“虚拟机”——“安装vmware 工具“.如下图所示:2、这时候Linux虚拟机中会出现一个安装包,我是图形界面操作,直接右键,解压缩,然后运行解压文件中的 vmware-install.pl.这是一个安装脚本文件,按提示操作.切记在最后的安装步骤时,选择你的电脑分辨率.如下图所示:3、最后,必须重启虚拟机,才能看到效果.
叠彩区15195546941: linux在图形界面怎样用命令 - ?
狄砌富马: Linux图形界面使用命令可以打开“虚拟终端”软件,“虚拟终端”软件中可以执行任何Linux命令,方法是在图形界面中点击软件搜索框(大部分Linux发行版都有软件搜索功能),然后输入“终端”二字,就可以看到你自己的Linux发行版上面的“虚拟终端”软件了.
叠彩区15195546941: 如何让另一台linux的终端显示我输入的文字 - ?
狄砌富马: man wall 你可以查看wall的定义 尝试的话 可以 wall abc(发送abc) 单独发送的话 可以尝试 mesg 或者 write user [ttyname]