2009年3月31日星期二

My a small Shell.

/* You can see here */
/* a simple shell */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>

#define SHELL_NAME "sh1"
#define PROMPT_ENVIRONMENT_VARIABLE "PROMPT"

char *prompt;

int main(int argc,char **argv)
{
char cmd[80];
int statval;

/*Dtermine prompt value.*/
if((prompt=getenv(PROMPT_ENVIRONMENT_VARIABLE))==NULL)
prompt=SHELL_NAME":";

/*Process commands until exit,or death by signal.*/
while(1) {
/*Prompt and read a command.*/
printf(prompt);
gets(cmd);

/*Process built-in commands.*/
if(strcasecmp(cmd,"exit")==0)
break;

/*Process non-built-in commands.*/
if(fork()==0) {
execlp(cmd,cmd,NULL);
fprintf(stderr,"%s:Exec%sfailed:%s\n",argv[0],cmd,strerror(errno));
exit(1);
}
wait(&statval);
if(WIFEXITED(statval)) {
if(WEXITSTATUS(statval)) {
fprintf(stderr,"%s:child exited with status %d.\n",argv[0],WEXITSTATUS(statval));
}
}
else {
fprintf(stderr,"%s:child died unexpectedly.\n",argv[0]);
}
}

}

My friend help me modify it, as follows:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>

#define SHELL_NAME "sh1"
#define SHELL_GETS(var) printf(prompt); gets(var)
#define SHELL_CMD(str) strcasecmp(cmd, str) == 0

char *prompt;

int main(int argc,char **argv)
{
char cmd[80];
int statval;

if(!(prompt = getenv("PROMPT")))
prompt = SHELL_NAME ": ";

while(1) {
SHELL_GETS(cmd);

if (SHELL_CMD("exit"))
break;

if (fork() == 0) {
execlp(cmd, cmd, NULL);
fprintf(stderr, "%s:Exec %sfailed:%s\n", argv[0], cmd, strerror(errno));
exit(1);
}

wait(&statval);

if (WIFEXITED(statval)) {
if (WEXITSTATUS(statval)) {
fprintf(stderr, "%s:child exited with status %d.\n", argv[0], WEXITSTATUS(statval));
}
}
else {
fprintf(stderr, "%s:child died unexpectedly.\n", argv[0]);
}
}

}

2009年3月30日星期一

My application

My name: gaowei
My email: xiyou.gaowei@gmail.com
My IRC nickname: weiwei
My Phone number: 13772035412
My Web page: http://gaoweige.blogspot.com/ 
My group club website: http://www.xiyoulinux.cn/

  I am a junior student in the Computer Network Department at Xi'an Institute of Post and Telecommunications in China.

  I have been using open source software on my computer for three years, and I like it because it helps me complete my work and studies every day.It helps me to learn much about software and computer devices.I can modify them to satisfy my needs.When I learned about operating systems, I wanted to program a small operating system.At the moment,I read a lot of library books and searched a sea of information on the internet. I know the Linux0.01 architecture and how to implement and compile it into my computer. In addition, I not only have some experience with Linux0.11 and Linux2.6.26, but I am also learning Linux2.6.28.So I have a great interest in the kernels of operating system. Of course, I skimmed over the codes of Minix and Free BSD. 

  I know that Minix is an excellent OS and is a new open-source OS designed to be highly reliable, flexible, secure, and what's more,is intended as a teaching tool. I programmed a simple shell and a small File System and wanted to use fewer lines of executable code to implement an OS. So I want to apply to take part in a program concerning the OS project. Then I can only utilise my knowledge, but also share my ideas and skills.

2009年3月28日星期六

install MINIX

Runnig Minix 3 on QEmu

You can download a Minix 3 ISO from the Download page, and set QEmu to install a machine from that ISO.
These instructions are to get MINIX 3 running under qemu 0.10-0-1 under Ubuntu Linux, but it should generally apply to other qemu installations under linux as well. First, use your package manager or other means to install qemu on your host operating system. Under Ubuntu you can use aptitude to install qemu as follows.

[root@localhost VMWARE]# qemu-img create minix.img 2G
Formating 'minix.img', fmt=raw, size=2097152 kB
[root@localhost VMWARE]# qemu -localtime -net user -net nic -m 128 -cdrom minix3_1_3a_ide_r2964.iso -hda minix.img -boot d
Could not open '/dev/kqemu' - QEMU acceleration layer not activated
[root@localhost VMWARE]#qemu -localtime -net user -net nic -m 256 -cdrom minix3_1_3a_ide_r2964.iso -hda minix.img -boot -c

Note:Don't move your *img to other place. If you do it,then it will error and don't boot in qemu for minix.

2009年3月25日星期三

GSOC我之所见

去年,大家(我们xiyoulinux兴趣小组)有很人想参加,但是只有我一个人坚持到最后,因为都是英文,都是高手,几乎没有我们表现的,也真说明了一点,我们的能力还是有待提高。那次之后,我对开源有了新的认识,也经常去一些社区看看!但是,还是没有真正的参与进去,今年,我想真正的参与进去,而不是为了什么名利,这次活动的主要动机也是让更多的人了解开源,参与开源。
昨天,磊子,告诉现在公司里面要的是可以干活的人,你那些参与人家认证吗?那也根本不能说明你的能力。对,很对,所以就更应该借助这个机会来提高自己的水平。要知道,开源里面是如何的沟通,如何的运作,如何吸引别人的,代码是如何高效的写出,是如何的管理代码,我们是要学这些。要选择一个自己喜欢的,哪怕自己现在没有能力,当然,我是不知望我可以被录取,我知道我的水平,我只是想参与开源,当然,即使没有GSOC我也应该参与开源项目的。这真是,磊子,说的经验,可以拿的出手的东西。一定要做,实践,专注。
对自己的要求,1.每天至少看一个小时;2.不要参与太多,一个就好了!3.重在参与,不断提高自己;4.一定要有可以拿出手的东西,来证明自己的实力!
好了!一点感悟!

2009年3月23日星期一

网页制作工具


我基本就不会写网页,但是这周,突然想写一个,所以找到如下的工具

Amaya是 一个具有浏览功能 的WEB开发工具,是由万维网协会(W3C)成员开发的一个网络浏览器,同时也可以作为对W3C成果的测试工具。Amaya包括了一个HTML编辑器和浏 览器,用户可以免费到W3C的网站下载它,在linux和windows下都有对应的版本。Amaya起初只支持HTML和CSS的编缉,现在已经添加了 对XML、XHTML、MathML、SVG等的支持。Amaya is intended to be a comprehensive client environment for testing and evaluating new proposals for Web standards and formats. A large part of the intended features of Amaya are implemented in this release, but some of them are not complete yet. Amaya is designed as an application on top of the Thot editing tool kit.
Bluefish,正如其项目主页上描述的那样,是一个功能强大的编缉程。你可以用它来设计网站,编写脚本和程序代码。Bluefish支持很多程序语言和标记语言,它最突出的特点在于编缉动态的交互式网站。Bluefish has many features, this list will give you an overview of the most important or outstanding features.
Quanta Plus 原 名叫Quanta,是一个WEB的集成开发环境(IDE),可以用于HTML、XHTML、CSS、XML、PHP和其它基于XML的语言或者是脚本语言 的开发。Quanta Plus是一个KDE的软件,包含于Kdewebdev软件包里。Quanta有可见即所得的设计模式和代码编缉模式两种开发模式。它的特点有:代码标签 提示功能,脚本语言的变量自动完成,项目管理,实时预览, PHP调试器,Quanta Plus is a highly stable and feature rich web development environment. The vision with Quanta has always been to start with the best architectural foundations, design for efficient and natural use and enable maximal user extensibility. We recognize that we don't have the resources to do everything we would like to so our target is to make it easy for you to help make this the best community based desktop application anywhere. Pretty much everything in Quanta is designed so you can extend it. Even the way it handles XML DTDs is based on XML files you can edit. You can even import DTDs, write scripts to manage editor contents, visually create dialogs for your scripts and assign script actions to nearly any file operation in a project. You can even look at and communicate with a wide range of what happens inside Quanta using DCOP.

KompoZer是一个基于Nvu的所见即所得的HTML编缉器。KompoZer是Sourceforge上的一个项目,它主要由社区修护。下面是从网络上摘录的关于KompoZer功能的介绍
支持所见即所得(WYSIWYG),在我们在制作网页时,更加的直观化,编辑网页就如同打字一样容易。内建一个FTP Client,让我们可以很轻易的把编辑好的文件发布到服务器上。登录FTP Server后,还支持在线实时更改页面。可靠的HTML原始码,让由Nvu所创建出来的网页,可以在当前多数的浏览器上正常运作。制作网页时,可以使用所见即所得模式或HTML原始码编辑模式。Tab功能:可以让我们很迅速的在多个页签间切换,并且编辑这些网页。支持表单、表格、layer以及网页模版。

还有SCREEM is a web development environment. It's purpose is to increase productivity when constructing a site, by providing quick access to commonly used features. While it is written for use with the GNOME desktop environment in mind it does not specifically require you to be running it, just have the libraries installed.

2009年3月19日星期四

网络&生活

