ラベル OS の投稿を表示しています。 すべての投稿を表示
ラベル OS の投稿を表示しています。 すべての投稿を表示

2012-12-26

書評:Modern Operating System (3e)




米国留学中にガッツリ読まされた本です。Modern Operating System (3e) は日本語訳がまだなので、もしこれから読むならこちらの方を読んだ方が良いと思います。

本書は、OSの概念から始まり、Process や Filesystem,Memory や I/O などの基本的な機構を一つずつ章分けして解説している本になっています。各章末にある問題は、実際に考えてみるととメチャクチャ面白いので、もしよければ章末問題もやってみると良いと思います。

少し全般的な話になっていまいますが、どうしても邦訳だと変な日本語になってしまいがちだと感じています(英語→日本語の変換がそもそも本質的に難しい作業なのだと感じています)。ただ、実際に原著の方もそんな難しい言葉を使っているかというと、全然そんなことはなくて、かなり丁寧に分かりやすい言葉を(恐らく意図的に)選んで書かれていました。なので、多少英語が苦手でも、こちらの原著を読んで理解した方が、翻訳によるノイズで時間を無駄に割くこともなくなるかな、と個人的には思います。

翻訳された本の全てが悪いとは全く思っていませんが、一方で、やはり専門書の翻訳はかなり厳しいモノがあるなーと、実際に xv6 の翻訳にチャレンジしてみて実感しました。

ご参考になれば幸いです。


2011-04-16

Xv6: Modern OS-like Case Study

PDF ver.


Yohei Yasukawa
Operating System
Dec. 15th, 2010
Case Study - Xv6


1. Introduction


Like case study sections in Modern Operating System, this paper introduces about Xv6, an teaching operating system, and shows how it runs in order to deeply understand a operating system concept.


A. What’s Xv6?


Xv6 is a teaching operating system that was developed by MIT in 2002, and being used as a material of operating system courses for graduate students since then.  And it is becoming famous as a well-developed teaching operating system. In fact, in 2010, it is used as a teaching material of operating system courses in not only MIT, but also Rutgers University, Yale University, Johns Hopkins University, and Stanford University, because of its simplicity.

For many years, operating systems had been taught as one of essential courses for understanding computer science. However, there were few operating systems that can be covered in within a semester because the great operating systems, which are well-developed as a teaching material such as BSD and Linux, are too large to cover in a course. Also, the existing operating systems, such as Unix, were so obsolete that many students were struggled to understand the differences between old and new architectures, and between old and new programming languages. These obstacles made it difficult to teach operating system concepts with actual readable source codes. 

To attack this problem, xv6 operating system was developed as a very compacted operating system that implements important operating system concepts which are mainly inspired from Unix version 6, but it is written in ANSI C programming language and runs on x86. So, Xv6 is becoming famous for a good teaching material that is written in readable source codes, and follows current architectures, but its line of codes keeps less than 10,000 and its commentary consists of less than 100 pages, which can be covered in a semester.


B. Related works

To understand perspective of xv6, knowing related works are helpful, so this section briefly introduces two other teaching operating systems, MINIX3 and Haribote OS.

  • MINIX 3


MINIX 3, which is an operating system developed since 1987, is one of other well-known operating systems that is intended for teaching. This operating system is thoroughly explained in the textbook, Operating Systems: Design and Implementation. 

There are two key different features from xv6. One main difference is that MINIX 3 uses micro kernel structure, which is one of concepts on operating system that implementing less features in a kernel results in increasing performances rather than implementing many features in a kernel. In other words, it needs to have well abstracted organizations, although UNIX tends to put all key functions in a kernel. In fact, the kernel in MINIX 3 operating system consists of less than 4,000 lines. Thereby, MINIX 3 operating system is potentially easier to porting other architectures.

 The other key difference is the concept of MINIX 3 operating system. MINIX 3 was developed not only for teaching, but also for embedded systems. Former versions of MINIX, such as MINIX 1 and MINIX 2, were intended only for teaching, but the modern organization, micro kernel, was fit to the purpose in embedded technology fields. So, from MINIX 3, MINIX expands its features to fit to the needs from embedded systems. Thereby, MINIX 3 users are increased from MINIX 3; on the other hand, the size of MINIX 3 is becoming larger, and now the line of codes keeps more than 30,000 lines.

  • Haribote OS


The other teaching operating system is Haribote OS, which was released with the book published in 2006 in Japan. This operating system contributes to understand operating system with actual source codes, because it does not fully cover general design and concepts that other operating systems do, but is intended for learning how operating systems are implemented. So, the book starts from implementing bootstrap from disks, and ends with implementing applications running on the Haribote OS. 

Also, unlike MINIX 3 and xv6, this operating system does not need any previous knowledge. According to the author, this operating system and book was structured for being understood by not only university students, but also junior high school students. In fact, the book kindly explains computer architectures when the readers needs to understand to implement. So, this teaching operating system is friendly for operating system learners, especially at the very beginning level.


C. Overview of Xv6

Operating systems have different aspects in order to adapt a particular situation or to achieve a particular purpose. But most operating systems, especially unix and unix-like operating systems, have very similar designs. The designs should be slightly different one by one, but its essential concept is totally same.

Fundamental Concepts

Xv6 is, as it is inspired from Unix V6, designed based on such shared, essential concepts. Thereby, xv6 can be a concrete example of other general operating systems. So, understanding of xv6 can be useful for any kind of operating systems. On the other hand, because it is an aggregation of general operating systems, most organizations are so simple that it is very understandable but not effective. For example, many operating systems separately use read locks and write locks in order to decrease performance degradation. However, xv6 does not separately use locks but use just a lock, which increases readability and simplicity of source codes. But it decreases the performance.

Interfaces

From this reason, xv6 kernel provides just following system calls:


Obviously, these system calls are familiar with general operating systems, and they run in the almost same way actually. But as you see that the arguments of functions are equal to or less than general ones, each function is simplified.

Like other operating systems, these system calls serve as an interface between kernel space and user space. Processes in user space cannot use the resources held by kernel, but they can use them by calling system calls. For example, to achieve an xv6’s memory allocation organization that can be dynamic, kalloc() and kfree() system calls are used to implement.

In xv6, any kind of organizations follow this concepts. So, when seeing xv6 codes, you can easily understand essential concepts of process, scheduler, locks, traps, etc. in implementation level, but you need to consider how those concepts can be adapted to real worlds for advancing your knowledge.



2. Process in Xv6

Xv6’s process contains instructions, data, and stack in user-space memory. Also, the process information is stored at data structure in a kernel-space. For example, if a process wants to get its process identifier, it can get it by calling pid() system call. So, processes in xv6 implements several organizations by controlling the data with system calls. This section introduces fundamental functions and a few distinct organizations in xv6.

Fundamental Functions

Xv6’s process can create a new process with fork() system call. It lets a process create new child process. Each process has same memory contents but separately managed.


Also, process can stop with exit() and can wait for one of the calling process’s children to exit with wait().


