Edytowanie Kodu linuxa

1

Mam pytanie, jak mogę edytować kod linuxa, by coś do niego dodać?
Z góry dziękuje

4

Możesz pobrać kod całego linuksa, zmienić i skompilować, ale prawdopodobnie chodzi ci o coś innego. Co chcesz dodać?

0

Możesz spróbować ogarnąć Linux from Scratch, jeśli polegniesz to znaczy, że to co chcesz zrobić jest poza zasięgiem Twoich możliwości.

8

Jak wyżej - co konkretnie chcesz zrobić? Dodać obsługę drukarki? Zmienić wygląd okienek? Samo jądro Linuksa robi bardzo dużo różnych rzeczy. A do tego środowiska graficzne, np. KDE SC robią kolejny pierdyliard rzeczy, ale są niezależne od jądra.
Pytanie dotyczy obszernego tematu. To tak jakbym zapytał "Jak mogę dodać coś do samochodu?". No ale do coś silnika, kierownicy, bagażnika, klimatyzację, radio?
To może przykład. "Linux" często jest utożsamiany z dystrybucją, np. Ubuntu, Fedora. Taka Fedora dzieli się na jądro GNU Linux + środowisko graficzne + programy typu binutils. Zatem jeśli chcę:

  • dodać obsługę sprzętu, piszę sterownik,
  • dodać obsługę procesora, dopisuję instrukcje do jądra,
  • dodać logowanie domenowe do okienka logowania, dopisuję obsługę do KDM, co jest częścią KDE SC,
  • dodać możliwość kompilowania programu na ARM, dopisuję funkcję do GCC.
0

Najszybciej zrobisz to uzywajac edytora hexadecymalnego, najlepiej z disassemblerem. Musisz znac tylko miejsce modyfikacji.

Chcesz zmienic sposob bootowania, jadro, sterownik czy jakis konkretny proces w systemie?

1

widzę że potrzeba kogoś, kto się zna na maintainowaniu kernela linuxa, bo ci nasi linuksiarze (@PerlMonk) z 4p to pewnie nawet nie kompilują jądra co każdy release

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.tar.xz

unxz -v linux-5.12.tar.xz

tar -xvf linux-512.tar

cd linux-5.12

cp -v /boot/config-$(uname -r) .config

sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev

sudo apt-get install yum

sudo yum install ncurses-devel bison flex elfutils-libelf-devel openssl-devel

make menuconfig

make

te libki do instalacji to w tutorialu znalazłem, nie wiem czy są bezpieczne

1

Kurde, musze przyznac ze choc siedze na codzien na linuchu to ostatnio kompilowalem jadro jeszcze w poprzednim stuleciu.

1

To zależy co masz na myśli. Musisz wiedzieć, że Linux (jako OS) to połączenie co najmniej kilku komponentów, każdy jest rozwijany osobno. Tak więc zacznij od określenia komponentu, który chcesz zmienić.

Najciężej jest z jądrem, bo na ogół, żeby przetestować, trzeba skopiować obraz jądra w odpowiednie miejsce, czasem zaktualizować konfigurację bootloadera, i uruchomić ponownie (wydaje mi się, że jest opcjonalna opcja podmieniania jądra w locie, ale nigdy tego nie używałem), za pewne warto robić to na maszynie wirtualnej. Trochę lżej jeśli modyfikujemy lub piszemy nowy moduł jądra. Na szczęście tylko najbardziej uprzywilejowane, najbliższe sprzętu rzeczy wymagają modyfikacji jądra. Z resztą, jeśli pytasz, raczej nie chcesz go ruszać, bo to zupełnie inna bajka niż programowanie w przestrzeni użytkownika. Podobnie jak w przypadku bootloadera.

W dalszej kolejności mamy program inicjujący — przeważnie systemd lub init (raczej na starszych dystrybucjach). Tu pewnie też będzie często potrzebne przeładowanie systemu. Dalej mamy program logowania w konsoli (zwyke pam), tryb graficzny (X11 lub Wayland). Systemowa powłoka to przeważnie bash (choć jest wiele innych implementacji), warto włączyć do tego też zestaw podstawowych programów, najpopularniejsze implementacje to coreutils i busybox.

Jeśli chodzi o program logowania w trybie graficznym to jest ich wiele (zwykle lightdm, kdm, gdm), a środowisk graficznych (np. Gnome, KDE, XFCE) i samodzielnych menedżerów okien jest już tyle, że nie będę wymieniać. :) Jeszcze warto wspomnieć o menedżerze pakietów — to już jest zależne od dystrybucji.

Dalej to już trudno powiedzieć co konkretnie zrobić, bo nie wiadomo co chcesz zrobić. To tak jakbyś zapytał, jak napisać program. :)

0

Najłatwiej, najszybciej, najlepiej, najbezpieczniej będzie stworzyć moduł kernela, ładowany dynamicznie w razie czego po prostu reboot systemu zrobisz.
Ewentualnie można go na stałe zainstalować, zamiast dynamicznie ładować za pomocą insmod.

Dupa.c

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void) {
	printk(KERN_ALERT "DUPA: Hello!\n");
	return 0;
}

static void hello_exit(void) {
	printk(KERN_ALERT "DUPA: EXIT\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");

Makefile

obj-m+=Dupa.o

Compile

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Install / remove

insmod Dupa.ko
rmmod Dupa
0

Zasadniczo to tak jak przedmówcy już pisali - jest podział w GNU/Linuxie na część kernel-space i user-space. Kernel-space to programowanie na wysokim poziomie uprzywilejowania. Możesz się tam odwoływać np. do sprzętu (kart PCI i innych peryferiów) bezpośrednio a nie być skazanym na czyjeś rozwiązania. Wysoki poziom uprzywilejowania to również wysoki poziom odpowiedzialności za kod, który piszesz. Przykładowo w user-space jeśli pomylisz się w obsłudze wskaźnika to poleci tylko ten program, który źle się odwoływał do tego wskaźnika. Natomiast w kernel-space jeśli się pomylisz w obsłudze wskaźników to możesz sobie nieźle napsuć w całym systemie, na dysku, etc. Zwykle taki system po wysypce nadaje się do restartu. Początki programowania w kernel-space wydają się być proste bo zamieniasz printf() na printk() ale to tylko pozory bo im głębiej będziesz sięgać do kernela tym trudniej cokolwiek ogarnąć. Na "zachętę" dodam, że jeśli chodzi o literaturę do kernel-space Linuxa to jest jej trochę ale najlepsze pozycje są wysoce "przeterminowane" z racji tego, że kernel cały czas ewoluuje i trudno dogonić w książce to co w kernelu się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1