Page 1 of 2

Есть вопрос

Posted: Tue Oct 07, 2008 12:01 pm
by Asper
Как получить физический адрес в программе зная адрес виртуальный?

Пример из Висопсиса (только здесь обратный подход):

Code: Select all

  queueHeadsPhysical = kernelMemoryGetPhysical(USBUHCI_QUEUEHEADS_MEMSIZE, MEMORY_PAGE_SIZE, "usb queue heads");
  // Map it to a virtual address
  status = kernelPageMapToFree(KERNELPROCID, queueHeadsPhysical, (void **) &queueHeads, USBUHCI_QUEUEHEADS_MEMSIZE);

[/color]

Re: Есть вопрос

Posted: Tue Oct 07, 2008 4:39 pm
by Serge
Никак. Функция есть, но доступна только из ядра

Re: Есть вопрос

Posted: Wed Oct 08, 2008 3:19 pm
by Asper
Драйвер эту функцию вызвать сможет?

Re: Есть вопрос

Posted: Wed Oct 08, 2008 4:41 pm
by Serge
Да. GetPgAddr

Re: Есть вопрос

Posted: Wed Oct 08, 2008 4:48 pm
by Asper
Большое спасибо Serge. Это как раз то, что мне было нужно. :)

Re: Есть вопрос

Posted: Thu Oct 23, 2008 3:03 pm
by Asper
Ещё вопрос : программа может узнать каким-либо образом свой адрес в файловой системе?

Re: Есть вопрос

Posted: Thu Oct 23, 2008 4:37 pm
by Serge
Что значит адрес ? Каталог из которого она запущена ?

Re: Есть вопрос

Posted: Fri Oct 24, 2008 3:47 pm
by Asper
Да

Re: Есть вопрос

Posted: Fri Oct 24, 2008 6:52 pm
by Serge

Code: Select all

db 'MENUET01'
dd 1
dd start
dd i_end
dd mem
dd mem
dd 0
dd app_path   ;буфер для хранения полного пути приложения. 1024 байта


start:

; находим последний '/' и заменяем его 0. Получается полный путь к ;каталогу из которого запущена программа.

          pushd path

          push '/'
          push app_path
          call _strrchr    ;стандартная функция С ищет в строке последний указанный символ

          mov byte [eax], 0

;делаем этот каталог текущим рабочим
          mov eax, 30
          mov ebx, 1
          mov ecx, [esp+8]
          int 0x40

;теперь программа может открывать файлы в своей папке без указания полного пути
Всё это должны были делать файловые менеджеры, но они этого не делают. В результате все программы запущенные в Колибри получают своим рабочим каталогом /rd/1/

Re: Есть вопрос

Posted: Sat Oct 25, 2008 3:50 pm
by Asper
Спасибо Serge, ты действительно разбираешься во многих вещах. А это ИМХО заслуживает звания хакера ОС Колибри. :wink:

Re: Есть вопрос

Posted: Mon Oct 27, 2008 4:13 pm
by Nable
to Asper
Serge не только разбирается во многих вещах, но и имеет время отвечать на вопросы. Мне бы времени...(

Re: Есть вопрос

Posted: Mon Oct 27, 2008 4:47 pm
by <Lrz>
То же самое только на ассемблере

Code: Select all

db 'MENUET01'
dd 1
dd start
dd i_end
dd mem
dd mem
dd 0
dd app_path   ;буфер для хранения полного пути приложения. 1024 байта


start:
        mov     edi,app_path
        mov     ecx,1024
        mov     esi,ecx
        xor     eax,eax
        cld
        repne   scasb
        test    ecx,ecx
        jz       exit

        sub     esi,ecx
        mov     ecx,esi
        std
        mov     al,'/'
        repne   scasb
        test    ecx,ecx
        jz      exit
        add     edi,2
        mov    [edi],0 ;ACSIIZ строка

; сейчас edi указывает на конец строчки типка /rd/1/File manager/
;                                                                                            ^ - тут edi 
          mov eax, 30
          mov ebx, 1
          mov ecx, app_path
          int 0x40

....

app_path   rb 1024
i_end:
PS если нужно загрузить либу, то смотри код
svn\bin\programs\develop\box_lib\trunk\editbox_ex.asm
тут реализован код загрузки библиотеки из папки в которой загружена программа, а если невозможно загрузить, используется ini_file db '/sys/lib/box_lib.obj',0

Re: Есть вопрос

Posted: Tue Oct 28, 2008 5:12 pm
by Asper
Nable
Я мог бы применить сказанные мной слова не только к Serge'у, а ко многим людям которые занимаются разработкой прикладного и системного софта для ОС Колибри, а также развитием собственно её. Ну а Serge'у и другим людям, которые своевременно отвечают на мои может быть иногда и дурацкие иногда вопросы я лично благодарен, т.к. их ответы помогают мне самому больше узнать Колибри и быстрее писать для неё программы не тратя время на самостоятельный поиск нужной информации.

LRZ
Respect, не прийдется самому заниматься переводом на ассемблер, а это как я уже написал Nable'у ускоряет мою работу.

Re: Есть вопрос

Posted: Tue Oct 28, 2008 5:43 pm
by Asper
Отцами-основателями Колибри считаю Mario79, Mike.dld и Diamond'а, возвращению последнего на форум я искренне рад, хотелось бы верить и в возвращение Mario79. :)

Re: Есть вопрос

Posted: Tue Oct 28, 2008 10:57 pm
by ДедОк
Mario79 играл очень сложную, неоднозначную, но важную роль... было бы очень здорово, если бы он вернулся...;)