As the program and sequence diagram above illustrates, fork() returns child process id to the parent process, and returns 0 to child process. So, the fork() behaves in the same way as general operating systems. However, exit() and wait() runs in a slightly different way. In general, they need status code in their arguments, but in xv6 they are not needed when calling exit() and wait(). So, when a process calls wait(), it just waits for one of the caller’s children to call exit().

Similarly, xv6’s process has exec() system call to replace the calling process’s memory with a new memory image. The different colors of data in user space illustrates, exec() system call replaces instructions, data, stack data in user space with new ones. So, in xv6,  the memory image except data structure in kernel space are all replaced with a new program when calling exec().


Scheduling

As most operating systems implement multiple process concept, xv6 implements it, too. But the way of scheduling processes works in a different, simpler way. When scheduling processes, red colored members in the following data structures are used.


The colored members are basically same as general designs except ZOMBIE state of process. In xv6, when a process died, it turns into a ZOMBIE process, and it is not removed automatically. The processes in ZOMBIE states do nothing, and wait for being detected from scheduler. If the scheduler notices that there is a ZOMBIE process in a process table, it removes from the table then. Implementing the automatically process-detected system should be smart, but it requires to have some kind of interrupts, which will reduce the simplicity of scheduler. So, ZOMBIE process state functions as just waiting for being removed.

With the colored data members, xv6’s scheduler runs in the following way which corresponds to the program below.
1. If a hardware interrupt is waiting to be handled, the scheduler's CPU will handle it before continuing. 
2. Check the process table looking for a runnable process. 
3. Set up CPU's segment descriptors and current process task state. 
4. Mark the process as RUNNING.
5. Call swtch() to start running new process.
(* swtch() function causes context switching; specifically, it saves the current context and switches to the chosen process’s context.)



These steps are basically same as the ones in general operating systems. The distinct point of xv6’s scheduler is that the scheduler seeks process table entries incrementally. It is so simple that the line of code are within just about 15 lines. However, in this scheduler, there is no way to assign process intentionally, such as priority-based scheduling. So, if there is a process that needs to be done earlier than other processes, it, however, has to wait for being assigned by xv6’s scheduler.


3. Memory Management in Xv6

As most operating systems have memory managers, xv6 operating system also has a memory manager in its kernel. If a process wants to get more memory spaces or returns its memory spaces to the kernel, they need to contact a memory manager. So, to accept a request from processes, a memory manager always manages used and free memory spaces.

