Os project 0 1
Download
1 / 56

OS Project 0 & 1 - PowerPoint PPT Presentation


  • 111 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' OS Project 0 & 1' - kreeli


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

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


Outline

Linux Installation

Linux Kernel Compilation

System Call

Outline

/55



Linux distribution

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


Before installation

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

Make sure your hardware and device

A clear head and relaxed mind

Some drinks and food

Before Installation

/55


/55 applications.


/55 applications.


Disks and partitions

/dev/hda, /dev/hdb, /dev/hdc, … applications.

/dev/hda1, /dev/hda2, …

/dev/sda, /dev/scd0, …

Mount Points

/

/swap

Disks and Partitions

/55


Partition division

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 1GB


/55 1GB


/55 1GB


End of installation

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


Reference

鳥哥的私房菜 mouse.

http://linux.vbird.org/

Ubuntu 正體中文站

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

Ubuntu Homepage

http://www.ubuntu.com/

Reference

/55



What is linux kernel

Kernel is the core of an operating system. mouse.

Scheduler, task management, memory management, …

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

What is Linux Kernel?

/55


When should we compile kernel

You can configure your Linux by compiling a new kernel. mouse.

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


Where to d l linux kernel

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

You also can download the source from Ubuntu.

Where to D/L Linux Kernel?

/55


Prepare your kernel source code

You need to be root to compile kernel mouse.

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


Prepare your kernel source code cont

Unzip kernel source code. mouse.

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


Configure your kernel

There are many ways to configure. mouse.

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 cont1

If you meet some problems (SATA) mouse.

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


Kernel compilation

#make clean mouse.

#make bzImage

#make modules

#make modules_install

#make install

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

Kernel Compilation

/55


Speed up kernel compilation

See how many cores/hyperthreading on your machine mouse.

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


Configure your boot menu

Setup your boot manager. mouse.

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


Configure your boot menu cont

Setup your boot manager. mouse.

vim /boot/grub/grub.cfg

Add the following section (Grub2):

Configure your Boot Menu (Cont)

/55


Some useful tools

Install ssh server mouse.

apt-get install ssh

A ssh client on Windows.

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

Some Useful Tools

/55


Reference1

鳥哥的私房菜 mouse.

http://linux.vbird.org/

Google

http://www.google.com/

Reference

/55


System call

System Call mouse.


Introduction

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


Using kernel module

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


Export sys call table

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


Export sys call table cont

sys_call_table is read-only after kernel version <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.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


Export sys call table cont1

Firstly, check your compiled kernel version <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Export sys call table cont2

In x86 64bit <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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

line 22: delete the “const”

Export sys_call_table (Cont)

/55


Export sys call table cont3

Add to export symbol <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Write your makefile

vim <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.makefile

vim myservice.c

Write Your Makefile

/55


Write kernel module

Include and Define <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Write kernel module cont

Initialize the kernel module <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Use kernel module

Compile <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


User application

Write an application to use your system call <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Build your own system calls

Here are two approaches developing our own system calls <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

Using kernel module

Modify the source code of Linux directly

Build Your Own System Calls

/55


Write your system call

Create a new file in /usr/src/linux-2.6.x/kernel/ <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Write your system call cont x86 32

In x86 32bit <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

/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


Write your system call cont x86 321

Create an entry (function name) in system call table <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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

syscall_table_32.S

.long sys_myservice

Write Your System Call (Cont) - x86_32

/55


Write your system call cont x86 64

In x86 64bit <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

/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


Write your system call cont

Define the prototype <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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

#define asmlinkage int sys_myservice(int arg1);

Write Your System Call (Cont)

/55


Write your system call cont1

Add to makefile to compile <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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

obj-y += myservice.o

Now, you can recompile your kernel

Write Your System Call (Cont)

/55


User application1

Write an application to use your system call <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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


Hints

Since we want measure the number of <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.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


Hints cont

Results <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

Hints (Cont)

2.

1.

3.

/55


Some useful tool

LXR, <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.http://rswiki.csie.org/lxr/http/source

Some Useful Tool

/55


Some useful tool cont

Manpages <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

apt-get install manpages-dev

Some Useful Tool (Cont)

/55


Reference2

Kernel Website <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

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 <top directory to the kernel sources>/arch/x86/kernel/i386_ksyms_32.c.

/55


ad