=================>8 BEGIN of TECH_UNICON.TXT 8<==================

                Linuxĵĺʾĳ

                          Ͻ
                          ϲ

ԭ

    ڲLinuxĵĺʾļϸ֮ǰбҪһ
ԭLinuxĹơҪ漰ֵ֪ʶLinuxն˺֡
ʵ֡

̨console
    ͨlinux¿Ŀ̨(console)ɼ豸ɵġֱ
/dev/ttyNtty0/dev/consoletty1tty2ǲͬն
virtual consoleͨʹȼalt+FnЩն֮
еЩtty豸linux/drivers/char/console.cvt.cӦ
console.cĻϵַvt.cͬնˣ
ṩconsole.cҪƵݡvt.cѲͬնҪconsole.c
ƵݷŵͬĻȥvt.cһ飬Ҹ
лָһǱġն˾ͶӦ
űĻconsole.cͬʱҲն˵룬Ȼѽյ
ŵ

֡壨framebuffer
    FramebufferǰԴһ豸ͨ豸Ķдֱ
ԴвֲǳģͳһġûعԴλ
áҳƵȵȾϸڡЩFramebuffer豸ɵġ
    FramebufferӦԴļlinux/drivers/video/Ŀ¼¡ܵĳ
ļΪfbcon.cĿ¼»ԿصԴļ
    ʹ֡ʱLinuxǽԿͼģʽµġ


    һ򵥵˵ַʾĹ̡Ǽն1
/dev/tty1һµļ򵥳
	main ()
	{
		puts("hello, world.\n");
	}
    putsȱʡļ(/dev/tty1)дϵͳ
write(2)ϵͳõlinuxӦĺĺconsole.cе
con_write()con_write()ջdo_con_write()do_con_write()
и"hello, world.\n"ַŵtty1ӦĻȥ
    do_con_write()ַ͹λáһ
do_con_write()
	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.htty_structṹ
ͨã߲㣩ttyԣȺ͸߶ȵȣ
    do_con_write()õtty_structṹеdriver_data
    driver_dataһvt_structָ롣vt_structṹаtty
кţʹtty1Ϊ1vt_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; //vc_nums1
	. . . . . .
	}
    Ҫն˵˽ݣʹ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. ط˫ֽڴӳϵԷǿַ11Ĳ
       ӳ䡣ԼƵķӳϵUNICODEdirect.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)

ʾ
    ˵ͼһġputcs("\n");""Ϊ
0xc40xe30xba0xc3ʱôأһԿ϶""
϶ĻϣԭС
    1. ûкֿ⣬ʾ֮ˡ
    2. ڸַʾvoid fbcon_cfb8_putcs()Уԭв¡
       ÿҪʾַδն˻WORDΪλȡ
      λֽASCII룬8λַԣں˫ֽڱ
       뷽ʽֲǲʾֵģֻʾxxxx_putcs()
       һһVGAַ

       Ҫ
       ȷdo_con_write()ʱuni_pcתıԭб롣һֱ
       ӵʵַʽǼһԼƵUNICODEӳ
       loadunimap direct.uniֱӰdirect.uniΪĵȱʡӳ

    ⣬ҪĵһԷ¡

    Ҫںмغֿ⣬Ȼ޸fbcon_cfb8_putcs()
fbcon_cfb8_putcs()һζWORDWORDĵλֽǷƴ
һ֣ƴһ֣ںֿеƫƣ
Ȼһ16 x 16VGAַʾ

    Ľ
	1. ܹ֣಻ĵط˵԰
	   ֿʼһֺ֣ĺֶ롣
	   ֡⡣
	2. ƶƻֵʾΪƶĺֻ롣
	   Ϊĸͨxxxx_putc()ɵġxxxx_putc()
	   xxxx_putcs()ʵֵĹƣxxxx_putc()
	   ֻˢһַһַxxxx_putc()
	   һһַĵַxxxx_putc()
	   ¡
		void fbcon_cfb8_putc(struct vc_data *conp, 
			struct display *p, int c, int yy, int xx)

    һԷͬʱ޸xxxx_putcs()xxxx_putc()Ϊ
ֵ⣬ÿһ֮ǰĻǰеʼλÿʼɨ裬
ȷҪַǷڰֵλϡǰֵλã
Ӧĵǰƶһֽڵλÿʼ

    һѣxxxx_putc()ûĵַһ
Ϊxxxx_putc()޷ֱڵַбöǷ
֡

    ǣxxxx_putc()Ĺλò(yy, xx)Ƴ
ַڻеλáһЩС鷳Linuxն£û
ܻϾĻshift + pageup¹yӦַڻ
һ¡ӦĽǣƵĹУǾĲ

    һǾֽһõһԸõİ汾
ûнturbonetcfgֲᷢ˵ı߿ַҲɺʾ
Ϊֱ߿ַչַҲʹַĵ8λ
ʾ磬ߡһƱΪ0xC4һ߾һ
0xC4ɣ0xC4C4Ǻ֡ġˮƽƱһġġ
ˡҪͷǳˣΪƱȽ϶࣬Ҵ
ֱƱַʽֶֶжϳӦλõ
ǲƱ˵۲ȡʲôų㷨Ȼ
ΪܴڶԣûгƶϳǰַƱ
Ǻ֡

    һѰҸõų㷨һͼѰĽ
ҪӸϽ⣬ĸϢӻַ
жǲġ

    һŬǷ֣UNIXʹչַʱҪַת
