Os project 0 1
This presentation is the property of its rightful owner.
Sponsored Links
1 / 56

OS Project 0 & 1 PowerPoint PPT Presentation


  • 90 Views
  • Uploaded on
  • Presentation posted in: General

OS Project 0 & 1. Advisor: Dr. Chih-Wen Hsueh Student: Tang-Hsun Tu 台灣大學 網媒所 / 資工所 Wireless Networking and Embedded Systems Laboratory Real-Time System Software Group October 3, 2014. Linux Installation Linux Kernel Compilation System Call. Outline. Linux Installation.

Download Presentation

OS Project 0 & 1

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


OS Project 0 & 1

Advisor: Dr. Chih-Wen Hsueh

Student: Tang-Hsun Tu

台灣大學

網媒所/資工所

Wireless Networking and Embedded Systems Laboratory

Real-Time System Software Group

October 3, 2014


Linux Installation

Linux Kernel Compilation

System Call

Outline

/55


Linux Installation


Including shells, libraries, tools, compiler, servers, applications.

Ubuntu, Redhat, Fedora, Mandrake, SuSE, Debian, Ubuntu, Gentoo…

Live CDs

You can make your own Linux distribution

This slide is based on Ubuntu 10.04 LTS

Linux Distribution

/55


Modify the boot sequence to boot your computer from CD-ROM

Make sure your hardware and device

A clear head and relaxed mind

Some drinks and food

Before Installation

/55


/55


/55


/dev/hda, /dev/hdb, /dev/hdc, …

/dev/hda1, /dev/hda2, …

/dev/sda, /dev/scd0, …

Mount Points

/

/swap

Disks and Partitions

/55


Swap partition is usually twice as RAM when it is less than 1GB

No more than four primary partition including root partition and swap partition

If four isn’t enough, use extend partition

Make sure all your mount points are correct

Partition Division

/55


/55


/55


/55


After dividing partitions, you only need to click your mouse.

After installation, reboot and enjoy your Linux!

Installation by text mode is the same as graphic mode

End of Installation

/55


鳥哥的私房菜

http://linux.vbird.org/

Ubuntu 正體中文站

http://www.ubuntu-tw.org/

Ubuntu Homepage

http://www.ubuntu.com/

Reference

/55


Linux Kernel Compilation


Kernel is the core of an operating system.

Scheduler, task management, memory management, …

You need to compile kernel source code to binary in order to run.

What is Linux Kernel?

/55


You can configure your Linux by compiling a new kernel.

Add new features, ex. patch kernel.

Support new hardware.

Disable functions you don’t need.

Develop your own kernel.

...

When Should We Compile Kernel?

/55


Kernel Website, http://www.kernel.org

You also can download the source from Ubuntu.

Where to D/L Linux Kernel?

/55


You need to be root to compile kernel

sudo -i

Download the necessary tools

apt-get update

apt-get install kernel-package gcc libncurses5-dev automake gcc libc6-dev build-essential

Go to System/Administration/synaptic package Manager or http://www.kernel.org/

Get the kernel source code

e.g. 2.6.35.5

Prepare Your Kernel Source Code

/55


Unzip kernel source code.

cd /usr/src

tar jxvf linux-source-2.6.X.tar.bz2

You may have many versions of Linux source codes.

Prepare Your Kernel Source Code (Cont)

/55


There are many ways to configure.

make config

make menuconfig

make xconfig

...

If you do not know how to configure, you can copy the old config file from /boot.

make mrproper

cp /boot/config-`uname -r` .config

make menuconfig

Configure your Kernel

/55


Configure your Kernel (Cont)

/55


If you meet some problems (SATA)

Device Drivers --->

SCSI device support --->

<*> SCSI device support

<*> SCSI disk support

Device Drivers --->

SCSI device support --->

SCSI low-level drivers --->

[*] Serial ATA (SATA) support

Configure your Kernel (Cont)

/55


#make clean

#make bzImage

#make modules

#make modules_install

#make install

#mkinitramfs –o /boot/initrd.img-2.6.x 2.6.x

Kernel Compilation

/55


See how many cores/hyperthreading on your machine

cat /proc/cpuinfo | grep processor | wc –l

e.g. 8

Compile with the number of jobs

make –j8 bzImage

make –j8 modules

...

Speed up Kernel Compilation

/55


Setup your boot manager.

vim /boot/grub/menu.lst

Add the following section (Grub1):

title Ubuntu 10.04 LTS, kernel 2.6.35.5

uuid xxxx

kernel /boot/vmlinuz-2.6.35.5 root=UUID=xxxx ro splash

initrd /boot/initrd.img-2.6.35.5

Configure your Boot Menu

/55


Setup your boot manager.

vim /boot/grub/grub.cfg

Add the following section (Grub2):

Configure your Boot Menu (Cont)

/55


Install ssh server

apt-get install ssh

A ssh client on Windows.

http://ntu.csie.org/~piaip/pietty/

Some Useful Tools

/55


鳥哥的私房菜

http://linux.vbird.org/

Google

http://www.google.com/

Reference

/55


System Call


System call is the mechanism used by an application program to request service from the OS.

Users can use it to communicate with kernel.

Here are two approaches developing our own system calls

Using kernel module

Modify the source code of linux directly

Introduction

/55


Building system calls in kernel module is more flexible than modifying kernel. When we want to use our system call, just install our kernel modules; and if we don’t need it right away, just remove modules.

Modifying kernel is not necessary. (But you still need to modify your kernel for O.S. project one.)

Using Kernel Module

/55


For sys_call_table, your should extern it in a file such as <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

Export sys_call_table

01

02

03

externvoid* sys_call_table[];

/*variable should be exported. */