有网络真的太好了!
现在,网络上有太多的机遇给你,所以,我们要马不停蹄的学习,而后运用我的知识,不要什么也想参与,什么也想学好,可能吗?估计,以我的能力是不可能实现的,现在就想少睡觉,多看看世界,多动手实践,好不至于以后输给自己啊!机会会越来越多,但是我们必须要有扎实的基本工,过人之处,不要盲目的羡慕别人。自己也要很多的优点,赢自己才是真正的赢!

网络中很多人帮助我,真的不错。

今天,感受了一下企业培训,企业培训主要是教你干什么,如何干,而学校教你这个可以干什么,是什么原理,而不教你具体的干,也要你锻炼的机会很少。所以再以后的学习过程中,应该把这二者结合起来,那样就无敌了!感觉,社会对专科和本科有明显的区别,名牌和不名牌也是,四级过的没有过的。很多事情当你真正的经历了从会更加深刻的体会到!其实,我有时在开导别人,其实,也在安慰自己,有时候自己,也何尝不是有很多忧愁的时候,只是不表现吧了!今天,上口语课,别人都可以用流利的英语对话,而我呢?就是讲不出来,当时,我就想我毕业了将如何呢?口语不好,对于那些好公司应该就会把我拒绝门外了。上课时候,我想要不,我毕业了去打工,而后,去做销售,然后转型,做生意,但是我这种性格真的适合搞推销嘛。我在很多方面已经尝试过了,编程,似乎真的不是很适合我,以后应该会改变我的道路。就不多说了!

关于ChatZila的使用,过去一般在网页里面和别人用IRC聊天,但是感觉很不好,最好采用了ChatZila感觉还比较好用。用法,简单介绍,在*client*里面输入/server 您要登录的频道,然后/join
#您要去的组就可以了,还是比较好用。其实,很多事情当我们熟练操作之后感觉一切不过如此的简单.

现在每天用这个聊天,而QQ就很少用了。啊哈!

奋发吧!不要唠叨了!

2009年3月16日星期一

auto

进入你要的原代码
1.#autoscan
它会生成autoscan.log configure.scan 这俩个文件
2.#mv configure.scan configure.in
3.在项目下面创建Makefile.am在它的子目录下面也建立Makefile.am
4.在项目下面创建NEWS,README,ChangeLog,AUTHORS
5.将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下
6.#aclocal 运行之后就会多出autom4te.cache 这个文件
7.#autoconf 运行之后就会多出configure这个文件
8.运行#automake -a之后会出现下面的
configure.in: no proper invocation of AM_INIT_AUTOMAKE was found.
configure.in: You should verify that configure.in invokes AM_INIT_AUTOMAKE,
configure.in: that aclocal.m4 is present in the top-level directory,
configure.in: and that aclocal.m4 was recently regenerated (using aclocal).
解决的办法在configure.in文件中添加AM_INIT_AUTOMAKE宏,用autoheador解决剩下的问题,还不行再次运行aclocal然后就可以用automake -a了。
9.运行./configure
这样也许还是没有Makefile文件
有的时候连我们自己也不知道为什么会是这样的,然后我就把autoheader和autoconf还有automake -a再次运行了一遍,没有任何的问题了。这里是成功的。
问题又来了,make之后
[gaowei@localhost xhttpy]$ make
cd . && /bin/sh /home/gaowei/cuinx/linux/xhttpy/missing --run autoheader
rm -f stamp-h1
touch config.h.in
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make all-am
make[1]: Entering directory `/home/gaowei/cuinx/linux/xhttpy'
gcc -g -O2 -o xiyouhttpd
gcc: 没有输入文件
make[1]: *** [xiyouhttpd] 错误 1
make[1]: Leaving directory `/home/gaowei/cuinx/linux/xhttpy'
make: *** [all] 错误 2
[gaowei@localhost xhttpy]$ ls
等等解决中!
多看书,多实践!
这本书不错http://sources.redhat.com/autobook/autobook/autobook_toc.html#SEC_Contents
准备一天浏览完!下一篇就是这本的内容了!似乎有点难度,就不发表了!
上次,还学到了这么一个命令strip - Discard symbols from object files.今天再次回顾到!

2009年3月15日星期日

Busy life

今天,早上起来上英语的口语课,感觉肚子就有点不舒服,现在还是有点不舒服呢?
上课的人比较少,那个老师也不是很好了!(感觉,汉语也不是很好,光听他发音的话你可能认为他不是个中国人呢?)所以,有些试听的人就一会走了,开始还有有个不错的女生坐到我旁边,但是她听了一节就不想听了走了,是西大的(西北大学)。后来就是11个人了,俩个男生其他是女生了!这次终于是我上的一个班里面女生多了,而且俩个是我们学校而且还认识。
别人的基础应该都比我的好,他们讲的我大部分听不懂,这真的是应该提高了,我想好了,再次减少我的睡眠时间然后提高自己的水平,谁让过去咱睡的多,没有好好的学呢?还有很多的东西要学习!今天讲了A~Z的发音,还有一些文化差异,还有就是夜生活和早上生活的比较,尽管我很想说但是我不知道自己该说什么,我真的不会用英语表达自己,别人说的我也听不懂,真的很丢人了!我一直这样丢人,但是我会改变的,我从来就没有放弃,哪怕我要比别人多倍的努力,我也要去学好它!
回来,又急急忙忙的赶去小组听CU(chinaunix)的讲座,第一个:讲了关于SELinux方面的,感觉他似乎有点紧张讲的一般了,其中涉及到DAC,MAC,RBAC,TE有空应该看看,然后讲了服务器的配置,操作不是很熟练(我想到了自己,尽管我也配置过一些但是比起他,我更是不精通阿!所以以后学习的时候一定要学好一定要熟练,哪怕是敲键盘也要快!)第二个:讲了LVS,我几乎就是密密糊糊的度过的,基本睡着了(现在我坐着绝对可以睡着),关于它的软件ipvsadm piranha, ldirectord..第三个:关于发行版的制作,我会的他没有叫我,我朋友答的我感觉有点问题,他还送了一本书,我最后回答了另一个问题,但是才送我一支笔,现实有时就是这样的。但是让我最关心的是我那个问题,什么呢?对于高手你不要讲皮毛的东西,那是小儿科,讲就要讲的高深,因为你面对的是高手,你就应该深。那个问题是,ubuntu是如何安装的,是如何启动的呢?我只是把表面的工作说了,他似乎感觉就很烦所以就直接给了我一支笔。原来是从内核角度,深层次的考虑!启动,对于一个计算机专业的人来说,具体是什么呢?从找到CPU的中断,到启动自身的bootloader然后加载内核,再到如何装载各种软件到硬盘。这是我今天记忆最深刻的了,比那些奖品要好的多了!第四个:关于网络排错,1.不要急,也不要激动,任何事情一定要问清楚什么情况,在行动,(我似乎犯过这样的毛病)2.要有思路,而且是明确的,解决问题还是这样的好!3.大胆,对自己的判断和分析大胆的实施,但是一定要想好退路和万一之后将如何?和几个公司里面的人聊聊,感觉Linux真的还是有前途的,但是要学好了!看来以后讲座还是少听才对!
好了,这就是我今天的一天了!

2009年3月14日星期六

一本书就这样看完了!