УEscape sequenceлǰַַתԿַ
EscΪ׵ĿUNIXնն˿
ƶꡢɾлַȵȡҲ˵Ʊ
ַ֮ǰͨҪضַתСconsole.cи
ַת¼ַ״̬ıϸñṩϢͿԷ
ɾذƱ뺺

    ˼·ָ£ֲµĽĶõһ
汾

    °汾ϣturbonetcfgڳλƵʱƱ뺺ֱ
ֿǷǳȷġµڡturbonetcfgػ
ʱлն˻ƶʱ򣩣ƱǱ˺֣
Ϊػȫڻʱ¼ַ״̬ıӳǰ
ַ״̬⻹ûսֻص㡣:-(

    սֶαǰַ״̬ÿһַڻ
Соһ»Ľṹ

    ÿһַռ16λĻ8λASCIIֵȫã8λ
ǰɫͱɫԣҲûжĿռáֻ
µĻΪ˱һԣǾԭĻͬ
СĻǷǺֵϢ

    Ҳж߻ʣֻҪΪÿַһbitϢ־Ƿ
־㹻ˣΪʲôҪԭСͬ˫ǲ̫
˷أ

    ȷ⣬Ժش

    ʵһbit־ǵǰַǺֵ߻Ұߵ
ͻʡȥɨĻϵǰַĹһ̻򵥡
ж߻ʣʹʹ8bitܹ˰ɣΪʲôҪʹ16bit
أ

    ǵǡõ8λźһ룬ø8λе2bit
ĸϢ8λʣ6λźֻ뷽ʽ
BIG5ġģϢӶʹǿʵͬʾ˫ֽ
Եַ໥š⣬ڱʱ˫ҲȽ׼㡣

    Ǿͻشϵ⡣
    Ϊֹһ׳׽ֺƱ໥šֵˢ
¡ػķʣµľǾʵֵˡ

    ǣFramebufferܶ࣬޸ÿһxxxx_putc()
xxxx_putcs()һСĹңĶÿ
ĲҲǺ鷳ģǶӲٵԿ޸ĺͲԻס

    ô治һֲҪ޸Կķأ

    һŬǷ֣ڵxxxx_putcs()xxxx_putc()
֮ǰ޸vgaָֿʹָʾĺںֿе
λãһֵvga ASCIIַҲ˵ںд
ֿ⣬һԭеvgaַֿ⣬һǺֿ⣬Ҫ
ֵʱ򣬾ͰvgaָָֿֿӦλã֮
ٰѸָָvgaֿԭλá

    һֻҪ޸fbcon.cconsole.cconsole.cά
˫ÿһַϢ븽ӵĻfbcon.c
˫иӵϢvgaָֿ룬õײʾ

    ﻹмҪעĵط
	1Ļػԭ򣬵õײxxxx_putc()xxxx_putcs()
	   ĵطжദֱװã
	   ֿ⡢xxxx_putcs()xxxx_putc()ָֿȹܡ
	2. ΪʵϹshift + pageupʱҲ֣ܿ
	   Ҫ޸ġ
	   Linuxն˵ʱṩ˻ع˱Ļ
	   ϢĹܣȼϹshift + pageupǰ
	   ʹõնӵһĻsoft back
	   űĻϢлն˵ʱ򣬹
	   ݻᱻµնʹáϹʱ
	   ʾǹеݡˣϹʱ
	   򿴵֣ҲӱȷûϢʧ
	   ĻϢ򹫹дʱ򣬱Ӧĸ
           ϢҲдĸҪfbcon.c붮
	   ùĸϢ
	   Ȼһ͵ķǾǲûϹ
	   ԹĴ
	3. Ѳͬı뷽ʽGBBIG5ĺͺģдɲͬmodule
	   ʵֶ̬أӶʹչµı뷽ʽҪ±
	   ġ

С
    ͨLinuxĵ̽Ƿ֣ĿǰLinuxĺУ
ȫûпǵ˫ֽڱַʾһ׽
ºʾķʵ˸÷

    ѭĵGPLȨͬʱʵһԴ룬Ȼ
ЩĶȻGPLġܶоĵһЩҶ
ĵظУջ

    ǶԺĺĻ˵һֳԣԶյ㡣ָĶ
ٴһЩhackɫʣ̫ںϽȨĺȥڻ̽
ԲһķһȻҪͨLinuxȺĹ
ͬŬʵ֡ҲǳӭҺǹͬһ⡣


    ʵֵKernel Patchļpatch.kernel.chineseԴ˼
˾ҳhttp://www.turbolinux.com.cnء

	cd /usr/src/Ŀ¼ӦLinuxԴڵĿ¼linux/
	patch -p0 -b < patch.kernel.chinese
	make menuconfig
     ѡConsole driversѡе
	[*] Double Byte Character Display Support(EXPERIMENTAL)
	[*] Double Byte GB encode (module only)
	[*] VESA VGA graphics console
	<*> Virtual Frame Buffer support (ONLY FOR TESTING!)
	<*> 8 bpp packed pixels support
	<*> 16 bpp packed pixels support
	<*> VGA characters/attributes support
	[*] Select compiled-in fonts
	[*] VGA 8x8 font
	[*] VGA 8x16 font

	make dep
	make bzImage
	make modules
	make install
	make modules_install
    Ȼµĺ
	insmod encode-gb.o

  =================>8 END of TECH_UNICON.TXT  8<==================
