Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Определение свободного и занятого места k  (Прочитано 49759 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 23-05-2008 07:12 » 

по формуле - вроде нет.
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 26-05-2008 06:49 » 

А не проще ли использовать табличный метод? Нужно всего 256 байт...
Код:
char bits[256] = {
  0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, // первая строка
.... // каждая след. строка будет из значений bits[номер строки] + bits[номер элемента в строке]
};
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #32 : 26-05-2008 07:09 » 

RXL, мне пока место экономить не нужно Улыбаюсь

а вот узнать текущий bitmap не мешало бы Улыбаюсь

s_bmap_nr; /* Количество bitmap-блоков, необходимых для отслеживания каждого блока в файловой системе */

вот не пойму как отследить?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 26-05-2008 07:15 » 

256 байт - не большой расход, а сокращает и ускоряет код значительно. Можно минимизировать: использовать только одну строку в 16 байт и конвертировать по ниблам.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 26-05-2008 07:26 » 

Ром, там и так табличный поиск, просто таблица заполняется компом, а не вручную
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #35 : 26-05-2008 08:28 » 

хм, по идеи текущий битмап должен выглядеть вот так:

Код:
buff2 = (super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * 1 + ((unsigned char*)(super->s_block_count / (super->s_blocksize * 8))));

но функция byte_c->GetZeroBitInBuf(buff2,len2); все равно валится по SIGSEG.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #36 : 26-05-2008 08:57 » 

ну не знаю, я в формуле не увидел часть
Код:
+((unsigned char*)(super->s_block_count / (super->s_blocksize * 8)))
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #37 : 26-05-2008 09:00 » 

Алексей1153++, Улыбаюсь

ну вообще

Код:
(........+(unsigned char*)super);

это ты меня подтолкнул, для передачи указателя Ага

а

Код:
super->s_block_count / (super->s_blocksize * 8)

это (мне кажется) текущий Bitmap который нужно передать, а не всю структуру.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 26-05-2008 09:09 » 

McZim, ммм, что то я не понял перехода :

(unsigned char*)super   - это я говорил, это указатель на начало блока памяти, куда указывает super

а это
((unsigned char*)(super->s_block_count / (super->s_blocksize * 8 )))
это указатель на начало блока памяти, с адресом "super->s_block_count / (super->s_blocksize * 8 )" - понятия не имею, куда ты попадёшь )
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #39 : 26-05-2008 09:14 » 

Алексей1153++, ок, я немного запутался, вот по этой формуле ((super->s_blocksize * 8 ) / super->s_block_count), можно получить текущий Bitmap именно мне его нужно передавать в цикле, вместо простого (unsigned char*)super или в месте с ним Улыбаюсь

З.Ы.: формула ((unsigned char*)(super->s_block_count / (super->s_blocksize * 8 ))) поменялась на ((unsigned char*)((super->s_blocksize * 8 ) / super->s_block_count))

был не прав Улыбаюсь

вот и вопрос как мне передать текущий Bitmap зная его по формуле ((super->s_blocksize * 8 ) / super->s_block_count)
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #40 : 26-05-2008 09:19 » 

можно конечно оформить это в качестве функции структуры, но мне кажется это не кашерно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #41 : 26-05-2008 09:28 » 

Код:
вот и вопрос как мне передать текущий Bitmap зная его по формуле ((super->s_blocksize * 8 ) / super->s_block_count) 

я не совсем понимаю, что ты имеешь в виду под "зная его по формуле"...   
Смысл формулы тоже чёта понять не могу .
Вот если бы знать смещение каждого битмапа от начала super, тогда

в цикле:
{
   DWORD dwdCurrentOffset= ... ;
   buf2 = ((BYTE*)super) + dwdCurrentOffset;
   ...
}
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #42 : 26-05-2008 11:02 » 

ага разобрались Улыбаюсь если цикл то нужно передавать по одному блоку, а мы передавали все сразу, если все сразу то нужно убрать цикл!
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #43 : 26-05-2008 11:14 » 

короче, вот так

Код:
for(int k=0; k < super->s_bmap_nr; k++)
{
   if(k == 0)
  {
      buff1 = (REISERFS_DISK_OFFSET_IN_BYTES + super->s_blocksize + (unsigned char* )super) ;
   }
   else
   {
     buff1 = (super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * k + (unsigned char* )super) ;
    }

     len1 = super->s_blocksize;
     totalcount += byte_c->GetZeroBitInBuf(buff1,len1);
}

или так

Код:
 buff1 = (REISERFS_DISK_OFFSET_IN_BYTES + super->s_blocksize + (unsigned char* )super) ;
 len1 = super->s_blocksize;
 totalcount += byte_c->GetZeroBitInBuf(buff1,len1);