In xv6, the memory manager manages its memory space with a linked list called freelist that contains list of memory area. The unit of its page size is 4KB because x86 segment size granularity is 4KB. So, for example, a page in the freelist is able to have huge size amount of memory spaces in one page, but the least size of a page should be 4KB. The actual structure is as follows:
struct run {  struct run *next;int len; // bytes;} struct run *freelist;
So, when xv6‘s user processes want to request more memory space for doing something, they can get it by calling kalloc() function. Like the scheduling algorithm in xv6, the memory manager seeks the free list incrementally, and if it detects the page that is large enough to accept the request, it returns a kernel-segment pointer. If not, it return 0. 

Similarly, if a process needed to release memory space, they can return it by calling kfree() function. But the kfree() runs a little more complex than that the kalloc() runs. When kfree() is called, not only the len bytes of memory spaces are freed, but also the memory manager sorts freelist, meaning that if there are free, adjacent pages, they are combined into one long page.

Obviously, this memory-allocating algorithm is too simple to adapt real world. But it matches xv6’s concept, an operating system as teaching material.


4. File System

As almost all of operating systems have file systems to maintain data consistently,  xv6 also has its simple file system. So, this chapter introduces how the file system in xv6 works  in terms of two sections: file system data, and file system call.

File System Data

In xv6, the file system composes of the following four elements:

1. Block Allocator 
2. I-nodes 
3. Directories 
4. Path names

First, the block allocator is responsible for managing disk blocks, and keeping track of which blocks are in use. It functions as a memory allocator does. So, if balloc() function is called, the allocator finds and returns free blocks, and then, some data is allocated at the returned new disk block. Also, it can release blocks by calling bfree(). One of the signature has a block to be freed, so if it is called, the given block will be released. So, the block allocator in xv6 can manage disk blocks.

Second element is an i-node, which refer to am unnamed file in the file system. Precisely, it is managed by several functions. For example, when allocating, getting or putting data,  the function of ialloc(), iget(), or iput() is used respectively. To allocate a new i-node, such as creating a file, xv6 will call ialloc() function. The ialloc() runs like balloc(), allocating a new i-node with the given type on device. In iget(), it finds the i-node by a given i-node number and returns its copy. And the xv6 can release a reference to an i-node by calling iput(). With such functions, xv6 can manage i-nodes.

The third is directories, which are special kind of i-nodes whose content is a sequence of directory entries. Each entry is a structure in which there are data of name and i-node number. So, for searching a directory, we can find it by calling dirlookup() with the name. Also, for writing, dirlink() function is provided. It enables us to write a new entry with the given name and i-node number into a directory. With those functions, the concept of directory is implemented in xv6.

Finally, there is a path name element, which serves as providing convenient syntax to identify particular files or directories. For example, you can directly refer to a file with the path name, “/xv6/fs.c”, by using the path name. In the case, xv6 first looks up root directory because it begins with a slash, and then, look up “xv6” directory. If the directory exits,  then starts to refer to “fs.c” file. If the path name does not begin with a slash, xv6 assumes that the path is a relative path, not absolute path.

With those elements, xv6 implements the file system. So, the xv6 file system runs in almost same way that the current unix and unix-like operating system runs. But the algorithms are totally naive. The functions to seek something such as balloc() and dirlookup(), xv6 uses a linear seeking, in order to fit the concept of xv6. So, the file system behaves almost same as other operating systems, but it is not efficient.

File System Call

We learned how the data structure in the xv6 file system works in the previous section, but not how the system calls in xv6 are related. So, this section briefly introduces which system calls are used to implement the file system. 

The following list shows some of the system calls and its brief behavior mainly used in xv6 file system.


In addition, there are some helper functions for system calls, which include argint(), argstr(), argptr(), and argfd(). They function as making a good abstraction and serve as connectors between lower level functions to upper level one. And they run in the same way as modern systems have, except that its algorithm is much simpler than the modern systems.



5. Input / Output


We described how the file system is structured and which system calls are used to access data in the previous chapter. Since this chapter, we will focus on how input and output works; specifically, how a buffer cache works in xv6.

Overview

Xv6 has a buffer cache organization to read data from and to write data into disks. This buffer cache functions as managing data temporarily before reading or writing in order to control data exclusively and increase performance. So, if two processes access the same data simultaneously, the organization can serve as serializing it. Also, it is beneficial for reducing the number of accessing physical devices, which is considered as one of the highest cost operations.

Data Structure

How does xv6 implement the buffer cache? Xv6 implements it by using a structure data called “buf”. The buf has three fields: dev, sector, and data. Dev specifies which disk device is referred, sector specifies which sector in a disk is referred, and data is a memory space for copying data from the sector. So, each buf corresponds to a sector in a disk. 

The point of this data structure is that how it collaborates with other processes for exclusive control. For collaborating, the data field in the structure data has flags to maintain a status of read and write by B_VALID, B_DIRTY, and B_BUSY. B_VALID flag determines if data is already read, B_DIRTY determines if the data need to write out, and B_BUSY is used for exclusive control. For example, if a process is using a buf, the B_BUSY flag turns on in order to avoid the situation that the other process uses the buf.

Disk Driver

To access disks, an interface between operating systems and hardwares is required. Currently, there are several kinds of interface to access disks, such as SCSI and SATA, but xv6 uses IDE controller as an interface, because it is a little older but very simple. The actual steps to boot IDE device is as follows:
1. Control interrupts:
      • Initializes locks and forbids hardware interrupts.
      • Allows uni- and multi-processor to interrupt.
2. Boot and wait:
      • Boot IDE controller
      • Do polling status bits until IDE controller becomes ready
3. Check disk status:
      • Choose each disk incrementally
      • Check if status bits are changed
      • If not changed, recognize that the disk is absent

So, through these steps above, xv6 boots the IDE and control disks.

Now we understand how to boot the disk interface, IDE controller. So, let us start understand how it controls disk accesses with buffers. In xv6, the requests of reading and writing data to disks are managed by a queue. If buffers in a queue all finish, the controller notifies it with an hardware interrupt. Specifically, the buffer is added into a queue by calling iderw(), and the first buffer in the queue is started to read or write by calling idestart(), while other buffers in the queue wait for finishing the previous buffer. 

The idestart() changes its behavior by the status of flags; if the write bit is on, it writes data, and then notify that it finished by calling ideintr(). If the read bit is on, with the sleep() system call, it waits for the notification that the disks are ready for being read, and then read data. 

Interrupts and Locks

What happens if an interrupt occurs when reading or writing data? Obviously, the consistency of disk file system will be broken because the disk access cannot be stopped immediately. To avoid such situations, xv6 has a special lock called idklock; xv6 acquires the lock by calling acquire(), and releases it by release(). So, with the lock, xv6’s writing and reading operations can be synchronized.

Like general operating systems, because the idelock is used, we should avoid race condition when acquiring and releasing the lock. So, xv6 creates critical regions by adding pushcli() or popcli() operation to forbid interrupts. Specifically, pushcli() is inserted before acquire(), and popcli() is inserted after release(). Of course, the interrupts can be nested, so the puchcli() and popcli() operations can be stacked in xv6.

Buffer Cache

Now we grasp the idea about how buffer cache works to read and write data. But why does the buffer cache serve as serializing accesses? It is obvious that we need to establish the situation that only one kernel process can edit file system’s data, because if not, the file system will not be consistent and the data will be corrupted. To allow only one process to read and write, bread() is used when using buffer caches to block processes. For example, if two processes are about to call bread(), one process gets the buffer successfully, and the other process will wait for that the first process finished its operation.

The bread() function calls two helper functions; first, call bget() to obtain a buffer for a given sector, and then, call iderw() to add the buffer into a queue in order to read or write disks. When bget() function is called, it starts to scan buffers incrementally, and if the buffer for a given sector is found, it tries to acquire a lock. If a lock is acquired successfully, bget() sets B_BUSY flag true, and return the buffer. For exceptions, if cannot acquire the lock, sleep until the lock is released. Also, if not found the targeted buffer, create a new buffer for that section, and if there is a buffer never used recently, reuse the buffer as a new buffer. In other words, there are no buffers in the list at the beginning, but each buffer is created based on needs. Once created, it is remained in the list, or reused as a new buffer.

It is common that general operating systems have the list of buffers for input and output, but in xv6, the list is structured based on LRU algorithm. The reason why xv6 uses LRU algorithm is that it is simple to scan for two meanings. If the obtained buffer is used successfully, the buffer moves its entry in the list to the first entry, because xv6 assumes that recently used buffer will be used again in the near future. Also, if looking for buffers never used recently, xv6 can scan the list by the reverse order, because the reverse order of the list means the order of buffer recently not used. So, the LRU algorithm fits to the concept of xv6.


6. Summary

In this case study, we investigated the background and concept of xv6 first, and then showed how xv6 runs. Overall, because of its concept, xv6 would be too simple as an operating system; however, it is implemented by the understandable codes and algorithms and they are essences modern operating systems. Also, the lack of functions to be an real operating system could be good assignments for learners to implement. For those reasons, xv6 is becoming famous as a new teaching operation system, and becoming widely used in operating system classes.



7. References


1. Xv6: a teaching operating system (revision 3)

2. The MINIX 3 Operating System

3. Haribote OS

2010-10-22

Process Simulator



どうも、最近Blogの更新がご無沙汰でしたが、ちゃんと生きてます。最近、こっちの大学のOSの授業で、Simulation Exercises for Operating Systemなる面白い課題が出されたので、Process Simulatorなる作品を作りました。今回は、その公開を兼ねて投稿しています。

Process Simulatorとは、OS内のプロセスマネジメントをシミュレートするシステムです。このシステムでは、複数のプロセスが1つのCPUをどのように共有しているかを、1 clockずつ追うことができます。

各プロセスは、簡易プログラムを読み込み、そのプログラムの指示通りの計算を行います。例えば、あるプロセスが、簡易プログラム内の"B"というinstructionを実行すると、そのプロセスはRunning状態からBlocked状態に遷移します。Blocked状態に遷移したプロセスは、任意のタイミングで、Blocked状態からReady状態に遷移させることができます。

各プロセスの状態はScheduling時に影響を受けます。例えば、実行中のプロセスがPreemptedされたり、Quantumを使いきったりした場合、Ready状態のプロセスリストの中にある1つのプロセスをRunning状態に遷移させます。なお、このときのリストのアルゴリズムは、FIFO Queueです。

... (中略) ...

とまぁ、触りの部分だけちょっと説明しましたが、詳細はREADMEにばっちり書いてあるので、続きに興味のある方は下記のREADMEを読んでください。

例によって、今回もプログラム一式丸ごとGitHubの下記URLにアップロードしています。

          http://github.com/yasulab/process-simulator

GitでCloneする場合は、こんな感じでcloneできます。

          $ clone git://github.com/yasulab/process-simulator.git

なお、Mainプログラムはココから参照できます。


‥‥リファクタリング?
大丈夫だ、問題ない。


以上です。

ちなみに、来週までにVirtual Zooなる作品をSchemeで作る予定なので、ちゃんと期日までに完成していれば、来週はVirtual Zooを投稿しようと思ってます。

ではでは。




README
=======


*************************
***Process Simulator***
*************************
Author: Yohei Yasukawa
Date: 10/20/2010


Index
1. What's Process Simulator?
1.1 Command Format
1.2 Instruction Format
1.3 Scheduling Policy
1.4 Synchronizing Organization
1.5 Reference
2. How to run Process Simulator
3. Existing Problems
4. How to get latest codes
5. Sample Output


1. What's Process Simulator?
============================
This program simulates how proceses run on a CPU,
in order to understand how processes share the CPU.
It includes essentail organizations in operating systems,
such as Process and Scheduling.


1.1 Command Format
------------------
To use this simulator, you need to know some commands for handling a world of ProcessSimulator.
After starting the simulator, the input shell are appeared.
When the simulator needs inputs, you can type the following commands:

