National Taiwan University
OS Project 0 & 1
Advisor: Dr. Chih-Wen Hsueh
Student: Tang-Hsun Tu
台灣大學網媒所 / 資工所
Wireless Networking and Embedded Systems Laboratory Real-Time System Software Group
April 21, 2023
/552National Taiwan University
Tang-Hsun Tu
Linux Installation Linux Kernel Compilation System Call
Outline
National Taiwan University
Linux Installation
/554National Taiwan University
Tang-Hsun Tu
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
/555National Taiwan University
Tang-Hsun Tu
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
/556National Taiwan University
Tang-Hsun Tu
/557National Taiwan University
Tang-Hsun Tu
/558National Taiwan University
Tang-Hsun Tu
/dev/hda, /dev/hdb, /dev/hdc, … /dev/hda1, /dev/hda2, …
/dev/sda, /dev/scd0, … Mount Points
/ /swap …
Disks and Partitions
/559National Taiwan University
Tang-Hsun Tu
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
/5510National Taiwan University
Tang-Hsun Tu
/5511National Taiwan University
Tang-Hsun Tu
/5512National Taiwan University
Tang-Hsun Tu
/5513National Taiwan University
Tang-Hsun Tu
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
/5514National Taiwan University
Tang-Hsun Tu
鳥哥的私房菜 http://linux.vbird.org/
Ubuntu 正體中文站 http://www.ubuntu-tw.org/
Ubuntu Homepage http://www.ubuntu.com/
Reference
National Taiwan University
Linux Kernel Compilation
/5516National Taiwan University
Tang-Hsun Tu
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?
/5517National Taiwan University
Tang-Hsun Tu
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?
/5518National Taiwan University
Tang-Hsun Tu
Kernel Website, http://www.kernel.org
You also can download the source from Ubuntu.
Where to D/L Linux Kernel?
/5519National Taiwan University
Tang-Hsun Tu
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
/5520National Taiwan University
Tang-Hsun Tu
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)
/5521National Taiwan University
Tang-Hsun Tu
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
/5522National Taiwan University
Tang-Hsun Tu
Configure your Kernel (Cont)
/5523National Taiwan University
Tang-Hsun Tu
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)
/5524National Taiwan University
Tang-Hsun Tu
#make clean #make bzImage #make modules #make modules_install #make install #mkinitramfs –o /boot/initrd.img-2.6.x 2.6.x
Kernel Compilation
/5525National Taiwan University
Tang-Hsun Tu
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
/5526National Taiwan University
Tang-Hsun Tu
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
/5527National Taiwan University
Tang-Hsun Tu
Setup your boot manager. vim /boot/grub/grub.cfg
Add the following section (Grub2):
Configure your Boot Menu (Cont)
/5528National Taiwan University
Tang-Hsun Tu
Install ssh server apt-get install ssh
A ssh client on Windows. http://ntu.csie.org/~piaip/pietty/
Some Useful Tools
/5529National Taiwan University
Tang-Hsun Tu
鳥哥的私房菜 http://linux.vbird.org/
Google http://www.google.com/
Reference
National Taiwan University
System Call
/5531National Taiwan University
Tang-Hsun Tu
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
/5532National Taiwan University
Tang-Hsun Tu
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
/5533National Taiwan University
Tang-Hsun Tu
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
extern void* sys_call_table[];/*variable should be exported. */ EXPORT_SYMBOL(sys_call_table);
010203
/5534National Taiwan University
Tang-Hsun Tu
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)
/5535National Taiwan University
Tang-Hsun Tu
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)
/5536National Taiwan University
Tang-Hsun Tu
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)
/5537National Taiwan University
Tang-Hsun Tu
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)
/5538National Taiwan University
Tang-Hsun Tu
vim makefile vim myservice.c
Write Your Makefile
/5539National Taiwan University
Tang-Hsun Tu
Include and Define
Extern the “sys_call_table”
Write your own system call
Write Kernel Module
#include <linux/kernel.h> /* We're doing kernel work */ #include <linux/module.h> #define __NR_mysyscall 200 /* define the number of our system call */
010203
typedef void (*sys_call_ptr_t)(void);extern sys_call_ptr_t sys_call_table[];sys_call_ptr_t orig_sys_call;
010203
/* Our system call */ asmlinkage int mysyscall(int n) { printk("enter mysyscall()\n"); return 2*n; }
0102030405
/5540National Taiwan University
Tang-Hsun Tu
Initialize the kernel module
Extern the “sys_call_table”
Write Kernel Module (Cont)
/* 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; return 0; }
01020304050607
/* Cleanup - unregister the appropriate file from /proc */void cleanup_module() { printk("Remove mysyscall module\n"); sys_call_table[__NR_mysyscall] = orig_sys_call; }
0102030405
/5541National Taiwan University
Tang-Hsun Tu
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
/5542National Taiwan University
Tang-Hsun Tu
Write an application to use your system call vim ap.c
Compile and execute gcc ap.c –o ap ./ap 10
User Application
#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]))); return 0;}
01020304050607080910111213
/5543National Taiwan University
Tang-Hsun Tu
Here are two approaches developing our own system calls Using kernel module Modify the source code of Linux directly
Build Your Own System Calls
/5544National Taiwan University
Tang-Hsun Tu
Create a new file in /usr/src/linux-2.6.x/kernel/ vim myservice.c
Add your system call
Write Your System Call
#include <linux/linkage.h>#include <linux/kernel.h>
asmlinkage int sys_myservice(int arg1){ printk("my service is invoked!\n"); return arg1 * 10;}
0102030405060708
/5545National Taiwan University
Tang-Hsun Tu
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
/5546National Taiwan University
Tang-Hsun Tu
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
/5547National Taiwan University
Tang-Hsun Tu
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
/5548National Taiwan University
Tang-Hsun Tu
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)
/5549National Taiwan University
Tang-Hsun Tu
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)
/5550National Taiwan University
Tang-Hsun Tu
Write an application to use your system call vim ap.c
Compile and execute gcc ap.c –o ap ./ap 10
User Application
#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]))); return 0;}
01020304050607080910111213
/5551National Taiwan University
Tang-Hsun Tu
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
/5552National Taiwan University
Tang-Hsun Tu
Results
Hints (Cont)
1.
2.
3.
/5553National Taiwan University
Tang-Hsun Tu
LXR, http://rswiki.csie.org/lxr/http/source
Some Useful Tool
/5554National Taiwan University
Tang-Hsun Tu
Manpages apt-get install manpages-dev
Some Useful Tool (Cont)
/5555National Taiwan University
Tang-Hsun Tu
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
/5556National Taiwan University
Tang-Hsun Tu
Q & A