搭建双塔 快速解法

问题描述:

2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。
  Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少。所以他来请你帮忙。
  给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr. F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建的双塔的最大高度,否则输出“Impossible”。

继续阅读

Linux受限用户的建立

 

想要给予用户什么功能,把命令copy到主目录的bin下。所有者最好为root,hia hia ~~

或者把主目录也改成root所有的,这样这个用户只能用来执行某些程序!用途嘛,太多了,你知道的。

 

附文本:

#!/bin/bash
username="dear"

cp -a /bin/bash /bin/rbash
useradd -c "A Restricted User" -g users -d /home/$username -s /bin/rbash $username
rm -rf /home/$username;  mkdir -m 555 /home/$username
mkdir -m 555 /home/$username/bin
cp -a /bin/ls /home/$username/bin
cp -a /usr/bin/passwd /home/$username/bin
echo "export PATH=/home/$username/bin" > /home/$username/.bash_profile
chmod 444 /home/$username/.bash_profile
passwd $username

好久没被这样的bug玩过了

今天在两个小bug上花了很多时间。几乎整个晚上都在寻找bug的来源~!

当我真正地找到bug的所在处时,大吃了一惊!唉,当年的恶梦重演了。。。太粗心大意了!

 

第一个bug:

 

Line 106,应该是 if( p!=NULL ) 才对。。。

我早就怀疑某个地方有点不对劲,今晚证实了,添加了MAP_ZERO参数,却没有生效。

 

 

mo是指针,初始化mo结构的内容,用到sizeof时候,应该是 sizeof(*mo) 或者 sizeof(PeModule)才对。

我真悲剧!

– –

 

以此为鉴,今后写代码慎重!

VESA服务程序搞定!

 

哈哈~~ 从sgos1.0移植过来的vesa驱动,不费吹灰之力啊,仅仅1个小时,成功编译后运行马上能够使用了。并没有预想之中的出现一大堆麻烦。也多亏之前的vm86写的相当不错~~

PS:键盘驱动也可以正常工作了!

 

下一步,一个简单的tty驱动~~~SimpleConsole!

lianxiang的人喜欢玩LED?

仔细地数了一下,23个LED小灯管(含网卡的黄灯和绿灯和ideapad的logo背景灯)。

 

 

 

夜深关灯后,还看到那么多灯光闪耀,炫啊!

 

这些小灯都应该可以通过系统来控制的,其中有7个还可以调节亮度和触摸感应。有空用sgos2弄个驱动来完全控制一下,应该很好玩!

read和_read?

昨晚把uname函数解决了,成功地在模拟的cygwin兼容层上运行了GNU uname程序。接着又尝试了一个比较简单的程序—cat。

 

在运行的过程中,还需要下面两个函数_read和_write。

 

其实这两个函数和read、write有什么区别呢?

 

我懒得去翻GNU的源代码了,_read和read的函数声明是一样的,所以我估计_read是cygwin内部使用的函数。于是,直接在read中调用_read,在_read里实现真正的读取操作的代码。

 

在基本实现了fstat功能后,我发现里面有一个指出块大小的变量。我把这个变量设置为一个页面的大小4096之后,惊奇地发现每次调用_read的时候都是4KB对齐的。真好,看来我在api层的FsReadFile函数里又设置了一下页面对齐有点多余的感觉。

 

附一个运行cat程序显示一个文本文件startup.txt的内容的截图。

 

 

 

下一步准备实现标准输出输入了。写一下tty和kdb的驱动。

Cygwin学习笔记

为了在最短的时间内掌握Cygwin原理,我选择了MSYS的源代码来进行分析研究。

以下内容仅为阅读代码时做的笔记,非文献。

 

当一个Cygwin程序运行时,首先到达mainCRTStartup ()这个入口函数,属于newlib,在newlib的crt0.c里。

mainCRTStartup ()调用msys_crt0或者cygwin_crt0,并传递main函数的地址。

msys_crt0调用了_msys_crt0_common 和 dll_crt0__FP11per_process。

在_msys_crt0_common()里,主要给per_process结构分配空间,然后初始化结构的数据内容。

进入dll_crt0__FP11per_process()后,就不会再返回了。

接着来到_dll_crt0(),获取环境变量和进程信息,通过set_console_handler设置终端IO文件。随后调用dll_crt0_1()

在dll_crt0_1里,设置了异常处理函数,初始化resourcelocks和threadinterface,似乎给线程都分配了名字。

调用了host_dependent.init (),不知道干了什么。

调用memory_init(),若是第一次加载dll,会创建一片共享内存区域。

调用events_init()初始化。

如果是使用fork创建的子进程,则跳到指定的地址去执行。否则,执行下面初始化:

Cygwin进程列表初始化,dtable初始化,信号处理初始化,tty初始化。

对命令行参数的路径进行转换。

 调用stdio_init()设置标准的输出输入描述符表。

至此,基本上完成了Cygwin的数据初始化。

 

最后调用dlls.init (),调用各个premain函数。调整到user_data->main去执行。

 

至此,我大致已经清楚了Cygwin的启动流程,可以去尝试自己写一个运行库了 :D

 

经过一晚奋战,结果如下,成功执行MSYS的env.exe程序。