    Q: End of one unit of time
       - CPU consumes 1 instruction from programs, and execute it.
    U: Unblock the first simulated process in blocked queue
       - If there is a blocked process, move its state from Blocked to Ready.
    P: Print the current state of the system.
       - The state include PC, PID, PPID, Priority, Value, Time, etc.
    T: Terminate the system after printing the current state.
       - The printing is same as 'P' command.

*1 The capital or not does not matter (q, u, p, and t are also accepted).
*2 You can read the command description above when you type 'help'.


1.2  Instruction Format
-----------------------
When you type Q command, 1 instruction in a special program is executed.
The instruction has several types which include:
  
    S n: Set the value of integer variable to n, where n is an integer.
    A n: Add n to the value of the integer variable, where n is an integer.
    D n: Substract n from the value of the integer variable, where n is an integer.
    B: Block this simulated process.
    E: Terminate this simulated process.
    F n: Create a new simulated process. The new simulated process is an exact copy of
       the parent simulated process. The new simulated process executes from the instruction
immediately after this instruction, while the parent simulated process continues its
execution n instructions after the next instruction.
    R filename: Replace the program of the simulated process with the program in the file
       filename, and set program counter to the first instruction of this new program.

An example of a program for a simulated is as follows:
  
       S 1000
       A 19
       A 20
       D 53
       A 55
       F 1
       R file_a
       F 1
       R file_b
       F 1
       R file_c
       F 1
       R file_d
       F 1
       R file_e
       E    


1.3 Scheduling Policy
---------------------
When the simulator has more than 1 process,
processes share a CPU by the scheduling policy.

The scheduling policy used in the simulator is FIFO Queue with priority.
When context swiching happens, the process in the Ready State queue is dequeued.
Then, the process is assigned to the CPU, and it can use CPU for some ticks.
The tick the process can use is determined by the priority. The relationship
between priority and ticks are:

Priority | Quantum(ticks)
  0 |    1
  1 |    2
  2 |    4
  3 |    8

If the process are preemted by B instruction, or uses all its quantum,
the context switching happens again, and the next process in the queue will be assigned.


1.4 Synchronizing Organization
------------------------------
Process Simulation issues 2 main processes, Commander and Process Manager process.
Commander process waits a command from users, and if received it,
the process immediately sends it to Process Manager process.
Similarly, Process Manager process reports the state of processes by issueing
Reporter process. So, to communicate between processes properly,
we need synchronizing organization.

Although sleep() is famous for synchronizing, Process Simulater
synchronizes by using pipe(), which is one of the experimental challenges in this program.
The pipe synchronization is that one process sleeps on a piped file descriptor,
and another process executes particular instructions, and then, closethe piped
file descriptor. So, the sleeping process notices that the file descriptor are
no longer used, and then it stops sleeping and executes the next instruction.
As a result, pipe serves as a synchronizing organization.

You can read the specific code of the organization in main.c program.
The codes have a comment like "Pipe Synchronization".



1.5 Reference
-------------
For futher information, please read the "spec.pdf" file.



2. How to run Process Simulator?
=============================
To run the simulator, you need the following envrionment.
   - GCC version 4.2.1 (GCC version 4.* will be also satisfied.)
   - Linux (Debian is recommended, but any distritbutions should be okay.)

If you are satisfied with the environment,
you can run the simulator by typing following commands in your terminal.

   $ make clean
   $ make
   $ make run

In default configuration, 'init.prog' are read as an initial program to start.
If you want to read other program instead, please type the following command in your terminal.

   $ ./ProcessSimulator INIT_PROGRAM_NAME

Then, the targeted program determined by the command line arguemnt is read as an initial program.
The program name does not need to have ".prog" extention.



3. Existing Problems
-------------------------
In Process Simulator ver 1.0, the following problems were discovered.
Part of or all of them will be fixed in the next update.

- 1. Problem occurs when the program does not end with E instruction.
- 2. Over maximum number of process(256) stops the system.
- 3. Over maximum number of instructions in a program(64) stops the system.
- 4. Over maximum number of inputs(256) stops the system.


4. How to get latest code
-------------------------
If you would like to use latest version of Process Simulater,
please visit the following website.

    http://github.com/yasulab/process-simulator

Or, please clone the code by typing the following command.

    $ git clone git://github.com/yasulab/process-simulator.git

To clone the code, you need to install Git in advance.

Git - Fast Version Control System
http://git-scm.com/


5. Sample Output
----------------
This section explains how Process Simulator runs with an example.
We use init.prog and calc.prog as example programs.

NOTE:
init.prog and calc.prog are as follows:

init.prog:
 1: F 1
 2: R calc.prog
 3: E

calc.prog:
 1: S 1000
 2: A 20
 3: D 25
 4: A 35
 5: D 30
 6: E

To make a long behavior short,
the following is the process from start to end of the execution.

Tick | Process ID | Instruction | Memo
1.     pid=0:      F 1  pid=1 is created (Start from 2nd tick).
2.     pid=1:       R calc.prog
3.     pid=0:    E  pid=0's turn around time is 3 ticks. (3-0=3)
4.     pid=1:    S 1000
5.     pid=1:    A 20
6.     pid=1:    D 25
7.     pid=1:    A 35
8.     pid=1:    D 30
9.     pid=1:    E  pid=1's turn around time is 7 ticks. (9-2=7)

So, Average Turn Around time is 5 ticks.

The following is the output that
you can see when you actually run.

OUTPUT:
/Users/yohei/os-project% make
gcc -c main.c
gcc -o ProcessSimulator main.o
/Users/yohei/os-project% make run
make
gcc -o ProcessSimulator main.o
./ProcessSimulator init.prog
> q
> Command = q
End of one unit of time.
Instruction = 'F 1'
Create 1 new simulated process(es).
Created a process(pid=1).
Quantum was expired, so assign the first process in the que to CPU.
Pid(0)'s priority class was raised to 1.
New process was assigned to CPU.
Swithed: cpu(0) <--> pid(1)

> q
Command = q
End of one unit of time.
Instruction = 'R calc.prog'
Replace the program of the simulated process with the program in the file 'calc.prog'.
Quantum was expired, so assign the first process in the que to CPU.
Pid(1)'s priority class was raised to 1.
New process was assigned to CPU.
Swithed: cpu(1) <--> pid(0)

> q
Command = q
End of one unit of time.
Instruction = 'E'
Terminate this simulated process.
pid=0 is Terminated.
There are no process running, so assign the first process in the queue to CPU.
New process was assigned to CPU.
Assigned: cpu <--- pcbTable[1]

> q
Command = q
End of one unit of time.
Instruction = 'S 1000'
Set the value of the integer variable to 1000.
CPU value: 0 -> 1000
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'A 20'
Add 20 to the value of the integer variable.
CPU value: 1000 -> 1020
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'D 25'
Substract 25 from the value of the integer variable.
CPU value: 1020 -> 995
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'A 35'
Add 35 to the value of the integer variable.
CPU value: 995 -> 1030
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'D 30'
Substract 30 from the value of the integer variable.
CPU value: 1030 -> 1000
No ready processes, so continue to run the current process.

> q
Command = q
End of one unit of time.
Instruction = 'E'
Terminate this simulated process.
pid=1 is Terminated.
Program was successfully executed.

=== RESULT ===
*********************************************
The current system state is as follows:
*********************************************
CURRENT TIME: 9
AVERAGE TURN AROUND TIME: 5.000000.

RUNNING PROCESS:
queue is empty

BLOCKED PROCESSES:
Queue of blocked processes:
queue is empty

PROCESSES READY TO EXECUTE:
Queue of processes with priority 0:
queue is empty
Queue of processes with priority 1:
queue is empty
Queue of processes with priority 2:
queue is empty
Queue of processes with priority 3:
queue is empty
=== END OF SYSTEM ===

2010-05-18

Hackbench on xv6



Xv6[1] is a pretty good material for OS learners, but one thing I am concerned is that how I benchmark xv6 after I developed or changed it. For example, xv6 has really simple scheduling algorithm that we easily understand, so that it may be a good idea to develop  scheduling algorithm to improve xv6 performance. However, one problem I met was how should I benchmark it? Therefore, I have modified 'hackbench.c', one of the simple benchmarking program, and now it can run on xv6. So, if you need to benchmark your implementations like me, you can download xv6 with hackbench by typing the following command:

     $ git clone git://github.com/yasulab/hackbench-on-xv6.git

Or, you can directly download it from

     http://github.com/yasulab/hackbench-on-xv6

That's it.
Enjoy xv6 life!

[1] en.wikipedia.org/wiki/Xv6

2009-11-24

Lucid-desktop in Chromium Operating System

Maybe this is the near future which we will see soon.





2009-11-21

Google Chrome OS in VMware Player on Debian





話題のGoogle Chrome OSを動かしてみました. 既に色々な情報がネット上で公開されていたおかげで, 特に苦労することなくGoogle Chrome OSが動かせました. 以下, その手順です.

1. 下記のサイトからVMware Playerをダウンロード
http://www.vmware.com/jp/products/player/

2. 下記のサイトを参考にして, ダウンロードした.bundleをインストール
http://emasaka.blog65.fc2.com/blog-entry-457.html

3. 下記のサイトからchrome-os-*-gdgt.vmdkをダウンロード
http://gdgt.com/google/chrome-os/download/

4. 下記のサイトの手順に従ってVMware Playerに3.でダウンロードした仮想ディスクをインストール
http://www.forest.impress.co.jp/docs/special/20091120_330552.html

5. Google Chrome OSを実行.


おまけ:
- Ctrl+Alt+tでShellに移動(Alt+Tabでウィンドウ切替え)


- Ctrl+Alt+DelでWindows Managerが起動


- DebianとGoogle Chrome OSでinitからログインまでのプロセス情報を比較




他、分かったこと:
- "$ sudo su "でrootにログイン出来る. passwordは"chronos".
- 標準で搭載しているEditorはviのみ. Emacs, vim共に使えない. apt-get installも出来ない
-- というか, 許可されていないパッケージは全てインストール出来ない.(セキュリティ向上のため?)
- C-compiler系が全て使えない. インストールも出来ない.

2009-04-26

A Direct Path to Dependable Software




A Direct Path to Dependable Softwareの要点を途中までメモってみました。

[注意]
1. 意訳+要約のため、かなり端折っている。
2. 微妙に意味の解釈が間違っている部分がある気がする。

※続きはImplementationから


Review articles
A Direct Path to Dependable Software
-Who could fault an approach that offers greater credibility at reduced cost?-

Daniel Jackson

Communications of the ACM
Vol. 52 No. 4, Pages 78-88
10.1145/1498765.1498787

※Introduction
ソフトウェアの信頼性の話
ーEx. シカゴ病院の薬のデータベースにバグがあり、情報が一夜で失われた。
ーこのような事件は電子投票/航空便の制御/核パワー/エネルギー配信でも起こるのでは?

組み込みソフトウェアの普及率の上昇につれて、大きなリスクを人々にもたらす。
ー特に医療分野において、ソフトウェアは人を生かすことも殺すこともできる。
ーー例)ペースメーカーとか
ーー1985-2005年までの、医療機器の欠陥による事故数は600,000。うち死亡者は30,000
ーー医療機器の欠陥事故の少なくとも約8%は、ソフトウェアによる事故。
ーーー組み込みソフトウェアが増えれば、ソフトウェアによる欠陥事故はもっと増えるだろう。

今までは、プロセスやツール/技術などのやり方が信頼性ソフトウェアを作ると信じられていた。
ーしかし、それら信頼性の証拠を示すには、indirectなアプローチである。
ーーこの記事では、信頼性ソフトウェアである確たる証拠を示すdirectなアプローチを主張する。
ーこのアプローチの特長は、2つある。
ーー真実性の向上:やり方の効果による不慮の事故ではないという主張ができる。
ーーコストの削減:開発資源を”最も重要な部分”に焦点を当てて、開発できる。
ーーー必要十分な開発資源で開発ができるため、冗長なコストを削減できるということ。

[The Need for a Direct Approach]
Dependable System:人々が信頼することができるシステム
ー理性的な人/組織にとって、利益がリスクを上回るような証拠があるシステム
ーー証拠が無ければ、safeとは言えない

将来、突出したソフトウェア開発技術がソフトウェア品質の証拠を作り上げるかもしれない。
しかしながら、今日の技術は、そのような技術とは程遠いところに位置している。
ー今までの経験を元にソフトウェアの欠陥率を予期することは出来るが、それを0にすることはできない。

例えば、車における、組み込みソフトウェア以外の技術について考えてみる。
ーNational Highway Traffic Safety Administrationのデータベースには、
年間約40,000件の重大な事故が記録されている。研究者は、その事故データ情報を元に
どのようなデバイスが最も安全なのかを、事故情報を比較しながら研究できる。
例)結果として、シートベルトやエアーバッグが、安全な車のデバイスとして誕生。

一方で、ソフトウェアにはこのような比較できる情報が無い。
ーどのようなソフトウェアの効果が、安全をもたらしたのか、または事故原因をもたらしたのか、
見分けることは難しい。よって、ソフトウェア開発事業会社にとって、事故データベースを
使った自社システムの有用性を証明することは難しくなる。結果として、消費者の
システム購入の意思決定を強く左右するようなデータをあつめることができなくなる。

加えて、現状では、ソフトウェアによる事故データには十分の情報が備わっていないことが挙げられる。
会社は、自社の基本的な事故情報を保有しているが、政府は各会社のソフトウェア事故情報を集めたような
データベースを持っていない。結果として、ソフトウェア事故から学ぶべき一般的な教訓を得にくい現状がある。

