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の文は以下の通りです。
このように呼び出されたのは登録された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)
キティちゃんの中からキティちゃんを選んでください。(具体的には私が以前書いたソロ、キティちゃん、keyboard関係の分析を見てください。)
その中のキティちゃんは、キティちゃんをセットした一連の操作です。consoliverはキティちゃんねるタイプで、キティちゃんを登録したconuoperationは以下の通りです。
したがって、キティ設備ファイルに対して操作を書くのはconwritecon----------------------------------------------------------------------------------------------------driver/char/vt.cct.ccontric呼び出しdowriteにマクロ定義があります。
そのため、呼出されたのもvcudca構造体配列vcuconsの中のあるメンバーvcubcs関数です。以上のことから、printkとキティファイルを使って最後にvccansに呼び出されたあるメンバーvcuputcs関数です。
visualuuinitは、vc swの初期化visualuinit------------------------------------------drivers/char/v.c関数にあります。
これは、conswitchグローバル変数から来ていることが分かります。bindou udriverには、conswitchに対する割当値bindu uderivern---------------------------------------------------------------------------------drivers/char/vt.
したがって、conswitchの値は、その使用者と関連するbindoucondudiverにvtubiindによってvtubindに呼び出される--------------------------------driver/char/vt.cvtbindはstoreによってstorebandを呼び出される--------------------------------------driver/char/v.c/v.c
そこでconswitchは、vtconsolite udviceからの调节者vt consonit udeviceには2ヶ所の呼び出しがありますが、结局はレギターのuconudiverにレギターを呼び出します。-----------------------------------------driver/char/v.clの中には、文があります。
だからconswitchはregiststststeruconudiverから来ています。---------------------------------------------------------------------------------------------------------Drivers/vt.c.はdrivers/video/confconconakak/sover.ccccccccccccccccccccccは、Drivers中で呼び出ししました。中文文文文了了了了了了了了演演了了了了了了了了了了了soconconconconconfconconconconconconconconconconconconconconconconconconconconconconconconvt.cの中の文:
このためconswitchはfbucon.fbconから以下のように定義されています。
したがって、vccton[]で変数のメンバー変数vc sw->conuputcsがframe ebuffで対応するのはfbconcfbconguplutcs--------------------drivers/video/consolive/fbconc.コードは以下の通りである。
その具体的な呼び出しは、登録されたRegister ufbのputcsであり、これにより、printkからframe ebuffまでのキティからframe ebuffへの呼び出しクエリが完了したことがわかる。
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への呼び出しクエリが完了したことがわかる。