write ourself os vpc中msdos设置共享文件夹 及安装msdos的注意事项

本文记录了使用Virtual PC 2004搭建MS-DOS 7.1共享环境的过程及遇到的问题。包括如何正确选择MS-DOS版本、Virtual PC版本,以及解决“emm386: unrecoverable privileged operation error”的方法。

《操作系统》一书中用 virtual pc搭建msdos共享环境中遇到的问题及解决方案。

下午参加玩婚礼,6:30左右赶到公司,继续看这本书。

按照书上讲的开始搭建环境。以前没用过微软的这玩意。

我的错误认识:

1,其实msdos 7.1 或这pcdos7.1都可以,被别人误导了,以为先要装msdos,再在其基础上装pcdos,其实不是这么回事。误导我的人在此,不知道你是不是也被这小子误导了!?http://download.youkuaiyun.com/source/286626 。这家伙说明中的问题非常具有误导性!血的教训,千万不能随便就跟着别人的感觉走了,这小子可能的确成功了,但在写说明是估计有点片面,或者是故意的!

2,virtual pc要用2004版,2007 不能在dos下设置共享。

3,要不然打死我也不会用微软的这玩意,但dos下可以将host下的文件家映射为dos下的一个磁盘!而vmware就不能,只能通过局域网的方式通host共享文件夹!这可能是唯一让我感觉选择virtualpc的reason了。

4,重点,安装msdos7.1时,选择“dos command only”就够用了。然后将virtual pc安装目录下的"dos addtions.fvd"加载到虚拟磁盘->srcfiles->fshare。这时共享可以使用!

5,msdos下运行pmtest1.com 时报告:emm386:unrecoverable privileged operation error的解决方案:安装msdos最后一部选择:unable load, 即不允许使用"emm386"扩展!微软简直是个无赖!!!这里有狡辩的理由!http://support.microsoft.com/kb/74210

其实这也是误导我在msdos上继续安装pcdos的愿意,刚开始我以为报这个错误是因为我没有安装pcdos,没有在pcdos上运行该程序的原因呢!智商的确底下!这个问题的解决多亏了这个小子的留言“XINGKONGYUN 发表于2008-09-25 20:22:33  IP: 221.0.106.*

对于这个错误"emm386:unrecoverable privileged operation error的解决方法是,在按住DOS时(我装的是DOS7.0.1) 最后有个选项问你是否加载emm386,你要选择不加载,这样就好了,具体的解释在微软的网站上http://support.microsoft.com/kb/74210
不过小弟不才,是在不理解那说得啥,有那位高人看明白了,一定要告诉小弟我啊。(下下面留个言说说也行啊)

”,要不然今晚上不用睡了!

这里应该是于渊的博客,http://blog.youkuaiyun.com/forrestyu/archive/2006/05/07/711520.aspx#911607

这里是一个同行的博客,有点参考价值:http://blog.sina.com.cn/s/blog_56dee71a01009z2r.html

不过也没见他正儿八经的回答过几个问题。鄙视。

---------这里有个哥们很有创造精神,给出了一个歪招:

 用WinImage打开DOS的img文档(如:MSDOS710.IMG),点击“Inject files in current image”按钮(往里面插入您想要的文档,如:pmtest1.com)。然后点Save(保存)。就能够了!这时,您能够看到MSDOS710.IMG文档里多了个pmtest1.com文档,启动VirutalPC,(插入映射文档)运行DOS
A:\>dir/w         
最后一个文档就是pmtest1.com。
:A:\>pmtest1.com

--------------

 

今天参加婚礼我就带着这本书,不过可惜没空能看几页。没想到这个婚礼从11点一直到了下午5点,靠,时间都被花在这上面了,以至于晚上我得补上,现在还没能睡觉。惨!

小朋友也出差了,一个星期没吃到好东西了…… 重伤 

不过最终把问题解决了倒是挺高兴的! 睡觉 

 

