android 设置setmultichoiceitems设置初始化勾选_Linux内核启动:虚拟盘空间设置和内存管理结构初始化...

1. 设置虚拟盘并初始化

接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中"虚拟盘使用标志"是否设置, 以此确定系统是否使用了虚拟盘(假设有虚拟盘,大小设置为2 MB)。 操作系统从缓冲区的末端起开辟2MB内存空间设置为虚拟盘,主内存起始位置后移2MB至虚拟盘的末端

43b21de26388908f768c460858931d77.png

实现代码如下

453442d0476d5cbc3d4b07f5656ff925.png
e26c8891b08ae119dfde78c2578e772e.png
aff0508a6eb5443be68d31d0e573cabe.png
d7600653970344b0d3cf62cd8694dc0f.png
a7359de277fd5fd33c638fd37a5fb408.png
ab08eb3f0963cede5a14128c84f867b1.png

在rd_init()函数中,先要将虚拟盘区的请求项处理函数do_rd_request()请求项函数控制结构blk_dev[7]的第二项挂接。 blk_dev[7]的主要功能是将某一类设备与它对应的请求项处理函数挂钩。 目前操作系统最多可以管理6类设备。 这个挂接动作意味着以后内核内核能够通过调用do_rd_request函数处理与虚拟盘相关的请求项操作。挂接之后,将虚拟盘所在的内存区域全部初始化为0。

d6ac09e6b430b8ce1eeda4b462b6e239.png

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

2. 初始化内存管理结构mem_map

对主内存区起始位置的重新确定,标志着主内存区和缓冲区的位置和大小已经全都确定,系统 开始调用mem_init()函数。 先对主内存区的管理结构进行设置。

0825409bc7cc65aeb5ffd925d58f898a.png

代码实现如下

306b9a7cf574e3c134be5da876372e1e.png
f594796615c1fb6fda104dd5f57bc530.png
37bba58c8f3f2e73b12ca110c6583e3d.png

系统通过mem_map[]对1MB以上的内存分页进行管理,记录一个页面的使用次数。 mem_init()函数先将所有的内存页面使用计数均设置成USED(100,即被使用),然后再将主 内存中的所有页面使用计数全部清零,系统以后只把使用计数为0的页面视为空闲页面。系统不对1MB以内的内存空间用这种分页方法管理,是因为操作系统对内核和用户进程采用了两套不同 的分页管理方法。内核采用分页管理方法,线性地址和物理地址是完全一样的,是一一映射的,等价于内核可以直接获得物理地址。用户进程线性地址和物理地址差异很大,之间没有可递推的 逻辑关系。操作系统目的就是让用户进程无法通过线性地址推算出具体的物理地址,让内核能够 访问用户进程,用户进程不能访问其他的用户进程,更不能访问内核。 1MB以内是内核代码和 只有由内核管控的大部分数据所在内存空间,是绝对不允许用户进程访问的。 1MB以上,特别是 主内存区主要是用户进程的代码、数据所在内存空间,所以采用专门用来管理用户进程的分页管理方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值