Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak kontrolowac wielkosc stosu na LPC bez MMU?

demoh 06 Jun 2008 15:36 1776 6
  • #1
    demoh
    Level 19  
    Mozna w jakis sposob kontrolowac wielkosc stosu tak gdy wyjdzie poza pewien zakres bylo wywolywane przerywanie?

    Chce napisac mikrojadro ktore bedzie przelaczac kontekst miedzy watkami. Wiem jak uruchamiac programy bez MMU (adresowanie wzgledne) i jak przydzielac pamiec itd. Ale nie wiem jak kontrolowac wielkosc stosu tak by nie zaczal nadpisywac innych danych.

    Za pomoc z gory dziekuje.
  • #2
    _Matik_
    Level 19  
    Witam,
    Nie bardzo rozumiem w czym tkwi dokladnie problem, ale moze troche pomoge. Przykladowo we FreeRTOSie kazdy watek ma swoj wlasny stos ktory, jak rozumiem, przelaczany jest podczas zmiany kontekstu (przelaczenia aktywnego watku). Wydaje mi sie ze programista musi sam zapewnic aby stos nie zostal przepelniony. Natomiast watek moze prosic o dynamiczny przydzial pamieci procesora. Jest to realizowane przez oddzielona procedure przydzielania pamieci, bedaca elementem tego systemu operacyjnego. Sprawa nie jest banalna poniewaz odpowiednia procedura musi uwzgledniac fragmentacje pamieci podczas przydzielania i zwalniania blokow.

    Rzeczywiscie bardziej zaawansowane procki (wlasnie chyba robi to MMU) zawieraja ochrone systemu przed zle napisanymi watkami odwolujacymi sie do chronionej pamieci. Jezeli nie ma MMU to zle napisany watek wywali system, ale dobrze napisany watek korzystajacy z funkcji przydzielania pamieci systemu operacyjnego bedzie dzialal nawet jezeli jego pamiec sie skonczy (funkcja mu zwroci FALSE)

    Jednym slowem chyba nie ma sprzetowej mozliwosci zapobiegania przepelnieniu stosu lub przypadkowego nadpisania pamieci. Przynajmniej w ARM7 bo o taki chyba chodzi. Nie wiem czy pomoglem i nie wiem czy nie sklamalem :>. Ja to tak rozumiem.
  • #3
    demoh
    Level 19  
    Wszystko oprocz przepelnienia stosu jestem w stanie wykonac na ARM7 bez problemu (napisac poprawnie jadro i program je obslugujacy).

    Ja myslalem tylko nad tym by z kazdym przelaczeniem kondekstu czy wywolaniem przerywania itp sprawdzac czy na stosie jest np minimum 512 wolnych bajtow. Ale z drugiej strony ten limit moze byc za maly bo np podfunkcja w C tworzaca tablice tymczasowa z 1 tys elementow (bez malloc itp) przepelni mi stos i bedzie klapa :/

    Jak bym ustawil stos tak by zawsze mial wolne minimum 16KB to i tak moze sie przepelnic jak wywola sie podfunkcja z jeszcze wieksza tablica tymczasowa lub jak funkcja bedzie wykonywana rekurencyjnie.

    W ukladzie bede miec 2 MB SRAM i niechcial bym robic jakis wielkich buforow na stosy :/ ale chyba bede musial przelaczac kontekst co 1/250 s i dac bufor 4KB na stos. Bo program moze zadnego przerywania nie wywolywac przez dlugi czas a konsumowac stos :/
  • #4
    _Matik_
    Level 19  
    Hmmm, ale po to wlasnie pisze sie funkcje alokacji pamieci aby watek mogl ja dynamicznie uzyskac lub otrzymac informacje o chwilowym braku pamieci i poczekac. Funkcja mmaloc z gcc chyba nie jest optymalna, we freertosie sa do wyboru 3 algorytmy jako kompromis pomiedzy mozliwosciami i szybkoscia dzialania. Chyba lepiej napisac cos samemu lub zobaczyc jak to jest tam zrobione.
    Moim zdaniem sprawdzanie ilosci pamieci przed wlaczeniem watku nie ma sensu bo wiadomo ze w skrajnych przypadkach moze przepelnic.
  • #5
    demoh
    Level 19  
    Ja wiem i umiem robic alokacje pamieci.

    Chodzi mi tylko o stos.

    Mam taki kod i 4KB wolnego stosu:

    Code:

    int a;
    int b;

    // tutaj jeszcze ok
    {
        char tablica[10000]; // tutaj chcemy wziasc wiecej ze stosu niz mamy

        ...
    }



    i sie program wykrzacza :/

    Mi chodzi tylko o to, czy istnieje jakis elegancki sposob zapobiegania tego typu sytuacji.

    Wiem ze moge robic malloc itp ale takich podblokow moze byc pelno i klapa :/

    Dynamiczne przydzielanie pamieci to male piwo przy stosie gdzie nie ma zadnego zabezpieczenia przed wyjechaniem poza zakres, a nawet nie mozna tego zakresu ustalic.
  • #6
    _Matik_
    Level 19  
    Poniewaz stosu nie uzywa sie do umieszczania w nich tak duzych porcji danych a jezeli juz to trzeba to zrobic tak aby miec pewnosc ze przepelnienie nie nastapi. Sprawa staje sie prostsza jezeli kazdy watek ma oddzielny, przelaczany przy zmianie kontekstu, zakres pamieci stosu i wiadomo ile mozna wykorzystac w danym momencie.
  • #7
    demoh
    Level 19  
    Chyba zrobie tak:

    np 4KB bufforu minimum na stos dla kazdego watku i podczas przelaczania kontekstu bede sprawdzal czy nie ma za malo miejsca na stosie lub czy jest za duzo. W ten sposob bede zwalnial i przydzielal odpowiednio miejsce na stosie.

    Jak to nie zadziala to doloze sprawdzanie stosu przy wywolywaniu przerywan.


    Chyba powinno to wystarczyc?


    PS. tak duzej tablicy nie powinno sie robic na stosie ale zawsze mozna wywolac 1000 razy ta sama funkcje w sposob rekurencyjny i na to samo wyjdzie :P ale bynajmniej latwiej sie programuje bez MMU :P (bynajmniej mi, bo np na 386 tryb chroniony jest zagmatwany troche :P)