作者:upwardit
简介:
我正在开发的操作系统uwos,刚刚开始,还不能称之为操作系统,只是一个引导程序而已.
现在刚加了一点FAT12文件格式,还没有完成.
已经进入保护模式.实现简单的键盘输入.
实现了标准C函数printf,带格式输出,如%d,%c,%s等.
下一步计划:
完成FAT12,然后支持FAT16.
加入中断,然后写键盘驱动.
还有许许多多的工作要做.
如分页,内存管理,进程调度等等.
待进一步完善会发布源代码.
开发工具:
masm 615,TC 2.0
说明:
现在网上有许多教学与个人操作系统,但是nasm,gcc居多.很多引用了LINUX的内核.修改,编译很方便.而且跨平台,优点多多.
uwos采用masm,tc混合编程.
masm编写引导程序.
tc编写内核(嵌入汇编,tc调用tasm编译).
混合编程过程如下:
使用汇编跳转到C语言,然后一直使用C语言,因为汇编效率太低.
asm文件用masm编译成obj,C文件用tc编译成obj,然后用masm的link链接这两个obj文件.
masm *.asm
tcc *.c
link /tiny *.obj+*.obj note:/tiny生成二进制.com文件
补充:单独C语言,编译成.com 使用tcc -mt -lt *.c
遇到问题:
1.采用这种方法生成exe文件,在DOS下没有问题.很可能不能直接供操作系统使用.
但生成com文件,输出字符串时,显示乱码,后经debug调试,发现地址相差100h,com文件有100h偏移量.
2.以前以为操作系统只能使用.com文件,因为.com文件是纯二进制的.exe不行.后来调试,发现LE格式的exe可以使用.
这种exe在link时,加上/tiny就能生成.com.当然用exe2bin也没问题,符合.com文件的要求,可能因为这能够使用.
运行环境:
wmware,bochs2.2.6
运行效果如下:

开发感受:
写一个操作系统太不容易了.才刚刚开始就遇到这么多问题.
调试太困难了.没办法,有时只能用tcc -S *.c 将C程序转换成asm调试.还要debug生成的exe,com文件.
有一些东西,网上资料很少,只能一边开发,一边猜想,一边测试.
大多数源码,为nasm,gcc编写.nasm与masm有一些差别,不能直接使用.gcc与tc在语法上差别不大,但gcc与tc嵌入汇编格式不一样.gcc是32位的.tc是16位的.而保护模式直接进入了32位,没用16位保护模式.TC只支持16位,打算用BC++5或者用nasm和gcc写.哈哈.
继续努力.
欢迎访问我的网站:www.upwardit.com
我在smth的blog:http://bbs.tsinghua.edu.cn/pc/index.php?id=djd7726
操作系统设计专题:http://www.upwardit.com/ShowSpecial.asp?SpecialID=1
工作烦忙,没时间学习,好长时间,才完成这点东西.以上内容全凭记忆.如有错误,敬请指正.有什么好的意见,建议,请给我留言.转载请注明UpwardIT.欢迎加我为好友,互相学习.常来我的BLOG及网站看看.我会不断更正,补充内容.
今天给我的网站http://www.upwardit.com
加了个下载系统遇到问题
在form中判断input是否为空,不为空则不跳转到其他页。
<script language="javascript" type="text/javascript">
function inputCheck()
{ if (document.form.Ky.value.length== 0) if (document.form.Ky.value.trim()=="")
{
alert("搜索条件不能为空!");
document.form.Ky.focus();
return false;
} return true;
}
</script>
<table>
<form method=post name=form onsubmit="return Check() Check()
" action="test.asp">
<tr><td>
<input name="ky" type="text" value="">
<input type="submit" name="Submit" value="test" class="button">
</td></tr>
</form> </table>
红色部份是犯的错误。
input内容为空document.form.Ky.value.trim()也不为空。
javascript没有独立的trim函数或者方法可以使用
。
javascript的trim()函数的实现
方法一:
String.prototype.trim= function()
{
// 用正则表达式将前后空格
// 用空字符串替代。
return this.replace(/(^\s*)|(\s*$)/g, "");
}
方法二:
function trim(str)
{
for(var i = 0 ; i<str.length && str.charAt(i)==" " ; i++ ) ;
for(var j =str.length; j>0 && str.charAt(j-1)==" " ; j–) ;
if(i>j) return "";
return str.substring(i,j);
}
onsubmit必须等于return Check()
以下为转载:
众所周知,在表单中加上onsubmit="return false;"可以阻止表单提交。
下面是简单的一小段代码:
[code:1]<form action="index.jsp" method="post" onsubmit="submitTest();">
<INPUT value="www">
<input type="submit" value="submit">
</form>
<SCRIPT LANGUAGE="javascript">
<!--
function submitTest() {
// 一些逻辑判断
return false;
}
//-->
</SCRIPT>[/code:1]
大家判断像上面的写法,点击submit按钮该表单是否提交?
若答案为是,就不用往下看了。
若答案为否,错了。实际情况是表单正常提交,若想它不提交,应该将
[code:1]<form action="index.jsp" method="post" onsubmit="submitTest();">[/code:1]改为
[code:1]<form action="index.jsp" method="post" onsubmit="return submitTest();">[/code:1]
为何?
原来onsubmit属性就像是<form>这个html对象的一个方法名,其值(一字符串)就是其方法体,默认返回true;
和Java一样,在该方法体中你可以写任意多个语句,包括内置函数和自定义函数,如
[code:1]onsubmit="
alert('haha'); // 内置函数
submitTest(); // 自定义函数
alert(this.tagName); // 用到了this关键词
......(任意多条语句)
return false;
"[/code:1]
就相当于
[code:1]Form.prototype.onsubmit = function() {
alert('haha'); // 内置函数
submitTest(); // 自定义函数
alert(this.tagName); // 用到了this关键词
......(任意多条语句)
return false;
};[/code:1]
这样的话你就覆写了(override)其默认方法(默认返回true)
大家注意到方法体中可以用this这个关键词,这里即代表了<form>的对象实例。
经过这样的分析后,以上情况就不难理解了:
[code:1]<form action="index.jsp" method="post" onsubmit="submitTest();">[/code:1]这样写,override方法的效果为:
[code:1]Form.prototype.onsubmit = function() {
submitTest();
};[/code:1]
在这里submitTest()虽然返回false,但我们只执行了此函数,没有对其结果进行任何处理。而
[code:1]<form action="index.jsp" method="post" onsubmit="return submitTest();">[/code:1]
override方法的效果为:
[code:1]Form.prototype.onsubmit = function() {
return submitTest();
};[/code:1]
这样,我们利用到了它的返回值,达到了预期效果。
这样理解的话我想印象会深刻得多,就不易出错了
结论:
我们可以用Java里的思维方式来思考模拟javascript中的类似情况
(javascript中基于prototype的面向对象技术也确实是这样做的),但他们毕竟还是有本质上的区别,如Java是强类型的,有严格的语法
限制,而javascript是松散型的。象上述方法:
[code:1]
Form.prototype.onsubmit = function() {
};[/code:1]
既可以有返回值,又可以没有返回值,在Java里是通不过的,毕竟Java里面不能靠方法的返回值不同来重载(overload)方法,而javascript中的重载要松散得多。
转载请注明作者:upwardit
在多线程中使用m_web.Navigate(“http://www.upwardit.com“,NULL,NULL,NULL,NULL); //CWebBrowser2 m_web; 时出错,不用多线程没有问题.
解决方法:
IWebBrowser2 *m_pBrowser;
IUnknown *pUnknown= m_web.GetControlUnknown();
pUnknown->QueryInterface(&m_pBrowser);
在线程中使用
m_pBrowser->Navigate(L”http://www.upwardit.com“,NULL,NULL,NULL,NULL); //L是必须的
如果使用字符串变量
m_pBrowser->Navigate(webaddr.AllocSysString(),NULL,NULL,NULL,NULL);
否则无法编译通过
另外在ie6下没问题,ie7会弹出”无法找到http://www.upwardit.com ,请确保路径或Internet地址正确”
在网上搜到以下解决方法(没测试):发个自己定义消息给自己的窗口,收到这个消息后再去调用Navigate
(1)分区:
#fdisk /dev/hdb
进入fdisk模式:
Command (m for help):p //查看新硬盘的分区
Command (m for help):n //创建新分区
可以用m命令来看fdisk命令的内部命令
n命令创建一个新分区;d命令删除一个存在的分区
p命令显示分区列表
t命令修改分区的类型ID号
l命令显示分区ID号的列表
a命令指定启动分区
w命令是将对分区表的修改存盘让它发生作用。
Command action
e extended //输入e为创建扩展分区
p primary partition (1-4) //输入p为创建主分区,这里我们选择p
Partion number(1-4):1 //第一个扩展分区,按你需求可以最多分4个主分区
First Cylinder(1-1014,default 1): 1 //第一个主分区起始的磁盘块数 可以直接回车,使用默认值
Last cylindet or +siza or +sizeM or +sizeK: +1024MB //可以是以MB为单位的数字或者以磁盘块数,可以直接回车,使用默认值。这里我们输入+1024MB表示分区大小为1G。
这样我们就创建完一个分区,如果要创建更多分区可以照上面的步骤继续创建。
创建完后用w保存分区。
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
(2)这样就分区完,我们还要进行格式化
#mkfs -t ext3 -c /dev/hdb1 //或者使用mkfs.ext3 /dev/hdb1
但出现错误:
/dev/hdb1: Not enough space to build proposed filesystem while setting up superblock
原因:分区时仅将hdb分为一个扩展分区,没有分出逻辑分区。于是重新分区,将sdb整个分为一个扩展分区hdb1,然后全部分为一个逻辑分区hdb5。
重新格式化分区
mkfs.ext3 /dev/hdb5
#mkdir newdisk //创建/newdisk目录,我们将把新的分区挂到newdisk下
#mount /dev/hdb1 newdisk//将/dev/hdb1挂载到/newdisk
# df //用df命令进行查看
会看到了,这就是我们刚才新挂载的分区
(3)我们每次重新启动服务器后都要进行手工挂载,这样很麻烦,我们需要修改/etc/fstab文件来进行自动挂载。
#vi /etc/fstab
在文件的末尾填加如下内容:
/dev/hdb1 /newdisk ext3 defaults 1 2
如有多个分区可修改hdb1和/newdisk,修改完后保存,重启linux。
序:
上次写过一篇文章“uwos:我正开发的操作系统“,是用的masm与tc 2.0写的。可以tc 2.0是16位的。系统进入32保护模式。用tc 2.0很不方便。打算用vc1.52或者bcc 5.0等32位的编译器。后来一想不如直接用gcc了,在windows和linux下都能编译。跨平台。呵呵。
下面简单介绍一下。gcc 版的与以前的不同。
引导过程,不再是用int 13h直接读第二扇区,而是加入对FAT12的支持,通过磁盘分区表得到内核uwos.sys在磁盘中的位置再读入内存,这样做可以用winimage打开uwos.img,直接替换uwos.sys。
uwos.sys负责用int 15h得到memory ranges,进入保护模式,加载自己写的C标准函数库实现printf等。init 8259中断,实现键盘驱动。aA是我用键盘输入的来测试键盘驱动,可以看到我将Caps Lock,Num Lock,Scr Lock键盘指示灯都打开了。
运行效果如下:
写UWOS引导程序时,参照了《自己动手写操作系统》里的FAT12引导程序。
其引导程序有好几个版本,只参照了其中一个,发现,这个版本不能加载大于64K的内核,其他有没有此问题不清楚。
mov cl, 1
call ReadSector
pop ax ; 取出此 Sector 在 FAT 中的序号
call GetFATEntry
cmp ax, 0FFFh
jz LABEL_FILE_LOADED
push ax ; 保存 Sector 在 FAT 中的序号
mov dx, RootDirSectors
add ax, dx
add ax, DeltaSectorNo
add bx, [BPB_BytsPerSec]
cmp bx,0 ;;>64k
jz large64k
jmp LABEL_GOON_LOADING_FILE
large64k:
mov bx,es
add bx,0×1000
mov es,bx
mov bx,0 ;;
jmp LABEL_GOON_LOADING_FILE
以上蓝色部分是我胡乱添加的,呵呵。这样可以读入大于64K的内核文件,如果有问题可以与我联系。
写UWOS文件操作程序,分析了一个FAT12.C的void int Fat12_Read函数
if((fp->current_pos + read_size) > fp->f_size )
read_size = (fp->f_size – fp->current_pos);
if ((fp->current_pos + offset) > 512)
read_size = (fp->current_pos + offset) – 512;
发现红色部分好像有问题,fp->current_pos,在不为0,即不是文件开头时,不对。改成了下面的样子
if ((offset + read_size) > 512)
read_size = 512 -offset;
否则下面的
if(!(fp->current_pos%512))
fp->current_blk = Msdos_12Next(fp->current_blk); //read next cluster
fp->current_blk 一直不变,读入重复的数据
不知FAT32.C的int Fat32Reads 有没有这个问题。
最近忙晕了。每天早上二点左右睡觉,早上七点半起床上班。十天多。累坏了。
主要是我的网站www.upwardit.com改版了。漂亮多了。欢迎来看看。
操作系统没怎么写,现在将以前写的,贴几张图出来。版本定为0.0.1,还没有分页,没有内存管理。觉得定为0.0.1有点早,实现了分页,内存管理的话,觉得可以为0.0.1版。
简单介绍一下uwos 0.0.1:
启动后可以选择是否进入图形界面
下面是进入字符界面,最下面显示时间,时钟中断,每秒更新一次,实现时间实时走动
下面是进入图形界面,显示26个字母.画直线和斜线.显示我的网站图标,16位bmp,5,5,5格式.显示图标文件大小.显示其他相关信息.显示字符时,增加背景色,和屏幕背景色相同,所以有字符的地方会不显示直线.显示实时时钟.显示鼠标指针.
下面是移动鼠标和时钟走动后的界面,文本模式也支持鼠标,光标跟随鼠标移动
就写这写了,以后再补充.
转载请注明作者:upwardit
在qt 3.3.8中加入了dockwindow,可是总是带着蓝色的标题栏。如下图:

但是以前写的别的程序dockwindow都不带蓝色标题栏。如下图:

对比了两个程序的添加dockwindow,以及设置dockwindow属性的源代码,没发现任何问题。排除了对dockwindow实现的怀疑。
以前发现过windows主题,对视图显示的影响。有没有可能是系统主题的影响呢?
果然将windows xp的主题改为经典,dockwindow就不带蓝色标题栏了,但改回window xp主题,又出现了蓝色标题栏。
奇怪,为什么第二个程序,不随主题改变呢?还是新的程序有问题。
仔细想了想,哈哈,第二个程序没有加风格处理。
如下:
int main( int argc, char ** argv )
{
…
QApplication app( argc, argv );
qApp->setStyle(new QWindowsStyle); //就是少了这句话。
…
}
这样设置了风格就好了,呵呵,不管主题怎么改,都不带蓝色的标题栏了。
总结:想想原理很简单,以前也用过setStyle。但是程序代码太多了,dockwindow与main不在同一个文件里,刚开始怎么也没想到是风格的问题,少了一句不起眼的setStyle,还一直以为是dockwindow设置的不对,使用各种方法调试。到网上查,可是qdockwindow的资料不多,没找到。解决这个问题用了三个多小时,现在记录下来。方便别人遇到类似问题时查阅。
转载注明作者:upwardit
1.普通pc机pci网卡不行,用AlphaServer的。
2.有32-bit和64-bit两种PCI I/O expansion slots之分。最早PCI工作在33MHz,随着对更高性能的要求,后来又提出把PCI总线的频率提升到66MHz,1993年又提出了64bit的PCI总线,称为PCI-X,目前广泛采用的是32-bit、33MHz或者32-bit、66MHz的PCI 总线,64bit的PCI-X插槽更多是应用于服务器。所以要插对位置(在机箱盖内部有图说明每个PCI slot类型)。
3.开机测试时,要关上机箱盖,否则会提示System door没有关,开机五分钟后自动关机。
4.使用netconfig配置网卡,ip,子网掩码,网关,静态路由等信息。改网卡名字时,会提示是否更改机器名。更改机器名后,再重启机器时会等很长时间。
5.加上网卡,改了名字后,重启机器,系统能正常运行。
6.如果系统不正常,尝试以下方法更改机器名(转载)
(适用于无CLUSTER/LSM/NIS/YP配置的系统)
假设原系统主机名为oldname, 新主机名为newname
1).使用root帐户登录
#rcmgr set HOSTNAME
2). 编辑/etc/hosts文件,做如下改变:
………
127.0.0.1 localhost
16.72.0.156 oldname
………
改为:
………
127.0.0.1 localhost
16.72.0.156 newname
………
3). # cd /sys/conf
# cp OLDNAME NEWNAME
# vi NEWNAME
….
ident “OLDNAME”
….
改为:
………
ident “NEWNAME”
……..
4). 编辑/etc/rc.config, 把HOSTNAME从OLDNAME改为NEWNAME
5). # cd /sys/conf
# cp OLDNAME.list NEWNAME.list
# cd /sys
# mv OLDNAME NEWNAME
6) # doconfig –c NEWNAME
# cp /vmunix /vmunix.bck
# cp /sys/NEWNAME/vmunix /vmunix
# shutdown –r now
7.配置了两台机器(都使用了LSM,都没使用第六步的doconfig命令,也没有更换vmunix),其中一台正常,另一台好长时间以后执行shutdown -r 重启后,又执行shutdown -h关机,竟不能引导系统。
loading vmunix时提示fffffc00060430000 boot strap address collision image loading aborted
halted CPU 0
halt code = 5
HALT instruction executed
PC = 20010510
使用以下方法解决此问题(转载)
Check the console firmware version:
P00>>>show version
If the version is not V5.5 or later, you need to upgrade your firmware to V5.5
or later.
Change the value of the console_memory_allocation environment variable
from old to new and reset the system:
P00>>>set console_memory_allocation new
P00>>>init
Boot the new kernel:
P00>>>boot
In the unlikely event the new kernel fails to boot:
P00>>>set console_memory_allocation old
P00>>>init
P00>>>boot -fi vmunix.save
or:
P00>>>boot -fi genvmunix
Correct the error and repeat the above procedure.
我使用boot -fi genvmunix进入操作系统
然后执行# doconfig –c NEWNAME
# cp /vmunix /vmunix.bck
# cp /sys/NEWNAME/vmunix /vmunix
# shutdown –r now
还是不能使用vmunix正常引导成功。
再次使用boot -fi genvmunix进入操作系统
# doconfig(不加-c NEWNAME)
# cp /vmunix /vmunix.bck
# cp /sys/NEWNAME/vmunix /vmunix
# shutdown –r now
系统使用vmunix正常引导成功。
补充(参照:Tru64 UNIX系统的网络配置与维护):
系统启动后,如果不能正确识别网卡,需要使用通用内核(genvmunix)启动机器,并重建内核。具体操作见命令doconfig的帮助文件或系统管理手册。以太网网卡被系统正确识别后,还需设置它的工作模式、接口类型和工作速率。以太网有AUI、BNC、UTP和光纤接口等接口类型,前两种接口已经很少使用,目前主要使用UTP和光纤接口。工作模式、接口类型和速率可在主控台上设置,如:
>>>set ew*0_mode ? (*为某个网卡的名字,如 ewa0_mode,可用show config看) ,主控台上设置的结果可通过命令lan_config或ifconfig改变。如:
#/usr/sbin/lan_config -i tu0 -m utp -x 1
此命令表示设置网卡tu0以全双工进行操作,使用UTP接口。若要求每次启动都使用同样的配置,可编辑/etc/rc.config文件中IFCONFIG_n(n为数字)参数,如:
#/usr/sbin/rcmgr set IFCONFIG_0 “speed 200”。此命令设置与IFCONFIG_0绑定的网卡以100M 、全双工方式工作。
在上述操作过程中,应注意DEGPA型号的千兆以太网卡的工作模式和速率不能在主控台上进行设置,只能在系统模式下设置,如:
#/usr/sbin/lan_config -i alt0 -a 0
此命令表示千兆以太网卡alt0不使用自适应模式。虽然服务器、连接服务器的交换机都支持IEEE 802.3u自适应模式(autonegotiation),但从实际使用效果来看,如果把服务器设为自适应模式,无论将交换机设置为自适应模式还是指定速率、工作模式,服务器的网络速度都非常慢;如果两端以指定的模式和速率工作,网络速度则恢复正常。此现象产生的原因不知是不同厂商设备之间的匹配问题还是其它原因。
转载请注明作者:upwardit
忙了一晚上,终于成功了,早上六点了,先写个题目.现在要睡觉了,以后再详细叙述.
……
看到linux上,在bochs上可以用gdb远程调试操作系统内核.而在windows上,直接下载安装的bochs,GDB Stub Options里的Enable GDB stub灰色,不可用.这样用C写的内核调试起来,很不方便.本人只上网找了,包括外国网站,全是linux上的,没发现windows上的.本人不习惯linux上的编辑器,尽管这些编辑器很好用,一点不比windows上的差.没有办法,只能自己想办法解决了.
试着将gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0加入到bochsrc.bsrc里.运行bochs提示不支持GDB stub.没办法,只有下载bochs源码,自己编译了.最初用VC2005的nmake编译源码里自带的MakeFile.可以生成bochs,但没有gdb stub.后来在linux上生成了带gdb stub的MakeFile.比较合并了两个MakeFile,用nmake编译不成功.又失败了.
看到源码里有不仅有.conf.win32-vcpp还有.conf.win32-cygwin,在.conf.win32-cygwin里加上”–enable-gdb-stub \”(注:没有引号)将–with-nogui删掉,哈哈.装cygwin,bin里面有好多与linux命令一样的exe,在windows下可以使用linux命令了,最好将cygwin\bin加到环境变量里,cool.我们使用sh .conf.win32-cygwin生成MakeFile.怎么来编译呢,我们不用vc了.用MinGW,这样就可以用gcc,g++,ld等.哈哈.将MinGW\bin下的mingw32-make,改名为make.然后make MakeFile.可是提示找不到sys/socket.h
Warning: .drectve `/DEFAULTLIB:”uuid.lib” /DEFAULTLIB:”uuid.lib” /DEFAULTLIB:”LIBCMT” /DEFAULTLIB:”OLDNAMES” ‘ unrecognized
undefined reference to `__security_cookie’
undefined reference to `
解决方法如下:
如果是VC,这跟GS编译选项有关,<当设置 “/ GS” 开关,编译器在编译出来的代码中插入“缓冲区超限检测代码”,默认情况下,包含了Platform SDK的VC++编译器将GS开关打开。并且,在Platform SDK的很多库文件使用”/GS”开关生成的。在VC++中,缓冲区 检查 的代码是放在 C Runtime库中的,这是链接器默认使用的库。但是VC++自带的C Runtime,跟Platform SDK中的C Runtime,是不一样的。bufferoverflowU.lib 一般用户模式 bufferoverflowK.lib 内核模式 bufferoverflow.lib 服务>(注:VC的解决方法为转载)
但是我们用的是MinGW,需要为MinGW设置SDL库,下载SDL-devel-1.2.13-mingw32.tar.gz,否则系统使用的是VC的,就会报上面的错误。
打开MinGW\include,将SDL中include里面的SDL文件夹复制到里面。
然后,回到MinGW\lib的文件夹下,将SDL中lib文件夹下的libSDL.dll.a, libSDL.la和libSDLmain.a三个文件拷贝到MinGW的lib文件夹下。
最后,把SDL中bin文件夹下的SDL.dll文件拷贝到C:\WINDOWS\system32下。也可以将SDL.dll绑定到使用了SDL库编译的*.exe文件所在的文件夹中。
这样链接成功,设置一下GDB stub就可以使用了.
运行bochs显示如下:
Waiting for gdb connection on port 1234
我们运行gdb(需要下载GDB on Windows),键入target remote localhost:1234回车,bochs会显示如下.
Connected to 127.0.0.1
哈哈,成功了.大体过程就是这样,只记得这么多了,文章可能不是很详细,有时间的话,可能会整理一份带图的详细说明.有问题欢迎多多交流,欢迎在不改变文章内容的情况下转载,但请注明作者:upwardit,以尊重本人工作到早上六点的劳动成果,这方便别人,中午边吃饭边写了一个多小时文档的辛苦.关于bochs和gdb使用,就不详细说明了.请各位自己查阅相关资料.
转载请注明作者:upwardit
1.软件版本:
mysql-essential-5.1.50
httpd-2.2.16
php-5.3.3
2.现象:
apache运行正常,但httpd.conf加入以下内容
#BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL
PHPIniDir “c:/Program Files/PHP/”
LoadModule php5_module “c:/Program Files/PHP/php5apache2_2.dll”
#END PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL
后apache服务无法启动.直接运行httpd也出错
3.解决方法:
后来发现运行php-win.exe也出错.是php的问题,不是apache问题.
重装php后,httpd.conf加入上面的配置,apache,php运行都正常.
对比了有问题的php.ini.原因是
“
; For example, on Windows:
;
; extension=php_mysql.dll”这行注释被解除掉,设置php_mysql.dll引起的.
网上好多资料都说要解除此注释以启用对mysql的支持.为什么在这里不行,或许是版本不一样.
php.ini里有
[PHP_MYSQL]
extension=php_mysql.dll
可能现在是通过这里来启用对mysql的支持.
在运行正常的情况下(php对mysql数据操作都正常,apache也正常)做实验,确定是”For example, on Windows:”后面的
“; extension=php_mysql.dll”解除注释后apache,php-win.exe运行出错.注释掉运行正常.
- 主机空间: 3G以上
- 主机线路环境: 海外
- 主机功能支持: ASP.NET…
- 附带邮局空间: 不带邮局
- 操作系统: Windows 2000系列
- 主机WEB方式管理: 不支持
- 付费周期: 1个月
- 虚拟主机价格: 0-99.99元
- 主机服务商: 其它服务商
- 主机所在地: 美国
| 美国空间,数量有限
3G以上空间每月只需10元! 200M MSSQL 2G MySQL 数据库 支持PHP5 ASP.NET v4.0 ASP.NET AJAX 还免费赠送网站程序及模板!
|
| 国外空间不限制流量和IIS,免备案,FTP+PHPMYADMIN管理.独立ip.空间速度,稳定证明一切!小店冲钻期间不赚钱,只赚信誉,特价销售.
此产品为合租共享!但IP为独立IP,只要不做违法站点,IP是绝不会被封的.独立IP,不是对每个人的,而是我们合租团队的,如果有问题了,我负责更换 低价出售,店家也不是很懂网站程序,如果购买,请在ftp账号和域名解析生效后马上确认付款,本店不接受中评和差评。不接受的请不要拍。 |
| 禁止放仿冒品牌类网站(如UGG等),博彩类、私服、色情、赌博、诈骗、垃圾邮件、成人写真、激情诱惑、恐怖暴力、游戏站点、下载站点、版权相关等一切法律法规禁止的内容,违规和被攻击站点(拒绝打擦边球的网站),一经发现,立即永久关闭且不退款。 |
| 产品编号 | 价格/月 | 空间容量 | 相关赠品 | 绑定域名 | IIS并发数 | 流量限制 | 子目录 |
| 美国空间1G | 10元 | 3G以上 | 200M MSSQL + 2G MySQL | 1个 | 不限 | 不限 | 不限 |
| 本店空间一个月内使用不满意可申请退款,请放心购买! | |||||||

了解宝贝★~~
美国主机Godaddy Deluxe方案,150G空间,无限流量,不限网站数量,支持PHP和MYSQL(Lniux)或者ASP、ASP.NET、PHP、MYSQL、ACCESS和MSSQL(Windows)。需要代购的朋友请拍下,然后按照要求提交资料即可。
Godaddy简介★~~
Godaddy 是世界第一大域名注册商,进军主机领域以后发展迅速,据多家监测机构显示,放置在Godaddy上的网站数量已经越居第一位。Godaddy同时提供 linux主机,Windows主机,VPS以及独立主机全线主机产品,各种需求的客户在这里都可以找到适合自己的产品。
Godaddy同时提供独立IP,SSL证书,帮助客户快速打造自己的电子商务网站。
Godaddy Deluxe系列主机介绍★~~
Godaddy Deluxe系列主机是Godaddy最受欢迎的主机。速度、性能和性价比等各方面都有较强的优越性。Deluxe系列主机分为两种类型,分别是Linux系列和Windows系列。
Linux 系列:运行环境为Linux系统,支持PHP、CGI、JSP等脚本,150G网站空间,1500G月流量,可以建立50个FTP帐号,无限域名绑定(可 以建立无限个站点),500个Email帐号,25个MYSQL数据库,无限Email转向。有独立的管理平台。
Windows系列:运行 环境为Windows2003系统,支持ASP、ASP.NET等脚本。同样是150G网站空间,1500G月流量,选择IIS 6.0支持1个FTP帐号;选择IIS 7.0可以建立50个FTP帐号,并且还可以支持php。无限域名绑定(可以建立无限个站点),500个Email帐号,25个MYSQL数据库,2个 SQLServer数据库,无限Email转向。有独立的管理平台。
Godaddy优点★~~
价 格便宜,windows基本是同行业中最低的,其他空间商的windows主机的月费基本都在9.95美元左右。购买一年Economy Plan可以使用优惠码cjcshare20优惠20%,只需要45.5美元;购买一年Deluxe Plan只需要63.74美元(性价比最高的一款)。
管理灵活。在Godaddy的控制面板就可以自助实现购买添加独立IP,更换主域名,增加支持JSP(linux),购买添加SSL证书等多种操作。在其他主机商,这些基本都需要联系主机商完成,很繁琐。
一个帐户可以同时支持asp和php。Linux和Windows平台价格是一样的,也支持jsp,可选iis 6或iis 7,对于用asp的国内客户来说是非常便宜的。
SSL证书非常便宜,第一年12.99美元,最划算的是赠送一个独立IP。
跟空间同时注册的域名仅1.99美元,续费也不贵,50多元,适合长期拥有。
速度快。Godaddy主机在国内的的大部分地区的速度都很好,在美国等国家的速度一流,非常适合外贸网站的使用。
快速搭建电子商务平台。Godaddy主机可以方便快捷的添加独立IP,SSL证书,满足电子商务的需要。
Godaddy Deluxe方案介绍★~~
Windows主机
150G空间
1500G流量/月
500个email帐户
支持子目录(可以做无限个站)
25个mysql数据库
FTP帐户可以多开50个
无限子域名
支持access asp asp.net v1.0/2.0 asp.net ajax mssql php5
———————————————————–
Linux系统
150G空间
1500G流量/月
500个email帐户
支持子目录(可以做无限个站)
25个mysql数据库
FTP帐户可以多开50个
无限子域名
支持PHP4 / PHP5 MySQL 4.1 or MySQL 5.0 Java CGI
| 三大理由告诉您为什么选择我们: 1、中文售后客服,从此不再为与客服沟通困难而烦恼! 2、多种付款方式,让您买的安心,用的放心! 3、淘宝消保卖家,不满意就退款,100%保证您的权益 |
有很多购买了所谓的美国空间但实际中发现速度很慢,其实购买的是美国位于新加坡的亚太中心区的空间;本店为实体公司,所提供的保证是美国本土主机,请放心购买.
青岛银达科技 www.qdhongye.com
一、长连接与短连接:
长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。
这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。
此方式常用于一点对多点通讯。C/S通信。
二、长连接与短连接的操作过程:
短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
三、长连接与短连接的使用时机:
长连接:短连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。
每个TCP连接的建立都需要三次握手,每个TCP连接的断开要四次握手。
如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作
下次操作时直接发送数据就可以了,不用再建立TCP连接。例如:数据库的连接用长连接,
如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪费。
短连接:web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。
像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,
而且同时用成千上万的用户,每个用户都占有一个连接的话,可想而知服务器的压力有多大。
所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。
总之:长连接和短连接的选择要视需求而定。
四、发送接收方式:
1、异步:报文发送和接收是分开的,相互独立,互不影响的。这种方式又分两种情况:
异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接送。
异步单工:接送和发送使用两个不同的程序来完成。
2、同步:报文发送和接收是同步进行,即报文发送后等待接送返回报文。同步方式
一般需要考虑超时问题,试想我们发送报文以后也不能无限等待啊,所以我们要设定一个等待
时候。超过等待时间发送方不再等待读返回报文。直接通知超时返回。
五、报文格式:
通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 收和发送报文函数。
阻塞与非阻塞方式
1、非阻塞方式:读函数不停的进行读动作,如果没有报文接收到,等待一段时间后超时返回,
这种情况一般需要指定超时时间。
2、阻塞方式:如果没有接收到报文,则读函数一直处于等待状态,知道报文到达。
循环读写方式
1、一次直接读写报文:在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。
2、不指定长度循环读写:这一版发生在短连接进程中,受网络路由等限制,一次较长的报文可能
在网络传输过程中被分解成很多个包,一次读取可能不能全部读完一次报文,这就需要循环读取报文,
知道读完为止。
3、带长度报文头循环读写:这种情况一般在长连接中,由于在长连接中没有条件能够判断循环读写什么时候结束。
必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文,实际情况中,报头码制格式还经常不一样,
如果是非ASCII的报文头,还必须转换成ASCII常见的报文头编制有:
1、n个字节的ASCII码。
2、n个字节的BCD码。
3、n个字节的网络整型码。
以上是几种比较典型的读写报文方式,可以与通信方式模板一起 预先提供一些典型的API读写函数。 当然在实际问题中,可能还必须编写与对方报文格式配套的读写API. 在实际情况中,往往需要 把我们自己的系统与别人的系统进行连接, 有了以上模板与API,可以说连接任何方式的通信程序 都不存在问题。
现象:/tmp占用400M的空间(里面全部是乱七八糟的东西)
动作:删除/tmp目录
后果:造成只能启动到控制台模式
应急:
1 创建目录:#mkdir /tmp 结果系统在控制台模式登录和X windows模式登录状态间反复切换,不能进入系统
2 改变权限:#chmod a+rwx,o+t /tmp
即为:
drwxrwxrwt 4 root root 4096 9月 16 15:18 tmp
系统恢复正常。
具体分析原因如下:
正常情况下,/tmp目录的权限是:
drwxrwxrwt 4 root root 4096 9月 16 15:18 tmp
它表示所有的用户都可以在其中建立文件(或目录),即任何人都对tmp目录拥有“写权限”,但是除非tmp目录的所有者和文件的所有者,其他人不能在/tmp目录下改写(或删除、重命名)别人的文件(或目录)。
如果你删除了系统的tmp目录,又用mkdir /tmp建立这个目录,那么根据umask的规定,默认建议的目录的权限是:
drwxr-xr-x 3 root root 4096 9月 16 15:31 tmp
那么其他人就不能在/tmp目录下建立文件了;这时,系统将出现故障(如:不能启动或不能进入x windows);
如果你用:chmod a+w /tmp改变/tmp目录的权限为:
drwxrwxrwx 3 root root 4096 9月 16 16:34 tmp
那么任何人都可以删除别人在/tmp目录下的文件了,包括删除root在/tmp目录下建立的文件;
如果用:chmod o+t /tmp为/tmp目录加了粘滞位t,那么其他人就不能在tmp目录下改写(或删除、重命名)别人的文件(或目录),起到了/tmp目录的作用。
另外,“suid”和“sgid”特殊标志位可以使普通用户运行一个程序,使这个程序访问或修改只有文件所有者或root用户才能直接访问或修改的文件,当然前提是这个普通用户对这个文件的某个部分拥有相应的权限。
今天把我郁闷坏了,好端端的Linux去不能正常启动了,图形界面总是进入不了,系统自动重启好几次还是进不了,最后提示进入命令行模式,在命令行模式下 vi /etc/inittab,看到id:5:initdefault 正确啊,不是3。试了下init 5(进入图形界面),没有反应,ctrl+alt+F7还是不行,startx依然不行,要不是没有反应,要不就是重启后最后还是提示进入命令行模式。
最后没办法,耐着性子看了看进入不了图形界面时提示的出错信息,提示将/etc/X11/XF86Config中FontPath unix/:7100注释掉,结合在网上搜到的信息,加了句FontPath “/usr/X11R6/lib/X11/fonts/misc“,保存后,重新启动X-Window(startx),结果这次好使了,哎,真时费了我一下午时间,看来以后还是得耐着性子看英文啊。
结合自己在网上搜集到的解决办法(我试过)
X-Window启动不了,查看/var/log/XFree86.0.log中有如下错误信息:“Fatal server error: could not open default font ‘fixed’”
解决方法如下:
(一)
运行
xfs & startx
说明:这个方法第一次可以进入图形界面,重启后就不行了,后面有原因说明。
(二)解决方法如下:编辑 /etc/X11/XF86Config,在“Section ‘Files’”里的“FontPath”段加入以下字体路径定义:
FontPath “/usr/X11R6/lib/X11/fonts/misc”(先注释掉原有的)
保存后,重新启动X-Window(startx)即可。
(三):
一、只注释掉FontPath unix/:7100可以启动,但中文字体有问题
二、在startx命令前运行xfs & 也可,但有点啰嗦,
实际上,之所以不能启动是因为用户清空 /tmp 目录造成,这里面有一个隐含的文件/tmp/.font-unix/fs7100,该文件属性为 srwxrwxrwx 长度为0,这是一个字体链接文件。这个文件删除就导致上面所说的问题,只要产生出这个文件即可真正的“修好”不能启动的问题。实际上,运行xfs &就是立即生成这个文件。系统中已经运行了xfs服务却不能自动生成这个文件(没有权限)。
另外需要说明的是生成这个文件在重起一次电脑后就丢失了,原因在于生成这个文件的程序xfs &是以当前用户身份运行的,一旦系统退出即自动清理掉生成的临时文件,因此需要将这个文件的所有者和用户组改成系统默认的xfs即可。
解决这个问题就这么几步:
1. 在登录后提示符下输入 xfs &
2. 运行 chown /tmp/.font-unix
3. 运行 chown /tmp/.font-unix/fs7100
4. 运行 chgrp /tmp/.font-unix
5. 运行 chgrp /tmp/.font-unix/fs7100
6. 重起一次即可(或者杀掉当前 xfs 重起系统的 xfs)
哈哈,大家明白了吧,我用的是(二);(一)不能根本解决问题,原因在(三)中已说明;(三)我没试过,应该也行。
查询了很多资料,根据自己的实际操作,总结如下。
运行等级不需修改,系统默认2,inittab文件也不需要,在启动项内核加上text参数就可以了。
方法一:
chmod +w /boot/grub/grub.cfg //添加可写权限
vi /boot/grub/grub.cfg //打开grub配置文件
在相对应的启动选项中找到“quiet splash”,其中splash是设置启动画面,可留可不留。不留的话就直接把splash改成text,留的话就是“quiet splash text”。
编辑 /boot/grub/grub.cfg
找到linux /boot/vmlinuz-2.6.31-20-generic root=UUID=2d09215f-5e7d-44d3-9fe5-8d87aa0e21b7 ro quiet splash
类似这样
在最后添加一个text,变为
linux /boot/vmlinuz-2.6.31-20-generic root=UUID=2d09215f-5e7d-44d3-9fe5-8d87aa0e21b7 ro quiet splash text
保存退出
chmod -w /boot/grub/grub.cfg //
Reboot
方法二:
vi /etc/default/grub¦lt;br /> 同样找到“quiet splash”,方法同上!
改完后保存退出
upda-grub //关键
reboot
通过以上,开机就直接进入文本模式了!
文本与桌面模式切换:
文本模式登陆后,在普通用户权限下执行startx,进入到桌面模式。
一定要在普通用户权限下,root权限下startx,桌面模式都是默认设置,不加载个人设置!
桌面到文本的切换:
Ctrl+Alt+F1,切到文本界面,执行Ctrl+c,结束掉刚才启动的X server!
关于什么是IceGrid,请参阅Ice-3.2.0文档或看这里。
在这里,我将建立一个拥有一个registry和两个node的IceGrid,其中node1与registry运行在同一台计算机上(但不同进程,IP为192.168.3.95),node2运行在另一台计算机上(IP为192.168.3.68)。环境均为XP SP2+Ice 3.2.0。
首先在D盘(可以任意)下建立目录MyIceGrid,再建立子目录db及db\registry和db\node1,以存放registry和node1的数据。
将以下MyIceGrid的配置信息另存为config.grid:
IceGrid.InstanceName=MyIceGrid
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=MyIceGrid/Locator:default -h 192.168.3.95 -p 12000#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=default -p 12000
IceGrid.Registry.Server.Endpoints=default
IceGrid.Registry.Internal.Endpoints=default
IceGrid.Registry.Data=D:\MyIceGrid\db\registry
IceGrid.Registry.PermissionsVerifier=MyIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=MyIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=MyIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=MyIceGrid/NullSSLPermissionsVerifier#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=D:\MyIceGrid\db\node
IceGrid.Node.CollocateRegistry=1
#IceGrid.Node.Output=db
#IceGrid.Node.RedirectErrToOut=1#
# Trace properties.
#
IceGrid.Node.Trace.Activator=1
IceGrid.Node.Trace.Patch=1
#IceGrid.Node.Trace.Adapter=2
#IceGrid.Node.Trace.Server=3#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
再将node1的配置另存为config.node文件:
#
# Sample configuration file for the IceGrid node daemon
##
# Proxy to the IceGrid registry
#
#Ice.Default.Locator=MyIceGrid/Locator:tcp -h 192.168.3.95 -p 4061
#Ice.Default.Locator=MyIceGrid/Locator:ssl -h localhost -p 4062
Ice.Default.Locator=MyIceGrid/Locator:tcp -h 192.168.3.95 -p 12000#
# The name of this node; must be unique within an IceGrid deployment
#
IceGrid.Node.Name=node1#
# The node object adapter listens on all interface using an OS-
# assigned port
#
IceGrid.Node.Endpoints=tcp#
# The directory where the IceGrid node maintains its data
# (server configuration files etc.)
# This directory must exist when icegridnode starts
#
# Under Vista we recommend using:
#
# C:\Users\Local Service\AppData\Local\ZeroC\icegrid\node1
#
IceGrid.Node.Data=D:\MyIceGrid\db\node1#
# Redirect server stdout and stderr to files in this directory:
#
# Under Vista we recommend using:
#
# C:\Users\Local Service\AppData\Local\ZeroC\icegrid\node1
#
IceGrid.Node.Output=D:\MyIceGrid\db\node1
#IceGrid.Node.RedirectErrToOut=1#
# Trace properties. Uncomment the other trace properties and
# select a suitable tracing level if you are having problems
# with activating servers.
#
IceGrid.Node.Trace.Replica=2
#IceGrid.Node.Trace.Activator=3
#IceGrid.Node.Trace.Adapter=3
#IceGrid.Node.Trace.Server=3
有了这些配置信息,我们已经可以建立拥有registry和node1的grid了,启动命令如下:
#启动registry
icegridregistry –Ice.Config=D:\MyIceGrid\config.grid
#启动node1
icegridnode –Ice.Config=D:\MyIceGrid\config.node
如果需要将它们运行为Windows的服务,可以使用–install参数安装,并设置服务的登录帐户为LocalService,然后在服务管理中启动。需要注意的是,如果配置文件发生了改动,那么必须重新启动它们才会生效。
现在把另台计算机上的node2启动并注册吧,相应的配置文件与node1非常类似,只需要把node1的东西改为node2就可以了,记得端口等信息要与registry一致。启动方法也与上面一样,就不再多说了。
怎么样看node1和node2是否已经注册呢?
输入以下命令启动IceGridAdmin:
icegridadmin –Ice.config=D:\MyIceGrid\config.grid

从窗口上能看出来建立的IceGrid使用的Ice版本为3.2。
在这里输入node list可以看到目前注册了的结点:node1和node2。

实施完以上步骤,我们的简单IceGrid就建立好了。当你在运行有node2的计算机上使用IceGridAdmin进要求输入用户名和密码,这个东西在IceGrid的配置文件的最后面。

![[Google]]( http://www.upwardit.com/wp-content/plugins/easy-adsenser/google-light.gif)






























近期评论