不求甚解!
设置一些X Window系统,配置文件在/etc/X11/xorg.conf文件中。
需转换桌面管理器,命令switchdesk
进入图形界面startx也可以在/etc/inittab中设置
vim 中如果读者取消了不想取消的操作,需要新执行命令,可按Ctrl+R或者:red
man -k 关键字
备份工具cpio
-o 复制出模式 -i复制入模式 -p:把文件从系统上的一个地方复制到另外一个地方
-a 复制文件之后把该文件的访问时间设置为源文件的访问时间
-B block: 把块的大小设置为5120字节,而不是默认的512字节。
-d: 在复制文件时创建需要的目录。 -t: 显示存档文件内容的表格。 -r: 允许使用cpio复制文件时,重新给文件命名。
备份root的文件。#find /root | cpio -o > /tmp/root_backup_1215.cpio
备份/root下所有的.tif文件 #find *.tif | cpio -o > /tmp/back.cpio
从cpio档案中恢复文件。 #cpio -i < back_tif.cpio
#find /root | cpio -o > /dev/st0
#cpio -i < /dev/st0
df 可看磁盘大小等
top 监视系统进程 top -n 10信息更新10次后退出top
free 查看内存 -b|k|-m分别以byte,KB,MB为单位显示内存使用情况
-s delay:显示每隔多少秒显示一次内存使用情况
-t:显示内存总和列 -o:不显示缓冲区调节列
quota显示磁盘使用情况和限制情况 #quota ayh显示用户gyh的磁盘使用情况
网络管理命令ifconfig ping netstat
查看计算机磁盘的分区情况 #fdisk -l
mount -t 文件格式 -o 选项 磁盘分区 挂载点目录名
#mount -t ntfs -o nls=utf8,umask=000 /dev/sda1 /mnt/winC
#mount -t vfat -o iocharset=utf8,umask=000 /dev/hda8 /mnt/winG
自动挂载,在文件/etc/fstab 加上 /dev/hda1 /mnt/winC ntfs umask=000,nls=utf8
/dev/sda5 /mnt/winG vfat umask=000, iocharset=utf8 0 0
#ln -s /mnt/winC/ ~root/Desktop/winC
桌面菜单/usr/share/applications 目录中建立一desktop文件可以用于添加程序。
uniq 命令显示文件中所有不重复的行。
比较文件内容的命令 comm diff
firefox里面的过滤器里面输入about:config可以看到一些配置
mousewheel.withnokey.sysnumlines改为false
mousewheel.withshiftkey.sysnumlines改为1
提速network.http.pipelining改为ture
network.http.proxy.pipelining改为ture
network.http.pipelining.maxrequests改大
提速:firefox的下载,在/usr/bin目录下建立axel.sh
#!/bin/sh
urxvt -e axel -v $1
并且在/usr/share/apps/konqueror/servicemenus/下新建一个文件,命名为axel_download.desktop,内容为
QUOTE:
[Desktop Entry]
Encoding=UTF-8
Actions=axelDownload;
Icon=ServiceTypes=kdedevice/*
[Desktop Action axelDownload]
Exec=axel.sh %U
Icon=kget
Name=Download with axel
Name[zh_CN]=用axel下载
vim也可以用ZZ保存退出
文件相关:w file 保存当前文件内容写到file文件中
:n1,n2w file 将从n1开始n2结束的行写到file文件中
:nw file 将第n行写到file文件中
:1,n2w file将从第1行起到光标当前位置的所有内容写到file文件中
:.,$w file 将从光标当前位置到文件结尾的所有内容写到file文件中
:r file 打开另一个文件file
:e file 建立file
:f file 把当前文件改名为file文件
搜索,替换,删除
:/str/ 搜索到有str的地方光标下移一行
:?str? 搜索到有str的地方光标上移一行
:/str/w file 将包含有str的行写到文件file中
:/str1/,/str2/w file 将从str1开始到str2结束的内容写入file文件中
:s/str1/str2 将第一个str1替换为str2
:s/str1/str2/g 将所有的str1替换为str2
:.,$s/str1/str2/g 将从当前位置到结尾的所有str1替换为str2
文本的复制,移动,删除
:n1,n2 co n3 将从n1到n2行之间的内容复制到第n3行下面
:n1,n2 m n3 将从n1到n2行之间的内容移动到第n3行下面
:d 删除当前行
:nd 删除从当前开始的n行
:n1,n2 d 删除n1行到n2行之间的内容
:.,$d 删除从当前行到结尾的所有内容
:/str1/,/str2/d 删除从str1开始到str2为止的所有内容
执行shell命令:!Cmd 运行shell命令Cmd
:n1,n2 w ! cmd
:r!Cmd
:set autoindent 缩进每一行,使之与前一行相同,通常用于程序的编写
:set noautoindent 取消缩进
:set number 在编辑文件时显示行号
:set nonumber 不显示行号
:set ruler 在屏幕底部显示光标所在的行,列位置
:set noruler 不显示光标所在的行,列位置
quota进行用户空间管理
设置别名alias l='ls -l'
GRUB是 GRand Unified Bootloader的缩写。
可以在/etc/grub.conf文件中内容进行设置,添加参数reDisableded和password可以使用户的系统在启动GRUB时就要求密码验证。为了安全,把这个文件的权限改为chmod 600 /etc/grub.conf而后再使得不可写chattr +i /etc/grub.conf如果要取消则把+变为-就可以了。
在/etc/logina.defs可以设置用户的密码的使用时间的长短和有效期。
在/etc/profile中在HISTSIZE=1000行增加tmout=600就是在这个时间内用户没有任何动作就注销这个帐户。同样也可以在别的用户的.bshrc中添加该值,修改注销时间。
通过添加一行命令到/etc/rc.d/rc.local可以在每次启动后运行,可以阻止用户的系统响应任何从外部或者内部的ping请求,如:echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all
/etc/services 文件制定了/usr/sbin/inetd将要监听的服务
[gaowei@localhost linux-2.6.28]$ grep -v "#" /etc/services显示没有被注释掉的服务
[gaowei@localhost linux-2.6.28]$ ps -eaf|wc -l
180 统计系统当前运行的服务的总数
Linux在启动时要检测脚本文件,这些脚本决定了init进程要启动哪些服务。默认系统是X为启动的,则文件在/etc/rc.d/rc5.d下。要在启动时禁止某个服务,只要把S替换成s就可以了。这三个服务漏洞比较多,S34yppasswddd(NIS服务器) S35ypser(NIS服务器) S60nfs(NFS服务器)
重要的日志文件有utmp,wtmp和lastlog
前俩个文件都是二进制文件,用户需要使用who,w,user,last和ac来查看这俩个文件包含的信息。用touch创建/var/log/pacct然后命令行里面#accton /var/log/pacct就可以启动进程统计了。
有空是应该好好学习iptable命令的。开启iptables用#service iptables start
*****配置各种服务器*****
webmin真的是个很强大的工具。rmp -iq webmin有rmp -qa|grep httpd有
在浏览器中输入http://127.0.0.1:10000就可以进入了
重装Windows系统Linux无法进入
1.进入救援模式,#chroot /mnt/sysimage
2. #grub-install /dev/hda
3. #exit
#sh NVIDIA-Linux-x86-1.0-9639-pkgl.run
可以使得系统自动连接到www.nvidia.com 网站检查驱动程序是否需要更新,如果需要,则会自动进行更新并且安装。
glxgears原来是测试显卡的,三个轮子在转动,不错!
还有这些可以测试[root@localhost ~]# glxinfo |grep rendering
direct rendering: Yes
[root@localhost ~]# glxinfo |grep direct
direct rendering: Yes
要使得系统的mp3可以播放,下载xmms-1.2.10.tar.gz
Linux系统对硬件设备对声卡的支持不好,可以自己下载ALSA(Advanced Linux Sound Architecture,Linux 高级声音体系)驱动程序。四个包alsa-driver-1.0.10.tar.tar also-lib-1.0.10.tar.tar alsa-utils-1.0.10.tar.tar alsa-oss-1.0.10.tar.tar
配置modprobe.conf
用tf可以设置分辨率,xvidtune可以进行微调。
rpm 进行强行安装--nodeps 覆盖原来的安装过的软件--replacefiles --force强制覆盖
tarball是以tar.gz压缩之后的源代码包。
优先下载i686的软件
ext2文件系统,就可能用debugfs命令找回并恢复失去的文件。
一旦文件卸载就运行fsck检查坏块badlocks命令
修复损坏的ext3文件系统。
[root@localhost ~]# e2fsck -fyv /dev/
e2fsck 1.40.2 (12-Jul-2007)
/dev/ is mounted.
WARNING!!! Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.
Do you really want to continue (y/n)? yes
e2fsck: Is a directory while trying to open /dev/
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
[root@localhost ~]# e2fsck -fyv root
yum
1.更换yum仓库 2.使用代理 3.使用fastmirror插接yum -y install yum-fastestmirror
4.使用axelget插件,可以在http://wininlinux.googlepages.com下载。将文件http://winilinux.googlepages.com/axelget.conf放入/etc/yum/pluginconf.d/目录,将http://wininlinux.googlepages.com/axelget.py放入/usr/lib/yum-plugins/即可,按用户的需要修改axelget.conf文件中的值。
文泉驿字体
http://sourceforge.net/project/showfiles.php?group_id=57796
http://sourceforge.net/project/showfiles.php?group_id=33291
Xpdf是一个可以阅读pdf的软件

编译内核

[gaowei@localhost linux-2.6.28]$ ls
arch crypto fs Kbuild Makefile REPORTING-BUGS sound
block Documentation include kernel mm samples usr
COPYING drivers init lib net scripts virt
CREDITS firmware ipc MAINTAINERS README security
[gaowei@localhost linux-2.6.28]$ make mrproper
#这是删除一些一切留下来的.o文件!
接着设置编译选项。
[gaowei@localhost linux-2.6.28]$ make menuconfig将会弹出一个图形的!
这里便是要设置内核的一些功能了!
内核的设置应尽量采用下面的原则:
1.确定内核需要的功能,直接编译进内核。
2.可能在将来会用到的功能,直接编译进内核。
3.不知道要做什么,看HELP,看不懂则采用默认值或者变为模块
4.可以看到内核可选的项目真的很多,真的要好好看看!
选择好了这些你就应该,保存设置了,在15个选项下面有一个是Save Configuration to an Alternate File选项,然后为其命名一个喜欢的文件名,这个文件内容就是刚刚编译完成的数据,然后选择,再保存一次到系统中,接下来准备编译!
之后我的有警告
scripts/kconfig/mconf arch/x86/Kconfig
#
# using defaults found in /boot/config-2.6.23.1-42.fc8
#
/boot/config-2.6.23.1-42.fc8:1437:warning: symbol value 'm' invalid for FIXED_PHY
/boot/config-2.6.23.1-42.fc8:1665:warning: symbol value 'm' invalid for IWL4965
/boot/config-2.6.23.1-42.fc8:1756:warning: symbol value 'm' invalid for ISDN
*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.
[gaowei@localhost linux-2.6.28]$ make clean
1.除掉原来的生成的*.o文件,这样就不会产生新旧版本的误差了。
[gaowei@localhost linux-2.6.28]$ make bzImage
2.制作出内核的文件。
[gaowei@localhost linux-2.6.28]$ make modules
3.制作出模块相关的文件。
4.如果,编译过程中发生问题,通常可能是挑选的项有问题,这样就需要重新挑选设定的内容make munuconfig,之后编译就可以成功了。执行"make bzImage"后,
我的错误是
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
KSYM .tmp_kallsyms1.S
AS .tmp_kallsyms1.o
LD .tmp_vmlinux2
.tmp_vmlinux2: final close failed: No space left on device
make: *** [.tmp_vmlinux2] 错误 1
这样就莫名其妙的好了!
[gaowei@localhost linux-2.6.28]$
Root device is (8, 9)
Setup is 12568 bytes (padded to 12800 bytes).
System is 2109 kB
CRC 47b80fb0
Kernel: arch/x86/boot/bzImage is ready (#1)
[gaowei@localhost linux-2.6.28]$ ll arch/i386/boot/bzImage
lrwxrwxrwx 1 gaowei gaowei 22 03-14 13:01 arch/i386/boot/bzImage -> ../../x86/boot/bzImage内核就已经编译好而且放在上面这个目录下了。
[gaowei@localhost linux-2.6.28]$
5.编译内核的模块部分
[gaowei@localhost linux-2.6.28]$ make modules_install
[gaowei@localhost linux-2.6.28]$ sudo make modules_install
口令:
cp: 无法 stat “/home/gaowei/linux/linux-2.6.28/modules.order”: 没有那个文件或目录
make: *** [_modinst_] 错误 1
[gaowei@localhost linux-2.6.28]$
接下来就是安装内核了!主要分为俩步:
1.将模块安装到/lib/modules/ 'uname -r',现在编译好的镜像还是在你的目录下,所以需要将内核放置在启动内核的默认目录/boot下。
把vmliuz-2.6.23.1复制到/boot/vmlinuz-2.6.23.1 然后把linux/System.map 发到/boot/System.map-2.6.23.1
我的设置如下
sudo cp arch/i386/boot/bzImage /boot/vmliuz-2.6.28
[gaowei@localhost linux-2.6.28]$ sudo cp System.map /boot/System.map-2.6.28
2.进行开机的设定。
修改grub配置文件,/boot/grub/grub.conf文件
添加如下:
title kernel 2.6.28
root (hd0,8)
kernel /boot/vmliuz-2.6.28 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
好了,等待重启而后再看结果!

昨天

昨天,已经成为过去,但是给了我们今天的很多启发!
昨天,我们的网络管理老师讲了一个故事,(我们那个女老师很爱讲故事,尽管有些故事很无聊)但是昨天那个故事,我感觉比较好!
一个老天使,一个小天使,一天来人间访问,第一天晚上他们到一户农民家里住,但是那家农民对他们很不好,让他们住在肮脏的地下室,第二天,老天使把他们家地下室的一个大洞补好了,他们就这样逛了一天,到了晚上到另一个农民家里住,这家的农民对他们很好,给他们做了很多的好吃的,让他们睡在暖和的床上,第三天,他们走的时候!小天使想不明白地问老天使:“太不公平了,你为什么要把他们家的奶牛给杀死呢?”他气愤的说道!
你们猜一猜why?
老天使说:“因为死神昨天晚上来了要他们的家的一个人的命,我用一头奶牛的命换了他的命“
”第一天晚上住的那个地下室里面的那个洞里面有一袋金子,所以我把它补好了!“
里面蕴含着一定的哲学!祸兮福之所倚,福兮祸之所潜!
很多的时候我们看似不好的也许是最好的呢?一切以平常心看待了!
昨天,还把这个故事讲给了一个小女孩听了!或许对她有帮助吧!
今天,http://lang-8.com/
We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.
(If you're the administrator of this website, then please read the log file "production.log" to find out what went wrong.)

2009年3月10日星期二

Linux下的下载工具!

最近,学到几个下载工具!
axle
[gaowei@localhost tool]$ axel -h是个不是很好的工具!感觉没有mytget好用!
Usage: axel [options] url1 [url2] [url...]
Report bugs to lintux@lintux.cx
[gaowei@localhost tool]$
aria2

aria2
is a utility for downloading files. The supported protocols are HTTP(S), FTP, BitTorrent, Metalink. It can download a file from multiple sources/protocols and tries to utilize your maximum download bandwidth.
目前还没有用不知道好坏了!
Prozilla也是一个十分流行的命令行下载工具。
Curl软件也可以了!
顺便下载了一个网络抓包工具
http://www.ethereal.com/download.html
突然想编写一个网络下载工具了,其实过去也想过,但是一直感觉自己的实力不够,其实实力是在不断的实践中得到的,而不能仅仅靠幻想和一味追求完美而不敢前进!
还有就是写一个简单的操作系统,其实,我感觉有时候呆在实验室也不一定是好事,感觉多少有点限制,或许那样只是不适合我而已!感觉,我自己有点好高骛远,要脚踏实地的好好学,想干什么就一定要把它干好!和有就是有什么要说的一定大胆的说出来!

2009年3月9日星期一

多系统安装

太慢了啊!所以写下来这些
今天到实验室,从大概7点到现在,真是麻烦啊!实验室的网络也不是很快了。
下载了Cent OS4.4准备安装,下载了好几个小时,下好,我基本把硬盘安装忘记了,所以就很慢了,记得要把镜像文件放到你的/目录下面哦!否则一般很难找到!
xiyoulinux@xiyoulinux-desktop:~$ cp CentOS-4.4.ServerCD-i386.iso /
cp: 无法创建一般文件 “/CentOS-4.4.ServerCD-i386.iso”: Permission denied
xiyoulinux@xiyoulinux-desktop:~$ sudo cp CentOS-4.4.ServerCD-i386.iso /
[sudo] password for xiyoulinux:
终于好了,cp完了!
尽管是装好了,但是不能够进入ubuntu了,又搞了一个中午,没有想到的是,居然把俩个系统都给破坏了,哎!明天继续把它装,而且没有光驱,就只好等借一个了!
中间遇到过去很多没有遇到过的问题!
注意mv系统文件时候要看好他的属性哦!你把同样的名字的文件放在同样的目录下有时属性不同就会起到不同的作用,那样有时候会破坏性很大的!
见下面的图!



又花了一个中午,还是没有好!
不过学会一种grub的恢复方法,就是用Linux Live CD引导进去,而后
进入grub
输入find /boot/grub/stage1
(hd0,0)
setup (hd0)
reboot
好了!这样就可以恢复了!
scp 主机名@ip地址:/目录 你要下载的目录
有时候,你的系统会安装不上,所以可以在grub里面的kerenl /vmlinuz 的后面添加generic-ide这样 也许会帮你很大的忙呢?今天刚刚学到的!

2009年3月8日星期日

global

最近要阅读源代码所以就找了一些工具,当然要从简单的入手从更加容易学,而且也不用学那>么工具的相关的知识了。
发现这个比较简单(下面的只是讲一些简单的配置及用法)
1.
GNU GLOBAL 提供了几个命令,其中拿來产生网页的命令就是 htags 。要使用此命令,首先
移到你解压的原始代码的根目录(以linux-0.11原始代码为例):
[gaowei@localhost linux-0.11]$ ls
boot GPATH GSYMS HTML init lib mm
fs GRTAGS GTAGS include kernel Makefile tools
[gaowei@localhost linux-0.11]$ pwd
/home/gaowei/Doc/tool/linux-0.11
[gaowei@localhost linux-0.11]$
然后下命令:
$ htags -g -F -f
其中 -g 是代表先执行 gtags 命令,因为必须先执行完 gtags 产生必要的 tag 資料库, htags 才能藉此产生网页。 -F 是代表将书面分成若干等的框架(frame);而 -f 则是代表要有查>詢的功能,此参数加上去 htags 会自动帮你加入表单以及必要的 cgi 程式。最后记得到产生>的 HTML 目录中底下的 cgi-bin 子目录新增 .htaccess :
Options +ExecCGI
AddHandler cgi-script .cgi
好了,比较简单而且好用!
个人感觉这几个可以
[gaowei@localhost HTML]$ firefox mains.html 这个是主函数,也许有几个呢?
[gaowei@localhost HTML]$ firefox files.html 这里可以搜索,也可以直接到某个目录
[gaowei@localhost HTML]$ firefox index.html 是索引,很不错了!
[gaowei@localhost HTML]$ firefox defines.html 一些宏定义

多管闲事之反思!

我对自己一些事情总个总结吧!
今天,看到有人说我多管闲事,也许真的是,但是,我干了很多的事情,有些也不知道是不
是呢?常干的事情,比方说:
1。给那些乞丐一些钱,并且问问他们为什么会这样,每次都让我很感动也不断的激烈自己>要好好的学习,为了自己,为了我的理想!
2。帮助,看似要帮助的人,但是很多人不会相信世界上真的有好人存在,也很怀疑我们这>
样的热心帮助别人的人,但是我依然帮助,尽管他们怀疑我们不怀好意,但是这是我们乐意
干的!帮过送水工扛过水;帮过大一的新生搬过东西;帮助路途中的人把行李放到高的架子
上;似乎有很多就不一一说了!
3。关心过不认识,不知道姓名的人。大一时几乎每天给一个复读的学生发短信,原因只是>她不想学习了,她不想高考了,不想呆在家里了!几乎发了一年,也许你也会认为我不怀好
意(其实我也幻想过,但是真的没有想会有真的回报)最好她考上了上海交大再没有联系。
还有大学时候,把自己不要的东西送人,把自己的课本送人(也许是刚刚认识的),给过别
人试卷(没有见过,今天我也没有见过,也许见过只是我们谁也不认识谁,似乎有些搞笑是
不是呢?
4。放假,帮别人义务服务(3天多),没想到最后还得到30元(没有办法他非要给)。
5。每天叫宿舍的人早起,为了生活情况不好的同学想,只有要赚钱的好事我会想到他们。>经常说我们宿舍的不要打游戏了,好好学习,也许多余。
6。最近,想给一个需要书的人,她竟然不要,具体原因我知道,我也不想知道。
最近,关心一个伤心的人,让她高兴,让她好好学习!
最近,给人装过系统,请人吃过饭。
最近,帮人家宣传自己!
最近,给过去的“同事”送过家乡的特产!
也许是自己善良,也许是自己多管闲事,也许是其他什么?
总之要把握好适度,做最好的自己,听别人说。
好,要经常的反思自己,看有什么不对加以改正!
谢谢!可以指出我的错误的朋友!随时听取别人的建议!
有时候,自己也是这样认为的!

但是,似乎也没有更加好的办法了!

2009年3月3日星期二

Linux0.01分析笔记(4)

[gaowei@localhost ~]$ sh -e
sh-3.2$ exit
exit
[gaowei@localhost ~]$ man sh
-e参数指定“\"不用做转义字符。
当shell启动时,会读取默认的配置文件/profile。
[gaowei@localhost ~]$ \ls这样可以但是[gaowei@localhost ~]$ ls\ls 就bash: lsls: command not found
[gaowei@localhost ~]$ sh \ ls
sh: ls: 没有那个文件或目录
[gaowei@localhost ~]$ sh \
>
[gaowei@localhost ~]$ sh
sh-3.2$ \
>
[gaowei@localhost ~]$ "ls" kernel/
book C kang kernel linux-0.11 man-pages-3.10
当执行shell时,用户键入一个命令,shell首先除去所有的"\"字符之前的字符(如果没有使用-e参数)和所有的引号中的字符。然后,shell按照如下的规则处理"!"引起的shell命令历史代替:
!! 代表前一个执行的命令
! 代表前个执行的命令
! 代表字符串开始的命令
然后,shell会将输入的命令字符串切换成为令牌(token)字符串。在引导中的所有字符串成为一个令牌。空格是隔开各个令牌的分割符。
然后,shell使用如下的规则处理命令行的通配符:
包含通配符(当前设定为*)的令牌被假定成文件名,通配符被扩展成为匹配的文件名(*匹配任何字符)。
shell执行I/O重定向(I/O readirections):
'> word' 重定向标准输出(redirect stdout)
'>> word' 重定向标准输出,添加在指定的文件后
'>& amp;word' 重定向标准输出和标准错误输出(redirects stdout and stderr)
'< word' 重定向标准输入(redirects stdin)

shell处理的文件描述符一般有三个:文件句柄0(stdin,标准输入),文件句柄1(stdout,标准输出),文件句柄2(stderr,标准错误输出)。

dup()系统调用的功能是返回一个新的文件描述符,它指向传入参数文件描述符指向的文件流。dup()使用进程文件分配表中的第一个没有使用的文件句柄复制为新的文件句柄。dup()经常使用的一个功能就是完成标准I/O的重定向。使用dup()进行I/O重定向的代码片段如下:
int fd,pid;
fd = open(path,mode);
if((pid=fork())==0) {
close(0);/*Close stdin.*/
/* Make stdin come from fd.Dup() will reuse the lowest.
*number unused file descriptor,0 in this case.*/

