动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.在Linux系统下如何优化Oracle具体.
.在Oracle中实现定时操作---Job Q.
.以 spfdisk 分割硬盘的一个范例.
.ORACLE数据库常见问题诊断方法.
.在Oracle数据库中如何使用超过2G.
.保证Oracle数据库安全性的策略和.
.ActualTest Oracle 1Z0-131 v01..
.Oracle 10g如何安排ORA-19815.
.Oracle与F5 Networks共同协手合作.
.Oracle SQL 语言从入门到精通.
.在报表视图中实现分类显示.
.如何一次处理一整个目录.
.Oracle 10g Release2新功能之变化.
.Oracle 临时表空间使用注意.
.Oracle 10g 新特性之 RMAN 的功能.
.oracle是如何工作的(zt)--比较.
.Oracle9i 数据库管理实务讲座(二).
.为布尔字段值选择一种高效的设计.
.如何快速查找文件.
.Red Hat 7.2/7.3 中文字体设置工.

用网络卡从并口上启动Linux

发表日期:2008-2-9 |



  作者:raoxianhong
  
  代码:
  
  1、到底想干什么
   了解Linux的启动过程,制作一个自己的Linux启动程序,可以增加对Linux的了解,还能学习PC机的启动机制,增进对计算机结构的了解,增强对Linux内核学习的信心。
  也可以在某些专用产品中使用(比如专用的服务器)。为此,我尝试在原来代码的基础上修改制作了一个用网络卡从并口上启动Linux的程序,以博一笑,其中有许多问题值得研究。
  2、Linux对启动程序的要求
   Linux(bzImage Kernel)对启动程序的要求比较简单,你只要能够建立一个启动头(setup.S),
  给出一些信息,然后将kernel(/usr/src/linux/arch/i386/boot/compressed/bvmlinux.out)调到
  绝对地址0x100000(1M地址处),假如有initrd,则将它调到内存高端(离0x100000越远越好,比如假如
  initrd小于4M,就可以将它调到地址0xB00000,即12M处,相信现在已经很少有少于16M内存的机器了),
  然后执行一些初始化操作,跳到内核处就行了。
   当然,说起来轻易做起来还有点麻烦,以下分几个问题解释。
  3、PC机开机流程--启动程序放在何处
   PC机加电后,进入实模式,先进行自检,然后初始化各个总线扩展设备(ISA, EISA,PCI,AGP),
  全部初始化做完后,从当前启动设备中读一个块(512字节)到07C0:0000处,将控制转到该处。
   了解这个过程,我们可以决定将启动程序放在何处:
   1)放在启动设备的MBR(主启动记录中),比如磁盘的启动扇区。这是一般的启动方式。
   2)放在总线扩展设备的扩展rom中,比如网卡的boot rom就行,这里制作的启动程序就是放在网卡中,可以支持 16K字节。
   3)哪位高手能够修改ROMBIOS,让BIOS在做完初始化后不要马上从启动设备读数据,而是调用一段外面 加入的程序(2K字节就够了,当然也必须与修改后的BIOS一起烧在BIOS ROM中),就可以从BIOS启动!
   4)先启动一个操作系统,再在此操作系统中写启动程序(比如lodlin16就是从DOS中启动Linux,好象中软
   提供了一个从Windows下启动Linux的启动程序)。
  4、操作系统放在何处
   操作系统(一般内核在500K-1M之间,加上应用程序可以控制在2M以内,当然都经过压缩了)的数据选择余地就大了,
  可以从软盘、硬盘、CDROM、网络、磁带机、并口(软件狗上烧个内核和应用程序?)、串口(外接你的设备)、 USB设备(?)、PCI扩展卡、IC卡等等上面来读;各位还有什么意见,提醒提醒。有位老兄说实在不行可以用键盘启动,每次启动时把内核敲进去,还有int 16h支持呢,做起来也不难,应该是最节省的方案了。
   反正一个原则是,在启动程序中能够从该设备上读就行了,这里最简单的就是并口了,简单的端口操作,不需 要任何驱动程序支持,不需要BIOS支持,比磁盘还简单(磁盘一般使用int 13h,主要是计算柱面啊、磁头啊、磁道啊、扇区啊好麻烦,幸好有现成的源代码,可以学习学习)。
   好了,我们挑个简单的方案,将启动代码(bootsect.S+setup.S)放到网络卡的boot rom中,内核数据和应用数据放到另外一台计算机上,用并口提供。下面谈谈几个相关的问题。
  5、将数据移动到绝对地址处
   第一个问题,我们得到数据,因为是在实模式下,所以一般是放在1M地址空间内,怎样将它移动到指定的地方去,
  在setup.S 的源代码中,使用了int 15h(87h号功能)。这里将该段代码稍加改动,做了些假设,列到下面:
  流程是:
   if (%cs:move_es==0)/*由于使用前move_es初始化为0,因此这是第一次调用,此时es:bx是要移动的数据
   存放处bx=0,es低四为位为零表示es:bx在64K边界上,fs的低8位指定目的地地址,
   也以64K字节为单位,用不着那么精确,以简化操作*/
   {
   将es右移四位,得到64K单位的8位地址(这样一来,最多只能将数据移动到16M以下了),作为源数据
   描述符中24位地址的高8位,低16位为零。
   将fs的低8位作为目的地的描述符中24位地址的高8位,同样,它的低16位为零。
   将es存放在move_es中,es自然不会是零,因此以后再调用该例程时就进行正常的移动操作了。
   ax清零返回。

   }
   else
   {
   if (bx==0)/*bx为零,表示数据已经满64K了,应该进行实际的移动*/
   {
   调用int15h 87h号功能,进行实际的数据移动(64K, 0x8000个16字节块)。
   目的地址(24位)高8位增一,往后走64K
   ax = 1
   return;
   }
   else
   {
   ax = 0;
   return;
   }
   }
  # we will move %cx bytes from es:bx to %fs(64Kbytes per unit)
  # when we first call movetohigh(%cs:move_es is zero),
  # the es:bx and %edx is valid
  # we configure the param first
  # follow calls will move data actually
  # %ax return 0 if no data really moved, and return 1 if there is data
  # really to be moved
  #
  movetohigh:
   cmpw $0, %cs:move_es
   jnz move_second
   # at this point , es:bx(bx = 0) is the source address
   # %edx is the destination address
   movb $0x20, %cs:type_of_loader
   movw %es, %ax
   shrw $4, %ax
   movb %ah, %cs:move_src_base+2
   movw %fs, %ax
   movb %al, %cs:move_dst_base+2
   movw %es, %ax
   movw %ax, %cs:move_es
   xorw %ax, %ax
   ret # nothing else to do for now
  move_second:
   xorw %ax, %ax
   testw %bx, %bx
   jne move_ex
   pushw %ds
   pushw %cx
   pushw %si
   pushw %bx
   movw $0x8000, %cx # full 64K, INT15 moves Words
   pushw %cs
   popw %es
   leaw %cs:move_gdt, %si
   movw $0x8700, %ax
   int $0x15
   jc move_panic # this, if INT15 fails
   movw %cs:move_es, %es # we reset %es to always point
   incb %cs:move_dst_base+2 # to 0x10000
   popw %bx
   popw %si
   popw %cx
   popw %ds
   movw $1, %ax
  move_ex:
   ret
  move_gdt:
   .word 0, 0, 0, 0
   .word 0, 0, 0, 0
  move_src:
   .word 0xffff
  move_src_base:
   .byte 0x00, 0x00, 0x01 # base = 0x010000
   .byte 0x93 # typbyte
   .word 0 # limit16,base24 =0
  move_dst:
   .word 0xffff
  move_dst_base:
   .byte 0x00, 0x00, 0x10 # base = 0x100000
   .byte 0x93 # typbyte
   .word 0 # limit16,base24 =0
   .word 0, 0, 0, 0 # BIOS CS
   .word 0, 0, 0, 0 # BIOS DS
  move_es:
   .word 0
  move_panic:
   pushw %cs
   popw %ds
   cld
   leaw move_panic_mess, %si
   call prtstr
  move_panic_loop:
   jmp move_panic_loop
  move_panic_mess:
   .string "INT15 refuses to Access high mem, giving up."
  6、用并口传输数据
   用并口传输数据,可以从/usr/src/linux/driver/net/plip.c中抄一段,我们采用半字节协议,
  并口线连接参考该文件。