最近感觉水平低下,买书比较多,平均一个月怎么也的买2本,电脑上下电子版的,床上放书,这样无论睡觉前还是早上赖床都可以顺手就哪里看几页。这东西真还在于积累和坚持,一不小心就看了一大半……哈哈哈,坚持两年估计理论能长不少。还得多动手实践了。

哎,真是没脸见老大了,那个小东西我还没搞定!继续编程自己吧,毕竟金融危机的机会不多。

还有,不得不批评一下百度!越来越垃圾了,用前面几个小时都用百度搜索原因,但根本就没搜索的有价值的线索(估计百度的数据的确不怎么客观),最后用google搜索才找到了http://blog.youkuaiyun.com/forrestyu/archive/2006/05/07/711520.aspx 。

#! /bin/sh # Monitor and store core dumps of crashing processes # default configuration COREBASEDIR=/ext/faults MINFREESPACE=3000 MAXCOREDUMPS=20 LOCKDIR=/tmp/faultmonitor.lock UPLOADSERVER="" UPLOADTIMEOUT=60 MAXLOGENTRIES=100 get_config_dm() { params=$(ubus call ProcessFaults _get) if [ -n "$params" ]; then local value="" value=$(jsonfilter -s "$params" -e '@[@].MaxProcessFaultEntries') [ -n "$value" ] && MAXCOREDUMPS=$value value=$(jsonfilter -s "$params" -e '@[@].StoragePath') [ -n "$value" ] && COREBASEDIR=$value value=$(jsonfilter -s "$params" -e '@[@].MinFreeSpace') [ -n "$value" ] && MINFREESPACE=$value fi } get_config_dm if [ -z "$COREBASEDIR" ]; then exit 0 fi # Basic characteristics of the fault PID=$1 SIGNAL=$2 TIME=$3 if [ ! -z "$4" ]; then PID=$4 fi # For systems where the arguments are seperated by null bytes, translate # those in semi-colons (;). CMDLINE=$(tr \\0 ";" < /proc/$PID/cmdline) # Do not handle crash dumps of ourself if grep -q faultmonitor /proc/$PID/cmdline; then exit 0 fi # Compute the crash id and store the count of crashes mkdir -p $COREBASEDIR while ! mkdir $LOCKDIR 2> /dev/null; do # poor mans busy waiting mutex sleep 0 done COUNTFILE=$COREBASEDIR/count CRASHID=0 if [ -e $COUNTFILE ]; then CRASHID=$(cat $COUNTFILE) fi COUNT=$(expr $CRASHID + 1) # Store counter/crash id echo $COUNT > $COUNTFILE rmdir $LOCKDIR # Store in log FAULTSLOG=$COREBASEDIR/log LOGENTRIES=0 if [ -f $FAULTSLOG ]; then LOGENTRIES=$(wc -l $FAULTSLOG |awk '{print $1}') if [ $LOGENTRIES -ge $MAXLOGENTRIES ]; then # remove the oldest entries sed -i "1d" $FAULTSLOG fi fi # Compute local core dump path and check limits # note: those checks are racy COREDUMPPATH=$COREBASEDIR/dump/$CRASHID/ FREESPACE=$(\df -k $COREBASEDIR | tail -f -n 1 | awk "{ print \$4 }") if [ $FREESPACE -lt $MINFREESPACE ]; then COREDUMPPATH="" fi if [ $MAXCOREDUMPS -eq 0 ]; then COREDUMPPATH="" fi echo "$CRASHID $PID $SIGNAL $TIME $CMDLINE" >> $FAULTSLOG # Store details if ! test -z "$COREDUMPPATH" then ubus call ProcessFaults.ProcessFault _add "\ {\"parameters\":\ {\"Reason\": $SIGNAL,\ \"ProcessName\": \"$CMDLINE\",\ \"FaultLocation\": \"$COREDUMPPATH\",\ \"ProcessID\": \"$PID\",\ \"TimeStamp\": \"$TIME\"}}" mkdir -p $COREDUMPPATH for i in wchan maps smaps fdinfo "stat*"; do echo cp -r /proc/$PID/$i $COREDUMPPATH cp -r /proc/$PID/$i $COREDUMPPATH done ls -l /proc/$PID/fd/ > $COREDUMPPATH/fd-listing.txt gzip -c > $COREDUMPPATH/core.gz fi 上面这个脚本文件的作用逐行分析
最新发布
09-13
以下是对该脚本的逐行分析: ```sh #! /bin/sh ``` 这是脚本的解释器声明,表明该脚本使用的是`sh`(通常是Bourne shell或其兼容版本)来执行。 ```sh # Monitor and store core dumps of crashing processes ``` 这是一个注释,说明该脚本的主要功能是监控并存储崩溃进程的核心转储文件。 ```sh # default configuration COREBASEDIR=/ext/faults MINFREESPACE=3000 MAXCOREDUMPS=20 LOCKDIR=/tmp/faultmonitor.lock UPLOADSERVER="" UPLOADTIMEOUT=60 MAXLOGENTRIES=100 ``` 这些行定义了脚本的默认配置参数: - `COREBASEDIR`:核心转储文件和日志的存储基础目录。 - `MINFREESPACE`:存储核心转储文件所需的最小可用空间(单位:KB)。 - `MAXCOREDUMPS`:允许存储的最大核心转储文件数量。 - `LOCKDIR`:用于实现简单锁机制的目录。 - `UPLOADSERVER`:上传核心转储文件的服务器地址,默认为空。 - `UPLOADTIMEOUT`:上传操作的超时时间(单位:秒)。 - `MAXLOGENTRIES`:日志文件中允许的最大条目数。 ```sh get_config_dm() { params=$(ubus call ProcessFaults _get) if [ -n "$params" ]; then local value="" value=$(jsonfilter -s "$params" -e '@[@].MaxProcessFaultEntries') [ -n "$value" ] && MAXCOREDUMPS=$value value=$(jsonfilter -s "$params" -e '@[@].StoragePath') [ -n "$value" ] && COREBASEDIR=$value value=$(jsonfilter -s "$params" -e '@[@].MinFreeSpace') [ -n "$value" ] && MINFREESPACE=$value fi } ``` 这是一个函数`get_config_dm`,用于从`ubus`(OpenWrt系统的消息总线)获取配置参数并更新脚本中的默认配置: - `params=$(ubus call ProcessFaults _get)`:调用`ubus`的`ProcessFaults`对象的`_get`方法,获取配置参数。 - `jsonfilter`:用于从JSON格式的`params`中提取特定的配置项,并更新相应的变量。 ```sh get_config_dm ``` 调用`get_config_dm`函数,更新配置参数。 ```sh if [ -z "$COREBASEDIR" ]; then exit 0 fi ``` 检查`COREBASEDIR`是否为空,如果为空则脚本退出,因为没有指定存储核心转储文件的基础目录。 ```sh # Basic characteristics of the fault PID=$1 SIGNAL=$2 TIME=$3 if [ ! -z "$4" ]; then PID=$4 fi ``` 获取脚本的命令行参数,分别赋值给`PID`(进程ID)、`SIGNAL`(导致进程崩溃的信号)和`TIME`(崩溃时间)。如果有第四个参数,则将其赋值给`PID`。 ```sh # For systems where the arguments are seperated by null bytes, translate # those in semi-colons (;). CMDLINE=$(tr \\0 ";" < /proc/$PID/cmdline) ``` 从`/proc/$PID/cmdline`文件中读取进程的命令行参数,并将其中的空字节(`\0`)替换为分号(`;`),存储在`CMDLINE`变量中。 ```sh # Do not handle crash dumps of ourself if grep -q faultmonitor /proc/$PID/cmdline; then exit 0 fi ``` 检查当前崩溃的进程是否是脚本自身(`faultmonitor`),如果是则脚本退出,避免处理自身的崩溃。 ```sh # Compute the crash id and store the count of crashes mkdir -p $COREBASEDIR while ! mkdir $LOCKDIR 2> /dev/null; do # poor mans busy waiting mutex sleep 0 done ``` 创建存储核心转储文件的基础目录`COREBASEDIR`,并使用`LOCKDIR`实现简单的锁机制,通过循环尝试创建`LOCKDIR`目录,直到成功获取锁。 ```sh COUNTFILE=$COREBASEDIR/count CRASHID=0 if [ -e $COUNTFILE ]; then CRASHID=$(cat $COUNTFILE) fi COUNT=$(expr $CRASHID + 1) # Store counter/crash id echo $COUNT > $COUNTFILE rmdir $LOCKDIR ``` 计算崩溃ID(`CRASHID`),如果`COUNTFILE`文件存在,则从文件中读取当前的崩溃ID,否则初始化为0。将崩溃ID加1得到新的计数`COUNT`,并将其写入`COUNTFILE`文件,最后释放锁(删除`LOCKDIR`目录)。 ```sh # Store in log FAULTSLOG=$COREBASEDIR/log LOGENTRIES=0 if [ -f $FAULTSLOG ]; then LOGENTRIES=$(wc -l $FAULTSLOG |awk '{print $1}') if [ $LOGENTRIES -ge $MAXLOGENTRIES ]; then # remove the oldest entries sed -i "1d" $FAULTSLOG fi fi ``` 定义日志文件的路径`FAULTSLOG`,如果日志文件存在,则统计日志文件的行数`LOGENTRIES`。如果日志文件的行数超过`MAXLOGENTRIES`,则使用`sed`命令删除第一行(最旧的条目)。 ```sh # Compute local core dump path and check limits # note: those checks are racy COREDUMPPATH=$COREBASEDIR/dump/$CRASHID/ FREESPACE=$(\df -k $COREBASEDIR | tail -f -n 1 | awk "{ print \$4 }") if [ $FREESPACE -lt $MINFREESPACE ]; then COREDUMPPATH="" fi if [ $MAXCOREDUMPS -eq 0 ]; then COREDUMPPATH="" fi ``` 计算本地核心转储文件的存储路径`COREDUMPPATH`,并检查可用空间和最大核心转储文件数量的限制。如果可用空间小于`MINFREESPACE`或`MAXCOREDUMPS`为0,则将`COREDUMPPATH`置为空,表示不存储核心转储文件。 ```sh echo "$CRASHID $PID $SIGNAL $TIME $CMDLINE" >> $FAULTSLOG ``` 将崩溃ID、进程ID、信号、时间和命令行参数写入日志文件。 ```sh # Store details if ! test -z "$COREDUMPPATH" then ubus call ProcessFaults.ProcessFault _add "\ {\"parameters\":\ {\"Reason\": $SIGNAL,\ \"ProcessName\": \"$CMDLINE\",\ \"FaultLocation\": \"$COREDUMPPATH\",\ \"ProcessID\": \"$PID\",\ \"TimeStamp\": \"$TIME\"}}" mkdir -p $COREDUMPPATH for i in wchan maps smaps fdinfo "stat*"; do echo cp -r /proc/$PID/$i $COREDUMPPATH cp -r /proc/$PID/$i $COREDUMPPATH done ls -l /proc/$PID/fd/ > $COREDUMPPATH/fd-listing.txt gzip -c > $COREDUMPPATH/core.gz fi ``` 如果`COREDUMPPATH`不为空,则执行以下操作: - 调用`ubus`的`ProcessFaults.ProcessFault`对象的`_add`方法,将崩溃的详细信息(原因、进程名、故障位置、进程ID和时间戳)添加到系统中。 - 创建核心转储文件的存储目录。 - 将`/proc/$PID`目录下的`wchan`、`maps`、`smaps`、`fdinfo`和以`stat`开头的文件复制到核心转储文件的存储目录中。 - 将`/proc/$PID/fd/`目录的文件列表保存到`fd-listing.txt`文件中。 - 将标准输入的内容压缩后保存为`core.gz`文件。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值