if(super->s_bmap_n>=1)
{
     buff2 = (super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * 1 + (unsigned char* )super) ;
     len2 = super->s_blocksize * (super->s_bmap_nr-1);
     totalcount += byte_c->GetZeroBitInBuf(buff2,len2);
}

))
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #44 : 26-05-2008 11:37 » 

не большая поправочка. Вот тут

Код:
buff2 = (super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * 1 + (unsigned char* )super) ;

1 -- это говорится что передается первый Bitmap, для второго битмапа будет цифра 2 и т.д.

максимально битмапов может быть 8.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 26-05-2008 11:43 » 

Макс, опять меня запутал ? )))
(super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * 1
- это же смещение к БЛОКУ ( 1,2,3... (zb)) , а не к битмапу
Я так понял, по крайней мере )
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #46 : 26-05-2008 11:51 » 

вот смотри: http://p-nand-q.com/download/rfstool/reiserfs_docs.html

тут:

Код:
Finding the first bitmap block: REISERFS_DISK_OFFSET_IN_BYTES + REISERFS_BLOCKSIZE

Finding the next bitmap blocks: REISERFS_BLOCKSIZE * REISERFS_BLOCKSIZE * REISERFS_BLOCKSIZE * 8 * n

ключевая фраза: bitmap
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 26-05-2008 11:54 » 

вообще то bitmap blocks Улыбаюсь
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #48 : 26-05-2008 11:54 » 

и потом, когда ты делаешь цикл вида

Код:
for(int k=0; k < super->s_bmap_nr; k++)

и потом используешь К вот так

Код:
buff1 = (super->s_blocksize * super->s_blocksize * super->s_blocksize * 8 * k + (unsigned char* )super);

то это и говорит что ты перебираешь БитМапы.

З.Ы.: а вот сама структура супер блока:

Код:
struct reiserfs_super_block
{
  uint32_t s_block_count;
  uint32_t s_free_blocks;                  /* free blocks count    */
  uint32_t s_root_block;                   /* root block number    */
  uint32_t s_journal_block;                /* journal block number    */
  uint32_t s_journal_dev;                  /* journal device number  */

  /* Since journal size is currently a #define in a header file, if
  ** someone creates a disk with a 16MB journal and moves it to a
  ** system with 32MB journal default, they will overflow their journal
  ** when they mount the disk.  s_orig_journal_size, plus some checks
  ** while mounting (inside journal_init) prevent that from happening
  */

/* great comment Chris. Thanks.  -Hans */

  uint32_t s_orig_journal_size;
  uint32_t s_journal_trans_max;           /* max number of blocks in a transaction.  */
  uint32_t s_journal_block_count;         /* total size of the journal. can change over time  */
  uint32_t s_journal_max_batch;           /* max number of blocks to batch into a trans */
  uint32_t s_journal_max_commit_age;      /* in seconds, how old can an async commit be */
  uint32_t s_journal_max_trans_age;       /* in seconds, how old can a transaction be */
  uint16_t s_blocksize;                    /* block size           */
  uint16_t s_oid_maxsize;                  /* max size of object id array, see get_objectid() commentary  */
  uint16_t s_oid_cursize;                  /* current size of object id array */
  uint16_t s_state;                        /* valid or error       */
  char s_magic[12];                     /* reiserfs magic string indicates that file system is reiserfs */
  uint32_t s_hash_function_code;           /* indicate, what hash function is being use to sort names in a directory*/
  uint16_t s_tree_height;                  /* height of disk tree */
  uint16_t s_bmap_nr;                      /* amount of bitmap blocks needed to address each block of file system */
  uint16_t s_version;                      /* I'd prefer it if this was a string,
                                           something like "3.6.4", and maybe
                                           16 bytes long mostly unused. We
                                           don't need to save bytes in the
                                           superblock. -Hans */
  uint16_t s_reserved;
  uint32_t s_inode_generation;
  char s_unused[124] ;                  /* zero filled by mkreiserfs */
} __attribute__ ((__packed__));

интересующая строка

Код:
uint16_t s_bmap_nr;                      /* amount of bitmap blocks needed to address each block of file system */
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #49 : 26-05-2008 11:55 » 

Алексей1153++, я к тому что не просто Блокс а именно БитМап Блокс Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 26-05-2008 14:01 » 

McZim, я и говорю - блоки ) Что ты мне бабушку лохматишь Улыбаюсь
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #51 : 26-05-2008 14:07 » 

Алексей1153++, это БитМап блоки их может быть от 1 до 8 в них входят простые блоки размером по 4096 их в каждом битмап блоке может быть 4096*8 максимум!!!
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #52 : 26-05-2008 14:33 » new

фсё, понял. Термины юниксовые незнакомые, плаваю ) . Главное - решили )))
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #53 : 26-05-2008 19:43 » 

Алексей1153++, ага, спасибо.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines