本文目錄一覽:
如何讓linux的一段c程序進入內核態運行
Linux內核的最初部分代碼是用彙編語言寫的(文件是boot/bootsect.s)。(我的彙編水平有限,暫且不看),它首先把自身這部分代碼移到絕對地址0x90000,把下面的2K代碼從引導設備加載到地址0x90200上,內核的其餘部分加載到地址0x10000處。在加載系統時顯示「loading…」. 然後,程序控制權交給另一個實模式彙編程序(boot/Setup.S)。
接下來,此程序把整個系統從地址0x10000移到地址0x1000,進入保護模式。程序控制轉給系統的其餘部分即地址0x1000。
下一個步驟是系統內核的解壓過程,這部分代碼在地址0x1000(文件/Boot/head.S),該段程序初始化寄存器,然後執行decompress_kernel(),這個函數源於zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三個文件
Loading ….[ bootsect.S ]
uncompress …..[ decompress_kernel() ]
main.c — start_kernel() 開始.
開始 printk(banner);
Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (檢查一下GCC 的版本號, 在/init/main.c 中如果gcc 的版本號不夠,時不允許編譯內核的)
#40 Sun Apr 18 17:44:20 CST 1999
調用init_time()打印出以下內容:
Detected 199908264 Hz processor.
然後運行 console_init() — drivers/char/tty_io.c */
Console: colour VGA+ 80×25
運行一個循環,測量一下 MIPS – 據說是要用一個確定的機器指令周期來實現實時的延遲.
Calibrating delay loop… 199.48 BogoMIPS
初始化內存/* init_mem */
Memory: 63396k/65536k available (848k kernel code, 408k reserved, 856k data
, 28k
/** dquote_init() **/
VFS: Diskquotas version dquot_6.4.0 initialized
察看cpu 的類型(在2.2.14 以後聽說增加了對多種cpu 的支持, 以後我可得用心看看,if I can find a bug of intel then ……)
CPU: Intel Pentium Pro stepping 09
初始或處理器與協處理器,對於比較老的處理器, linux 會用軟件模擬協處理器?
Checking 386/387 coupling… OK, FPU using exception 16 error reporting.
檢查治理的合法性
Checking ‘hlt’ instruction… OK.
POSIX conformance testing by UNIFIX
此後調用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c)
創建一個運行 init 的進程.
進入了第二階段用戶模式 ( user_mode )End of start_kerne最後進入cpu_idle ( arch/i386/kernel/process.c )
第二部分 設備的初始化
對設備的初始化調用. init()—do_basic_init()–+
pci_init() 對pci 設備的初始化( 在main.c文件中有這樣一段 ifdef PCI …..需要看一下)下面打印出結果:
PCI: PCI BIOS revision 2.10 entry at 0xfd8d1
PCI: Using configuration type 1
PCI: Probing PCI hardware
對Socket的初始化,socket_init() (這裡也許就是linux 的網絡秘密所在吧,以後我的注意) -Linux NET4.0 for Linux 2.2
Based upon Swansea University Computer Society NET3.039
NET4: Unix domain sockets 1.0 for Linux NET4.0.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
Starting kswapd v 1.5 kswapd_setup()
調用 device_setup()
Detected PS/2 Mouse Port.
初始化 聲卡
Sound initialization started
Sound initialization complete
初始化 軟驅
Floppy drive(s): fd0 is 1.44M
FDC 0 is a National Semiconductor PC87306
SCSI 設備的初始化
(scsi0) found at PCI 13/0
(scsi0) Wide Channel, SCSI ID=7, 16/255 SCBs
(scsi0) Downloading sequencer code… 419 instructions downloaded
scsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.10/3.2.4
scsi : 1 host.
Vendor: SEAGATE Model: ST32155W Rev: 0596
ype: Direct-Access ANSI SCSI revision: 02
Detected scsi disk sda at scsi0, channel 0, id 0, lun 0
Vendor: SEAGATE Model: ST32155W Rev: 0596
Type: Direct-Access ANSI SCSI revision: 02
Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0
scsi : detected 2 SCSI disks total.
(scsi0:0:0:0) Synchronous at 40.0 Mbyte/sec, offset 8.
SCSI device sda: hdwr sector= 512 bytes. Sectors= 4197405 [2049 MB] [2.0 GB ](scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 8.
SCSI device sdb: hdwr sector= 512 bytes. Sectors= 4197405 [2049 MB] [2.0 GB]Partition check: sda: sda1 |
sdb: sdb1 sdb2 |
安裝 文件系統 filesystem_setup()
安裝設備驅動程序 mount_root()
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 28k freed
Adding Swap: 66540k swap-space (priority -1)
Soundblaster audio driver Copyright (C) by Hannu Savolainen 1993-1996
SB 3.01 detected OK (220)
at 0x220 irq 5 dma 1
YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1
996 at 0x388
NET4: AppleTalk 0.18 for Linux NET4.0
eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, IRQ 9.
Board assembly 645520-034, Physical connectors present: RJ45
Primary interface chip DP83840 PHY #1.
DP83840 specific setup, setting register 23 to 8462.
General self-test: passed.
Serial sub-system self-test: passed.
Internal registers self-test: passed.
ROM checksum self-test: passed (0x49caa8d6).
Receiver lock-up workaround activated.
NET4: AppleTalk 0.18 for Linux NET4.0
結束 do_basic_setup()
open(“/dev/console”, O_RDWR, 0)
開始執行 /sbin/init ( execv(…) )
內核就此啟動完畢…
最快學習C語言的方法
一、明確學習目的:
◆ C語言功能強大,本書涉及知識結構全面、合理。是一門非常好的編程語言基礎語言。
◆ C是一門學習邏輯、程序算法、算法實現很好的教程。通過第一學期C語言的學習,從而可以了解程序的設計編碼的過程。
◆ C是一單進程、單線程執行,從頭到尾執行,學習難不小。但結構嚴謹的高級語言,可以很好學習編程規範和要求。
◆ C語言是為以後學習其它語言打下基礎的語言。
二、好的學習方法:
基於上述學習目的並且也我們第一門編程語言。學習方法是:
◆ 課前預習,課後複習,認真做課堂、課後的作業,理解理論知識。
◆ 記住語法規則。
◆ 加強邏輯思維。
◆ 多動手,通過練習上機了解它的運行過程。
◆ 實踐—理論—再實踐,剛開始學習C語言時,按示例練習,並推動理論的學習,然後再自己多思考,多上機實踐。
常見問題:
1、有同學聽說C語言很難,剛學習到第二、三章時,於是說:老師,我不會呀!真的很難。我不知道如何學習?
分析:
1)心理作用,在沒有學習之前都認為很難了。學不會也正常。
2)前三章是基礎,對於沒有學習過編程語言的同學來說,新的專業名詞很多。
3)前三章是基礎,還不能完整的寫出一個C程序。於是,就不知道如何去用,在哪個時候用等很多的疑問。
問題的存在:過於着急,對新的事務領悟不夠。
解決方法:學習是循序漸進和積累的過程,不要着急。這此知識都是為以後作鋪墊的。
2、有同學學到數組時,說:聽你上課時,我懂,但要我自己寫,我不知道如何寫?不知道如何開始?
分析:
1)邏輯性思想太亂。如果問:「如果班上有30個同學,要判斷成績是否及格,你將如何做?」;「當然先知道每個同學的成績,然後一個一個和60比較,如果大於等60,則及格,否則不及格。」;「那麼C語言來實現,如何做?」。聲明30個變量存儲成績?不是一個好辦法。如果聲明一個30元素的數組,是不是更合理。另外,如果要寫30個條件語句來判斷,也太過於繁鎖。如果用for循環是不是更加合理。
2)練習太少,有解決方法,但不能用C語言實現。
問題的存在:思路不清淅,練習太少。
解決方法:多上機練習,多思考,舉一反三。了解程序的運行過程和編碼。
三、學習要點和重點:
◆ 第一章至第四章的:基礎知識和理論知識必須要求能理解、領悟。也是學習其它語言的基礎。
◆ 第二章、第三章提到很多的專業名詞,如數據類型,變量與常量的區別,標識符的命名規則,表達式及各種運算符及輸入輸出函數基礎
◆ 五章和第六章:程序的基本結構,學習完前六章,要求能理解程序運行和編碼的過程。
◆ 將我們的算法用編程語言來實現,主要是學習程序設計的邏輯性。也是學習其它語言的基礎
◆ 第七章到第十一章:學習C語言的特色,更深入了解C語言。本章讓學員加強空間的想像力。
◆ 第十二章:是文件的操作。考慮的是如何將程序的輸出結果及相關信息用文件記錄下來。
四、學習難度:
◆ 與日常的自然語言的表達不完全相同,所有結果要通過計算才能得。計算機沒有想像能力和空間思維能力。計算機能運行,依靠程序員的嚴謹的命令來驅動。
◆ 語法格式多,知識點全面。應用時,要將零散的知識點有效有序的組合。
很多問題的解決方法是需要經驗的。
C語言重點是什麼
C語言是一個實用性很強的語言。你如果想要學好它,就得下一翻功夫。可是大多數人都認為它太難學了。
首先你要有一個正確的態度,沒有一個正確態度的人是學不好任何東西的。你如果真想學好C語言的話,你就要做好好好學它的準備,不要三心二意。
你要了解你需要的教材。什麼樣的教材才是適合你。你要認真的選,不要太隨意了。因為不同的教材程度不同,也不一定適合你。
就是學的問題了。你做好了上面的準備,就好好開始學了。可是學好一門語言,一個好的方法很重要的。你要從整體上來理解C語言,認識到C語言的優勢,還有C語言的特點。C語言是面向過程的一門語言,特彆強調各個程序的關係。像程序之間的調用,這是很平常的。
一門語言的基礎部分不過是一些關於數的類型,字符的類型的定義。你只要認真看不難明白的。不過最好的方法還是上機調試。在這一階段做一些簡單的程序。來明白C語言的編程環境,數字的類型。這樣理解起來會更快些,也比較容易記憶。
就是學習一些過程語言的基礎的《《《模式。順序,循環,》》》選擇這些東西。這些東西都是一些活的東西,千萬不要死記硬背,這是沒有用的。在這一階段,你可以編一些比較簡單的程序。像數據的計算,成績的判定等等。
隨着學習的深入,你會發現C語言有許多東西很有趣的。這樣學習不再是一個多麼難的事了,而是一件快樂的事。最後C語言和任何一門語言一樣需要多上機調試,多動腦。C語言的基礎部分很快就會掌握的。
最主要多動腦
多練習
多看一些習題
多做做
就很快搞定
祝你早日成功
FORTRAN編程語言與C語言
fortran語言中可通過定義子程序從而返回一系列變量值,而c語言的函數一般只能返回一個變量值。
Fortran語言的最大特性是接近數學公式的自然描述,在計算機里具有很高的執行效率。易學,語法嚴謹。可以直接對矩陣和複數進行運算,這一點類似MATLAB。自誕生以來廣泛地應用於數值計算領域,積累了大量高效而可靠的源程序。很多專用的大型數值運算計算機針對Fortran做了優化。廣泛地應用於並行計算和高性能計算領域。
C語言是一個有結構化程序設計、具有變量作用域(variable scope)以及遞歸功能的過程式語言。C語言傳遞參數均是以值傳遞(pass by value),另外也可以傳遞指針(a pointer passed by value)。不同的變量類型可以用結構體(struct)組合在一起。只有32個保留字(reserved keywords),使變量、函數命名有更多彈性。部份的變量類型可以轉換,例如整型和字符型變量。通過指針(pointer),C語言可以容易的對存儲器進行低級控制。預編譯處理(preprocessor)讓C語言的編譯更具有彈性。
什麼是內核!
內核是操作系統的內部核心程序,它向外部提供了對計算機設備的核心管理調用。我們將操作系統的代碼分成2部分。內核所在的地址空間稱作內核空間。而在內核以外的統稱為外部管理程序,它們大部分是對外圍設備的管理和界面操作。外部管理程序與用戶進程所佔據的地址空間稱為外部空間。通常,一個程序會跨越兩個空間。當執行到內河空間的一段代碼時,我們稱程序處於內核態,而當程序執行到外部空間代碼時,我們稱程序處於用戶態。 從UNIX起,人們開始用高級語言(UNIX上最具有代表性的就是UNIX的系統級語言C語言)編寫內核代碼,使得內核具有良好的擴展性。單一內核(monolithic kernel)是當時操作系統的主流,操作系統中所有的系統相關功能都被封裝在內核中,它們與外部程序處於不同的內存地址空間中,並通過各種方式(在Intel IA-32體系中採用386保護模式)防止 外部程序直接訪問內核結構。程序只有通過一套稱作系統調用(system call)的界面訪問內核結構。近些年來,微內核(micro kernel)結構逐漸流行起來,成為操作系統的主要潮流。1986年,Tanenbaum提出Mach kernel,而後,他的minix和GNU的Hurd操作系統更是微內核系統的典範。 在微內核結構中,操作系統的內核只需要提供最基本、最核心的一部分操作(比如創建和刪除任務、內存管理、中斷管理等)即可,而其他的管理程序(如文件系統、網絡協議棧等)則儘可能的放在內核之外。這些外部程序可以獨立運行,並對外部用戶程序提供操作系統服務,服務之間使用進程間通信機制(IPC)進行交互,只在需要內核的協助時,才通過一套接口對內核發出調用請求。 微內核系統的優點時操作系統具有良好的靈活性。它使得操作系統內部結構簡單清晰。程序代碼的維護非常之方便。但是也有不足之處。微內核系統由於核心態只實現了最基本的系統操作,這樣內核以外的外部程序之間由於獨立運行使得系統難以進行良好的整體優化。另外,進程間互相通信的開銷也較單一內核系統要大許多。從整體上看,在當前的硬件條件下,微內核在效率上的損失小於其在結構上獲得的收益,故而選取微內核成為操作系統的一大潮流。 然而,Linux系統卻恰恰使用了單一內核結構。這是由於Linux是一個實用主義的操作系統。Linux Tovarlds以代碼執行效率為自己操作系統的第一要務,並沒有進行過一個系統的設計工作,而是任由Linux在使用中不斷發展。在這樣的發展過程中,參與Linux開發的程序員大多為世界各地的黑客們。比起結構的清晰,他們更加註重功能的強大和高效的代碼。於是,他們將大量的精力放在優化代碼上,而這樣的全局性優化必然以喪失結構精簡為代價,導致Linux中的每個部件都不能輕易被拆除。否則必然破壞整體效率。 雖然Linux是單一內核體系,但是它與傳統的單一內核UNIX操作系統不同。在普通的單一內核系統中,所有的內核代碼都是被靜態編譯聯入的,而在Linux中,可以動態裝入和卸載內河中的部分代碼。Linux將這些代碼段稱為模塊。(module),並對模塊給予了強有力的支持。在Linux中,可以在需要時自動裝入和卸載模塊。 Linux不支持用戶態線程。在用戶態中,Linux認為線程就是共享上下文(Context)的進程。Linux通過LWP(light weight thread)的機制來實現用戶態線程的概念。通過系統調用clone()創建新的線程。 Linux的內核為非搶佔式的。即,Linux不能通過改變優先權來影響內核當前的執行流程。因此,Linux在實現實時操作時就有問題。Linux並不是一個「硬」實時操作系統。 在Linux內核中,包括了進程管理(process management)、定時器(timer)、中斷管理(interrupt management)、內存管理(memory management)、模
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/156640.html