《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.3 设置虚拟盘空间并初始化

简介: 本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第2章,第2.3节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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

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

image

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

//代码路径:init/main.c:
void main(void)
{
    …
#ifdef RAMDISK
    main_memory_start += rd_init(main_memory_start, RAMDISK*1024);
#endif
    …
}
//代码路径:kernel/blk_drv/blk.h:
    …
#define NR_BLK_DEV    7
    …
struct blk_dev_struct {
    void (*request_fn)(void);
    struct request * current_request;
};
    …
#if (MAJOR_NR== 1)
    …
#define DEVICE_REQUEST do_rd_request
    …

//代码路径:kernel/blk_drv/ll_rw_blk.c:        //ll可以理解为low level
    …
struct blk_dev_struct blk_dev[NR_BLK_DEV]= {
    { NULL, NULL },        /* no_dev */
    { NULL, NULL },        /* dev mem */
    { NULL, NULL },        /* dev fd */
    { NULL, NULL },        /* dev hd */
    { NULL, NULL },        /* dev ttyx */
    { NULL, NULL },        /* dev tty */
    { NULL, NULL }            /* dev lp */
};
…

//代码路径:kernel/ramdisk.c:
…
#define MAJOR_NR 1
    …
long rd_init(long mem_start, int length)//hd_init()、floppy_init()与此类似
{
    int    i;
    char    *cp;

    blk_dev[MAJOR_NR].request_fn= DEVICE_REQUEST;//挂接do_rd_request()
    rd_start= (char *) mem_start;
    rd_length= length;
    cp= rd_start;
    for (i=0; i < length; i++)
         *cp++= '\0';        //初始化为0
    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()函数的执行效果。

image

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

相关文章
|
存储 调度
探索操作系统的心脏:内核与用户空间的交互
在数字世界的每一次呼吸中,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心组件——内核与用户空间之间的神秘舞蹈。通过直观的比喻和生动的代码片段,我们将一窥这场幕后的交响曲,了解它们是如何协同工作以支持我们的计算需求的。从简单的文件读写到复杂的网络通信,每一个操作背后都隐藏着内核与用户空间之间精妙的互动。准备好跟随我们的脚步,一起揭开操作系统的神秘面纱。
244 3
|
安全 程序员 Linux
探索操作系统的心脏:内核与用户空间的交互之旅
【9月更文挑战第9天】本文是一次深入操作系统核心的探险,我们不仅会穿越神秘的内核世界和多彩的用户空间,还将揭秘它们之间如何通过系统调用、库函数、API等桥梁进行信息交换。这不仅是一段技术之旅,也是对操作系统设计哲学的思考。我们将用浅显的语言,逐步揭开操作系统的神秘面纱,让读者在轻松愉快的阅读中,获得对操作系统深层次理解的钥匙。
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
561 18
|
安全 Linux 开发者
探索操作系统的心脏:内核与用户空间的交互
在数字世界的每一次点击和命令背后,隐藏着一个复杂而精妙的操作系统世界。本文将带你走进这个世界的核心,揭示内核与用户空间的神秘交互。通过深入浅出的解释和直观的代码示例,我们将一起理解操作系统如何协调硬件资源,管理进程和内存,以及提供文件系统服务。无论你是编程新手还是资深开发者,这篇文章都将为你打开一扇通往操作系统深层原理的大门。让我们一起开始这段旅程,探索那些支撑我们日常数字生活的技术基石吧!
288 6
|
存储 调度 开发者
探索操作系统的心脏:内核与用户空间的交互之旅
在数字世界的无限广阔中,操作系统扮演着枢纽的角色,连接硬件与软件,支撑起整个计算生态。本篇文章将带领读者深入操作系统的核心——内核,揭示其与用户空间的神秘交互。我们将透过生动的例子和易于理解的比喻,深入浅出地探讨这一复杂主题,旨在为非专业读者揭开操作系统的神秘面纱,同时为有一定基础的读者提供更深层次的认识。从进程管理到内存分配,从文件系统到设备驱动,每一个环节都是精确而优雅的舞蹈,它们共同编织出稳定而高效的计算体验。让我们开始这场奇妙之旅,一探操作系统背后的科学与艺术。
251 5
|
安全 数据处理 调度
探索操作系统的心脏:内核与用户空间的交互之旅
操作系统,这个现代计算机体系的守门人,承载着软件与硬件间复杂而精妙的对话。本文将深入其核心,揭秘内核与用户空间之间如何协同工作,确保数据安全且高效地流动。我们将透过代码示例的镜头,观察这一过程的具体实现,同时反思在设计与使用操作系统时面临的挑战与机遇。
|
存储 安全 开发者
探索操作系统的心脏:内核与用户空间的交互
在数字世界的复杂迷宫中,操作系统扮演着至关重要的角色。它不仅仅是软件与硬件之间的桥梁,更是维系计算生态平衡的关键。本文将深入探讨操作系统的核心组件—内核和用户空间,以及它们如何协同工作来支持现代计算需求。通过浅显的语言和生动的比喻,我们将揭开操作系统神秘的面纱,了解它是如何影响我们日常生活的每一个方面。无论你是科技爱好者还是普通用户,这篇文章都将带你领略操作系统的奇妙世界,让你对电脑内部的运作有一个全新的认识。
215 2
|
算法 调度 C语言
探索操作系统的心脏:内核与用户空间的交互
【10月更文挑战第36天】本文将深入探讨操作系统的核心组件—内核,以及它如何与用户空间进行交互。我们将通过浅显易懂的语言和生动的例子来揭示这一复杂主题的面纱。文章不仅涉及理论知识,还会展示具体的代码示例,帮助读者更好地理解内核机制。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
Ubuntu 网络安全 开发工具
Ubuntu19.04的安装过程详解以及操作系统初始化配置
本文详细介绍了Ubuntu 19.04操作系统的安装过程、初始化配置、网络设置、软件源配置、SSH远程登录以及终端显示设置。
535 2
Ubuntu19.04的安装过程详解以及操作系统初始化配置
|
存储 Linux Windows
深入浅出操作系统:从用户空间到内核的旅程
【9月更文挑战第28天】本文将通过一次虚拟的探险之旅,带领读者了解操作系统的复杂结构。我们将一起穿越神秘的用户空间,探索文件系统、进程管理等奇妙领域,并最终潜入深不见底的内核空间,揭开中断处理、内存管理和设备驱动等核心机制的秘密面纱。准备好你的背包,我们即将启程!
238 5