2.3 设置虚拟盘空间并初始化

2.3 设置虚拟盘空间并初始化

接下来将对外设中的虚拟盘区进行设置。检查makefile文件中“虚拟盘使用标志”是否设置,以此确定本系统是否使用了虚拟盘。我们设定本书所用计算机有16 MB的内存,有虚拟盘,且将虚拟盘大小设置为2 MB。操作系统从缓冲区的末端起开辟2 MB内存空间设置为虚拟盘,主内存起始位置后移2 MB至虚拟盘的末端。图2-3展示了设置完成后的物理内存的规划格局。

调用rd_init()函数,开始对虚拟盘进行设置,具体执行代码如下:

 
 
  1. //代码路径:init/main.c:  
  2. void main(void)  
  3. {  
  4.     …  
  5. #ifdef RAMDISK  
  6.     main_memory_start += rd_init(main_memory_start, RAMDISK*1024);  
  7. #endif  
  8.     …  
  9. }  
  10. //代码路径:kernel/blk_drv/blk.h:  
  11.     …  
  12. #define NR_BLK_DEV 7  
  13.     …  
  14. struct blk_dev_struct {  
  15.     void (*request_fn)(void);  
  16.     struct request * current_request;  
  17. };  
  18.     …  
  19. #if (MAJOR_NR== 1)  
  20.     …  
  21. #define DEVICE_REQUEST do_rd_request  
  22.     …  
  23.  
  24. //代码路径:kernel/blk_drv/ll_rw_blk.c:  //ll可以理解为low level  
  25.     …  
  26. struct blk_dev_struct blk_dev[NR_BLK_DEV]= {  
  27.     { NULL, NULL },  /* no_dev */  
  28.     { NULL, NULL },  /* dev mem */  
  29.     { NULL, NULL },  /* dev fd */  
  30.     { NULL, NULL },  /* dev hd */  
  31.     { NULL, NULL },  /* dev ttyx */  
  32.     { NULL, NULL },  /* dev tty */  
  33.     { NULL, NULL }   /* dev lp */  
  34. };  
  35. …  
  36.  
  37. //代码路径:kernel/ramdisk.c:  
  38. …  
  39. #define MAJOR_NR 1  
  40.     …  
  41. long rd_init(long mem_start, int length)//hd_init()、floppy_init()与此类似  
  42. {  
  43.     int i;  
  44.     char *cp;  
  45.  
  46.     blk_dev[MAJOR_NR].request_fnDEVICE_REQUEST;//挂接do_rd_request()  
  47.     rd_start= (char *) mem_start;  
  48.     rd_length= length;  
  49.     cprd_start;  
  50.     for (i=0; i < length; i++)  
  51.          *cp++= '\0';  //初始化为0  
  52.     return(length);  

在rd_init()函数中,先要将虚拟盘区的请求项处理函数do_rd_request()与图2-4中的请求项函数控制结构blk_dev[7]的第二项挂接。blk_dev[7]的主要功能是将某一类设备与它对应的请求项处理函数挂钩。可以看出我们讨论的操作系统最多可以管理6类设备。请求项将在2.6节中详细解释。这个挂接动作意味着以后内核能够通过调用do_rd_request函数处理与虚拟盘相关的请求项操作。挂接之后,将虚拟盘所在的内存区域全部初始化为0。图2-4表示了rd_init()函数的执行效果。

最后将虚拟盘区的长度值返回。这个返回值将用来重新设置主内存区的起始位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值