printkからframe ebuffまで

17354 ワード

ソースアドレス:http://blog.sina.com.cn/s/blog_633 f 462900 k 4 yw.
Linuxカーネルを使用したframe buffのvga表示には、2つの方法があります。(限られていますが、筆者の能力は2つしか分かりません。)画面に出力します。一つはprintkを通してスクリーンに出力します。もう一つは、キティファイルを操作して書くことです。1:printkからvc_までconsprintk  --------------------------------------ケネル/printk.cprintkはパラメータを処理した後、vprintkvprintkを呼び出します。ロゴcharがロゴに文字を塗りつぶします。buffでは、release_を呼び出します。ソロ曲sem()文字をrelease_にプリントアウトします。ソロ曲sem--------------------ケネル/printk.c関数は本来はリリース信号量であるが、同時にコールコールを呼び出した。ソロ曲driversはロゴをbuffの文字が印刷されます。コールソロ曲drivers----------ケネル/printk.c呼び出しコールソロ曲driversプリント文字_コールソロ曲drivers--------------ケネル/printk.c呼び出しコールソロ曲driversプリントキャラクターコールソロ曲drivers------------ケネル/printk.cuコールソロ曲driversの文は以下の通りです。
 436     for (con = console_drivers; con; con = con->next) {

 437         if ((con->flags & CON_ENABLED) && con->write &&

 438                 (cpu_online(smp_processor_id()) ||

 439                 (con->flags & CON_ANYTIME)))

 440             con->write(con, &LOG_BUF(start), end - start);

 441     }
 
このように呼び出されたのは登録されたconsoneのwrite関数であることがわかる。driver/char/vt.cに登録してもいいです。ソロ曲driver、その対応するwrite関数はvt_です。ソロ曲printvt_ソロ曲print------------driver/char/v.cvt_ソロ曲printの最終呼び出しはvc_です。cons[fguconsone].d->vc_sw->con_putcs(vc,start,cnt,vc->vc_y,vc->vc x)は文字を表示します。したがって、printkはvc_に遡ることができる。data構造体配列vc_コンサートの中のあるメンバーvc_sw->con_putcs関数2:キティちゃんからvc_までconsがキティ設備ファイルを書き込む時に呼び出す操作はキティちゃんです。fops(drivers/char/キティちゃん_io.c) 
 810 static const struct file_operations tty_fops = {

 811     .llseek     = no_llseek,

 812     .read       = tty_read,

 813     .write      = tty_write,

 814     .poll       = tty_poll,

 815     .unlocked_ioctl = tty_ioctl,

 816     .compat_ioctl   = tty_compat_ioctl,

 817     .open       = tty_open,

 818     .release    = tty_release,

 819     .fasync     = tty_fasync,

 820 };
 
キティちゃんの中からキティちゃんを選んでください。(具体的には私が以前書いたソロ、キティちゃん、keyboard関係の分析を見てください。)
2234     retval = init_dev(driver, index, &tty);
という語句があり、キティちゃんを関連付けることができます。具体的なキティキャップの登録例を通して、drivers/char/vt.cのvty nit関数に表示されます。
2965     console_driver->owner = THIS_MODULE;

2966     console_driver->name = "tty";

2967     console_driver->name_base = 1;

2968     console_driver->major = TTY_MAJOR;

2969     console_driver->minor_start = 1;

2970     console_driver->type = TTY_DRIVER_TYPE_CONSOLE;

2971     console_driver->init_termios = tty_std_termios;

2972     if (default_utf8)

2973         console_driver->init_termios.c_iflag |= IUTF8;

2974     console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;

2975     tty_set_operations(console_driver, &con_ops);

2976     if (tty_register_driver(console_driver))

2977         panic("Couldn't register console driver
");
 
その中のキティちゃんは、キティちゃんをセットした一連の操作です。consoliverはキティちゃんねるタイプで、キティちゃんを登録したconuoperationは以下の通りです。
2939 static const struct tty_operations con_ops = {

2940     .open = con_open,

2941     .close = con_close,

2942     .write = con_write,

2943     .write_room = con_write_room,

2944     .put_char = con_put_char,

2945     .flush_chars = con_flush_chars,

2946     .chars_in_buffer = con_chars_in_buffer,

2947     .ioctl = vt_ioctl,

2948     .stop = con_stop,

2949     .start = con_start,

2950     .throttle = con_throttle,

2951     .unthrottle = con_unthrottle,

2952     .resize = vt_resize,

2953 };
 
 
したがって、キティ設備ファイルに対して操作を書くのはconwritecon----------------------------------------------------------------------------------------------------driver/char/vt.cct.ccontric呼び出しdowriteにマクロ定義があります。
2096 #define FLUSH if (draw_x >= 0) { \

2097     vc->vc_sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to - (u16 *)draw_from, vc->vc_y, draw_x); \

