Автор Тема: Работа с големи буфери в ядрото  (Прочетена 5245 пъти)

Lord Bad

  • Напреднали
  • *****
  • Публикации: 1667
  • Distribution: Fedora 13
  • Window Manager: GNOME
  • Jedi Knight
    • Профил
Работа с големи буфери в ядрото
« Отговор #30 -: Sep 08, 2006, 13:41 »
Гледам никой нищо май няма да каже, та ще споделя с вас последните си разкрития, които ме отказаха да ползвам mmap /dev/mem... Написах следната програма, която просто трябва да сканира оперативната памет и да определи размера и чрез /dev/mem:
Примерен код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main()
{
   int mem_fd, ret;
//   char var_char[4];
   char *charp;
   int count = 0;

   if((mem_fd = open("/dev/mem",O_RDONLY)) < 0){
      printf("\n\nProblem in opening /dev/mem");
      exit(-1);
   }

   ret = 1;
   charp = (char *)malloc(sizeof(char) * 1024 * 1024);
   
   while(ret > 0){
      ret = read(mem_fd, charp,sizeof(char) * 1024 *1024);
      printf("\nret:%d",ret);
      if (ret > 0)
         count++;
   }
   
   printf("\nMemory Read:%d MB",count);

   exit(0);
}


Като го тествах на служебния ми комп, на който върви Федора 5 с ядро  2.6.17 резултата беше следния:
Примерен код
[root@bozhidar hpialloc]# ./read_mem

ret:1048576
ret:-1
Memory Read:1 MB



А на ARM-a полежението е още по-зле:
Примерен код
-bash-2.05b# ./read_mem_linux
Unable to handle kernel paging request at virtual address 20000000
pgd = c18e0000
[20000000] *pgd=00000000
Internal error: Oops: f5 [#3]
Modules linked in:
CPU: 0
PC is at .c2u_0fupi+0xc/0x50
LR is at read_mem+0x74/0xa4
pc : [<c00a6c60>]    lr : [<c00aec70>]    Not tainted
sp : c1be1f1c  ip : 00000000  fp : c1be1f50
r10: c1c9d0a4  r9 : 40149008  r8 : 00100000
r7 : fffffff2  r6 : c1c9d0a4  r5 : 00100000  r4 : 81249007
r3 : 00000000  r2 : 000ffffc  r1 : 20000000  r0 : 40149008
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: 397F  Table: A18E0000  DAC: 00000015
Process read_mem_linux (pid: 79, stack limit = 0xc1be00fc)
Stack: (0xc1be1f1c to 0xc1be2000)
1f00:                                                                00100000
1f20: 81249007 00100000 c1c9d0a4 fffffff2 c00aec70 00000000 c1c9d080 00000000
1f40: 00000000 c1be1f84 c1be1f54 c006112c c00aec08 c0056d8c c1cbe680 fffffff7
1f60: 40149008 c1c9d080 00000003 c001d224 c1be0000 401421a0 c1be1fa4 c1be1f88
1f80: c006136c c0061050 00000000 4001d9cc befffe34 00008544 00000000 c1be1fa8
1fa0: c001d0a0 c0061338 4001d9cc c0023b08 00000003 40149008 00100000 00000001
1fc0: 4001d9cc befffe34 00008544 4000c85c 00000001 00008470 401421a0 befffe10
1fe0: 400e40a0 befffdf0 000084f0 400e40a4 60000010 00000003 9feb7c4a 3fd67f64
Backtrace:
[<c00aebfc>] (read_mem+0x0/0xa4) from [<c006112c>] (vfs_read+0xe8/0x120)
 r7 = 00000000  r6 = 00000000  r5 = C1C9D080  r4 = 00000000
[<c0061044>] (vfs_read+0x0/0x120) from [<c006136c>] (sys_read+0x40/0x5c)
[<c006132c>] (sys_read+0x0/0x5c) from [<c001d0a0>] (ret_fast_syscall+0x0/0x2c)
 r6 = 00008544  r5 = BEFFFE34  r4 = 4001D9CC
Code: 1a000037 e2522004 4282c004 4a000026 (e4913004)
 Segmentation fault
-bash-2.05b#



Затова отново прегледах из гугъл и разбрах следните неща - на х86 архитектурата това е работело в 2.14 сериите на ядро, но после в 2.16 са били направени промени и /dev/mem може да се ползва надеждно само за четене/писане по ioport-ове. Главния му потребител се оказва че е Х сървъра... В arm не е ясно дали някога е работело въобще затова сега ще търся други варианти...
Активен

Fuelled by Fedora 13 "Goddard"
====================================
Rock it!

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Работа с големи буфери в ядрото
« Отговор #31 -: Sep 12, 2006, 12:02 »
Тъй...регистрирах се, блях

Ъм...при мен изхода от програмата е:

ret:1048576
ret:1048576
.....
......
ret:1048576
ret:-1
Memory Read:896 MB

896МВ е големината на ZONE_NORMAL, /dev/mem не дава достъп до ZONE_HIMEM, така че няма как да изчета останалата памет до 1280-тия мегабайт.

Т.е при мен няма проблем с изчитането.

Сега обаче като се замисля...вероятно причината за това е хардуерен. Доколкото знам първите 16MB се водят ZONE_DMA - т.е адресно пространство използвано за ДМА трансфери от ISA и някои PCI устройства..нямам обаче много ясна идея защо става така при теб.

Можеш ли да пейстнеш какво има в /proc/zoneinfo BTW?
Активен

"Knowledge is power" - France is Bacon

Lord Bad

  • Напреднали
  • *****
  • Публикации: 1667
  • Distribution: Fedora 13
  • Window Manager: GNOME
  • Jedi Knight
    • Профил
Работа с големи буфери в ядрото
« Отговор #32 -: Sep 12, 2006, 12:54 »
Разбира се:
Цитат
[root@bozhidar hpialloc]# cat /proc/zoneinfo
Node 0, zone      DMA
  pages free     3096
        min      17
        low      21
        high     25
        active   0
        inactive 0
        scanned  0 (a: 0 i: 0)
        spanned  4096
        present  4096
        protection: (0, 0, 879, 1519)
  pagesets
  all_unreclaimable: 0
  prev_priority:     12
  temp_priority:     12
  start_pfn:         0
Node 0, zone   Normal
  pages free     48198
        min      939
        low      1173
        high     1408
        active   90048
        inactive 54868
        scanned  0 (a: 0 i: 0)
        spanned  225279
        present  225279
        protection: (0, 0, 0, 5119)
  pagesets
    cpu: 0 pcp: 0
              count: 175
              high:  186
              batch: 31
    cpu: 0 pcp: 1
              count: 9
              high:  62
              batch: 15
  all_unreclaimable: 0
  prev_priority:     12
  temp_priority:     12
  start_pfn:         4096
Node 0, zone  HighMem
  pages free     1045
        min      128
        low      298
        high     469
        active   82137
        inactive 77478
        scanned  0 (a: 0 i: 0)
        spanned  163825
        present  163825
        protection: (0, 0, 0, 0)
  pagesets
    cpu: 0 pcp: 0
              count: 158
              high:  186
              batch: 31
    cpu: 0 pcp: 1
              count: 10
              high:  62
              batch: 15
  all_unreclaimable: 0
  prev_priority:     12
  temp_priority:     12
  start_pfn:         229375
Активен

Fuelled by Fedora 13 "Goddard"
====================================
Rock it!