Próbuję uruchomić aplikację dla systemu Linux i wszystko, co chcę uruchomić, to ta jedna aplikacja po uruchomieniu. Potrzebuję sieci i to wszystko (bez wyświetlacza, urządzeń peryferyjnych itp.). Nie chcę, aby inne aplikacje działały, więc aplikacja, którą uruchamiam, ma 100% procesora. czy to możliwe?
17
Odpowiedzi:
Minimalny program initrd CPIO hello world krok po kroku
Skompiluj cześć świata bez żadnych zależności, które kończą się nieskończoną pętlą.
init.S
:Nie możemy użyć
sys_exit
, inaczej jądro wpadnie w panikę.Następnie:
Tworzy to system plików z naszym hello world
/init
, który jest pierwszym programem dla użytkowników, który uruchomi jądro. Moglibyśmy również dodać więcej plikówd/
i byłyby one dostępne z/init
programu podczas działania jądra.Następnie
cd
w drzewie jądra Linux, kompilacja jest jak zwykle i uruchom ją w QEMU:I powinieneś zobaczyć linię:
na ekranie emulatora! Pamiętaj, że nie jest to ostatni wiersz, więc musisz spojrzeć nieco dalej.
Możesz także użyć programów C, jeśli połączysz je statycznie:
z:
Możesz działać na prawdziwym sprzęcie z włączonym USB
/dev/sdX
i:Świetne źródło na ten temat: http://landley.net/writing/rootfs-howto.html Wyjaśnia także, jak używać
gen_initramfs_list.sh
, czyli skryptu z drzewa źródeł jądra Linux, który pomaga zautomatyzować proces.Następny krok: skonfiguruj BusyBox, aby móc współpracować z systemem: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Testowane na Ubuntu 16.10, QEMU 2.6.1.
źródło
możesz uruchomić jądro z
init=/path/to/myapp
parametrem zdefiniowanym w bootloaderze.źródło
Wygląda na to, że próbujesz założyć kiosk . Większość przewodników po Internecie koncentruje się na przeglądarce internetowej, takiej jak Firefox, jako pojedyncza aplikacja, która działa. Spójrz na ten przewodnik po pomysły.
źródło
Z pewnością możesz uruchomić tylko jedną aplikację użytkownika po uruchomieniu jądra. Ale nie będzie miał 100% CPU, ponieważ będą musiały istnieć inne procesy związane z jądrem. Zwykle odbywa się to w urządzeniach z wbudowanym systemem Linux, np. Routerach bezprzewodowych. Mam również doświadczenie z pierwszej ręki, robiąc to dla aplikacji wielowątkowej.
Po uruchomieniu jądra uruchamiany jest skrypt inicjujący lub startowy. Przeczytaj o poziomach pracy systemu Linux i procesie init. W użyciu są różne schematy uruchamiania, więc nie można być konkretnym. Ale Linux pozwoli ci dokładnie skonfigurować, które aplikacje i demony będą wykonywane w twojej sytuacji. Inne niż plik startowy w katalogu głównym, pliki wymagające modyfikacji znajdują się w / etc , a w szczególności /etc/init.d
BTW, chyba że jesteś jakimś superprogramerem lub zanim uruchomisz zdalny serwer GDB, będziesz potrzebować jakiegoś rodzaju konsoli debugowania (konsoli PC lub portu szeregowego) dla swojej aplikacji. Umożliwi to otrzymywanie powiadomień o błędach seg, błędach magistrali i błędach asercji. Więc planuj mieć coś w rodzaju „peryferyjnego” oprócz „sieci”.
źródło
Istnieje kilka aplikacji systemowych, które należy uruchomić, poza nimi, oczywiście, możesz poświęcić resztę zasobów komputera tej aplikacji. Aby mieć minimum, możesz rzucić okiem na naprawdę małe dystrybucje Linuksa, takie jak TinyCore Linux itp.
Również zależałoby to od samej aplikacji, wymaganych usług poza siecią itp.
Myślę, że jeśli możesz podać bardziej szczegółowe informacje, uzyskasz bardziej szczegółową odpowiedź.
Podoba mi się rodzaj aplikacji itp.
źródło
Jeśli naprawdę nie chcesz niczego poza jądrem Linuksa, obsługą sieci i aplikacją, jedynym sposobem na to jest:
make menuconfig
) własne niestandardowe jądro i usunąć wszystkie funkcje niezwiązane z uruchomieniem systemu i sieci. Będziesz chciał wyłączyć blokowanie warstwy, nie wiem jak to zrobić w ostatnich jądrachmake menuconfig
.init
tego nie zrobi, lub przygotuj się na 1 dodatkowy proces przestrzeni użytkownika.Wiem, że moduły jądra mogą tworzyć procesy - prosty
ps aux
pokazałby wiele w typowym systemie (wszystkie są w nawiasach). Prawdopodobnie chcesz, aby Twój moduł utworzył proces jądra. Aby pozbyć się wszystkich procesów tworzonych przez jądro poza twoim, musisz wyłączyć wątki [kthreadd
], zarządzanie energią [pm
], warstwę zdarzeń [events
] i inne.Jeśli chcesz bardziej praktycznej konfiguracji procesu przestrzeni użytkownika w jądrze + 1, jest to możliwe.
Linux ma opcję wiersza polecenia jądra o nazwie
init=
- właśnie to jądro uruchomi się po zakończeniu ładowania. Program musi znajdować się na urządzeniu głównym określonym za pomocąroot=
lub w pliku initrd (ładowanym przez program ładujący).Jeśli ten program zakończy działanie, Linux wpadnie w panikę, więc upewnij się, że nigdy się nie zakończy.
Wiele współczesnych dystrybucji Linuksa ma to ustawione, więc
init
program w initrd wykonuje pewne dodatkowe inicjowanie przestrzeni użytkownika przed uruchomieniem/sbin/init
lub/sbin/systemd
. Musisz dowiedzieć się, co robi twoja dystrybucja tutaj (informacje o Debianie są tutaj ) i dowiedzieć się, gdzie możesz określić końcowy program „przekazywania”, a następnie możesz powiedzieć mu, aby uruchomił aplikację zamiastinit
lubsystemd
.systemd
zarządza wieloma podstawowymi funkcjami, takimi jak budowanie/dev
, ustawianie nazwy hosta i inne rzeczy, więc jeśli jesteś elastyczny, możesz zamiast tego rozważyć konfiguracjęsystemd
odrodzenia pojedynczego procesu i opcjonalnie uruchom go ponownie, jeśli się nie powiedzie. Jeśli się nie mylę, robi to zasadniczo w trybie pojedynczego użytkownika lub w trybie odzyskiwania - uruchamia powłokę.Będziesz miał uruchomione 2 procesy (
systemd
i twój program), ale system nie będzie panikował, jeśli Twój program zakończy działanie lub ulegnie awarii.Rozważ też po prostu lekką instalację Debiana - instalacja „netinst” nie ma wiele innych uruchomień niż jądro, powłoka i kilka usług - lub rozważ OpenWRT / LEDE - ma domyślnie serwer WWW dla Luci i kilka innych usług, ale można je łatwo wyłączyć.
źródło