<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      可以叫我阿星

       

      linux下/dev/mem分析

      linux下/dev/mem分析

      dev/mem: 物理內(nèi)存的全鏡像。可以用來訪問物理內(nèi)存。
      /dev/kmem: kernel看到的虛擬內(nèi)存的全鏡像。可以用來訪問kernel的內(nèi)容。


      /dev/mem 用來訪問物理IO設(shè)備,比如X用來訪問顯卡的物理內(nèi)存,或嵌入式中訪問GPIO。用法一般就是open,然后mmap,接著可以使用map之后的地址來訪問物理內(nèi)存。這其實(shí)就是實(shí)現(xiàn)用戶空間驅(qū)動的一種方法。
      /dev/kmem 一般可以用來查看kernel的變量,或者用作rootkit之類的。

      通過/dev/mem設(shè)備文件和mmap系統(tǒng)調(diào)用,可以將線性地址描述的物理內(nèi)存映射到進(jìn)程
      的地址空間,然后就可以直接訪問這段內(nèi)存了。

      比如,標(biāo)準(zhǔn)VGA 16色模式的實(shí)模式地址是A000:0000,而線性地址則是A0000。設(shè)定顯
      存大小為0x10000,則可以如下操作

          mem_fd  = open( "/dev/mem", O_RDWR );
          vga_mem = mmap( 0, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED,
                          mem_fd, 0xA0000 );
          close( mem_fd );

      然后直接對vga_mem進(jìn)行訪問,就可以了。當(dāng)然,如果是操作VGA顯卡,還要獲得I/O
      端口的訪問權(quán)限,以便進(jìn)行直接的I/O操作,用來設(shè)置模式/調(diào)色板/選擇位面等等

      在工控領(lǐng)域中還有一種常用的方法,用來在內(nèi)核和應(yīng)用程序之間高效傳遞數(shù)據(jù):

      1) 假定系統(tǒng)有64M物理內(nèi)存,則可以通過lilo通知內(nèi)核只使用63M,而保留1M物理內(nèi)
        存作為數(shù)據(jù)交換使用(使用 mem=63M 標(biāo)記)。
      2) 然后打開/dev/mem設(shè)備,并將63M開始的1M地址空間映射到進(jìn)程的地址空間。

      使用/dev/kmem查看kernel變量 從lwn.net學(xué)到的
      實(shí)例代碼如下:
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <stdarg.h>
      #include <fcntl.h>
      #include <unistd.h>
      #include <errno.h>

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <sys/poll.h>
      #include <sys/mman.h>

      int page_size;
      #define PAGE_SIZE page_size
      #define PAGE_MASK (~(PAGE_SIZE-1))

      void get_var (unsigned long addr) {
              off_t ptr = addr & ~(PAGE_MASK);
              off_t offset = addr & PAGE_MASK;
              int i = 0;
              char *map;
              static int kfd = -1;

              kfd = open("/dev/kmem",O_RDONLY);
              if (kfd < 0) {
                      perror("open");
                      exit(0);
              }

              map = mmap(NULL,PAGE_SIZE,PROT_READ,MAP_SHARED,kfd,offset);
              if (map == MAP_FAILED) {
                      perror("mmap");
                      exit(-1);
              }
              /* 假定這里是字符串 */
              printf("%s\n",map+ptr);

              return;
      }

      int main(int argc, char **argv)
      {
              FILE *fp;
              char addr_str[11]="0x";
              char var[51];
              unsigned long addr;
              char ch;
              int r;
             
              if (argc != 2) {
                      fprintf(stderr,"usage: %s System.map\n",argv[0]);
                      exit(-1);
              }

              if ((fp = fopen(argv[1],"r")) == NULL) {
                      perror("fopen");
                      exit(-1);
              }

              do {
                      r = fscanf(fp,"%8s %c %50s\n",&addr_str[2],&ch,var);
                      if (strcmp(var,"modprobe_path")==0)
                              break;
              } while(r > 0);
              if (r < 0) {
                      printf("could not find modprobe_path\n");
                      exit(-1);
              }
              page_size = getpagesize();
              addr = strtoul(addr_str,NULL,16);
              printf("found modprobe_path at (%s) %08lx\n",addr_str,addr);
              get_var(addr);
      }

      運(yùn)行:

      # ./tmap /boot/System.map
      found modprobe_path at (0xc03aa900) c03aa900
      /sbin/modprobe


       

      ××××××××××××××××××××××××××××××××××××××××××××××


      區(qū)別:

      1. /dev/mem: 物理內(nèi)存的全鏡像。可以用來訪問物理內(nèi)存。
      2. /dev/kmem: kernel看到的虛擬內(nèi)存的全鏡像。可以用來訪問kernel的內(nèi)容。


      作用:

      1. 前者用來訪問物理IO設(shè)備,比如X用來訪問顯卡的物理內(nèi)存,或嵌入式中訪問GPIO。用法一般就是open,然后mmap,接著可以使用map之后的地址來訪問物理內(nèi)存。這其實(shí)就是實(shí)現(xiàn)用戶空間驅(qū)動的一種方法。
      2. 后者一般可以用來查看kernel的變量,或者用作rootkit之類的。參考1和2描述了用來查看kernel變量這
      在2.4,可以直接打開/dev/mem,然后讀取。

      在2.6,直接打開/dev/mem后,只可以讀取前0x101000部分的內(nèi)容(ubuntu)。大約是1MB加4KB。讀取后面的內(nèi)容將出現(xiàn)"open not permitted"錯誤。

      解決的方法是使用mmap()。routine如下:

      f = open("/dev/mem", O_RDONLY);

      my_mem = mmap (0, 0x1000, PROT_READ, MAP_SHARED, f, 0x34f000);
      if (my_mem == MAP_FAILED)
      printf("map failed %s\n",strerror(errno));
      通過my_mem就可以得到0x101000之后的內(nèi)存內(nèi)容了。

      posted on 2021-01-21 11:39  可以叫我阿星  閱讀(391)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 国产亚洲精品第一综合麻豆| 国产偷窥熟女高潮精品视频| 樱花草在线社区www| 少妇撒尿一区二区在线视频| 五月综合网亚洲乱妇久久| 人妻av资源先锋影音av资源| 国产精品自拍午夜福利| 最新亚洲人成网站在线影院| 亚洲国产午夜精品理论片在线播放| 下面一进一出好爽视频| 国产精品av免费观看| 欧美精品国产综合久久| 亚洲欧美日本久久网站 | 久久久综合九色合综| 人妻精品久久无码区| 亚洲爆乳精品无码一区二区| 国产精品一码二码三码四码| 精品无码久久久久久尤物| 黄色特级片一区二区三区| 亚洲av永久无码天堂影院| 日韩一区二区三区在线视频| 欧美日韩一区二区三区视频播放| 久热色视频精品在线观看| 一二三三免费观看视频| 野外做受三级视频| 国产高清精品在线91| 国产欧美日韩精品丝袜高跟鞋 | 亚洲精品国产精品不乱码| 一区二区三区四区激情视频| 成年女人免费碰碰视频| 精品国产精品三级精品av网址| av大片| 肇源县| 国产一区二区三区AV在线无码观看 | 国产精品不卡区一区二| 亚洲国产美国产综合一区| 丰满少妇熟乱xxxxx视频| 亚洲大尺度无码无码专线| 久久人体视频| 国产精品中文字幕日韩| 四虎亚洲精品高清在线观看|