dup(fd);
close(fd); /*No longer needed.*/
execve(...); /*Run command,with input from fd..*/
} else {
/*Parent.Wait for child processes to exit.*/
while(wait(NULL)>0);
}
pipe()函数可以创建一个FIFO流(First In First Out stream,先进先出流)来完成进程间的通信。pipe()系统调用生成俩个文件句柄,一个可以向FIFO流中写入,一个可以从FIFO流中读取。可以通过在父进程中使用pipe()函数来创建管道,然后再生成fork()子进程,每一个生成的子进程中都有父进程调用pipe()函数生成的文件句柄的复制。在子进程中,>可以把父进程中通过pipe()生成的句柄使用dup()函数来重定向子进程的标准输入(stdin),标准输出(stdout)和标准错误输出,这样父进程就可以控制子进程的标准I/O了。
int i,pid,mypipe[2];/*Two fds,for pipe ends.*/
pipe(mypipe); /*Create pipe.*/
/*Create reader.*/
if((pid=fork())==0) {
close(0); /*Close stdin.*/
dup(pipe[0]); /*Stdin comes from pipe.*/
close(pipe[0]); /*No longer needed.*/
close(pipe[1]); /*Not needed.*/
execve(...); /*Run command,with input from pipe.*/
}
/*Create write.*/
if((pid=fork())==0) {
close(1); /*Close stout.*/
dup(pipe[1]); /*stdout goes to pipe.*/
close(pipe[1]); /*No longer needed.*/
close(pipe[0]); /*Not needed.*/
execve(...); /*Run command,with output to pipe.*/
}
/*Parent.*/
close(pipe[0]);
close(pipe[1]);
while(wait(NULL)>0); /*Wait for child processes to exit.*/
一个例子:
[gaowei@localhost 10SHELL编程技术和实例]$ gcc -o dup dup.c
[gaowei@localhost 10SHELL编程技术和实例]$ ls
10 a.out dup dup.c sh1.c sh2 sh2.c
[gaowei@localhost 10SHELL编程技术和实例]$ ./dup
This is to stdout
This is to stderr
[gaowei@localhost 10SHELL编程技术和实例]$ ls
10 a.out dup dup.c err out sh1.c sh2 sh2.c
[gaowei@localhost 10SHELL编程技术和实例]$ cat ./out
This is to stdout
[gaowei@localhost 10SHELL编程技术和实例]$ cat ./err
This is to stderr
[gaowei@localhost 10SHELL编程技术和实例]$ ls -a
. .. 10 .10.swp a.out dup dup.c err out sh1.c sh2 sh2.c
[gaowei@localhost 10SHELL编程技术和实例]$ ls
10 a.out dup dup.c err out sh1.c sh2 sh2.c
[gaowei@localhost 10SHELL编程技术和实例]$
一个成熟的shell应该支持管道操作总体结构如下:
(cmd1 | cmd2) /* cmd1的标准输出为cmd2的标准输入 */
pipe[fdarr]; /*定义管道 */
if((pid1 = fork()) == 0) {
close(1); /*关闭cmd1的stdout */
dup(fdarr[1]); /* 设置fdarr[1]为cmd1的stdout */
close(fdarr[0]);

aptr[0]="cmd1"; aptr[1]=NULL;
execve("cmd1",aptr,eptr);
}
if((pid2=fork()) ==0) {
close(0); /*关闭cmd2的stdin */
dup(fdarr[0]); /*设置fdarr[0]为cmd2的stdin */
close(fdarr[0]);
close(fdarr[1]);

aptr[0]="cmd2";aptr[1]=NULL;
execve("cmd2",aptr,eptr);
}
close(fdarr[0]);
close(fdarr[1]);
wait() for both pid1 and pid2;
shell程序的主程序组成如下:
#include "def.h"
main(void)
{
int i;
initcold();
for(;;) {
initwarm();
if(getline())
if(i=parse())
execute(i);
}
}

