[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Lost] svn-diff von snake707
Hallo,
also 1. habe ich änderungen unternommen (in meiner wc):
svn diff im Anhang
leider wurde ich ausm irc gebannt, wegen openvpn über packman.links2linux -.-
schaade, warn wohl zuviele online
mfg
Index: src/kernel2/src/mm/phys.c
===================================================================
--- src/kernel2/src/mm/phys.c (Revision 725)
+++ src/kernel2/src/mm/phys.c (Arbeitskopie)
@@ -47,7 +47,7 @@
extern void kernel_phys_start();
extern void kernel_phys_end();
-/** Bitmap aller physischen Seiten. Gesetztes Bit steht für freie Seite */
+/** Bitmap aller physischen Seiten. Gesetztes Bit steht f�r freie Seite */
#define PMM_BITS_PER_ELEMENT (8 * sizeof(uint_fast32_t))
#define PMM_NUM_DMA_ELEMENTS ((16 * 1024 * 1024) / sizeof(uint_fast32_t))
@@ -57,7 +57,7 @@
static lock_t pmm_lock = 0;
/**
- * Größe von pmm_bitmap in Elementen (= 1/8*sizeof(uint_fast32_t) der Anzahl
+ * Gr��e von pmm_bitmap in Elementen (= 1/8*sizeof(uint_fast32_t) der Anzahl
* der physischen Seiten)
*
* @see pmm_bitmap
@@ -65,14 +65,14 @@
static size_t pmm_bitmap_length;
/**
- * Anzahl der nutzbaren Seiten. Entspricht pmm_bitmap_size * 32 abzüglich
+ * Anzahl der nutzbaren Seiten. Entspricht pmm_bitmap_size * 32 abz�glich
* der von der BIOS-Memory-Map als reserviert gekennzeichneten Bereiche.
*/
static size_t pmm_bitmap_usable_pages;
/**
- * Gibt die Startadresse der Bitmap zurück
+ * Gibt die Startadresse der Bitmap zur�ck
*/
void* pmm_get_bitmap_start()
{
@@ -81,8 +81,8 @@
/**
* Setzt die Startadresse der Bitmap. Diese Funktion ist einzig und allein dazu
- * bestimmt, den Übergang von physischen zu virtuellen Adressen beim
- * Einschalten von Paging bewerkstelligen zu können.
+ * bestimmt, den �bergang von physischen zu virtuellen Adressen beim
+ * Einschalten von Paging bewerkstelligen zu k�nnen.
*/
void pmm_set_bitmap_start(void* bitmap_start)
{
@@ -90,7 +90,7 @@
}
/**
- * Gibt die Göße der Bitmap in Bytes zurück
+ * Gibt die G��e der Bitmap in Bytes zur�ck
*/
size_t pmm_get_bitmap_size()
{
@@ -193,16 +193,16 @@
/**
* Sucht num freie Pages und gibt einen Zeiger auf den Anfang der ersten Page
- * zurück.
+ * zur�ck.
*
* @param lower_index Index der niedrigsten erlaubten Page
- * @param upper_index Index der höchsten erlaubten Page
+ * @param upper_index Index der h�chsten erlaubten Page
* @param num Anzahl der Pages.
*
* @return Zeiger auf den Anfang der ersten Page.
* @return Im Erfolgsfall wird ein Zeiger auf den Anfang der ersten
- * Page zurückgegeben (Bei Erfolg ist der Rückgabewert immer
- * durch PAGE_SIZE teilbar). Im Fehlerfall wird 1 zurückgegeben.
+ * Page zur�ckgegeben (Bei Erfolg ist der R�ckgabewert immer
+ * durch PAGE_SIZE teilbar). Im Fehlerfall wird 1 zur�ckgegeben.
*/
/* TODO: unbedingt testen */
@@ -263,10 +263,10 @@
/**
* Reserviert num Pages.
*
- * @param lower_limit Niedrigste erlaubte Adresse (Muß auf 32-Bit-Systemen
+ * @param lower_limit Niedrigste erlaubte Adresse (Mu� auf 32-Bit-Systemen
* auf einer 128K-Grenze liegen. Wenn nicht, wird gerundet)
*
- * @param upper_limit Höchste erlaubte Adresse (Muß auf 32-Bit-Systemen
+ * @param upper_limit H�chste erlaubte Adresse (Mu� auf 32-Bit-Systemen
* auf einer 128K-Grenze liegen. Wenn nicht, wird gerundet)
*
* @param num Anzahl der zu reservierenden Seiten
@@ -313,7 +313,7 @@
}
/**
- * Reserviert num Pages, die beliebig im physischen Speicher liegen können.
+ * Reserviert num Pages, die beliebig im physischen Speicher liegen k�nnen.
*
* @see pmm_alloc_limits
*/
@@ -330,27 +330,36 @@
/**
- * Gibt physisch zusammenhängende Speicherseiten frei
+ * Gibt physisch zusammenh�ngende Speicherseiten frei
*
* @param start Zeiger auf das erste Byte der ersten freizugebenden Seite
* @param count Anzahl der freizugebenden Seiten
*/
void pmm_free(paddr_t start, size_t count)
{
- // TODO Prüfen, ob die Seiten vorher auch besetzt waren, sonst Panic
+ // TODO Pr�fen, ob die Seiten vorher auch besetzt waren, sonst Panic
+ size_t i= NUM_PAGES(start - *pmm_bitmap),j,k; //anzahl der Pages, Von pmm_bitmap und start
+ for(j=0;j<count;j++){
+ for(k=0;k<PMM_BITS_PER_ELEMENT;k++) {
+ if(pmm_bitmap[i+j] & (1 << k)) { //Wenn die Warte wahr ist, dann ist ja eine page nicht besetzt
+ //Panic
+ }
+ }
+ }
phys_mark_page_range_as_free(start, count);
}
+
struct reserved_block {
paddr_t start;
paddr_t end;
};
/**
- * @return Beschreibung des reservierten Blocks. Wenn i größer als die
+ * @return Beschreibung des reservierten Blocks. Wenn i gr��er als die
* Anzahl der reservierten Blocks ist, wird ein Block mit start > end
- * zurückgegeben.
+ * zur�ckgegeben.
*/
static struct reserved_block get_reserved_block
(struct multiboot_info* multiboot_info, size_t i)
@@ -358,7 +367,7 @@
struct reserved_block result;
- // Überprüfung der BIOS-Memory-Map
+ // �berpr�fung der BIOS-Memory-Map
struct multiboot_mmap* mmap;
uintptr_t mmap_addr = multiboot_info->mi_mmap_addr;
uintptr_t mmap_end = mmap_addr + multiboot_info->mi_mmap_length;
@@ -367,7 +376,7 @@
mmap < (struct multiboot_mmap*) (mmap_end);
mmap++)
{
- // Typ 1 steht für freien Speicher
+ // Typ 1 steht f�r freien Speicher
if (mmap->mm_type != 1) {
if (i-- == 0) {
result.start = (paddr_t)((uintptr_t) mmap->mm_base_addr);
@@ -431,7 +440,7 @@
}
/**
- * Suche einen Platz für die Bitmap
+ * Suche einen Platz f�r die Bitmap
*/
static paddr_t find_bitmap_mem
(struct multiboot_info* multiboot_info, size_t size)
@@ -459,11 +468,11 @@
}
/**
- * Bestimmt die benötigte Größe der Bitmap in Bytes
+ * Bestimmt die ben�tigte Gr��e der Bitmap in Bytes
*/
static size_t required_bitmap_size(struct multiboot_info* multiboot_info)
{
- // Suche die höchste Adresse
+ // Suche die h�chste Adresse
paddr_t upper_end = 0;
if (multiboot_info->mi_flags & MULTIBOOT_INFO_HAS_MMAP)
{
@@ -488,7 +497,7 @@
multiboot_info->mi_mem_upper));
}
- // Umrechnen auf benötigte Bytes für die Bitmap
+ // Umrechnen auf ben�tigte Bytes f�r die Bitmap
return (size_t) upper_end / PAGE_SIZE / 8;
}
@@ -496,13 +505,13 @@
* Initialisiert den physischen Speicher.
*
* @param mmap_addr Adresse der Memorymap.
- * @param mmap_length Länge der Memorymap in Bytes.
- * @param upper_mem Größe des upper_mem in Kilobyte, wie in der Multboot-Info
- * übergeben.
+ * @param mmap_length L�nge der Memorymap in Bytes.
+ * @param upper_mem Gr��e des upper_mem in Kilobyte, wie in der Multboot-Info
+ * �bergeben.
*/
void pmm_init(struct multiboot_info* multiboot_info)
{
- // Finde einen Platz für die Bitmap
+ // Finde einen Platz f�r die Bitmap
size_t bitmap_size = required_bitmap_size(multiboot_info);
pmm_bitmap = find_bitmap_mem(multiboot_info, bitmap_size);
pmm_bitmap_length = 8 * bitmap_size / PMM_BITS_PER_ELEMENT;
@@ -510,16 +519,16 @@
// Am Anfang ist alles frei
memset(pmm_bitmap, ~0x0, bitmap_size);
- // Zunächst die Bitmap selbst als besetzt markieren...
+ // Zun�chst die Bitmap selbst als besetzt markieren...
phys_mark_page_range_as_used(pmm_bitmap, NUM_PAGES(bitmap_size));
- // ...anschließend die BIOS-Memory-Map abarbeiten
+ // ...anschlie�end die BIOS-Memory-Map abarbeiten
size_t i = 0;
do
{
struct reserved_block block = get_reserved_block(multiboot_info, i++);
- // Wenn der Start nach dem Ende liegt, ist der Block ungültig
+ // Wenn der Start nach dem Ende liegt, ist der Block ung�ltig
// und wir sind fertig
if (block.start > block.end) {
break;
@@ -531,4 +540,5 @@
(block.start, NUM_PAGES(block.end - block.start));
}
while(TRUE);
+ pmm_bitmap_usable_pages=bitmap_size-NUM_PAGES(block.end-block.start);
}
Index: src/kernel2/src/syscalls/mem.c
===================================================================
--- src/kernel2/src/syscalls/mem.c (Revision 725)
+++ src/kernel2/src/syscalls/mem.c (Arbeitskopie)
@@ -40,7 +40,7 @@
#include "mm.h"
/**
- * Einen Speicherblock allozieren.
+ * Einen Speicherblock allokieren.
*
* @param bytes Groesse des Speicherblocks
* @param flags Flags
@@ -62,7 +62,17 @@
return address;
}
+//TODO: Test ob das hier funktioniert.
+
+/**
+ * Einen Speicherblock freen.
+ * @param bytes Groesse das Speicherblocks
+ * @param start Addresse des ersten Speicherblocks
+ */
+
void syscall_mem_free(vaddr_t start, size_t bytes)
{
+ size_t page_count = NUM_PAGES(PAGE_ALIGN_ROUND_UP(bytes));
+ pmm_free(start, page_count);
}