1

So I am doing a project that requires me to create a RAM disk in MINIX. The question is as follows:

Your task is to implement your own RAM disk which can be used as a location to store data where fast access is required. It should have read and write permissions for everybody and must be 10MB in size.

I am struggling to find info on this topic for MINIX, so I've been trying to work off numerous other tutorials that are for Linux distros.

Using this tutorial I have done the following in MINIX:

mknod /dev/ram0 c 0 1
chmod 777 /dev/ram0

Then mkfs -b 10240 -i 2000 -B 1024 /dev/ram0 yields the error:

mkfs: /dev/ram0: number of blocks too large for device.

This occurs even when I make the -b parameter 1. When I type mkfs /dev/ram0 an error stating the following appears:

mkfs: this device can't hold a filesystem.

In the tutorial I can see the author increasing the size of the ramdisk to 16GB in grub.conf, but that file isn't located in /etc.

ANY help would be appreciated as I am struggling to find info on MINIX in general with tasks like this.

Armand Maree
  • 488
  • 2
  • 6
  • 21
  • Must you "implement your own ramdisk" with your own code, or use what's already there? If you're not writing your own code, this question is out of scope for Stack Overflow. – Brad Aug 24 '15 at 18:48
  • @Brad They did not specify. Would it be possible for me to implement this with my own code, considering I have been doing the Operating Systems module (at university) for only a month now and started using MINIX 2 weeks ago. – Armand Maree Aug 24 '15 at 18:53
  • No, that wouldn't be possible, sorry. You'd have to know how to write your own kernel modules. – Brad Aug 24 '15 at 18:58
  • So then I'm sure they meant use the existing stuff. :-) I'll report back when I spoke with the lecturer tomorrow. – Armand Maree Aug 24 '15 at 21:15

1 Answers1

1

I figured it out:

On line 43 of

/usr/src/include/minix/dmap.h

add #define FAST_DEV 6. Now we have a symbol to represent the minor of our new device. This simply helps us avoid magic numbers.

m_ioctl() in

/usr/src/drivers/memory/memory.c

is hardcoded to receive a message and create the RAM device. To make it generic change RAM_DEV (look through the function, it is in there as a parameter to some function) to m_ptr->DEVICE. RAM_DEV is the minor device number of the RAM device and m_ptr->DEVICE is the minor device number that the request wants to be created (it will make sense in a while). Also, on line 28 of this file you need to increment the value of NR_DEVS to allow the program to be able to create the new device we are going to specify now. Then around line 143 in the m_transfer() function there is a switch on m_device for case RAM_DEV, KMEM_DEV and BOOT_DEV, add case FAST_DEV underneath BOOT_DEV. This will allow the OS to transfer files to/from our new device in the same way as it does for RAM_DEV.

In

/usr/src/servers/fs/main.c

you will see that main() calls fs_init() which in turns call load_ram(). In load_ram() is where the message (that is received in m_ioctl()) is constructed and sent. To create a message for our new device add the following to the beginning of the fucntion:

m_out.m_type = DEV_IOCTL;
m_out.PROC_NR = FS_PROC_NR;
m_out.DEVICE = FAST_DEV; /* minor of fast device, this is why we had to make m_ioctl() generic */
m_out.REQUEST = MIOCRAMSIZE;
m_out.POSITION = 10485760 /* size of 10MB in bytes */
s = sendrec(MEM_PROCNR, &m_out); /* this sends the message */

Now recompile:

cd /usr/src
make world
make install
and make all the directories that you worked in (just to be safe)
then shutdown

Create fast device:

mknod /dev/fast b 1 6

EDIT:

Clarification for load_ram():

PRIVATE void load_ram(void)
{
    register struct buf *bp, *bp1;
    ...
    ...
    int s;

    /* add the code here */
    m_out.m_type = DEV_IOCTL;
    etc
}

Clarification for the switch statement:

case RAM_DEV:
case KMEM_DEV:
case BOOT_DEV:
case FAST_DEV: /* add this line */
Armand Maree
  • 488
  • 2
  • 6
  • 21