第十一章
分析Linux0.01中实现系统调用的俩个文件system_call.s和sys.c来展示Linux0.01的系统调用的实现方式。标准的C语言库函数,在不同的操作系统上有不同的内部实现。
应用程序可以通过一个固定的过程,从而调用内核提供的功能,在Intel体系结构的计算机中,这是通过执行中断0x80h实现的。
应用程序通常是一个进程,进程在调用内核时,跳转到内核代码中的位置一般标记为system_call(在Linux0.01中,system_call是汇编程序system_call.s中的一段代码的入口点的标记)。在system_call位置的代码将检查系统调用号,依据系统调用号告诉系统内核进程请求的系统服务是什么。然后,它再查找系统调用表sys_call_table[],找到希望调用的内核函数的地址,并调用此函数,最后将控制权返回应用程序。编写一个自己的函数,然后改变sys_call_table[]中的指针并指向该函数。
Linux用于实现系统调用异常的实际指令是:int $0x80
定义系统调用的预定义宏为: _syscallN(parameters)
在include/unistd.h中可以找到_syscallN(parameters)还有__NR_name的形式定义了66个常数,这些常数就是系统调用函数name的函数指针在系统的调用表中的偏移量。
系统调用表是一张表格,按照顺序定义了系统中所有的系统调用的入口函数地址。在Linux0.01中,系统调用表定义在include/linux/sys.h中,如下所示:
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp,sys_setsid};
在数组sys_call_table[]中的每一个元素都是一个函数指针(在C语言中,函数名代表指向函数入口的指针),按系统调用号(即前面提到的_NR_name)排列了所有系统调用函数的指针,以供系统调用入口函数查找。从这张表可以看出,Linux给它所支持的系统调用函数取名叫sys_name。
系统调用入口函数定义在/linux/kernel/system_call.s文件中。是使用汇编语言书写的,包含了系统调用的主要处理程序,同时也包含了时钟中断处理程序,硬盘中断处理程序也包含在本文件中。
从system_call入口的汇编程序的主要功能是:
检查是否为合法的系统调用。
保存寄存器的当前值。
根据系统调用表_sys_call_table和EAX寄存器持有的系统调用号找出并转入系统调用响应函数。从该响应函数返回后,让EAX寄存器保存函数返回值,跳转至ret_from_sys_call,>当ret_from_sys_call结束后,将执行进程调度。
在执行位于用户程序中系统调用命令后面余下的指令之前,若INT 0x80h的返回值非负,则直接按类型type返回;否则,将INT 0x80h的返回值取绝对值,保留在errno变量中,返回-

