2009年3月14日星期六

编译内核

[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)。

time