導航:首頁 > 源碼編譯 > linux5x內核編譯

linux5x內核編譯

發布時間:2022-07-10 04:33:20

『壹』 怎麼用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內核問題,解決方法如下:
執行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通過使用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環境中。但微軟還有很長的路要走。

    閱讀全文

    與linux5x內核編譯相關的資料

    熱點內容
    噴油螺桿製冷壓縮機 瀏覽:578
    python員工信息登記表 瀏覽:376
    高中美術pdf 瀏覽:160
    java實現排列 瀏覽:512
    javavector的用法 瀏覽:981
    osi實現加密的三層 瀏覽:231
    大眾寶來原廠中控如何安裝app 瀏覽:915
    linux內核根文件系統 瀏覽:242
    3d的命令面板不見了 瀏覽:525
    武漢理工大學伺服器ip地址 瀏覽:148
    亞馬遜雲伺服器登錄 瀏覽:524
    安卓手機如何進行文件處理 瀏覽:70
    mysql執行系統命令 瀏覽:929
    php支持curlhttps 瀏覽:142
    新預演算法責任 瀏覽:443
    伺服器如何處理5萬人同時在線 瀏覽:250
    哈夫曼編碼數據壓縮 瀏覽:425
    鎖定伺服器是什麼意思 瀏覽:383
    場景檢測演算法 瀏覽:616
    解壓手機軟體觸屏 瀏覽:349