第十二章
关于这一章我记录的比较少
尽管在Linux0.01中没有写网络的部分,但是现在是个网络的时代,这本书中也讲了关于网络的部分,而且我又是学习网络的,所以就在写一写了。
Linux是一个网络操作系统。
TCP/IP协议是一套数据通信协议,其名字是由这些协议中的俩个主要的协议组成的,即传输控制协议(Transmission Control Protocol,TCP)和网间协议(Internet Protocol,IP)。

Linux0.01分析笔记(3)

第七章
在Linux0.01内核中的include/linux/sched.h文件中,定义了进程的不同状态,
#define TASK_RUNNING 0 表示进程在"Ready List"中,这个进程除了CPU以外
,获得了所有的其他资源
#define TASK_INTERRUPTIBLE 1 进程在睡眠中,正在等待一个信号或者一个资源
#define TASK_UNINTERRUPTIBLE 2 进程等待一个资源,当前进程在“Wait Queue“
#define TASK_ZOMBIE 3 僵尸进程(没有父进程的子进程)
#define TASK_STOPPED 4 标识进程在被调试
进程控制表中的每一项都是一个task_struct结构,而task_struct结构中存储各种低级和高级的信息,包括从一些硬件设备的寄存器复制到进程的工作目录的链接点。
进程控制表既是一个数组,又是一个双向链表,同时又是一个树。其实现是一个包括多个指针的静态数组。此数组的长度NR_TASKS
#define NR_TASKS 64
#define HZ 100
数组中的结构则保存在系统预留的内存页中,定义如下:
#define FIRST_TASK task[0]
#define LAST_TASK task[NR_TASKS-1]
系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的全局指针变量current用来记录正在运行的进程。变量current只能由kernel/sched.c中的进程调度改变。
内核线程在Linux2.0.0的核心中就可以被看到,例如在linux-2.0.1\linux\arch\alpha\kernel\entry.S中的代码。Linux系统使用系统调用fork()来创建一个进程,用exit()来结束一个进程。fork()和exit()的源程序保存在kernel/fork.c和kernel/exit.c中。fork()主要任务是初始化要创建进程的数据结构,其主要的步骤有:
(1)申请一个空闲的页面来保存task_struct。
(2)查找一个空的进程槽(find_empty_process())。
(3)为kernel_stack_page申请另一个空闲的内存页作为堆栈。
(4)将父进程的LDT表复制给子进程。
(5)复制父进程的内存映射信息。
(6)管理文件描述符和链接点。使用fork()创建一个进程后,程序的俩个复制都在运行。通常一个复制使用exec()调用系统的应用程序。
进程的调度(schedule()函数)
用户级线程(User-level threads) 是由与应用程序链接的线程库实现。核心不知道线程的
存在,也就不能独立调度这些线程了。
多任务系统可以划分为单处理器多任务系统和多处理器任务系统。
Linux0.01的核心进程源代码主要包括sched.c,fork.c,kill.c等。
sched.c是Linux的主要核心文件,它实现了Linux的进程调度功能,包括实现进程的各种状
态:睡眠(sleep_on),唤醒(wakeup),调度(schedule)等。
fork.c包含了实现系统调用fork()的辅助功能函数。
kill.c主要实现了系统调用kill(),kill()的作用主要是杀死一个进程。
system_call.s包含了系统的低级处理函数,主要都是一些汇编处理程序。

第八章
设备管理系统通常是设备驱动程序和操作系统的其余部分和应用程序的唯一接口。
设备管理系统需要实现如下的功能:
(1)隔离设备驱动程序和操作系统核心。
(2)隔离硬件和用户程序。
一般操作系统的设备管理程序具有如下特性:
(1)异步I/O(Asynchronous I/O)
(2)即插即用(Plug and Play)
在Unix下可以使用read()和write()来读和写设备,用ioctl()来对设备进行设置;而在Windows使用ReadFile()和WrintFile()来读和写设备,用DeviceIoControl()来对设备进行设置。
在Linux系统中俩种典型的情况:读RAMDISK和读IDE设备。
对于read请求,如果read一个RAMDISK,典型的过程如下:
(1)从RAMDISK内存空间复制内存到用户空间(user space)。
(2)结束调用,返回用户空间。
一个IDE驱动程序,典型的read处理过程如下:
(1)接受一个read请求,然后把这个请求放到I/O队列中。
(2)如果I/O队列为空,将这个读写磁盘扇区的请求发送到磁盘驱动器。
(3)将调用read系统调用的进程切换为SLEEP状态。
(4)当磁盘驱动器完成磁盘扇区读操作后,会发出一个中断。IDE驱动程序接收到这个中断后,把读出的数据从磁盘控制器传送到核心的buffer中,然后把数据复制到用户空间,接下来唤醒调用进程。
(5)当调用浚进程被唤醒时,系统的控制权回到用户空间的用户进程。
CPU的内部中断又可以叫异常,异常的主要作用是报告一些程序运行中的错误和处理缺页中断(page_fault)。这些异常都是通过set_trap_gate宏来设置的。set_trap_gate宏是定义在include/asm/system.h文件中的一个宏,被用来设置CPU的trap,起定义如下:
#define set_trap_gate(n,addr) \
_set_gate(&idt[n],15,0,addr)
在Linux0.01中,中断处理主要做了俩个部分的工作:
(1)trap.s将各个CPU的trap信息填入到idt中;
(2)asm.s处理当出现trap的时候后续的一系列处理。
在Linux0.01中处理的外部中断有时钟中断(0x20),串行通信口中断(0x23和0x24),硬盘中断(0x2e),键盘中断(0x21),这些中断具体的处理函数在文件rs_io.s,hd.c和keyboard.s中。
如果多个设备共享一个中断,那么每当一个设备产生一个中断时,CPU会执行所有的isr中断服务程序。具体的一个完整的中断产生和处理流程是:
(1)产生中断
(2)CPU应答
(3)查找idt中的对应向量
(4)在gdt中查找idt项的代码段
(5)对比当前的cpl和描述符的dpl看是否产生越级保护
(6)检查是否发生特权级的变化,如果是就保存ss和esp,否则不保存
(7)保存eflags,cs,eip和错误码
(8)将idt对应描述地址装入cs和eip中以便执行
(9)执行irp_interup
(10)执行do_irp
(11)循环执行isr
(12)中断返回。
trap.c处理了硬件中断和运行中可能产生的错误。
asm.s包含了处理低级硬件错误的代码,asm.s也使用TS位来处理协处理器错误。
ISR(Interrupt Service Routine,ISR),中断处理程序。
x86体系结构是一个中断驱动的系统,外部发生的事件总是通过中断服务程序来进行处理。
在x86体系结构中,中断处理程序的入口地址是保留在系统的IDT(Interrupt Descriptor Table,中断描述表)中的。
中断处理程序和普通程序的区别是:中断处理程序必须非常简单,而且需要处理CPU的状态
。ISR在结束时,都必须调用"Interrupt Return(IRET)",而普通应用程序在结束时调用的是"Return (RET)"或者"Far Return(RETF)"。
BIOS数据区提供了大量的硬件设备信息,通过读取BIOS的数据,可以方便地了解计算机的硬件设备情况。
在IMB AT和IBMPS/2键盘系统中,CPU并不直接和键盘进行通信,而是通过一个8042芯片或者其他与之兼容的芯片。键盘本身也有自己的芯片(Intel8084及其兼容芯片)。
console.c主要实现了控制台功能,包含con_init()和con_write()函数。
serial.c实现了rs232串口通信功能,主要函数是:rs_write(),rs_init()以及相关的中断功能。