EXPORT_SYMBOL(sys_call_table);

/55


sys_call_table is read-only after kernel version 2.6.23.

If you really want to try this method using kernel version which is higher than 2.6.23, you will have to modify your current kernel source and recompile it.

Export sys_call_table (Cont)

/55


Firstly, check your compiled kernel version

uname –a

In x86 32bit

vim /usr/src/linux-2.6.x/arch/x86/kernel/ entry_32.S

.section .rodata, “a”

.section .data, “aw”

Export sys_call_table (Cont)

/55


In x86 64bit

vim /usr/src/linux-2.6.x/arch/x86/kernel/syscall_64.c

line 22: delete the “const”

Export sys_call_table (Cont)

/55


Add to export symbol

vim /usr/src/linux-2.6.x/kernel/kallsyms.c

extern void *sys_call_table;

EXPORT_SYMBOL(sys_call_table);

Export sys_call_table (Cont)

/55


vim makefile

vim myservice.c

Write Your Makefile

/55


Include and Define

Extern the “sys_call_table”

Write your own system call

Write Kernel Module

01

02

03

#include <linux/kernel.h> /* We're doing kernel work */

#include <linux/module.h>

#define __NR_mysyscall 200 /* define the number of our system call */

01

02

03

typedefvoid(*sys_call_ptr_t)(void);

extern sys_call_ptr_t sys_call_table[];

sys_call_ptr_t orig_sys_call;

01

02

03

04

05

/* Our system call */

asmlinkage int mysyscall(int n){

printk("enter mysyscall()\n");

return2*n;

}

/55


Initialize the kernel module

Extern the “sys_call_table”

Write Kernel Module (Cont)

01

02

03

04

05

06

07

/* Initialize the module - replace the system call */

int init_module(){

printk("Insert mysyscall module\n");

orig_sys_call = sys_call_table[__NR_mysyscall];

sys_call_table[__NR_mysyscall]= mysyscall;

return0;

}

01

02

03

04

05

/* Cleanup - unregister the appropriate file from /proc */

void cleanup_module(){

printk("Remove mysyscall module\n");

sys_call_table[__NR_mysyscall]= orig_sys_call;

}

/55


Compile

make

Insert the module to kernel

insmod ./myservice.ko

Remove the module from kernel

rmmod myservice

List the modules in kernel

lsmod

Use Kernel Module

/55


Write an application to use your system call

vim ap.c

Compile and execute

gcc ap.c –o ap

./ap 10

User Application

01

02

03

04

05

06

07

08

09

10

11

12

13

#include <stdlib.h>

#include <stdio.h>

#define _GNU_SOURCE

#include <unistd.h>

#include <sys/syscall.h>

#define __NR_mysyscall 200

int main(int argc,char*argv[])

{

printf("%d\n", syscall(__NR_mysyscall, atoi(argv[1])));

return0;

}

/55


Here are two approaches developing our own system calls

Using kernel module

Modify the source code of Linux directly

Build Your Own System Calls

/55


Create a new file in /usr/src/linux-2.6.x/kernel/

vim myservice.c

Add your system call

Write Your System Call

01

02

03

04

05

06

07

08

#include <linux/linkage.h>

#include <linux/kernel.h>

asmlinkage int sys_myservice(int arg1)

{

printk("my service is invoked!\n");

return arg1 *10;

}

/55


In x86 32bit

/usr/src/linux-2.6.x/arch/x86/include/asm/

unistd_32.h

The index must be the last in the list

e.g. #define __NR_myservice 338

Write Your System Call (Cont) - x86_32

/55


Create an entry (function name) in system call table

/usr/src/linux-2.6.x/arch/x86/kernel/

syscall_table_32.S

.long sys_myservice

Write Your System Call (Cont) - x86_32

/55


In x86 64bit

/usr/src/linux-2.6.x/arch/x86/include/asm/

unistd_64.h

The index must be the last in the list

#define __NR_myservice 300

__SYSCALL(__NR_myservice, sys_myservice)

Write Your System Call (Cont) - x86_64

/55


Define the prototype

/usr/src/linux-2.6.x/include/linux/syscalls.h

#define asmlinkage int sys_myservice(int arg1);

Write Your System Call (Cont)

/55


Add to makefile to compile

vim /usr/linux-2.6.x/kernel/Makefile

obj-y += myservice.o

Now, you can recompile your kernel

Write Your System Call (Cont)

/55


Write an application to use your system call

vim ap.c

Compile and execute

gcc ap.c –o ap

./ap 10

User Application

01

02

03

04

05

06

07

08

09

10

11

12

13

#include <stdlib.h>

#include <stdio.h>

#define _GNU_SOURCE

#include <unistd.h>

#include <sys/syscall.h>

#define __NR_myservice 300

int main(int argc,char*argv[])

{

printf("%d\n", syscall(__NR_myservice, atoi(argv[1])));

return0;

}

/55


Since we want measure the number of sent signals and called sys_kill(), we might need to add a counter to system call “kill()” in /usr/src/Linux-2.6.x/kernel/signal.c.

e.g. int nr_kills;

If you want to use this variable in your system call or kernel module, you have to export it.

EXPORT_SYMBOL(nr_kills);

printk can print messages in kernel, use dmesg to check.

Hints

/55


Results

Hints (Cont)

2.

1.

3.

/55


LXR, http://rswiki.csie.org/lxr/http/source

Some Useful Tool

/55


Manpages

apt-get install manpages-dev

Some Useful Tool (Cont)

/55


Kernel Website

http://www.kernel.org

LXR

http://rswiki.csie.org/lxr/http/source

http://lxr.linux.no/linux/

Google

http://www.google.com/

Reference

/55


Q & A

/55


  • Login