os project 0 february 25, 2015. outline linux installation linux kernel compilation system call...

Post on 19-Jan-2016

227 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

OS Project 0

February 25, 2015

/ 452

Outline Linux Installation Linux Kernel Compilation System Call Development Kernel Modules

Part I

Linux Installation

/ 454

Kernel versus Distribution Kernel is the core of the operating system including

scheduler, memory management, file system, etc. Distribution is a full functional environment

including the kernel and a large collection of software applications.

The following slides are based on Ubuntu 12.04.4 (desktop version). Download Link:

http://ftp.twaren.net/Linux/Ubuntu/ubuntu-cd/precise/ubuntu-12.04.4-desktop-amd64.iso (64-bit)

http://ftp.twaren.net/Linux/Ubuntu/ubuntu-cd/precise/ubuntu-12.04.4-desktop-i386.iso (32-bit)

/ 455

Preparation (1/2) A computer An Ubuntu 12.04 DVD or image A clear head and relaxed mind Some drinks, food, or comics

/ 456

Preparation (2/2) If you want to install Linux on your hard disk,

please set at least 16GB unpartitioned space. You may want to shrink your existing disk by disk

management if there is no more unpartitioned space.

Ubuntu can coexist with Windows. Change the boot sequence to boot from CD-ROM

first.

If you want to install Linux on a virtual machine, you can use VirtualBox or VMware. VirtualBox Website: https://www.virtualbox.org/

Please refer to this website for creating a VM in VirtualBox.

/ 457

/ 458

/ 459

/ 4510

/ 4511

/ 4512

/ 4513

/ 4514

/ 4515

Some Useful Commands Installing packages in Ubuntu

$ apt-cache search xxxx $ sudo apt-get install xxxx

GNU Compiler Collection $ gcc -o test test.c $ ./test

Makefile $ make

Text-mode editor $ vim

SSH server and client $ ssh -p port user@hostname

/ 4516

Some Useful Tools SSH server

$ sudo apt-get install ssh

SSH client for Windows PieTTY http://ntu.csie.org/~piaip/pietty/

/ 4517

References 鳥哥的私房菜

http://linux.vbird.org Ubuntu 正體中文站

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

http://www.ubuntu.com

Part II

Linux Kernel Compilation

/ 4519

When Should We Compile Kernel? There are various situations we have to

compile the kernel. Try new kernel patches for the latest laptops. Enable/disable features built in the kernel. Develop new features. …

This slides are based on Linux 3.13.2. http://

ftp.ntu.edu.tw/linux/kernel/v3.x/linux-3.13.2.tar.xz

/ 4520

Download Source Archives Kernel Website: http://www.kernel.org

Mirror: http://ftp.ntu.edu.tw/linux/kernel/v3.x/

/ 4521

Preparation Setting up build environment

$ sudo apt-get update $ sudo apt-get install gcc vim ssh libncurses5-dev

Getting the source archive $ cd ${HOME} $ wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.X.X.tar.xz

Extracting the archive $ tar Jxvf linux-3.X.X.tar.xz $ cd linux-3.X.X

/ 4522

Kernel Configuration (1/2) There are several ways to configure the

kernel. $ make config $ make menuconfig $ make xconfig

(It will need qt4-qmake and qt4-dev-tools packages.) ...

If you do not know how to configure, you can copy the old configuration file from /boot. $ cp /boot/config-`uname -r` .config $ make olddefconfig $ make menuconfig

This step is optional.

/ 4523

Kernel Configuration (2/2)

/ 4524

Kernel Compilation The first time (about 30min ~ 1.5hr):

$ make bzImage $ make modules (It takes quite a long time.) $ sudo make modules_install $ sudo make install $ sudo mkinitramfs -o /boot/initrd.img-3.X.X 3.X.X Do this whenever you reinstall the modules.

Configure the boot loader and then reboot! Others (about 5~10min):

$ make bzImage $ sudo make install Then reboot!

/ 4525

Kernel Compilation with Multiple Cores See how many cores on your machine.

$ cat /proc/cpuinfo | grep processor | wc -l E.g., 4.

Compile with the number of jobs (threads). $ make -j4 bzImage $ make -j4 modules ...

/ 4526

Boot Loader Configuration (Optional) Ubuntu will do this for you when installing the

kernel. Adding a new entry to /boot/grub/grub.cfg

If you got a black screen after booting the new kernel Change ‘gfxmode $linux_gfx_mode’ ‘gfxmode text’

/ 4527

Rebooting Do not forget to reboot every time you install

a new kernel image!

You can use ‘uname -a’ to check current system information.

Part III

System Call Development

/ 4529

Preparation Find out whether the kernel is 32-bit or 64-bit

version. $ uname -p

32-bit: i386 i686 64-bit: x86_64

/ 4530

Adding a System Call (1/4) Define your system calls.

Create a new file kernel/myservice.c.

Add this new attribute to kernel/Makefile. obj-y += myservice.o

#include <linux/linkage.h>#include <linux/kernel.h>

asmlinkage int sys_myservice(int arg1){ printk(“My service is invoked!\n"); return arg1 * 10;}

0102030405060708

/ 4531

Adding a System Call (2/4) Declare the prototype of your system calls.

Add the declaration to include/linux/syscalls.h. asmlinkage int sys_myservice(int arg1);

/ 4532

Adding a System Call (3/4) Register a system call number (32-bit).

For Linux 3.X, it has a automatic way to generate system calls compared to the previous versions.

Add a new entry to arch/x86/syscalls/syscall_32.tbl. 350 i386 myservice sys_myservice

The generated file is in arch/x86/include/generated/uapi/asm, after compilation.

/ 4533

Adding a System Call (4/4) Register a system call number (64-bit).

Add a new entry to arch/x86/syscalls/syscall_64.tbl. 313 common myservice sys_myservice

The generated file is in arch/x86/include/generated/uapi/asm, after compilation.

/ 4534

System Call Invocation Create a test file ap.c to try your system call.

Compile & execute. $ gcc -o ap ap.c $ ./ap 10

#include <stdlib.h>#include <stdio.h>#define _GNU_SOURCE#include <unistd.h>#include <sys/syscall.h>

#define __NR_myservice 350

int main(int argc, char** argv){ printf("%d\n", syscall(__NR_myservice, atoi(argv[1]))); return 0;}

01020304050607080910111213

/ 4535

Related APIs Access a block of data from/to user space in

the kernel. #include <linux/uaccess.h> unsigned long copy_from_user (void* to, const void __user* from, unsigned long n);

unsigned long copy_to_user (void __user* to, const void* from, unsigned long n);

Use the generic function syscall to invoke a specific system call in user space. #include <sys/syscall.h> int syscall(int number, ...);

The first argument, number, is the system call number.

/ 4536

Some Useful Tools (1/2) LXR Website: http://lxr.linux.no/linux/

/ 4537

Some Useful Tools (2/2) Manpages

$ sudo apt-get install manpages-dev $ man XXXX

/ 4538

References Kernel Website

http://www.kernel.org LXR

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

Part IV

Kernel Modules

/ 4540

An Example of Writing a Kernel Module(1/5) Definition of the module structure

/ 4541

An Example of Writing a Kernel Module(2/5) Initialization and cleanup functions

/ 4542

An Example of Writing a Kernel Module(3/5) File operations

/ 4543

An Example of Writing a Kernel Module(4/5) User AP

/ 4544

An Example of Writing a Kernel Module(5/5) Makefile

Testing $ sudo insmod hello.ko $ dmesg $ sudo ./ap $ dmesg $ sudo rmmod hello

/ 4545

Q & A

top related