第九章
Linux系统继承了Unix中"everything is a file"的思想,使用文件系统接口,从而可以控
制Linux系统中的所有设备。通过引入VFS(Virtual File System)的概念,可以使Linux文件系统的主要部分和具体的物理文件系统类型无关。
对硬盘进行访问的基础是对硬盘的磁盘扇区进行寻址。通常,对于硬盘的寻址使用CHS(Cylinder/Head/Sector)参数。CHS就是使用柱面数(Cylinders),磁头数(Heads),和扇区数(Sectors per track)来定位硬盘驱动器任何一个扇区的方法。
Cylinders表示硬盘每一面盘片上有几条磁道,最大为1024(用10个二进制位存储).
Heads表示硬盘总共有几个磁头,也就是有几面磁片,最大为256(用8个二进制位存储)。
Sectors per track表示每一条磁道上有几个扇区,最大为63(用6个二进制位存储)。
每一个扇区一般是512B所以磁盘最大容量为
256*1024*63*512/1048576=8064GB (1M=1048576B)
BIOS INT 13h调用是BIOS提供的磁盘基本输入输出中断调用,它可以完成磁盘(包括硬盘和软盘)的复位,读写,校验,定位,诊断,格式化等功能。它使用的就是CHS寻址方式,因此最大能访问8GB左右的硬盘。
典型的扇区存放形式:
扇区在磁道上连续存放;带磁盘内部Cache的现代磁盘。
Unix文件系统结构
Boot block |Super block |Inode table...........|Data block zone
引导块(Boot block)通常位于文件卷最开始的第一扇区,这512B是文件系统的引导代码,为根文件系统所特有,其他文件系统中这512B为空。
超级块(Sper block)紧跟引导块之后,用于描述文件系统的结构,如i节点长度,文件系统大小等信息。
i节点表(Inode table)存放在超级块之后,其长度由超级块中i节点长度字段决定,起作用是用来描述文件的属性,长度,属主,属组,数据块表等信息。
数据区(Data block zone)跟在i节点表后面,用于存放文件的数据。
在Unix系统中,一个普通的文件通常由俩部分组成:i节点+数据块
用fsck可以修正文件系统的不一致。
fsck - check and repair a Linux file system
日志文件系统(Log-Structured File System)的设计思想是跟踪文件系统的变化而不是文件系统的内容,所有对文件系统的更新都被记录在日志中。
Linux文件系统其实可以分为三个部分,第一部分叫VFS。这是Linux文件系统对外的接口,
任何要使用文件系统的程序都必须经由这层接口来使用它。另外俩部分属于文件系统的内部,其中一个是Cache,另一个就是真正最底层的文件系统,像Ext2,FAT之类的。
在文件系统里的每一个文件,系统都给它一个inode,只要inode不一样,就表示这俩个文件不相同,inode是由VFS定义的。
一个硬盘最多可以有8个分区(partition),其中4个是主分区(Primary partition),另4个则是扩展分区(extended partition)。除了分区,硬盘第一个扇区称为MBR(Master Boot Record,主启动录)。
文件系统的一些过程:
创建一个文件,其步骤如下:
(1)分配和初始化inode
(2)将inode和文件名的对应关系写入到文件目录表项中(通常在当前的工作目录)
(3)将上述数据写入磁盘。
修改一个磁盘文件,起步骤如下:
(1)将此文件的inode装载到内存中
(2)分配空闲的磁盘块(将这些磁盘块在freelist中标记为已经分配)
(3)修改这个文件的inode,指向这个新分配的磁盘块
(4)将用户的数据写入这个磁盘块
(5)将这个文件所有的修改都写入磁盘。
删除一个磁盘文件,其步骤如下:
(1)将此文件的inode装载到内存中。
(2)依据inode数据查找到将要删除的数据所在的磁盘块
(3)标记这个磁盘块为空闲
(4)将这个文件所有的修改都写入磁盘。
在系统启动时,只执行一次的函数sys_setup读取所有的IDE硬盘上的分区表。在kernel/hd.c源程序中包含对各种IDE接口的驱动代码。此外rw_hd()函数完成了从各种IDE设备上读取
和写入数据块的功能。
在Linux0.01的文件系统中hd.c()代码演示了从IDE设备上读取和写入数据块,而fs/block_dev.c中包含了对块设备文件系统的具体支持。
kernel/hd.c处理IDE中断和数据块写入,读出队列
fs/block_dev.c使用hd.c中提供的功能,例如:block_write()来向硬件驱动器中写入或者读出数据
fs/read_write.c中包含了sys_read(),sys_write(),and sys_lseek()的代码。
super.c文件中包含了Linux0.01的文件系统处理超级块表(super-block tables)的功能。
read_write.c文件包含了Linux0.01文件系统中对字符设备和块设备的读操作和写操作的实现过程。
open.c包含了Linux0.01中打开文件的操作过程。
inode.c包含了Linux0.01中对文件系统inode表的维护过程。
buffer.c实现了文件系统中的缓冲功能。
bitmap.c包含了处理文件系统中inode和文件系统中位图的功能。

Linux0.01分析笔记(2)

第四章
在过去写过了,所以就不在重复了!请看

第五章
格式化的作用是在磁盘上划分不同的区域来存储不同的数据。
磁盘经过格式化后主要包括的区域有:主引导记录区(只有硬盘有),引导记录区,文件分配表(FAT),目录区和数据区。
1988年,国际标准化组织(International Standards Organization,ISO)公布了CD-ROM文
件结构标准,这个标准被称之为ISO 9660。
CD-ROM盘上可以存放信息的区域称为卷空间(volume space).卷空间分成俩个区:从LSN0~LSN16称为系统区,它的具体内容没有规定;从LSN16开始到最后一个逻辑扇区称为数据区,它用来记录卷描述符(volume descriptors),文件目录,路径表,文件数据等内容。
可启动CD-ROM的工作原理:BIOS首先检查光盘的第17个扇区(sector 17),查找其中的代码,若发现其中的启动记录卷描述表(Boot Record Volume Descripter),就根据表中的地址继续查找启动目录(Booting Catalog),找到启动目录后,再根据其中描述的启动入口(Boot Entry)找到相应的启动磁盘镜像(Bootable Disk Image)或启动引导文件,找到启动磁盘镜像后,读取其中的数据,并执行相应的开机动作。相对于单重启动CD-ROM而言,多数启动CD-ROM的启动目录中包含多个启动入口,指向多个启动磁盘镜像。《Bootable CD-ROM Format Specification》
下面是在LA32架构的系统引导过程。
1.硬盘启动步骤
PC机启动过程是遵循一定顺序的,过程如下:
(1)机器加电
(2)BIOS加电自检(Power On Self Test - POST)。BIOS在内存中的起始地址为0FFFF:0000,
BIOS的加电自检就是从地址0FFFF:0000开始执行。BIOS加电自检的主要工作包括:CPU,内存及硬盘等关键设备的检测,即插即用设备的检测。完成这些检查后,将依据结果更新ESCD(Extended System Configuration Data,扩展系统配置数据).
(3)计算机将硬盘0柱面0磁头1扇区(主引导区MBR)中的512B读入内存0000:7C00处并跳到0000:7C00处执行;在读取过程中,计算机并不检查该扇区的内容是什么。
(4)检查(WORD)0000:7DEE是否等于0xAA55,若不等于则转去其他启动介质,如果没有其他启动介质则显示“No ROM BASIC“,然后死机。
(5)跳转到0000:7C00处执行MBR中的程序。
(6)MBR首先将自己复制到0000:0600处,然后继续执行。
(7)MBR在主分区表中搜索标志活动的分区,如果发现没有活动分区或有不止一个活动分区,则停止。
(8)将活动分区的第一个扇区读入内存地址0000:7C00处。
(9)检查(WORD)0000:7DFE是否等于0xAA55,若不等于则显示"Missing Operationing System"然后停止,或者尝试软盘启动。
(10)跳转到0000:7C00处继续执行特定系统的启动程序。
(11)启动系统。
而软盘启动而(1)(2)(3)(4)(5)同上(6)是启动系统。
硬盘主引导扇区基本结构
主引导扇区是硬盘的第一个扇区,它由主引导记录(MBR,Master Boot Record),硬盘分区表
(DPT,Disk Partiton Table)和引导扇区标识(Boot Record ID)三部分组成。
硬盘的一个扇区是512B。主引导记录占用主引导扇区的前446B(字节编号是0~0x1BD)存放系统主引导程序(它负责从活动分区中转载并运行操作系统引导程序)。
硬盘分区表占64B(字节编号0x1BE~0x1FD),记录了磁盘的基本分区信息。硬盘分区表分为4个分区项,每一项16B,分别记录了每个主分区的信息(一个硬盘因此最多可以有4个主分区)。
引导扇区标识占用俩个字节(字节序号是从0x1FE~0x1FF)。对于合法引导区,这个标识为0xAA55。这通常计算机判断引导扇区是否合法的标志。
主引导记录中包含了硬盘的一系列参数和一段引导程序。引导程序主要是用来在系统硬件自
检完后引导具有激活标志分区上的操作系统,它最后执行的指令是一条JMP指令,这条指令使计算机可以跳转执行操作系统本身的引导程序。
DOS命令fdisk /mbr可以修复这段程序。
在Linux系统中可以执行如下的命令来恢复MBR:
dd if=/dev/hda of=/boot/boot.NNNN bs=446 count=1 #备份MBR
dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1 #恢复MBR
硬盘主引导扇区的应用
1.清除硬盘引导功能
2.加密整个磁盘
3.加密单个硬盘分区
4.加入硬盘启动口令识别
5.先于DOS驻留内存程序
6.实现同一硬盘多个操作系统的选择启动
7.实现硬盘主引导扇区或DOS引导扇区的自我修复
Linux0.01的引导部分主要包括俩个源文件:boot.s和head.s。boot.s是计算机上电启动时,由BIOS执行的系统引导代码。head.s是Linux的32位引导代码,在其中将调用main(),最后完成操作系统的引导。
1.boot.s:BIOS引导代码
在计算机加电时,boot.s被BIOS的引导程序加载到地址0x7C00处,然后boot.s将自己移动>到地址0x90000处,然后跳转到地址0x90000处开始执行。然后,boot.s使用BIOS中断功能,加载系统核心到地址0x10000处。接下来,boot.s禁止所有中断,移动系统核心到地址0x0000处,切换处理器到保护模式,然后调用系统的开始程序。系统核心开始运行后,将重新设置保护模式,然后打开需要的中断。
2.head.s:Linux的32位引导代码
这段代码被加载到地址0x00000000处开始运行。地址0x00000000也是系统页表的地址,当系统完成引导后,这段地址将被系统页表重新覆盖使用。
gcc -c my_kernel.c
"-c"开关告诉GCC只是编译成为一个目标文件而不是链接。然后,可以使用如下的命令链接核心,并且设定核心转载的地址为0x100000:
ld my_kernel.o -o kernel.bin -oformat binary -Ttext 0x100000
用“-oformat binary"开关来运行ld告诉链接器输出文件是plain的,没有重定向,没有头信息,只是一个glat的二进制镜像。
“-Ttext 0x100000"告诉链接器用户想要的"text"(代码段)地址在0x100000的内存标记处。
引导代码必须遵循如下的规则:
(1)BIOS会把引导程序装载到固定地址07C00h。因此,引导程序的段地址和飘移地址是固定的。
(2)引导代码必须编译成为plain binary file类型。
(3)plain binary file的尺寸必须是512B(512B是一个扇区的大小)
(4)文件必须以0xAA55h标志结果。
"times 510-($-$$)db 0"代码是一句只有nasm能够理解的代码。
“二次转载”是指:由BIOS从磁盘上装入引导扇区(0头0磁道1扇区)到内存地址07C0:0000,>并跳转到该地址执行;再由从07C0:0000地址开始的引导代码把存放在其他扇区中的程序转
入内存,并跳转到该程序中执行。

