You are on page 1of 9

Adding a new System Call to your Kernel

Komandat te cilat do perdorim duhet ti instalojm :

sudo apt-get install gcc


sudo apt-get install libncurses5-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt install make
sudo apt-get install libssl-dev
sudo apt-get install libelf-dev
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe"
sudo apt-get update
sudo apt-get upgrade

Hapat:

Downloading a kernel:

Para së gjithash , ne duhet të shkarkojmë një kernel nga kernel.org. Ne mund ta bëjmë këtë duke
përdorur komandën "wget" ose ta shkarkojmë manualisht duke klikuar opsionin "tarball".
Extracting the kernel:

Tani, shkoni te dosja ku është shkarkuar kerneli dhe ekstraktoni atë duke shtypur "tar -xvf
*filename*” ose thjesht duke klikuar me te djathten mbi ted he duke zgjedhur opsionin “extract to”.

Krijimi i një folder të re të quajtur hello:

Shkoni në dosjen ku keni nxjerrë kernelin dhe futuni brenda dosjes së kernelit dhe krijoni një direktori të
re duke hapur terminalin atje dhe duke shtypur "mkdir *emri i dosjes*" ose thjesht duke klikuar me të
djathtën atje dhe duke klikuar mbi dosjen e re.
Shtimi i një kodi C për system call:
Tani, shkoni te dosja që krijuam tani dhe hapni terminalin atje dhe krijoni një skedar të ri të kodit C duke
shtypur "gedit hello.c" dhe ngjisni kodin e mëposhtëm atje:

#include <linux/kernel.h> asmlinkage long sys_hello(void)


{
printk("Hello world\n");
return 0;
}

Shpjegimi i kodit:
Ne përdorëm #include <linux/kernel> sepse po ndërtojmë një thirrje sistemi për kernelin tonë linux.
Amslinkage thjesht do të thotë që argumentet për këtë funksion do të jenë në stack në vend të
regjistrave të CPU.
Printk përdoret në vend të printf sepse ne do të printojmë në skedarin e regjistrit të kernelit.
Nëse kodi ekzekutohet dhe ai kthen 0, atëherë do të thotë që programi ynë u ekzekutua me sukses dhe
Hello world është shkruar në skedarin e regjistrit të kernelit.

Krijimi i një Makefile për kodin C:


Tani, ne duhet të krijojmë një Makefile për dosjen tonë të re për të siguruar që kodi në dosje të
kompilohet gjithmonë sa herë që përpilohet kerneli. Për ta bërë këtë, ne shkruajmë në terminalin tonë
"gedit Makefile" dhe vendosim "obj-y := hello.o"
Shtimi i kodit të ri në skedarin e tabelës së sistemit:

Meqenëse po krijojmë një thirrje sistemi 64-bit sipas sistemit tonë, duhet të shtojmë hyrjen e thirrjes së
sistemit në skedarin syscall_64.tbl i cili mban emrin e të gjitha thirrjeve të sistemit në sistemin tonë. Nëse
sistemi ynë do të ishte një sistem 32-bitësh, do të duhej të shtonim thirrjen tonë të sistemit në
syscall_32.tbl (Mund të kontrollojmë llojin e sistemit tonë duke shtypur "uname -m" në një terminal). Ky
skedar tbl ndodhet brenda dosjes së kernelit në /arch/x86/entry/syscalls/syscall_64.tbl. Mund të
shkojmë në këtë direktori duke përdorur cd dhe më pas të modifikojmë skedarin duke shtypur "gedit
syscall_64.tbl"
Shtimi i prototipit të thirrjes së re të sistemit në skedarin e kokës së thirrjeve të sistemit:

Tani duhet të shtojmë prototipin e thirrjes sonë të sistemit në skedarin e kokës së sistemit, i cili
ndodhet në dosjen e kernelit, më pas "/include/linux/syscalls.h". Ne duhet të shtojmë prototipin e
funksionit tonë të thirrjes së sistemit në këtë skedar.

Ndryshimi i versionit dhe shtimi i dosjes hello në Makefile e kernelit:

Tani, ne duhet të shtojmë numrin tonë të listës në ekstraversionin e skedarit të krijimit të kernelit
dhe duhet të shtojmë modulin e ri që krijuam në skedarin e krijimit të kernelit tonë. Për këtë, ne
hapim Makefile-in e kernelit dhe kërkojmë "core-y" dhe shkojmë në instancën e dytë që është nën
"KBUILD_EXTMOD" dhe shtojmë modulin tonë të ri që është "përshëndetje" në fund të tij. Në fund,
skedari ynë i krijimit do të duket diçka si kjo:
Krijimi i një skedari konfigurimi:

Tani duhet të krijojmë një skedar konfigurimi për kernelin tonë. Rendi i hapave përpara këtij mund të
ndryshojë, por rendi i këtij hapi dhe hapat që vijnë menjëherë pas tij nuk mund të ndryshojnë. Ne
mund të krijojmë një Menuconfig ose thjesht të kopjojmë konfigurimin e vjetër. Unë do të kopjoj
konfigurimin e vjetër dhe do ta përdor atë konfigurim për kernelin tim të ri. Para së gjithash, ne
kërkojmë për konfigurimin që kemi aktualisht duke shtypur “ls /boot | grep config” dhe ne kopjojmë
konfigurimin që na shfaqet duke shtypur “cp /boot/config-4.10.0-28-generic *drejtoria jonë e kernelit
linux*”. Më pas krijojmë konfigurimin e vjetër duke shtypur “po” | make oldconfig -j4”, duke vepruar
kështu, sistemi do të krijojë automatikisht konfigurimin e ri për ne dhe do të zgjedhë opsionin e
paracaktuar për gjithçka.

Pastrimi dhe përpilimi i kernelit:

Ne duhet të pastrojmë të gjithë objektin tonë ekzistues dhe skedarin e ekzekutueshëm sepse
përpiluesi ndonjëherë lidh ose përpilon skedarët gabimisht dhe për të shmangur këtë, ne fshijmë të
gjithë objektin tonë të vjetër dhe skedarët e ekzekutueshëm duke shtypur "make clean -j4" (është më
mirë të kaloni në modaliteti super përdorues duke shtypur "sudo su" përpara se të ekzekutohen
komandat pas kësaj) dhe kur të përfundojë e gjithë kjo, ne shkruajmë "make -j4" për të filluar
ndërtimin e kernelit tonë (-j4 shpërndan bërthamat e shumta që sistemi ynë ka për kompilim. Nëse
ne nuk e bëjmë këtë, sistemi do të përdorë vetëm një bërthamë të vetme për përpilimin e
kernel i cili është mjaft i ngadalshëm. Shtimi i -j4 do të rrisë shpejtësinë e përpilimit tonë me
pothuajse 4 herë. Vini re se 4 është numri i bërthamave që kam në laptop. Ju mund të kontrolloni
numrin tuaj të bërthamave duke shtypur komandën "lscpu" dhe futni numrin në përputhje me
rrethanat)

Now we have to wait until our Kernel image is built and ready. If we see “Kernel image is ready”
when the command is done executing, that means that our kernel image is ready to be installed. (I
forgot to take screenshots of this point)
Instalimi i moduleve:

Tani duhet të instalojmë kernelin që kemi ndërtuar duke shtypur “make modules_install install” i cili
do të instalojë kernelin dhe do të përditësojë gjithashtu grub-in tonë. Kur të gjitha këto të kryhen dhe
terminali thotë "mbaroi", atëherë ne mund të rinisim laptopin tonë ose manualisht ose duke shtypur
“shutdown -r now” dhe mbajmë tastin “Shift” ndërkohë që po riniset për të hapur menynë e grub-it
dhe për të kaluar në kernelin e ri që sapo kemi instaluar. (Kam harruar të bëj screenshot edhe për
këtë pikë.)

Kontrollimi nëse telefonata e sistemit po funksionon siç duhet:

Pas hyrjes në kernelin e sapopërpiluar, ne kontrollojmë thirrjen e sistemit duke bërë një kod C të
quajtur "userspace.c" dhe duke vendosur kodin e mëposhtëm në të:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h> #include <unistd.h>
int main()
{
long int i = syscall(335);
printf("System call sys_hello returned %ld\n", i);
return 0;
}

Tani e përpilojmë kodin duke shtypur “gcc userspace.c” dhe duke e ekzekutuar duke shtypur “./a.out”.
Nëse kthen 0, kjo do të thotë që kodi ynë është kompiluar me sukses dhe thirrja e sistemit po funksionon
mirë (Vini re se në thirrjen e syscall(335), 335 është numri ku kemi shtuar thirrjen tonë të sistemit në
tabelë) dhe në fund, ne ekzekutojmë " dmesg” për të parë mesazhet e kernelit dhe do të gjejmë “Hello
World” të shkruar në fund të tij.

You might also like