この数十年の間、私たちはソフトウェア品質を著しく向上させる技術およびアプローチを開発してきた。
それらの技術およびアプローチとは、以下の4つを含んでいる。
1. よいプラットフォーム:安全プログラミング言語, 独立したアドレス空間のOS, 仮想マシーン
2. よいインフラの構築:configulation control, bug tracking, treacibility
3. よいプロセス:spiral/agile model, prototyping
4. よいツール:統合環境, 静的解析器, model checker
加えて、以下の5つの基盤的な技術を作り上げた。
1. 問題の構築化技術
2. デザインモデルの技術
3. Software Architectureの技術
4. 検証技術
5. テスト技術
しかしながら、これら全ての技術は誤って使われることが多く、また、成功を保証するものではない。
経験に基づくソフトウェア構築技術は、上述のギャップを埋め、科学的測定法の有用性を提供したが、
今でもなお、ソフトウェアシステムの品質の確たる証拠を、簡単に、かつ自信を持って突き詰める技術ではない。

たくさんの保証規格は、ベストプラクティスを強制するように仕向けた、
よく工夫された考案であったが、一方で、正反対の効果も持ちはじめていた。
ーベストツールの使用やソフトウェアの危険箇所に注意するように促していた代わりに、
厄介な要求を義務として課した。
ーー時代遅れで、統一的で、同じ技術を義務化した。
ーーー結果として、本当に価値があるのかよく分からない、同じような仕様書が増えた。
The Common Criteria security certification(MSがwindowsに対して取得した証書)
を取得するためにはコストがかかる。また、そのコストは、本質的なバグフィックスにかかる
コストよりも大きいため、会社に取っては有用性の低いことだと館が得られてきた。

政府は、基本的な証拠を元に、よくソフトウェアシステムを評価する立場に位置していた。
ーいくつかのプロセスに対して、いくつかのテストが任意に行われた。
ーその検証テストは時々、破滅的に失敗することがあった。
ーー例)パナマのFDA-certified radiation-therapyにおける悲劇的な事件(2001)
ーー最も効果の高いと言われている規格は高価な上に、その価値を評価することが難しい。

上述とは違うアプローチとして、"goal-based"または"case-based"検証がはやっている。
このアプローチは、従来のあるやり方を強制するというアプローチと違って、開発者が呼ばれる。
ーそこで、claimed dependability goalsを満たすシステムだという直接的な証拠を提供する。
ーーU.K., Ministry of Defenceはこのアプローチで、規格獲得プロセスを著しく簡単化した。

この直接的なアプローチは、アメリカの証明機関や規格付与機関において未だ採用されていない。
最近、いくつかの政府機関では、現状のアプローチのコストと効果について見直している。
ーこの研究によって推奨されているアプローチこそ、本記事の根幹を成すものである。


[Why Testing Isn't Good Enough]
ソフトウェア開発者のレパートリーの中で、テストとは決定的なツールである。
そして、自動化されたテストを行うことは、一つの技術的能力があることの印である。
ー例)欠陥を見つけるためのRegression Test
どんどんと増えていく広大なテスト領域を覆う唯一の方法は、機械の力を使うことである。
ー多くの研究者がこれを認めるようになってきている。
Edsger Dijkstraによる以下の提言がある一方で、
ー"testing can be used to show the presence of errors but not their absence"
テストすることが信頼性を証明する十分な証拠になる、と信じている人たちが増えている。

私たちがテストに対して知っている経験は、この信条は間違っていることを指摘している。
ー小さいソフトウェアなら徹底的にテストできるが、一般的なソフトウェアは広大過ぎて
全てを徹底的にテストすることは難しい。
ーーソフトウェアを起動してすぐの入力と、いくつかの操作をした後の入力では意味が異なる。
ーーー全ての分岐を網羅的にテストすることは極めて難しい。

もう一方のアプローチは、テスト範囲を分散して、リスクの高いところを集中的にテストすることである。
ーしかしながら、信頼性を得られるために必要なテスト数は、想像以上に膨大である。
ー例)1,000の入力に対して99%の信頼を得るためには5,000のテストが必要。
5,000のテスト中でバグを10個発見したら、20,000テストが追加で必要になる。
ーー故に、バグの発見は自信の向上にはつながらない。

このような状況下では、テストでバグを発見すると、
さらに高いレベルでのテストが要求されるため、
テストにかかるコストはねずみ算式に膨れ上がる。

それにも関わらず、現存の証明方法の多くは、未だにテストに依存している。
ー自信でシステムを保証するためには"five nines"信頼性を達成する必要がある。
ーー100,000時間実行し続けてもバグが起こらないシステム
ーーーこのような信頼性の保証方法はとても現実的ではない。


[A Direct Path]
信頼性を保証するための直接的なパスとは、批評を実証することである。
ー何がシステムを構成するのか、何がシステムに信頼性をもたらすのかを考える。

システムとは、ハードウェア/ソフトウェア/使用者によって成り立つ製品のこと。
ー例)飛行機同士の空中衝突はパイロットの操作によって起こすこともできる。
ーーシステムは、人為的な事故をシステムの仮定から除いたとき、
設計全体のうちの、重要な部分にのみ設計を集中することができる。

信頼できるシステムとは、ある仕事を信頼して与えられるシステムのことである。
ー信頼できるシステムとは、証拠なしには成り得ない。
ーバグのないシステムではなく、失敗が起こらないことが証明されているシステムである。

信頼性は利益とコストのトレードオフである。
ー飛行機の空路制御や核パワー、電力の配備において、社会は寛容ではない。
ーーこのような重要な部分の技術には、多大なコストを掛けて、
大規模にソフトウェア開発を行い、また、その信頼性の証明を行わなくてはならない。
危険な状態は、その使用されたときの前後関係に依存する。
ー例)放射線療法の用量を計算するために、スプレッドシートのマクロ関数を使うことは危険
ー携帯のネットワークやGPSのようなシステムは、多くのアプリケーションによって使われているので、
そのシステムが壊れてしまったら、悲劇的な状況に陥る。

信頼性は、大規模なスケールにおいて、簡単に測定することができない。
ー多様な前後関係によって失敗は起こるので、測定を数値ではかることは難しい。
ー信頼性は、その用途によって必要十分なレベルが異なる。
ーー高い信頼性:放射線治療の用法計算、クレジットカードの数値計算
ーー低い信頼性:ネットショッピングにおいて、購入するためにストックした商品の紛失
ー高い信頼性が必要なシステムでは、機械が無断で重要な変更を行うことは許されない。

以上のことを具体化すると、以下の3つが要求される。
1. どの部品(software, physical, human)が信頼性を向上させるか決めること
2. 決定的なプロパティを確認すること
3. どのレベルの信頼性を満たすべきなのかを決定すること

[Properties and where they reside.]
決定的なプロパティは、具体的には以下の2つに分類される。
1. プロパティは個々の機能を関連付けて成り立つ
2. プロパティがいくつかの機能を横切るように使う

