‘壹’ 怎么用gdb和bochs调试内核
gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对linux 0.11内核进行C语言级的调试。当然,Linux 0.11内核也需要进行使用-g选项重新编译。
14.13.1 编译带gdbstub的Bochs系统{.j,
Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-2.2.tar.gz):U
使用tar对软件包解压后会在当前目录中生成一个bochs-2.2子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stubI0B%
checking build system type... i686-pc-linux-gnu7.tY.
checking host system type... i686-pc-linux-gnuQ
checking target system type... i686-pc-linux-gnu{
...©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。M
[root@plinux bochs-2.2]# makeQ
[root@plinux bochs-2.2]# make installN?
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。ufVz
若在运行./configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。>1z<z
14.13.2 编译带调试信息的Linux 0.11内核"jmg
通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 0.11系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的0.11内核模块来调试。这两种环境下都需要对0.11内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:2
LDFLAGS = -M -x // 去掉 -s 标志。XJFU)Y
CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 标志。iMN
进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:_6
[root@plinux linux-0.11]# find ./ -name MakefileSn^
./fs/Makefile-
./kernel/Makefile/"`p%
./kernel/chr_drv/Makefile(pyM
./kernel/math/MakefileV
./kernel/blk_drv/Makefiles/CDu
./lib/Makefile[x~
./Makefile980
./mm/Makefile/zb
[root@plinux linux-0.11]#S9/Q
另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsect.s文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。pP
Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system system.tmp=-&a
strip system.tmphQ6n0S
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)
rm -f system.tmpY3w[/@
sync9=P2n
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。KuEo
当然,我们也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000来处理这种情况。a?g4
14.13.3 调试方法和步骤;M]3!
下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 0.11系统上编译出的内核代码分别来说明调试方法和步骤。
1 调试现代Linux系统上编译出的Linux 0.11内核?E
假设我们的Linux 0.11内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:
使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解开这个软件包后,可以看到其中包含以下几个文件和目录:MX{-
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。X
[root@plinux linux-gdb-rh9]# ll'*5tfq
total 1600bJT~Q
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrcf%J2s
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-0.11-for-orig8EIChk
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f
这里的bochs配置文件与其他Linux 0.11配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:NhL
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6
运行这个实验的基本步骤如下:@EkQ
(1).启动X window系统后打开两个终端窗口;(mPN
(2).在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“./run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);1P=VI<
(3).在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;iDqm8
(4).在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;p
(5).在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/main.c的main()函数处。v3L2
下面是运行gdb和在其中执行的一些命令示例。[2;jS
[root@plinux linux]# gdb tools/system hI/
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)!mC}
Copyright 2003 Free Software Foundation, Inc.|3
GDB is free software, covered by the GNU General Public License, and you areC$NY4
welcome to change it and/or distribute copies of it under certain conditions.boNdAL
Type "show ing" to see the conditions.3[nfHW
There is absolutely no warranty for GDB. Type "show warranty" for details.'1-V
This GDB was configured as "i386-redhat-linux-gnu"...Oq&*[
(gdb) break main }<;
Breakpoint 1 at 0x6621: file init/main.c, line 110.+%!.]{
(gdb) target remote localhost:12342 .yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481(
481 namei.c: No such file or directory.5QU
in namei.c&%P'
(gdb) cont Pv'/S$
Continuing.P:O_{
Breakpoint 1, main () at init/main.c:110 *
110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD
(gdb) list 5XT
105 { /* The startup routine assumes (well, ...) this */2L$
106 /*_c
107 * Interrupts are still disabled. Do necessary setups, then)Z0k
108 * enable themjZ@+wn
109 */u
110 ROOT_DEV = ORIG_ROOT_DEV;d&!*`
111 drive_info = DRIVE_INFO;#yRW,
112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw
113 memory_end &= 0xfffff000;`v8fAR
114 if (memory_end > 16*1024*1024)lA#
(gdb) next DH.zM
111 drive_info = DRIVE_INFO;X
(gdb) next ?+S:q
112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt
(gdb) print /x ROOT_DEV <W<
$3 = 0x21d }{%Q
(gdb) quit |
The program is running. Exit anyway? (y or n) yt
[root@plinux linux]#lixBs
=====================================================
14.1 利用bochs调试内核%UU
Bochs具有非常强大的操作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面14.2节,这里基于Linux 0.11内核来说明Windows环境下Bochs系统调试操作的基本方法。m[2
14.1.1 运行Bochs调试程序.g8O
我们假设Bochs系统已被安装在目录“C:/Program Files/Bochs-2.1.1/”中,并且Linux 0.11系统的Bochs配置文件名称是bochsrc-hd.bxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件run.bat,其内容如下:R
"C:/Program Files/Bochs-2.1.1/bochsdbg" -q -f bochsrc-hd.bxrcjFypV+
其中bochsdbg是Bochs系统的调试执行程序。运行该批处理命令即可进入调试环境。此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:D8v~
C:/Documents and Settings/john1/桌面/Linux-0.11>"C:/Program Files/Bochs-2.1.1/boRW6RNY
chsdbg" -q -f bochsrc-hd.bxrc2
========================================================================`)2?os
Bochs x86 Emulator 2.1.13$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hd.bxrcq4
00000000000i[ ] installing win32 mole as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified.1dsv
00000000000i[ ] using log file bochsout.txtmM
Next at t=0*
(0) context not implemented because BX_HAVE_HASH_MAP=0c
[0x000ffff0] f000:fff0 (unk. ctxt): jmp f000:e05b ; ea5be000f0g$
<bochs:1>i/
此时Bochs调试系统已经准备好开始运行,CPU执行指针已指向ROM BIOS中地址0x000fffff0处的指令处。其中'<bochs:1>'是命令输入提示符,其中的数字表示当前的命令序列号。在命令提示符'<bochs:1>'后面键入'help'命令,可以列出调试系统的基本命令。若要了解某个命令的具体使用方法,可以键入'help'命令并且后面跟随一个用单引号括住的具体命令,例如:“help 'vbreak'”,如下面所示。V7
<bochs:1> help@n{L(
help - show list of debugger commands5&6^
help 'command'- show short command description~B
-*- Debugger control -*-e!/;l
help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J
record, playback, load-symbols, slistr2:
-*- Execution control -*-pOHjE
c|cont, s|step|stepi, p|n|next, modebpj
-*- Breakpoint management -*-|EQ
v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI
bpe, bpd, d|del|deleteyR%|
-*- CPU and memory contents -*-xsMy
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, mp_cpu,@|'p
set_cpu, ptime, print-stack, watch, unwatch, ?|calc7
<bochs:2> help 'vbreak'_t*<#o
help vbreak/?
vbreak seg:off - set a virtual address instruction breakpoint0
<bochs:3>flx+
为了让Bochs直接模拟执行到Linux的引导启动程序开始处,我们可以先使用断点命令在0x7c00处设置一个断点,然后让系统连续运行到0x7c00处停下来。执行的命令序列如下:.Xfk
<bochs:3> vbreak 0x0000:0x7c00hDzuWy
<bochs:4> cfMH/'X
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&
Next at t=4409138<-0m5
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0 ; b8c007b 03*
<bochs:5>3R28Q
此时,CPU执行到boot.s程序开始处的第1条指令处,Bochs主窗口将显示出“Boot From floppy...”等一些信息。现在,我们可以利用单步执行命令's'或'n'(不跟踪进入子程序)来跟踪调试程序了。在调试时可以使用Bochs的断点设置命令、反汇编命令、信息显示命令等来辅助我们的调试操作。下面是一些常用命令的示例:J'P
<bochs:8> u /10 # 反汇编从当前地址开始的10条指令。,S/2
00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl
00007c03: ( ): mov ds, ax ; 8ed8)1f*
00007c05: ( ): mov ax, 0x9000 ; b80090WmD1
00007c08: ( ): mov es, ax ; 8ec0(`|
00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1
00007c0d: ( ): sub si, si ; 29f6ze_QZY
00007c0f: ( ): sub di, di ; 29ffZStl
00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF
00007c13: ( ): jmp 9000:0018 ; ea18000090!s?PR9
00007c18: ( ): mov ax, cs ; 8cc8(
<bochs:9> info r # 查看当前CPU寄存器的内容aM>/D
eax 0xaa55 436057a@`_
ecx 0x110001 1114113/$3$K"
edx 0x0 00j3G?
ebx 0x0 0gE
esp 0xfffe 0xfffee7{
ebp 0x0 0x0]*lX
esi 0x0 0m
edi 0xffe4 65508TD}Zo
eip 0x7c00 0x7c00e
eflags 0x282 642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R;%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D*)}n{
‘贰’ Linux 中 vi /etc/sysctl.conf 如何编辑
1、vi编辑器可以通过i、o、a等命令直接进入编辑模式,然后就可以修改文件了,vi/vim的工作模式如下图所示:
file-max:这个参数表示进程可以同时打开的最大句柄数,这个参数直接限制最大并发连接数。
tcp_tw_reuse:这个参数设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP链接。这个对服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
tcp_keepalive_time:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是7200seconds,意思是如果某个TCP连接在idle2小时后,内核才发起probe。若将其设置得小一点,可以更快地清理无效的连接。
tcp_fin_timeout:这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间。
tcp_max_tw_buckets:这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认是i180000,过多TIME_WAIT套接字会使Web服务器变慢。
tcp_max_syn_backlog:这个参数表示TCP三次握手建立阶段接受WYN请求队列的最大长度,默认1024,将其设置大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
ip_local_port_range:这个参数定义了在UDP和TCP连接中本地端口的取值范围。
net.ipv4.tcp_rmem:这个参数定义了TCP接受缓存(用于TCP接收滑动窗口)的最小值,默认值,最大值。
net.ipv4.tcp_wmem:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值,默认值,最大值。
netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
rmem_default:这个参数表示内核套接字接收缓存区默认的大小。
wmem_default:这个参数表示内核套接字发送缓存区默认的大小。
rmem_max:这个参数表示内核套接字接收缓存区默认的最大大小。
wmem_max:这个参数表示内核套接字发送缓存区默认的最大大小。
‘叁’ 有成功获得华为荣耀5x root权限的吗求方法!
不建议Root手机。
Root后,手机有可能无法达到最佳工作状态的,部分功能可能无法正常运行的,同时由于第三方固件未经充分测试可能会存在兼容性不好、系统易受病毒入侵等问题的。
Root会带来无法预料的负面影响,一定要谨慎操作的。如果设备不能正常使用,并且无法恢复的话,是需要自行承担风险的。
对Root引起的软硬件故障,华为售后维修网点可以按非保修处理的,并按普通的保外软件维修进行收费的。
‘肆’ linux 5的操作系统,开机启动选择要进入的系统后就没有任何反应了!是什么问题
A 内核引导
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。紧接着由启动设备上的grub程序开始引导linux,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。也就是所谓的内核引导开始了,在内核引导过程中其实是很复杂的,我们就当它是一个黑匣子,反正是linux内核做了一些列工作,最后内核调用加载了init程序,至此内核引导的工作就完成了。交给了下一个主角init。
B 运行init
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。具体内容如下:(你可以在你的linux上执行命令 cat /etc/inittab 这样获得)
复制代码
代码如下:
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
###表示当前缺省运行级别为5(initdefault);
id:5:initdefault:
###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
###当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
###在启动过程中允许按CTRL-ALT-DELETE重启系统
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schele a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
###如果进程退出则再次运行mingetty程序(respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行(respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:
代码如下:
id:runlevel:action:process
对上面各项的详细解释如下:
1. id
id是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
2. Runlevel
runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了2、3、4、5几个级别,在CentOS系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。
3. action
action是描述其后的process的运行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入runlevel。sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel。其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。
4. process
process为具体的执行程序。程序后面可以带参数。
Tips: 如果你看不懂这个文件,没有关系,随着你对linux的深入了解,你再回过头看这个文件你就会豁然开朗的。但是你现在必须要明白runlevel的各个级别的含义。
C 系统初始化
在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
rc.sysinit约有850多行,但是每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在本文中列出来,也不做具体的介绍。当rc.sysinit程序执行完毕后,将返回init继续下一步。通常接下来会执行到/etc/rc.d/rc程序。以运行级别3为例,init将执行配置文件inittab中的以下这行:
l5:5:wait:/etc/rc.d/rc 5
这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。
D 建立终端
rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:
复制代码
代码如下:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验
证用户的身份。
E 用户登录系统
对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。
Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。
login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
‘伍’ 自己可以编译安卓源码吗
用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:
sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”
其中[email protected]为你自己的邮箱.
简要说明
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.
源码下载
由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)
repo工具下载及安装
通过执行以下命令实现repo工具的下载和安装
mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:
我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:
这里写图片描述
执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.
错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:
通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)
如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.
结束吧
到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.
‘陆’ 3.硬盘上安装有多个系统时,基于NT.5X或NT.6X内核的不同,请分别说下通过grub之类的多系
这要看你怎么部署
首先看第一个 基于NT5的引导器是NT loader(NTLDR)
基于NT6的引导器是Boot manager(bootmgr)
这是第一种部署
win 2000
NTLDR——
win xp
grub—— 这种部署比较简单
vista
bootmgr—— win7 (也可以给每一个系统分别配一个引导器 即第二种)
win8 (注意 在这种情况下 bootmgr只能使用win8的版本)
第二种
NTLDR1—— win200
NTLDR2—— win xp
grub—— 这种部署比较复杂但可靠
bootmgr1—— vista
bootmgr2—— win7 (也可以给同核心系统分别配一个引导器 即第一种)
bootmgr3—— win8
还有一种是链式的 非实用的 适合爱折腾的 千变万化
ntldr——ntldr——ntldr——...
xp 2000 grub
第二种与第一种类似
至于有多少个引导器 数一数就可以了
此外 目前大家主要是用grub启动其他引导器 (第二种)这样二级崩溃一个 不会影响全局
望采纳
‘柒’ 请问.NET和 java的区别
深度解析:J2EE vs .NET开发平台
看到这个标题,也许会有人表示疑惑,J2EE和.NET并不在一个层次上,怎么能将它们放在一起呢?需要指出的是,通常所说的.NET包含了一个相当广泛的产品家族,包括开发平台、操作系统、服务器、终端设备等,此外还包括服务平台。开发平台只是整个.NET战略中的一部分,所以确切地说,放在这里的.NET应该算是.NET开发平台。
随着三层/多层企业信息系统结构的深度发展和下一代分布式计算模型Web 服务的出现,企业应用中关于平台、框架、语言的竞争也愈演愈烈。J2EE平台在过去几年里一直引领着企业应用的潮流,但最近微软强力推出的.NET平台也开始吸引着众多IT企业和开发人员的注意力,向J2EE平台提出了强有力的挑战。企业应用领域的技术对抗也因此拉开了架势。
需要强调的是,.NET是战略产品,而J2EE是描述产品的标准,现在有很多符合J2EE标准的产品。在可以预见的未来,它们都将是构建企业信息系统应用的基础性平台,尤其是开发和部署Web服务的重要平台。
尽管可以同时使用几种系统平台和语言,但对于企业来说,还需要选择一个战略性的平台来实现数据的无缝集成,加速企业应用的部署。而要做出正确的选择,首先需要充分了解两个平台的特点和优势。本期专题将为您细说J2EE和.NET。
一、群力所至的J2EE
二、.NET开发平台留住Windows开发者
三、 J2EE与.NET平台体系架构的异同
四、 J2EE vs .NET:Web服务谁主沉浮?
一、群力所至的J2EE
中南大学 罗新星 毕文杰
企业应用系统的开发一直面临着重大挑战:一方面,企业应用系统面对的是一个异构的分布式环境,它必须支持与已有系统的集成性和与其他系统的互操作性;另一方面,作为为客户、合作伙伴和企业内部提供信息服务的平台,企业系统还必须具有高可用性、安全性、可靠性和可伸缩性。这些要求再加上复杂多变的用户需求和不断伸缩的交付时间,使得企业系统的开发越来越困难。开发商和广大程序员一直在努力推动和殷切期待一个成熟、标准的企业平台来简化和规范企业系统的开发和部署。Java技术的出现,尤其是J2EE(Java 2 Platform Enterprise Edition)平台的推出正是这种努力的结果,也使得企业系统的开发由此变得更加快速和方便。需要指出的是,J2EE本身是一个标准,它为不同厂商创建平台产品提供了标准,使不同J2EE平台产品之间的交互成为可能。
J2EE旅程
Java于1996年由Sun公司推出,当时它的主要用途是制作产生动态网页的Applet。后来,人们发现Java的“一次开发,多次运行”、纯面向对象的特性、垃圾回收机制和内置的安全特别适合于开发企业应用系统。于是,企业应用开发商纷纷在Java标准版的基础上各自扩展出许多企业应用API,其结果导致基于Java的企业应用呈爆炸式增长。但是各企业系统API之间又不能相互兼容,破坏了Java的平台独立性。鉴于此,Sun公司联合IBM、Oracle、BEA等大型企业应用系统开发商于1998年共同制订了一个基于Java组件技术的企业应用系统开发规范,该规范定义了一个多层企业信息系统的标准平台,旨在简化和规范企业应用系统的开发和部署。这一规范和其定义的平台就构成了J2EE。目前J2EE的最新版本是J2EE 1.3。需要注意的是,J2EE本身是一个标准,而不是一个现成的产品(虽然现在有很多符合J2EE标准的产品),它由以下几个部分组成:
J2EE规范。该规范定义了J2EE平台的体系结构、平台角色及J2EE中每种服务和核心API的实现要求。它是J2EE应用服务器开发商的大纲。
J2EE兼容性测试站点。Sun公司提供的一个测试J2EE应用服务器是否符合J2EE规范的站点,对通过该站点测试的产品,Sun公司将发放兼容性证书。
J2EE参考实现。即J2EE SDK,它既是Sun公司自己对J2EE规范的一个非商业性实现,又是为开发基于J2EE企业级应用系统原型提供的一个免费的底层开发环境。
J2EE实施指南。即BluePrints文档,该文档通过实例来指导开发人员如何去开发一个基于J2EE的多层企业应用系统。
组件-容器 搭建体系架构
J2EE规范定义了一个基于组件的多层企业应用系统开发平台,其逻辑结构如图1所示。图中的椭圆形表示组件,大矩形表示容器,包含向下文字的小矩形表示API,箭头表示访问,箭头线上的文字表示相应的协议。
J2EE是一个基于组件-容器模型的系统平台,其核心概念是容器。容器是指为特定组件提供服务的一个标准化的运行时环境,Java虚拟机就是一个典型的容器。组件是一个可以部署的程序单元,它以某种方式运行在容器中,容器封装了J2EE底层的API,为组件提供事务处理、数据访问、安全性、持久性等服务。在J2EE中组件和组件之间并不直接访问,而是通过容器提供的协议和方法来相互调用。组件和容器间的关系通过“协议”来定义。容器的底层是J2EE服务器,它为容器提供J2EE中定义的各种服务和API。一个J2EE服务器(也叫J2EE应用服务器)可以支持一种或多种容器。在图1中,你可能已经注意到每个容器的服务包括两部分:J2SE(Java 2 Platform Standard Edition)和一组扩展的服务。这是因为J2EE是以Java标准版为基础的,各容器在J2SE之上再根据需要提供一些扩展的服务,如目录服务、事务管理、数据访问、消息机制、安全性等。
J2ee的核心——EJB
J2EE定义了四种组件:Applet组件、Application客户组件、Web组件及EJB(Enterprise JavaBeans)组件。其中Applet和Application客户组件在客户端运行,J2EE通过Java插件为Applet提供运行环境,Application客户的容器就是本地Java虚拟机。Web及EJB组件在服务端运行。J2EE中包含两种Web组件:JSP和Servlet。它们是Web服务器的功能扩展,都能生成动态Web页面。不同的是JSP是将Java代码嵌入到HTML中,服务器负责解释执行,生成结果返回用户(与ASP技术相似)。而Servlet是单独的Java类,它动态生成HTML文件返回给客户。Web组件的容器比较典型的就是基于Java的Web服务器。
EJB是J2EE平台的核心,也是J2EE得到业界广泛关注和支持的主要原因。我们知道,J2EE的一个主要目的就是简化企业应用系统的开发,使程序员将主要精力放在商业逻辑的开发上。EJB正是基于这种思想的服务器端技术,它本身也是一种规范,该规范定义了一个可重用的组件框架来实现分布式的、面向对象的商业逻辑。EJB的核心思想是将商业逻辑与底层的系统逻辑分开,使开发者只需关心商业逻辑,而由EJB容器实现目录服务、事务处理、持久性、安全性等底层系统逻辑。
一个可部署的EJB组件包含3个部分:
Remote 接口 Remote接口定义EJB组件中提供的可供用户调用的方法,也就是通常所说的实现商业逻辑的函数或过程(如计算商品价格的函数),以供远程客户端调用。在EJB组件部署到容器的时候,容器会自动生成Remote接口相应的实例,即EJB对象,它负责代理用户的调用请求。
Home接口 Home接口定义一组方法来创建新的EJB对象,查找、定位和清除已有的EJB对象。在EJB组件部署时容器也会自动生成相应的Home对象,该对象负责查找和创建EJB对象,返回EJB对象的引用给客户;用户利用该引用调用EJB组件的方法,得到结果;最后Home对象清除EJB对象。我们可以形象地称Home接口为EJB对象的工厂。
Enterprise Beans类 Enterprise Beans类是商业逻辑的具体实现类。其可供用户调用的方法在Remote接口中定义。根据功能不同,EJB 2.0规范中定义了三种Enterprise Beans:会话Beans(Session Beans)、实体Beans(Entity Beans)和消息驱动Beans(Message-driven Beans)。
会话Beans分无状态和有状态两种。一般无状态的会话Beans模拟商业逻辑,比如计算价格等。有状态的会话Beans通常模拟一个客户会话,它会临时保存客户信息,根据客户要求调用其他Beans来存取数据。两种会话Beans都不保存状态信息或数据,当客户断开连接或服务器关闭时,会话Beans也随之消失。一个会话Beans的典型例子是网站上的购物车。
实体Beans模拟商业数据,它表示一个数据存储,可以是状态信息或数据库中的一条纪录。实体Beans在客户断开连接或服务器关闭后,仍有服务保证其数据得以保存。一个实体Beans的典型例子就是客户账号信息。
消息驱动Beans在行为上很像会话Beans。不同的是仅在需要向这些Beans发送消息时才调用消息驱动Beans,比如在需要的时候发送用户确认信息等。
另外,在提交和部署EJB组件时,还需要两个文件:部署描述文件,容器根据该文件来部署Enterprise Beans,提供所要求的服务;EJB jar文件,它是提交给EJB容器的一个部署单元,容器(应用服务器)在部署时解开它,装入Enterprise Beans。
EJB容器非常复杂,一般由专业的J2EE应用服务器开发商提供,比较流行的EJB容器由IBM的WebShpere、BEA公司的WebLogic Server、Sun公司的iPlant等应用服务器提供。EJB容器除了为EJB提供事务处理、目录服务、持久性管理和安全性服务外,还负责EJB的部署、发布和生命周期管理。
平台标准服务
服务是组件和容器之间,以及容器和J2EE服务器之间的接口,在实现层面上它就是一系列API和协议。J2EE平台定义了一组标准的服务,其中有些服务是由J2SE提供的,有些则是J2EE对Java的扩展。
目录服务 JNDI(Java Name and Directory) API为应用程序提供了一个统一的接口来完成标准的目录操作,由于JNDI是独立于目录协议的,应用程序可以用它访问各种目录服务,如LDAP、NDS、DNS等。
数据访问 JDBC(Java Database Connectivity) API为访问不同类型的数据库提供了统一的途径,屏蔽了不同数据库的细节,具有平台无关性。J2EE平台除了要求核心的JDBC API(包含在J2SE中)外,还要求扩展的JDBC API 2.0,它支持行集、连接池和分布式的事务处理。
事务处理 JTA(Java Transaction Architecture)定义了一组标准的接口,为应用系统提供可靠的事务处理支持。JTS(Java Transaction Service)是CORBA OTS事务监控的Java实现。JTS规定了事务管理器的实现方式,该事务管理器在高层支持JTA标准,在底层实现了OMG OTS规范的Java映射。
消息服务 JMS(Java Message Service)是一组用于和面向消息的中间件相互通信的API。
它既支持点对点的消息通信,也支持发布/订阅式的消息通信。 电子邮件 JavaMail API允许在应用程序中以独立于平台、独立于协议的方式收发电子邮件。JAF(JavaBeans Activation Framework)负责处理MIME编码,JavaMail利用JAF来处理MIME编码的邮件附件。
CORBA兼容接口 RMI(远程方法调用)是在分布式对象间通信的Java本地方法,它使应用程序调用远程方法像调用本地方法一样,不需要考虑所调用对象的位置。RMI-IIOP是RMI的扩展,是符合CORBA标准的对象通信协议,也是J2EE默认的组件通信协议。Java IDL允许J2EE应用组件通过IIOP协议访问外部的CORBA对象。
安全服务 JAAS(Java Authentication and Authorization Service)用两个步骤实现安全性:认证,即由用户提供认证信息(如用户名和密码)来获得系统认证,这一过程又称之为登录;授权,在被确认为合法用户后,系统根据用户的角色授予其相应的权限。J2EE的授权是基于安全角色的概念,一个安全角色是一个拥有相同权限的逻辑组。J2EE的安全角色由应用组件提供商来定义。
Web服务支持 目前J2EE还不提供对Web服务的支持。Sun提供了一套API及其实现WSDP作为对J2EE的扩展,但目前还不是J2EE规范的内容。在WSDP中,JAXP用来解析XML文档;JAXR向UDDI服务器注册Web Services;JTX/RPC用基于XML的协议(如SOAP)来发送和接收XML文档;JWSDL处理WSDL文档。虽然J2EE不是为Web服务而生,但它现在正在努力追赶Web服务的脚步。
多层应用模型
从应用的角度来看,J2EE为企业应用系统的开发提供了一种多层分布式企业应用模型。在J2EE中,应用逻辑按功能不同可以划分为不同类型的组件,各组件根据它们所在的层分布在不同的机器上,共同组成一个基于组件的分布式系统。
J2EE定义了一个典型的四层结构,分别是客户层、Web层、商业逻辑层和企业信息系统层。
在应用开发时,J2EE定义的四层模型可根据实际情况灵活运用。由于除了Applet外其他的组件都可以访问数据库、EJB组件和企业信息系统,所以通过不同层的取舍及组合,可以衍生出许多应用软件开发模型,如基于Web的四层模型、基于桌面应用的三层模型(不包括Web层)、B2B模型(不包括客户层)等。如果应用系统比较简单,一般不用EJB作为逻辑层,而直接用Web组件来实现商业逻辑和数据访问,毕竟EJB的开发和部署费用还相当高。
二、.NET开发平台留住Windows开发者
南京邮电学院 李建忠
.NET开发平台一推出,就开始了与J2EE平台的竞争。它的绝大部分是微软Windows DNA(Distributed Network Architecture)的重写,DNA是微软以前开发企业应用程序的平台。Windows DNA中包括了许多已经被证实的技术,新的.NET框架取代了这些技术,并包含了Web服务层和改良的语言支持。从战略角度看,.NET开发平台担负着整合.NET战略的重任,但它最直接的目标则是努力为微软保留住庞大的Windows用户基础。
微软的Windows开发用户群是微软通过Windows操作系统获得的最大财富。对于为什么要推出.NET开发平台,微软表示,主要原因之一就是由于Java向开发者承诺的硬件和操作系统无关性,可能会导致这些用户转向其他平台。虽然开发平台本身不会给微软带来很多收益,但Windows程序员是企业内部对微软产品的主要支持力量,商用软件的开发者形成了向客户销售微软产品的重要渠道。如果微软可以让开发者在.NET开发平台上编写应用程序,那么就会有更多的公司购买微软的其他产品。
认识.NET
认识.NET最好的方法是看它做什么。.NET战略将互联网本身作为构建新一代操作系统的基础,并对互联网和操作系统的设计思想进行合理延伸,使开发人员能够创建出与设备无关的应用程序,以便轻松实现互联网连接。.NET包括一个相当广泛的产品家族,它们构建于XML和互联网产业标准之上,为用户提供Web服务的开发、管理、应用和体验。图1是对.NET战略的总体描述。组成.NET战略的五个方面包括:
.NET开发平台 这是一组用于建立Web服务应用程序和Windows桌面应用程序的软件组件,包括 .NET Framework(框架)、.NET开发者工具和ASP.NET。于今年3月发布的Visual Studio .NET将是RAD开发工具中一个重要的产品。
.NET服务器 能够提供广泛聚合和集成Web服务的服务器是搭建.NET平台的后端基础。 .NET基础服务 密码认证、日历、文件存储、用户信息等基础服务是必不可少的。微软正在着力建设的.NET My Services等基础性服务平台是这方面可以借鉴的例子。
.NET终端设备 广泛的连接互联网并体验Web服务的终端设备是实现.NET的前端基础。PC、PDA以及各种嵌入式设备将在这个广阔的天地里发挥作用。
.NET用户体验 能够满足人们各种各样需求的用户体验是.NET的最终目标,也是.NET的价值实现。
在这五个组成部分当中,.NET开发平台中的 .net框架是.NET软件构造中最具挑战性的部分,其他四个部分则紧紧围绕.NET框架来进行组织整合。
.NET 框架内核
.NET框架实现了语言开发、代码编译、组件配置、程序运行、对象交互等各个层面的功能,为Web服务及普通应用程序提供了一个托管、安全、高效的执行环境。所有在.NET平台上创建的应用程序运行都需要两个核心模块:Common Language Runtime(CLR,通用语言运行时)和.NET Framework类库。CLR是一个软件引擎,用来加载应用程序,确认它们可以没有错误地运行,并进行相应的安全许可验证,执行应用程序,然后将被清除。
.NET Framework类库则向程序员提供软件组件,来编写在CLR的控制下运行的代码,它们按照单一有序的分级组织提供了一个庞大的功能集,包括从文件系统到对XML功能的网访问的每一样功能。该类库为开发提供了三种基本编程模板:基于ASP.NET的Web表单应用、基于ASP.NET的Web服务应用和基于传统GUI交互的Windows应用。
CLR——.NET的虚拟机
CLR为.NET应用程序提供了一个托管的代码执行环境。托管意味着将原来由程序员或操作系统做的工作剥离出来交由CLR来完成,从而使程序运行获得更高的安全性和稳定性。这些工作包括内存管理、即时编译、组件自描述、安全管理和代码验证,以及其他一些系统服务。CLR提供一个技术规范,无论程序使用什么语言编写,只要能编译成中间语言,就可以在它的支持下运行,这样.NET应用程序就可以独立于语言。CLR还在应用程序运行环境中为基于组件的编程提供了直接支持,比如它支持属性、事件、对象、继承性、多态性、接口等组件编程特性。
CLR中的自动垃圾收集器负责.NET应用程序运行时的内存分配、对象布局、内存释放等内存管理问题,彻底解决了多年来困扰程序员的内存泄漏问题,大大增强了应用程序的健壮性。
即时编译器在运行时将中间语言以调用的对象方法为单位动态编译成本地二进制代码。
中间语言是在.NET平台下编译器输出PE文件(Windows可执行文件)的语言,它为.NET平台提供了多语言支持,允许开发者使用20多种不同的编程语言。而元数据是一个内嵌于PE文件的表的集合,描述了代码中数据类型等在代码执行时CLR需要知道的信息。元数据使得.NET应用程序代码具备自描述特性,提供了类型安全保障,而这在以前需要额外的类型库或接口定义语言(IDL)。
CLR根据托管组件的来源(如互联网、企业局域网、本地机器)等因素确定各组件的信任度,并根据信任度来限定它们执行诸如读取文件、修改注册表等敏感操作的权限。此外,CLR借助通用类型系统对代码类型进行严格的安全检查,可以避免不同组件之间可能存在的类型不匹配问题。通过代码访问安全机制,开发人员可以为应用程序指定完成工作所必需的权限。CLR不仅规定了代码访问安全,还规定了基于角色的安全。基于角色的认证为互联网上分布式组件的执行提供了安全保证。
值得指出的是,CLR通常寄宿在其他高性能服务器的应用程序中,比如互联网信息服务器(IIS)、SQL Server数据库服务器等。这样,开发者可以充分利用CLR诸多安全、高效的优点来部署自己的商业逻辑。
类库——组件和服务的家园
.NET Framework类库由一组广泛的、面向对象的、可被开发者用于任何编程语言的可重用类集合组成。它提供了几乎所有应用程序都需要的公共代码;在此之上是许多应用程序模板,这些模板为开发网络站点和网络服务提供特定的高级组件和服务,不管是传统的命令行程序还是Windows图形界面程序,亦或是面向下一代互联网分布式计算平台的ASP.NET或Web服务应用。与在Windows和它的SDK中发送的代码库一样,.NET框架类库将程序员从繁重的编程细节中解放出来,而专注于程序的商业逻辑。它将核心Win32 API最常用的功能和外挂SDK的功能封装到了一个统一的包中,并采用清晰而有条理的方式对类库进行分组和描述,这样开发者就能够更方便地找到其应用程序所需要的大多数功能。下面是它所提供的一些核心服务:
系统框架服务
服务框架包括一套开发人员希望在标准语言库中存在的基类库,如集合、输入/输出、字符串、数据等基类。基类库还提供访问操作系统服务的类,如图画、网络、线程、加密等类型。此外,服务框架也包括数据访问类库以及开发工具。
ADO.NET组件
ADO.NET为基于网络的、可扩展的应用程序和服务提供数据访问服务。它不仅支持传统的基于链接指针风格的数据访问,而且对于更适合于把数据返回到客户端应用程序的无链接数据模板,它也提供高性能的访问支持。
XML数据组件
通过它开发人员可以对任何数据进行XML转换、传输和确认,所有数据都可以被看做是XML格式的。同时,系统也支持ADO.NET数据与XML数据之间的通用转换。
Windows表单组件
Windows表单组件为开发人员提供了强大的Windows应用程序模型和丰富的Windows用户口,包括传统的ActiveX控件和Windows XP的新界面,如透明的、分层的浮动窗口。对CLR的强大支持也是Windows表单组件令人兴奋的地方之一。
ASP.NET应用服务
ASP.NET的核心是其用于处理基于低级结构HTTP请求的高性能的运行语言,其编译运行的方式大大提高了它的性能。ASP.NET使用基于构件的.NET框架配制模板,因此它获得了诸如XCOPY配制、构件并行配制、基于XML配制之类的优点。它还支持应用程序的实时更新,同时提供高速缓冲服务,以改善性能。
ASP.NET Web表单
ASP.NET Web表单把VB表单高效率的优点带到了Web应用程序的开发中。ASP.NET Web单支持传统的将HTML内容与脚本代码混合的ASP语法,但是它提出了一种将应用程序代码和用户接口内容分离的、更加结构化的方法。它提供一套映射传统HTML用户接口部件(包括列表框、文本框和按钮)的ASP.NET Web表单控件和一套更加复杂的Web应用控件(如日历和广告转板)。
对于.NET和Java本质区别最精辟的评述
java是平台无关的语言, #e.O?e
.NET是语言无关的平台。 U 1[
lTuVLQ*e
早说有报道 ?39aW4%g
java呈下面的三角型: 6 _^X@$IVD
java sBrpJc
unix linux windows... 'KxUv$5x
c c++ java vb C#... vtCd6cl=c
whidows be@})?gH
而oracle就这两种都没有,但有这两者都没有的数据库平台和sap。而甲骨文的最终幻想就是把这两个三角型合起来成为一个矩形。 Ri/?Y6r63
个人看法:不过单纯从语言以及sun和ms的基本语言库来说,java已经比不上.net了(以前是.net学java,现在是java学.net)。java剩下的只是哪将近十年来的经验积累 iHa)XtI
~+H)"e
由于M$自己也有数据库系统软件,Oracle的这个最终幻想可能还要长久的幻想下去,而且有无终点还很难说。 uAYFZ{%C$
再则M$的产品线的互补性已经是很难撼动的了,Visual Studio、Windows、Office和Sql Server,太吓人了@_@。 Z*6:;nzn
7$%'URFP]
net 是平台垄断 i }$soCE
java 是语言垄断 nV%#lMQ G
2!myNh:zM
好像C++之父给个一个论断:JVM本身就是一种平台(大意)。 f950x3++L
SUN or M$都是要将开发者binding到自己的平台上。 6H.2hW&Fm
不过不考虑技术本质,考虑现在的市场现象,这个论断可以成立 0q>wxi`i
,3XmL
.net 基本看一本书就够了 而Java要看许多书 还不一定能干活 =#+0HLGCFA
`# >.Q,V
.net就像品牌机,什么东西都预先由M$装好,但整体性能总是那么差强人意.JAVA更容易DIY,DIY就需要自看更多的书,当然这是取舍问题.
在SD Times的一篇名为Java VS .NET?的文章中,作者提出了自己的观点,在企业的应用中,Java并不会和.NET正面对抗,而更可能的是合作。Java和.NET各有特点,各有优势:
1、 在智能客户端领域,.NET绝对占有统治地位。
2、 Java在大规模的、跨平台集成的服务端领域则有明显优势。
3、 论及开发工具的功能性和易用性,则首推.NET
4、 而在安全性方面,基于Linux和Unit的Java要强于基于Wnidows的.NET。
文中还提到,虽然以上的对比是当前的实情,但Java和.NET都在不断的发展中,彼此之间的差距还在持续的缩小。两个阵营都在相互学习,弥补自身的不足,最后的两个产品将会越来越相似。
.NET将开发工具的易用性发挥到了极致。但微软走的是傻瓜型工具的路线,这一点为诸多优秀程序员所不屑。但傻瓜型工具的特点会带来生产力的突破,可以预言,在一些小型的企业中,将会在未来几年更多的转向.NET的方案。尤其是现在使用VB、PB、Delphi的各个企业。
开放源码界给了Java很大的助力,而Java的很大一部分的魅力也是通过各个优秀的开放源码项目得到体现的。可能有一些企业并不关心开放源码,但这个态度其实是有问题的。开发源码的价值在于,他提供了一种生态环境:企业可以借助开源项目,在一个很高的起点上发展,然后再实现盈利的同时,反之回馈开源项目。在人的问题上,开源软件锻炼了大批优秀的程序员,这批程序员不是依赖于某个公司提供的傻瓜型工具,而是靠自己,靠集体的智慧来提高劳动生产率。这种发展模式是和.NET的路线截然不同的。所以Java下有很多关于软件管理、软件建模方面的研究,而.NET这方面就差很多了。
而值得称道的是,微软做了一件非常聪明的事情-将CLR规范和C#规范提交给了ECMA组织,从而实现了.NET底层框架的标准化,这使得一些程序员开始将一些优秀的开源项目转移到.NET上来。而Mono项目的发展,也使得.NET真正实现了跨平台的目标。这样,.NET就正式涉足到了Unit环境中。但微软还有很长的路要走。