字节收发过程如下:
  #define PORT_BASE 0x378
  #define data_write(b) outportb(PORT_BASE, b)
  #define data_read() inportb(PORT_BASE+1)
  #define OK 0
  #define TIMEOUT 1
  #define FAIL 2
  
  int sendbyte(unsigned char data)
  {
   unsigned char c0;
   unsigned long cx;
   data_write((data & 0x0f));
   data_write((0x10 (data & 0x0f)));
   cx = 32767l * 1024l;
   while (1) {
   c0 = data_read();
   if ((c0 & 0x80) == 0)
   break;
   if (--cx == 0)
   return TIMEOUT;
   }
   data_write(0x10 (data >> 4));
   data_write((data >> 4));
   cx = 32767l * 1024l;
   while (1) {
   c0 = data_read();
   if (c0 & 0x80)
   break;
   if (--cx == 0)
   return TIMEOUT;
   }
   return OK;
  }
  int rcvbyte(unsigned char * pByte)
  {
   unsigned char c0, c1;
   unsigned long cx;
   cx = 32767l * 1024l;
   while (1) {
   c0
上一篇:Troubleshooting ORA-01090: shutdown in progress,ORA-01081 人气:504
下一篇:about kernel exploit 人气:328
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-8-19 久溜溜电影系统(免维护+小偷) v5
2008-8-19 晴天免费电影系统完整版(带迅雷采
2008-8-19 Twinklous File Manager v1.5
2008-8-19 千米旅游网站管理系统 v2.0
2008-8-19 资阳人才网 v2.0
2008-8-19 全球商务B2B网站系统 v1.0 asp版
2008-8-19 动域网主机代理管理系统 v1.0
2008-8-19 JH2008-企业网站(全站生成html)
2008-8-19 GlobalEC C2C管理系统 v1.0
2008-8-16 iLaba Player(小喇叭播放器) v2.
2008-8-16 DoubleClickFix 鼠标双击修正工具
2008-8-16 CrystalCPUID 4.15.2.451
2008-8-16 VeryCD 电驴(easyMule) 1.0.4 Bu
2008-8-16 uTorrent 1.8 Build 11813 - Sta
2008-8-16 比特精灵(BitSpirit) v3.3.2.287
2008-8-16 StayInTune音叉 v1.0 破解版
2008-8-16 iChing《周易》汉化补丁 v1.0
2008-8-16 Starmap星空图v1.0汉化破解版
  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