LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 867|回复: 5

linux C对存储器读写问题

[复制链接]
发表于 2003-4-1 00:09:21 | 显示全部楼层 |阅读模式
  1. #include<stdio.h>
  2. #include<dos.h>
  3. main()
  4. {
  5.     char far * p;
  6.     unsigned seg,off;

  7.     p=MK_FP(0xb000,0x20);   //和成一个物理地址
  8.     seg=FP_SEG(p);          //取段地址
  9.     off=FP_OFF(p);          //取偏移地址

  10.     printf("far p %p,segment%04x,offset%0x\n",p,seg,off);
  11. }
复制代码


linux上,有没有像MK_FP、FP_SEG、FP_OFF的宏定义或是类似的函数啊?
发表于 2003-4-1 02:27:46 | 显示全部楼层

我想應該沒有吧

Linux下的內存模式是flat,指針的長度是4bytes,即可直接訪問4G以內的內存,不需要SEG和OFF,也沒有far和near的概念,但Linux Kernel不會允許你訪問本程序以外的內存空間..所以你那個程序應該是無法正常運行的...
 楼主| 发表于 2003-4-1 03:05:17 | 显示全部楼层
那应该怎么访问memory呢?
发表于 2003-4-1 11:27:57 | 显示全部楼层

我也沒試過..

不知道行不行,不過kernel的確屏障了很多這種低級的操作,連BIOS中斷也不能用,只能用提供給我們的syscall中斷,同樣在Windows下也是,我做過一個?驗,寫了一個小程序:

  1. int main(void)
  2. {
  3.         char *p = (char *)0xb8000020;

  4.         *p++ = 65;
  5.         *p++ = 0x41;

  6.         return 0;
  7. }
复制代码

這是向顯示?沖區寫進一個字符,結果如下:
Windows 2k下用Visual C++ 6.0編譯 ==> 運行失敗
Windows 2k下用GCC 3.2編譯 ==> 運行失敗
Windows 2k下用Turbo C++ 3.0編譯 ==> 運行成功
RH8 Linux下用GCC 3.2編譯 ==> 運行失敗

用Turbo C++3.0編譯出?淼氖16位程式,而其余的都是32位,我想windows為了兼容以往的16位程式,所以允許它們進行低級操作,但32位程式就不能...

你要是真的想在Linux下訪問,也許要把程序放到Kernel起動前執行 又或者找找看kernel有沒有提供一些函數讓你訪問內存,總之我想要程序直接去訪問應該是不太可能的..
发表于 2003-4-3 03:40:15 | 显示全部楼层
哈,DOS 时代的麻烦事,忘掉吧!!!
发表于 2003-4-9 01:07:35 | 显示全部楼层
tc2!=linux
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表