信頼性においては、プロパティに焦点を当てることは、個々の機能に焦点を当てるよりも効率的。
ープロパティは機能的に分類されている。また、個々の関数のまとまりの意味をもっている。
ーEx. データベースにおける決定的なプロパティ
ーーログイン時に使う関数をチェックするより、ログインの一連の流れをチェックした方が良い。

いくつかのソフトウェアシステムは、全体的な仮想サービスを提供する。
ーただし、物理的な干渉は除く。
システムの目的が物理的な現象を生成/制御/監視するようなとき、
決定的なプロパティを表現する語彙を形成しなくては成らない。
これは一見明らかに見えるが、そこにはソフトウェアへのインターフェースに関する
記述要求の長い慣習が存在する。
ー例)放射線療法のアプリケーションにおける決定的なプロパティとは以下のようなものではない。
ーー放射されるビームが有界の緊張を持つこと。
ーー正しい信号がビーム生成器に送られること。
ーービームの量の設定において、正しいコードが記述されていること。
ー放射線療法のアプリケーションにおける決定的なプロパティとは、
患者が過剰な放射線を浴びないことである。

そこには、ある終わりにおいて、システムの物理的な効果と繋がっている一連のイベントがある。
そのイベントには、ある他の終わりにおいて実行された、途中命令の周辺機器の信号がある。
決定的なプロパティが使われた現象を定式化していけばいくほど、
ユーザに対する基本的な配慮は弱まっていく。

評判の悪い事件は、ソフトウェアに近づけていくことによる、潜在的な恐ろしさを示している。
ー例)An Airbus A320 landing at Warsaw Airport in 1993

ー省略

[The dependability case. ]
信頼性に対する証拠は、ケースによって異なる。
ーそのケースに当てはまるかどうかは、開発によって異なる。
ーーしかし、ある重要な特徴がある。

1. ケースはサードパーティの証明機関によって評価される。
ー証明機関は開発者と顧客からなる独立した機関。
そのケースが正常なケースとチェックするための努力は、最小でなければ成らない。
ー信頼性できるケースは公式の証明のようなもの
ーー構成するのは難しいが、チェックするのは簡単。
評価を行う際に、システム開発や特定のアプリケーションにおける専門知識を必要としては成らない。

2. ケースは完全でなければならない。
ー決定的なプロパティの持つ主張については、ホールが一つもないということ。
ーー正当でない他のどの仮定も、ノートされる。
ーーー責任の所在をはっきりとさせるため。
ーー例)”コンパイラは正確なコードを生成する”というケースに置ける信頼性
ーー例)OSやミドルウェアは、決定的なプロパティにおいて生成されたメッセージを確実に運ぶ
ーー例)ユーザはある信頼されているプロトコルに必ず従う

3. ケースは正常でなければならない。
ー以下のようなことをすべきではない
ー例)網羅的ではないテストを元にした手続きに対して、完全な正確さを主張すること
ー例)保証されていない仮定を作ること
ー例)弱いメモリモデルの言語のプログラムにおいて、判断を下すこと???


[Implementation]
※続きはあとで。

2009-04-24

studying MINIX after haribote OS


はりぼて開発に一旦区切りを付け、今後はMINIX 3の勉強を始めることになりました。今日はそこに至った経緯についての報告。

はりぼてOSは、OS開発の実践的なノウハウを学べる非常に良い教材だと思います。難しいことを深く考えず、問題があればその都度乗り越えていくその実践的な開発方針は、純粋にOS開発を楽しむ機会を僕に与えてくれました。実際に、主観的ではありますが、はりぼてOSの拡張は本当に楽しめました。

一方で、OS学習者としてはりぼてOSの拡張経験を振り返って見ると、スタートからゴールまでの道のりが非常に遠回りになっていた開発だったと感じています。というのも、一度開発したシステムを再設計することがとても難しかったからです。例えば、もし僕がファイルシステムの理論を深く学んだ後で設計を始めていたら、開発期間を縮めることができただけではなく、そのファイルシステムの開発意義をもっと高めることができただろうと思っています。

以上のことから、OS学習者ならば、OS開発の実践的なノウハウだけではなく、理論的なノウハウも学ぶべきだと強く感じています。そして、僕がはりぼてOSの開発に一旦区切りをつけて、MINIX 3の勉強を始めた理由もここにあります。

まぁ、まだ第2章までしか読んでいないので確実なことは言えませんが、はりぼてOSの拡張を通して得た知識および経験と、これから学ぶMINIX 3の理論を対比させながら学ぶことで、ただMINIX 3を読んで得られる知識以上のものを身につけらるんじゃないかなぁ、と考えています。

長々とグダグダと書きましたが、そんな近況です。
ではでは。



P.S.
今朝方、S先生の飲み会参加が確定。

2009-04-04

Distributed and Ubiquitous Computing




春休みも終盤。ようやく研究室配属の結果が決まりました。
正直、配属の結果にかなり満足しています。

僕の研究室はタイトルの通り、分散ユビキタスコンピューティングです。平たくいえば、OSとかwiiみたいな新たなユーザインターフェースとかを研究している研究室です。そのうち、僕はOSの研究チームに入りました。この研究室を志望した理由は大きく分けて3つ, 興味と学習範囲と環境です。

興味については、以前のブログを見ていただけたら分かるように、元から非常に高いです。OSを設計することを、よく色々な例にたとえられますが、僕としては"街"の設計に近いんじゃないかなぁと思います。街にはたくさん人がいて、人がそれぞれ何かの役割を持っていて、人同士で時には間違いを指摘したり修正したり、とそんなイメージをOSに持ってます。うまく設計することは簡単なことではないけれど、うまく設計する価値は非常に高いと思ってます。まだうまく言えていないけど、そういったことから非常にOSに興味を持っています。

この興味が高い理由にも繋がるけど、研究のために必要な学習範囲が半端じゃないです。例えば、CPU, memory, register, compilerなどなど非常に多くのアーキテクチャの中身を知らなくてはいけません。また、中身を知っているだけではなく、それらをソフトウェアでどう管理していくかもわからなくてはいけません。さらに、ただソフトウェアで管理するだけではなく、ユーザがイライラしないように使いこなせるような品質・機能を提供しなければなりません。このように、結構勉強する範囲が広いです。 逆にいえば、OSが分かればコンピュータのperspectiveが理解できると思っています。だから、OSを深く理解できていれば、きっとどんな設計にも実装にもOSで学んだ知識が応用できる、というメリットがあると思っています。

最後に、研究する環境が非常に良いです。研究室の設備も十分に良いのですが、それ以上に中にいる人達の技術と向上心が高い。例えば、昨日はプチ懇親会があったのですが、途中から技術の話に代わって、しまいには輪講に使う本の決定会議にまで至りました。もちろん、これらの話の主体は同期の4年生です。

配属前夜は、色々なところから勧誘があったり面白い話があったりして、どの研究室にするか死ぬほど悩んで胃を痛めました。しかし、それは十二分に報われたと思います。僕は周りのに比べてまだまだスキルが劣っている方なので、これからさらに勉強を進めていき、周りに追いついていけるようにならなくてはなりません。でも、そういう気持ちにさせてくれる環境は、結構凄い財産なんじゃないかなぁ、と思う今日この頃。

