c語言內核模式,C語言內核

本文目錄一覽:

如何讓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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:57
下一篇 2024-11-18 01:57

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • 內核驅動編譯環境代價分析

    內核驅動編譯環境是在Linux系統中編譯內核模塊的過程。本文通過分析內核驅動編譯環境的各個方面,包括編譯工具的選擇、編譯速度、編譯器選項等,來探討其代價所在,並提供一些優化的建議。…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論