2098     draw_x = -1; \

2099     }

2100 #endif
 
そのため、呼出されたのもvcudca構造体配列vcuconsの中のあるメンバーvcubcs関数です。以上のことから、printkとキティファイルを使って最後にvccansに呼び出されたあるメンバーvcuputcs関数です。
2908     for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {

2909         vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));

2910         INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);

2911         visual_init(vc, currcons, 1);

2912         vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);

2913         vc->vc_kmalloced = 0;

2914         vc_init(vc, vc->vc_rows, vc->vc_cols,

2915             currcons || !vc->vc_sw->con_save_screen);

2916     }
 
visualuuinitは、vc swの初期化visualuinit------------------------------------------drivers/char/v.c関数にあります。 
724     vc->vc_sw = conswitchp;
 
これは、conswitchグローバル変数から来ていることが分かります。bindou udriverには、conswitchに対する割当値bindu uderivern---------------------------------------------------------------------------------drivers/char/vt.
2992 static int bind_con_driver(const struct consw *csw, int first, int last,

2993                int deflt)

3029         conswitchp = csw;
 
したがって、conswitchの値は、その使用者と関連するbindoucondudiverにvtubiindによってvtubindに呼び出される--------------------------------driver/char/vt.cvtbindはstoreによってstorebandを呼び出される--------------------------------------driver/char/v.c/v.c
3317     struct con_driver *con = dev_get_drvdata(dev);

3320     if (bind)

3321         vt_bind(con);
だからconswitchはdevugetudvdataから来ています。vtconsolite udviceにあります。
3359     dev_set_drvdata(con->dev, con);
 
そこでconswitchは、vtconsolite udviceからの调节者vt consonit udeviceには2ヶ所の呼び出しがありますが、结局はレギターのuconudiverにレギターを呼び出します。-----------------------------------------driver/char/v.clの中には、文があります。
3420 int register_con_driver(const struct consw *csw, int first, int last)
 
だからconswitchはregiststststeruconudiverから来ています。---------------------------------------------------------------------------------------------------------Drivers/vt.c.はdrivers/video/confconconakak/sover.ccccccccccccccccccccccは、Drivers中で呼び出ししました。中文文文文了了了了了了了了演演了了了了了了了了了了了soconconconconconfconconconconconconconconconconconconconconconconconconconconconconconconvt.cの中の文:
 581     err = take_over_console(&fb_con, first_fb_vc, last_fb_vc,

 582                 fbcon_is_default);
 
このためconswitchはfbucon.fbconから以下のように定義されています。
3320 static const struct consw fb_con = { -----------------drivers/char/vt.c

3321     .owner          = THIS_MODULE,

3322     .con_startup        = fbcon_startup,

3323     .con_init       = fbcon_init,

3324     .con_deinit         = fbcon_deinit,

3325     .con_clear      = fbcon_clear,

3326     .con_putc       = fbcon_putc,

3327     .con_putcs      = fbcon_putcs,

3328     .con_cursor         = fbcon_cursor,

3329     .con_scroll         = fbcon_scroll,

3330     .con_bmove      = fbcon_bmove,

3331     .con_switch         = fbcon_switch,

3332     .con_blank      = fbcon_blank,

3333     .con_font_set       = fbcon_set_font,

3334     .con_font_get       = fbcon_get_font,

3335     .con_font_default   = fbcon_set_def_font,

3336     .con_font_copy      = fbcon_copy_font,

3337     .con_set_palette    = fbcon_set_palette,

3338     .con_scrolldelta    = fbcon_scrolldelta,

3339     .con_set_origin     = fbcon_set_origin,

3340     .con_invert_region  = fbcon_invert_region,

3341     .con_screen_pos     = fbcon_screen_pos,

3342     .con_getxy      = fbcon_getxy,

3343     .con_resize             = fbcon_resize,

3344 };
 
 
したがって、vccton[]で変数のメンバー変数vc sw->conuputcsがframe ebuffで対応するのはfbconcfbconguplutcs--------------------drivers/video/consolive/fbconc.コードは以下の通りである。
1332     struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];

1333     struct display *p = &fb_display[vc->vc_num];

1334     struct fbcon_ops *ops = info->fbcon_par;

1335

1336     if (!fbcon_is_inactive(vc, info))

1337         ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,

1338                get_color(vc, info, scr_readw(s), 1),

1339                get_color(vc, info, scr_readw(s), 0));
 
 
その具体的な呼び出しは、登録されたRegister ufbのputcsであり、これにより、printkからframe ebuffまでのキティからframe ebuffへの呼び出しクエリが完了したことがわかる。