というわけで、さっそく486アーキテクチャの勉強にとりかかります。では。

P.S.
生息地がCafe Miyamaから研究室に変わりました。でも、あの雰囲気は好きだし、時々は顔出すかなぁー。

2009-03-31

submit final report




ようやく終わりました。とてもとてもとても長かったようで実は結構短い研究が終わりました。

ようやく自他共に認める春休み…って、え、もう終わる?
そんな馬鹿なorz orz

授業が始まるまでもう少しか。研究室どこにしようかなー。正直、OSとデータ解析でかなり迷っているけど、まぁ決め手はオープンハウスということで明日と明後日にワクテカしとくか。とりあえず産総研の見学申し込みだけはしておこう。面白そうだし。



※ なお、今回の研究成果は全てオープンソースとして公開しています。OSに興味ある方はLet'sアクセス!
OSに興味無い方でも他のソフトウェアも公開してるので見てってね!
URL: http://www.arukou.sakura.ne.jp/yasulab/os/

はりぼてOSの拡張:メモリ空間のみを使用して動作するファイルシステムの実装




【Description】
Trying to implement a file system, which runs only using memory, on haribote OS.


【目的】 ※ myos_report_001.pdfから一部引用
研究内容として"メモリ領域のみを使用して動作するファイルシステムの実装"
(以下、本研究)を選んだ2つの目的について述べる。

1つ目の目的は、はりぼてOSの拡張例を広く公表することで、OS開発者数の増加を促進させることである。はりぼてOSは、必要最低限の機能のみを実装し、他の欠けている機能の実装については各読者に委ねるというスタンスを持っている。このため、一般的なOSにあるべき大部分の機能が欠けている。はりぼてOSの著者は、これらの欠けている機能について、読者自身で実装することを強く勧めているが、ウェブ上で確認できる読者自身による開発例は未だ多くはない。

また、ウェブ上で確認できる拡張例の多くは、拡張したOSの配布のみに強く焦点が当てられているため、拡張へのアプローチや拡張したOSの仕様について深く述べられている例が少ない。このため、読者の多くは、はりぼてOSの拡張するための具体的なアプローチ方法が思いつかず、本書を読み終えた後においても、OSの拡張まで手を伸ばす読者が多くないのだと私は考えている。

これらのことから、本研究では、まずはりぼてOSを拡張させ、その後、拡張したOSの制作過程とその仕様をウェブ上に広く公表する。そうすることで、読者自身によるOSの拡張を促し、今後のOS開発者数の増加を目的の1つとしている。
(引用終了)


URLhttp://www.arukou.sakura.ne.jp/yasulab/os/
上記URLに置かれている資料は全てオープンソースとして公開しています
これら資料が、どこかの誰かの役に立っていたら嬉しいです。
yohei yasukawa, March 31th, 2009,
Dept. of Computer Science,
Waseda University

2009-03-29

Absolute path / Relative path











cdコマンドの引数に対する構文解析器を作りました。


今までのcdコマンドでは絶対パスが表現できなかったり、隣接したディレクトリにしか移動できなかったりと、色々とショボイcdコマンドでした。しかしながら今回の更新により、例えば、ルートディレクトリに直接移動出来たり、パス名を連続して綴ることで隣接していないディレクトリに移動出来たりします。


ただ「これだけだと従来のcdコマンドと何も変わらいじゃないか!面白くナス!」と思ったので、言語処理系の授業で習った誤り処理も追加してみました。これにより、cdコマンドが失敗したとき、なぜ失敗したのかを教えてくれます。


関係ない話だけど、cdコマンド改造後の方がソースコードが短くなっのはビビったw。元々のcdコマンドがnaiveだったという原因もあるだろうけど、それ以上に再帰降下関数が最強すぎるという罠なのだろう。2単位の癖にSoC設計×2よりキツイと噂の言語処理系を、糞真面目に取り組んでおいて心の底から良かった思った瞬間。実は、言語処理系はオープン科目として受講できるみたいだけど、どう見ても死亡フラグです。本当にありがとうございました。
※ちなみに、言語処理系のノート等はここら辺にあります。参考資料としてどうぞ。


さて、メモリの離散的な確保も実装したし、cdコマンドも強化したので、後はドキュメント書くだけかな。ガリガリ書いていきます。

2009-03-27

Block Division ver 2







ブロック構造体に色々なバグがあったのを修正。






ついでに、ブロックサイズを#defineの値を変えるだけで変更できるようになりました。試しにブロックサイズを3byteにすると上述したようなブロックを跨ぎまくってデータを保存するファイルシステムになります。1ブロックあたりに損するデータ量は、head部のサイズと+ヌル文字[byte]です。なので、ブロックサイズが3byteだと、実際のデータ量より、データ情報を構築するためのデータ量の方が大幅に大きくなります。つまり、超冗長なファイルシステムになります。しかしながら、確保するメモリのサイズも小さくなるので、フラグメントの隙間にも挟める可能性がグッと上がります。






・・・しかしながら、今のファイルシステムはブロック毎に、離散的にメモリを確保しているんじゃなくて、連続的にメモリ確保しているという罠。なんというもったいないシステムorzorzorzorz






明日中に、離散的にメモリを確保して、つなぎ合わせて実データを構築できるようにしよう。

2009-03-26

Project Research D




うおおおおおおおおおおおおおおおおおおおおおおおおおおおお。

プロジェクト研究DがA+だったあああああああああああああああ。
これは超うれしいww。今年一番の嬉しいイベントだわw。
これで、オペレーティングシステムがCだった言い訳が出来たw。
というかOSの授業がCで、OSの研究がA+とか、極端すぎるなw。

研究の最終的な仕上げをやるモチベが急上昇した。
このまま30日まで突っ切るわ!

2009-03-24

haribote OS on VirtualBox


qemuじゃなくて、SunのVirtul Boxで自分の作ったOSを動かすことに成功。今日はそれに関するメモ。

成功といっても、実際にやったことはVirtualBoxのフロッピーイメージにharibote.imgを登録しただけです。フロッピーイメージをマウントしていると、ハードディスクにあるOSよりも優先的に起動するため、マウントしている限りずっとharibote OSが動きます。それだけ、かな。特にメモするようなことでもないかw。一応キャプチャも使ってみる。

はりぼてOSを起動させるときはファイルイメージをマウントする。




"追加"でフロッピーイメージを登録して、登録されたharibote.imgを選択する。


マウントしたらリセットする。




はりぼてOSが起動する。


はりぼてOSを起動させたくないときは、フロッピーイメージをアンマウントするだけです。
以上。


ちなみに、Virtual Boxを使ってもサウンドオーディオの問題(QEMUだとmmlplayやbeepdownを入力しても音が聞こえない問題)は解決しません。理由は…現在調査中。Ubuntuの方ではしっかりと音が出ているので、少なくともVirtualBoxのせいではないはず。いちいち音確認するためだけにリブートする気にはならないから、やっぱしemulatorで音が確認出来たら便利だよなぁ。

さて、作業再開。