- /*
- * Store the video mode parameters for later usage by the kernel.
- * This is done by asking the BIOS except for the rows/columns
- * parameters in the default 80x25 mode -- these are set directly,
- * because some very obscure BIOSes supply insane values.
- */
- static void store_mode_params(void)
- {
- u16 font_size;
- int x, y;
- /* For graphics mode, it is up to the mode-setting driver
- (currently only video-vesa.c) to store the parameters */
- /*graphic_mode是一个定义在Video-mode.c里面的全局变量,我们之前知道一个定义而未被初始化的变量会放在.bss段里面,而在header.S里面,.bss段里的所有内容已经被初始化为0了,所以这里graphic_mode就应该是0, 而return其实将永远无法执行到。*/
- if (graphic_mode)
- return;
/*store_cursor_position实际上是调用INT 10 AH=0x03 来获取当前光标的位置并将其保存在boot_params.screen_info.orig_x和boot_params.screen_info.orig_y里面 */
- store_cursor_position();
-
- /*store_video_mode调用的是INT 10 AH=0x0f来获取当前的显示模式通过AH来返回当前显示模式下总共有可在屏幕上显示几列字符,AL返回当前的显示模式.AL=03代表是彩色显示模式,AL=07代表黑白显示模式。BH里面返回的是当前活动的显示页面是第几个。一般的设计,显卡工作在DOS兼容模式下显示页面是有2个,一个是0,一个是1.这是由于当期,显示都是准备好一个页面然后将其激活。关于显示页面我没有找google大神和翻资料。记得大学时候老师和教材里面是这么说的,懒得查了。有人知道我错的话欢迎指出。
- 最终返回的AH和BH会被保存到boot_params.screen_info.orig_video_mode和boot_params.screen_info.orig_video_page中*/
- store_video_mode();
/*video_segment指向当前的显示内存,在PC中是确定的位置。具体设置的值看以下代码,它会在save_screen中被用到*/
- if (boot_params.screen_info.orig_video_mode == 0x07) {
- /* MDA, HGC, or VGA in monochrome mode */
- video_segment = 0xb000;
- } else {
- /* CGA, EGA, VGA and so forth */
- video_segment = 0xb800;
- }
- set_fs(0); //将fs段寄存器设置为0
- font_size = rdfs16(0x485); /* Font size, BIOS area */ //从fs:0x485的内存处读取一个字,将其存储在font_size中。问题是fs:0x485里面是什么?
- boot_params.screen_info.orig_video_points = font_size;
- x = rdfs16(0x44a);//从fs:0x44a的内存处读取一个字。问题是fs:0x44a里面是什么?
- y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1;//从fs:0x44a的内存处读取一个字。问题是fs:0x484里面是什么?
//至今为止force_x和force_y从来没有被引用和初始话,因为它们在bss段,现在的值就应该是0,x和y不会给改变
- if (force_x)
- x = force_x;
- if (force_y)
- y = force_y;
- boot_params.screen_info.orig_video_cols = x; /*难道fs:0x44a里面就是当前显示模式下的显示列数目?*/
- boot_params.screen_info.orig_video_lines = y;/*难道fs:0x484里面就是当前显示模式下的显示行数目*/
- }