第六章
连续分配存储管理方式分为:单一连续分配,固定分区分配和动态分区分配。
虚存提供的功能:扩大地址空间,内存保护,内存映射,公平分配内存,虚存共享。
Inter-Process Communication,IPC 进程间的通信机制
虚拟存储器基本特征是:虚拟扩充,部分装入,离散分配,多次对换。
虚存中的置换算法:先进先出算法(FIFO),最佳置换算法(OPT),最近最少使用置换算法(LRU),最近未使用置换算法(NUR)。
非连续存储管理机制中主要包括:页式管理,段式管理和段页式管理。
任何一个物理地址都可以映射为:段地址+段内偏移。
操作系统必须知道系统物理内存的容量,才能够有效地使用和管理这些物理内存。在CPU处于实模式时,CPU可以访问的物理内存最大只能达到1MB+64KB(在A20 Gate被打开的情况下,否则最大只能访问1MB)。因此,在实模式下通常无法直接通过内存访问来获取内存容量。
可以通过BIOS的15h中断从计算机的CMOS中读取计算机的物理内存的大小,并把这个数据保留在操作系统核心中。BIOS INT15h中断提供了三个子中断来获得系统的物理内存大小,分别是88和E801h和E820h。
malloc()函数作用是从一大块内存中分配出所需要的空间。在分配时需要注意,要留出一部分malloc()不能分配的内核空间(为了便于存储保护,内核地址空间和用户地址空间是相互隔开的)以备内核使用。
内核malloc()函数已经具备了存储分配功能,但是还不具备虚拟存储功能,通过缺页处理来实现虚拟存储管理。
可执行文件的头信息格式有许多标准,例如:coff,elf和pe格式等。
在malloc()函数实现中使用了首次适配方法来进行存储分配。当使用free()函数释放内存时,会对相邻的存储空间进行合并。
page.s是一段汇编语言程序,提供了Linux0.01中缺页异常处理功能。page.s仅仅提供了和
硬件存储管理器的接口功能,大部分功能代码在memory.c文件中。

Linux0.01分析笔记(1)

我是对我读的那本书作的笔记,以后会添加自己的分析。
第一章
我过去也看过这本书,但是很多没有理解,有很多忘记了,故今天又重新看,而且把笔记写下!
GUN的主要精神是软件源代码应该自由流通!
GUN是GUN‘s Not Unix的缩写,是由自由软件基金会(Free Software Foundation,FSF)的董事长Richard M.Stallman(RMS)于1984年发起的。GUN制定了GPL(The General Public License,GUN通用公共准许证)
自由软件的自由包括:使用的自由(可以不受任何限制来使用软件),研究的自由(可以研究软件运作方式并使其合适个人需要),散布的自由(可以自由地复制此软件散布给他人),改良的自由(可以自行改良软件并散布改良后的版本以使全体用户受益)。
1991年8月,一位来自芬兰赫尔辛基大学的年轻人Linus Benedict Torvalds,对外发布了一套全新的操作系统Linux
黑客是指计算机技术上的行家或热衷于解决问题,克服限制的人。黑客乐意解决和发现新问题,并乐意相互帮助。他们相信计算机中充满各种各样有趣的问题,并且这些问题一旦被自己解决,他们愿意让解决方法被所有人共享。他们感觉发现问题,解决问题,共享答案的过程是有趣的,并着迷地去做。他们将解决问题视为乐趣,相信技术应该是自由的,应该被所有人共享。黑客是对拥有高科技和崇高理念的孜孜不倦的计算机爱好者,工作者的尊称。

第二章
现代操作系统都具有:并发,共享,虚拟,异步的特性,同时还具有:存储器管理,处理器管理,设备管理,文件管理,用户接口。
Run_Time Library,RTL,运行时函数库。
Bochs是一个x86 PC的模拟器。
Wine/DOSEmu是先把把原有系统的应用软件通过他们把原操作系统API,那些软件,再经过模拟操作系统的API,成为模拟操作系统应用软件。
软件的美在于它的功能,在于它的内部结构。对用户来说,通过直观,简单的界面呈现出具有恰当特性的程序就是美。对于软件设计者来说,被简单,直观地分割,并具有最小内部耦合的软件结构就是美!

第三章
DJGPP是DOS下的自由源代码的保护模式C语言编译器。
还有RHIDE是DJGPP的图形界面。

学make和ld还有nasm

Dos下一个汇编程序
;---------------------------------------------------------------------
.model small
.stack 100h
.data
Welcome db 13,10,'Hell,world!',13,10,'$'

.code
start:
mov ax,@data
mov ds,ax
lea dx,welcome
mov ah,9
int 21h

; end the program
mov ah,4ch
int 21h
end start
;--------------------------------------------------------------------
用masm hello.asm
link hello.obj就可以了。
Linux下和它下面一样功能的程序
section .text
global main
main:
mov eax,4 ;4号调用
mov ebx,1 ;ebx送1表示stdout
mov ecx,msg ;字符串的首地址送入ecx
mov edx,14 ;字符串的长度送入edx
int 80h ;输出字串
mov eax,1 ;1号调用
int 80h ;结束
msg:
db"Hello World!",0ah,0dh
用下面的命令就可以了!
[gaowei@localhost nasm]$ nasm -f elf hello.asm
[gaowei@localhost nasm]$ ls
hello.asm hello.o
[gaowei@localhost nasm]$ gcc -o hello hello.o
[gaowei@localhost nasm]$ ls
hello hello.asm hello.o
[gaowei@localhost nasm]$ ./hello
Hello World!
为了辨别CPU的类型,需要使用CPUID汇编指令(CPUID是一个特殊的汇编指令,其机器0FHA2H。如果编译器不支持CPUID指令,可以直接输入CPUID的机器码)。该指令可以被以下CPU识别:Intel 486以上的CPU。Cyrix M1以上的CPU。AMD Am468以上的CPU。
1.判断CPU的厂商
通过CPUID汇编指令,返回CPU OEM字符串,从而判断CPU厂商,规则如下:
先让EAX=0,再调用CPUID。
Inel的CPU将返回:
EBX:756E6547H 'Genu'
EDX:49656E69H 'ineI'
ECX:6C65746EH 'ntel'
EBX,EDX,ECX连接起来是"GenuineIntel",含义为真正的Intel。
Cyrix的CPU将返回:
ENX:43797269H
EDX:78496E73H
ECX:74656164H
"CyrixInstead","Cyrix来代替"
AMD的CPU将返回:
EBX:41757468H
EDX:656E7469H
ECX:63414D44H
"AuthenticAMD",可信的AMD。
2.判断CPU类型
先让EAX=1,再调用CPUID,EAX的8~11位就表明CPU类型。例如:
3-368
4-468
5-Pentium
6-Pentium Pro Pentium II
2-Dual Processors
EDX的第0位:代表有无FPU。
EDX的第23位:CPU是否支持IA MMX,这点很重要,如果想用57条新增的指令,要先检查这一
位,否则Windows就会出现“该程序执行了非法指令,将被关闭”。
3.专门检测是否P6架构
先让EAX=1,再调用CPUID,如果AL=1,就是Pentium Pro或Pentium II。
4.专门检测AMD的CPU信息
先让EAX=80000001H,在调用CPUID,如果EAX=51H,就是AMD K5;如果EAX=66H,则是K6。
EDX第0位:是否有FPU。
EDX第23位:CPU是否支持MMX。
在PC中,彩色显示器的字符屏幕显存起始地址在0xB8000000处,单色显示器的视频缓冲区起
始地址在0xB8000000处。

time