1 int __init s3c_fb_probe(struct platform_device *pdev)
2 {
3 char driver_name[]="s3c_fb";
4 int ret;
5 int index=0;
6
7 for(index=0; index<S3C_FB_NUM; index++){ //遍歷每一個(gè)fb,我們里只有一個(gè)lcd.
8 s3c_fb_init_fbinfo(&info[index], driver_name, index);
9
10 if(index==0){ //操作主lcd
11 s3c_fb_backlight_power(1); //開啟背光,lcd電源源,開啟背光等。
12 s3c_fb_lcd_power(1);
13 s3c_fb_backlight_level(DEFAULT_BACKLIGHT_LEVEL);
14
15 dprintk("dev FB init\n");
16
17 //映射內(nèi)存區(qū)域
18 if (!request_mem_region((unsigned long)S3C_VA_LCD, SZ_1M, "s3c-lcd")) {
19 ret = -EBUSY;
20 goto dealloc_fb;
21 }
22
23 dprintk("got LCD region\n");
24
25 //打開lcd_clock
26 lcd_clock = clk_get(NULL, "lcd");
27 if (!lcd_clock) {
28 printk(KERN_INFO "failed to get lcd clock source\n");
29 ret = -ENOENT;
30 goto release_irq;
31 }
32
33 clk_enable(lcd_clock);
34 printk("S3C_LCD clock got enabled :: %ld.%03ld Mhz\n", print_mhz(clk_get_rate(lcd_clock)));
35
36 msleep(5);
37 }
38
39 //申請(qǐng)顯存
40 /* Initialize video memory */
41 ret = s3c_fb_map_video_memory(&info[index]);
42 if (ret) {
43 printk("Failed to allocate video RAM: %d\n", ret);
44 ret = -ENOMEM;
45 goto release_clock;
46 }
47 dprintk("got video memory\n");
48
49 //初始化寄存器,這里與具體的設(shè)備有關(guān)。
50 ret = s3c_fb_init_registers(&info[index]);
51 ret = s3c_fb_check_var(&info[index].fb.var, &info[index].fb);
52
53 //所謂的色表(調(diào)色盤?),不清除是干啥的。
54 if(index<2){
55 /* 2007-01-09-Tue. for RGB 8-8-8 palette*/
56 if(fb_alloc_cmap(&info[index].fb.cmap, 256, 0)<0){
57 goto dealloc_fb;
58 }
59 }
60 else{
61 /* 2007-01-09-Tue. for RGB 8-8-8 palette*/
62 if(fb_alloc_cmap(&info[index].fb.cmap, 16, 0)<0){
63 goto dealloc_fb;
64 }
65 }
66 //注冊(cè)framebuffer??
67 ret = register_framebuffer(&info[index].fb);
68 if (ret < 0) {
69 printk(KERN_ERR "Failed to register framebuffer device: %d\n", ret);
70 goto free_video_memory;
71 }
72 }// for(index=0; index<CONFIG_FB_NUM; index++)
73
74 // initialize the struct for Waitforvsync
75 // 關(guān)于中斷的初始化工作,貌似2412是注冊(cè)以后又取消了
76 s3cfb_vSyncInfo.count = 0;
77 init_waitqueue_head(&s3cfb_vSyncInfo.waitQueue);
78
79 #if defined(CONFIG_ARCH_S3C2443)
80 ret = request_irq(IRQ_LCD3, s3c_fb_irq, 0, "s3c-lcd", pdev);
81 #elif defined(CONFIG_ARCH_S3C6400)
82 ret = request_irq(IRQ_LCD_VSYNC, s3c_fb_irq, 0, "s3c-lcd", pdev);
83 #elif defined (CONFIG_S3C_DVS) && defined (CONFIG_ARCH_S3C2412)
84 ret = request_irq(IRQ_LCD, s3c_dvs_irq, 0, "s3c-lcd", pdev);
85 #endif
86 if (ret != 0) {
87 printk("Failed to install irq (%d)\n", ret);
88 goto release_irq;
89 }
90
91 #if defined (CONFIG_S3C_DVS) & defined (CONFIG_ARCH_S3C2412)
92 disable_irq(IRQ_LCD);
93 #endif
94
95 //在sys底下建立節(jié)點(diǎn),用于和用戶空間交互
96 /* create device files */
97 device_create_file(&(pdev->dev), &dev_attr_backlight_power);
98 device_create_file(&(pdev->dev), &dev_attr_backlight_level);
99 device_create_file(&(pdev->dev), &dev_attr_lcd_power);
100
101 //勝利退出
102 printk(KERN_INFO "fb%d: %s frame buffer device\n",
103 info[index].fb.node, info[index].fb.fix.id);
104 return 0;
105
106 free_video_memory:
107 s3c_fb_unmap_video_memory(&info[index]);
108
109 release_clock:
110 clk_disable(lcd_clock);
111 clk_put(lcd_clock);
112
113 release_irq:
114 #if defined(CONFIG_ARCH_S3C2443)
115 free_irq(IRQ_LCD3, &info);
116 #elif defined(CONFIG_ARCH_S3C6400)
117 free_irq(IRQ_LCD_VSYNC, &info);
118 #endif
119 //release_mem:
120 release_mem_region((unsigned long)S3C_VA_LCD, S3C_SZ_LCD);
121
122 dealloc_fb:
123 framebuffer_release(&info[index].fb);
124 return ret;
125 }
126
127
128
第二章 從內(nèi)核出發(fā)
內(nèi)核開發(fā)特點(diǎn):
- 沒(méi)有l(wèi)ibc庫(kù)。 kernel是一個(gè)不依賴任何庫(kù)的,包括標(biāo)準(zhǔn)C函數(shù)庫(kù)。kernel中使用的一些常見函數(shù),比如memset, strcpy都是在kernel代碼中自己實(shí)現(xiàn)的。
- 請(qǐng)使用gcc來(lái)編譯內(nèi)核,因?yàn)閮?nèi)核中的代碼并不完全符合ANSI C的標(biāo)準(zhǔn)。
- 沒(méi)有內(nèi)存保護(hù),非法的內(nèi)存操作可能會(huì)使系統(tǒng)掛起。
- 不要使用浮點(diǎn)數(shù)
- 內(nèi)核棧容量很小( 2 * 頁(yè)面大小 )
- linux是搶占多任務(wù)操作系統(tǒng),進(jìn)程,內(nèi)核都可以搶占,而且支持多處理器,所以內(nèi)核代碼需要考慮并發(fā)和同步的問(wèn)題。
- 盡量要兼容所有架構(gòu)(arch),良好的移植性
第三章 進(jìn)程管理
內(nèi)存描述符及任務(wù)結(jié)構(gòu)
- 每個(gè)進(jìn)程都對(duì)應(yīng)有一個(gè)進(jìn)程描述符,即task_struct結(jié)構(gòu),用來(lái)記錄這個(gè)進(jìn)程的所有信息:打開的文件,地址空間,進(jìn)程狀態(tài)……
- linux通過(guò)slab(個(gè)人感覺(jué)類似于pool)分配task_struct。 進(jìn)程的task_struct指針存放在位于內(nèi)核棧底的一個(gè)叫做thread_info的結(jié)構(gòu)里面。
- 內(nèi)核通過(guò)PID來(lái)標(biāo)識(shí)進(jìn)程,默認(rèn)設(shè)置最大值,即默認(rèn)系統(tǒng)最大進(jìn)程數(shù)為32768。內(nèi)核中一般通過(guò)current宏來(lái)獲的當(dāng)前進(jìn)程的task_struct,不同的體系架構(gòu)下,實(shí)現(xiàn)方法可能會(huì)不同。
- 進(jìn)程狀態(tài),可以通過(guò)set_task_state來(lái)設(shè)置
- TASK_RUNNING 進(jìn)程可執(zhí)行;它正在運(yùn)行,或者是在任務(wù)隊(duì)列中等待被運(yùn)行。
- TASK_INTERRUPTIBLE 進(jìn)程可中斷;進(jìn)程被阻塞,但是可以通過(guò)信號(hào),或者其他方法喚醒。
- TASK_UNINTERRUPTIBLE 進(jìn)程不可中斷;進(jìn)程被阻塞,而且不受任何干擾,不會(huì)響應(yīng)信號(hào)而被喚醒。
- TASK_ZOMBIE 進(jìn)程僵死;進(jìn)程已經(jīng)運(yùn)行完畢,但是父進(jìn)程沒(méi)有調(diào)用wait4系統(tǒng)調(diào)用,此時(shí)子進(jìn)程的task_struct保留,等待父進(jìn)程查詢相關(guān)信息。【Agaric:相似的,在windows上,進(jìn)程的HANDLE通過(guò)(CreateProcess或者OpenProcess得到) 在程序運(yùn)行完畢后,在CloseHandle 前,也是仍然有效,用于查詢進(jìn)程相關(guān)信息,比如Exit code 等等】
- TASK_STOPPED 進(jìn)程停止;
- 進(jìn)程上下文: 進(jìn)程通過(guò)系統(tǒng)調(diào)用或者異常陷入內(nèi)核,此時(shí)內(nèi)核是"代表進(jìn)程"在工作,這個(gè)工作環(huán)境,叫做進(jìn)程上下文,內(nèi)核程序可以通過(guò)宏來(lái)獲的當(dāng)前進(jìn)程的task_struct
- 進(jìn)程家族樹: 除了init,每個(gè)進(jìn)程都有父進(jìn)程, 每個(gè)進(jìn)程都可能有子進(jìn)程及兄弟進(jìn)程。
(待續(xù))
配置svnserver
可以直接在YaST2里面,在xinetd設(shè)置里面,添加svnserve的選項(xiàng)。
但是要注意運(yùn)行使用的用戶,默認(rèn)的svn:svn是沒(méi)有被建立的, 我改成nobody以后就ok了,但不知道有什么什么問(wèn)題。
配置APACHE
采用svnserver的方法有許多不便,所以我還是決定最終采用http的方法。
OpenSuse的apache2的配置文件布局似乎和其他系統(tǒng)有點(diǎn)不一樣。 它在httpd.conf里面并沒(méi)有直接進(jìn)行的配置,而是包含了其他很多的conf文件,其中的每一個(gè)conf,包含了某一個(gè)具體部分的配置。
ls /etc/apache2/
charset.conv httpd.conf mod_autoindex-defaults.conf mod_status.conf ssl.crl ssl.key vhosts.d
conf.d listen.conf mod_info.conf mod_userdir.conf ssl.crt ssl.prm
default-server.conf magic mod_log_config.conf mod_usertrack.conf ssl.csr sysconfig.d
errors.conf mime.types mod_mime-defaults.conf server-tuning.conf ssl-global.conf uid.conf
配置svn 使用 apache 的文章很多,我就不重復(fù)具體的配置方法了,只是說(shuō)明一下在suse10.3上具體需要修改的文件。
/etc/apache2/conf.d/subversion.conf 這個(gè)文件被httpd.conf所包含,用來(lái)修改svn目錄及一些設(shè)置,一般教程里面都是修改httpd.conf.
/etc/apache2/sysconfig.d/loadmodule.conf 用來(lái)在apache啟動(dòng)時(shí)加載模塊用。
我最終解決mod_dav_svn加載的方法是,在/usr/lib/apache2-prefork/ 下建立一個(gè) mod_dav_svn.so的鏈接(位于 /usr/lib/apache2)這樣在YaST的httpserver設(shè)定里面就可以選擇和加載這個(gè)模塊了。 就是這個(gè)問(wèn)題,花了我好幾個(gè)消失來(lái)解決。
其他的配置方法,可以參考svn中文手冊(cè),和網(wǎng)上其他的配置教程。
http://blog.chinaunix.net/u1/34474/showart_404278.html
http://blog.chinaunix.net/u1/41638/showart_438078.html
http://blog.csdn.net/fudan_abc/
我使用的不是SMDK2412的開發(fā)板,而是公司已經(jīng)出貨的2412的機(jī)器,原來(lái)用的是自己的一個(gè)OS,現(xiàn)在打算在他上面運(yùn)行l(wèi)inux.
編譯2.6的內(nèi)核,需要比較新的gcc, 我暫時(shí)能找到的新版arm-linux-gcc也就是3.4.1。,之前用arm-none-linux-eabi-gcc 4.1編出來(lái)的zImage好大,基本不能用。對(duì)于開發(fā)工具和內(nèi)核版本,我覺(jué)得還是越新越好(穩(wěn)定版),否則可能會(huì)遇到一些稀奇古怪的問(wèn)題。
1.修改Boot
使用公司原有的Boot, 在Boot啟動(dòng)Kernel的時(shí)候,加入的參數(shù)設(shè)定,然后用公司專用的usb更新工具燒錄kernel到flash中,啟動(dòng)機(jī)器以后顯示了一堆亂碼,在啟動(dòng)參數(shù) console=ttySAC0后面加上了,115200,設(shè)定波特率以后一切OK.
2.MTD分區(qū):修改文件common-smdk.c , 修改其中的MTD設(shè)備的分區(qū)。
新的kernel里面已經(jīng)有了默認(rèn)分區(qū)表,我們只要根據(jù)我們需要來(lái)做部分修改就可以,我的nand有512MB, 我目前只是將前面的2M分給boot,kernel, 緊接下來(lái)的4M分給rootfs,打算暫時(shí)加載一個(gè) 簡(jiǎn)單的cramfs。其他的nand都還沒(méi)有用。
3.取消NAND驅(qū)動(dòng)中的ECC讀校驗(yàn),以及壞塊監(jiān)測(cè)部分, 因?yàn)镹AND操作部分,boot和kernel有一些不同。
重啟以后,mount root分區(qū)失敗,還打出了I/O 錯(cuò)誤。 關(guān)閉了ECC校驗(yàn),修改了pc工具的燒錄地址以后,ok. 這都是因?yàn)槲覀兊臒浌ぞ呤褂玫牡刂繁硎痉椒ê蚭cc的方式有一些不同。
4.燒錄 root 文件系統(tǒng)。
拿了一個(gè)在kernel2.4 2440 上用過(guò)得cramfs直接來(lái)用,提示找不到dev/console, 上網(wǎng)查了一遍,應(yīng)該是因?yàn)楝F(xiàn)在新版的kernel去掉了devfs的緣故,為了先快速的有一個(gè)可執(zhí)行環(huán)境,所以在網(wǎng)上找了一個(gè)現(xiàn)成的,已經(jīng)自己建立好節(jié)點(diǎn)的cramfs,里面的busybox版本也比較新。
開機(jī)運(yùn)行,總算見到了親愛的shell.
工作需要,加之好奇心,終于給自己家的PC里面也安裝上了Linux。 為了和公司的OpenSuse有所不同于是就選擇另一款大名頂頂?shù)陌l(fā)行版Fedora.
我一直認(rèn)為,人生總是要遇到一些挫折的。 可不就是裝個(gè)系統(tǒng)嘛,為啥就要這樣難為我捏?
懶得插上光驅(qū),于是就用硬盤安裝的辦法。 可grub for dos 就是不認(rèn)我從ISO里解出來(lái)的vmlinuz,

汗,放狗去搜,貌似沒(méi)有人遇到過(guò)這個(gè)情況。不能就這樣放棄吧?再看看解壓出來(lái)的一個(gè)jpg,居然也打不開,nnd是不是文件解錯(cuò)了。 之前我解文件用的是winrar, 換成 Deamon Tools 試試, NND 這次那附圖OK了。 再用grub來(lái)load , OK! 額。。 原來(lái)winrar在解iso的時(shí)候會(huì)掉鏈子, 伙計(jì)們以后要千萬(wàn)小心。
以后的事就順利多了。 裝顯卡驅(qū)動(dòng),直接用yum的包就可以啦,不過(guò)裝完以后需要修改grub的list,因?yàn)閮?nèi)核也更新了,需要從新的內(nèi)核啟動(dòng),顯卡驅(qū)動(dòng)才可以奏效。Fedora默認(rèn)已經(jīng)安裝了桌面特效,顯卡驅(qū)動(dòng)安裝完以后,直接在菜單里面選擇打開特效就OK. 嘿嘿,效果還可以吧。

接下來(lái)就是解決QQ滴問(wèn)題了。 開始用Pigin,只能聊天,而且只能看見在線的好友,勉強(qiáng)能用,后來(lái)又裝了wine上面的qq2007,應(yīng)該是配置的問(wèn)題,總是crash。 不過(guò)最后發(fā)現(xiàn)了lumaQQ和eva這兩個(gè)好東東。 我本人還是比較喜歡eva的,功能很全了,界面也很友好,只可惜這個(gè)家伙不能像其他的一些KDE程序在gnome下也能正常運(yùn)行,只能在KDE下玩兒。LumaQQ作者現(xiàn)在主要在維護(hù)iphone版本的, 普通的java版有一段時(shí)間沒(méi)更新了, 現(xiàn)在還能常用, 界面也還好。
這幾天綜合下來(lái),感覺(jué)Fedora還算不錯(cuò),但是易用性上面,不如Opensuse。 至于 ubuntu , 我用的不多, 感覺(jué)優(yōu)點(diǎn)是國(guó)內(nèi)源多,所以更新和下載程序速度比較快。

工作的任務(wù)是一直Linux內(nèi)核,現(xiàn)在看來(lái),還有很多東西要學(xué),很多路要走。
我覺(jué)得對(duì)于這樣比較長(zhǎng)期/艱巨的任務(wù),相我這樣工作經(jīng)驗(yàn)不豐富的人,很難針對(duì)它來(lái)指定一個(gè)計(jì)劃, 其實(shí)就是很難將其分割成一步步來(lái)完成的小計(jì)劃。導(dǎo)致每天都暈暈呼呼的不知道干什么好。 希望有經(jīng)驗(yàn)的朋友能給點(diǎn)建議。
Winrar解ISO可能會(huì)掉鏈子
對(duì)Linux有興趣的初學(xué)者,不妨親身在機(jī)器上安裝一個(gè)易用的發(fā)行版(非虛擬機(jī), 推薦Ubuntu, Opensuse10.3(KDE))
MIT BBS上說(shuō)微軟電話面試的一道題就是“Who do you think is the best coder, and why?”。我覺(jué)得挺有意思的,也來(lái)湊個(gè)熱鬧。排名不分先后。
Bill Joy, 前任Sun的首席科學(xué)家,當(dāng)年在Berkeley時(shí)主持開發(fā)了最早版本的BSD。他還是vi和csh的作者。當(dāng)然,Csh
Programming Considered Harmful
是另一個(gè)話題樂(lè)。據(jù)說(shuō)他想看看自己能不能寫個(gè)操作系統(tǒng),就在三天里寫了個(gè)自己的Unix,
也就是BSD的前身。當(dāng)然是傳說(shuō)了,但足見他的功力。另一個(gè)傳說(shuō)是,1980年初的時(shí)候,DARPA讓BBN在Berkley
Unix里加上BBN開發(fā)的TCP/IP代碼。但當(dāng)時(shí)還是研究生的B伯伯怒了,拒絕把BBN
TCP/IP加入BSD,因?yàn)樗X(jué)得BBN的TCP/IP寫得不好。于是B伯伯出手了,端的是一箭封喉,很快就寫出了高性能的伯克利版TCP/IP。當(dāng)時(shí)
BBN和DARPA簽了巨額合同開發(fā)TCP/IP
Stack,誰(shuí)知他們的代碼還不如一個(gè)研究生的好。于是他們開會(huì)。只見當(dāng)時(shí)B伯伯穿個(gè)T-shirt出現(xiàn)在會(huì)議室(當(dāng)時(shí)穿T-shirt不象現(xiàn)在,還是相
當(dāng)散漫的哈)。只見BBN問(wèn):你怎么寫出來(lái)的?而B伯伯答:簡(jiǎn)單,你讀協(xié)議,然后編程就行了。最令偶暈倒的是,B伯伯碩士畢業(yè)后決定到工業(yè)界發(fā)展,于是就
到了當(dāng)時(shí)只有一間辦公室的Sun, 然后他就把Sparc設(shè)計(jì)出來(lái)樂(lè)。。。象這種軟硬通吃的牛人,想不佩服都不行的說(shuō)。據(jù)Bill
Joy的同事說(shuō),一般開會(huì)的時(shí)候B伯伯總是拿一堆雜志漫不經(jīng)心地讀。但往往在關(guān)鍵之處,B伯伯發(fā)言,直切要害,提出漂亮的構(gòu)想,讓同事們徹底崩潰。對(duì)了,
他還是Java Spec和JINI的主要作者之一。
John Carmack,ID
Software的founder和Lead Programmer。上個(gè)月和一個(gè)搞圖形的師兄聊天,他竟然不知道John Carmack,
也讓偶大大地暈了一把。不過(guò)也許搞研究的和搞實(shí)戰(zhàn)的多少有些隔吧。想必喜歡第一人稱射擊游戲的都知道J哥哥。90年代初只要能在PC上搞個(gè)小動(dòng)畫都能讓人
驚嘆一番的時(shí)候,J哥哥就推出了石破天驚的Castle Wolfstein, 然后再接再勵(lì),doom, doomII,
Quake...每次都把3-D技術(shù)推到極
限。J哥哥的簡(jiǎn)歷上說(shuō)自己的專長(zhǎng)是"Exhaust 3-D
technology",真是牛人之言不我欺的說(shuō)。做J哥哥這樣的人是很幸福的,因?yàn)楦鞔髨D形卡廠家一有了新產(chǎn)品就要向他“進(jìn)貢”
,不然如果他的游戲不支持哪種卡,哪種卡基本就會(huì)夭折樂(lè)。當(dāng)初MS的Direct3D也得聽取他的意見,修改了不少API。當(dāng)然,J哥哥在結(jié)婚前十?dāng)?shù)年如
一日地每天編程14小時(shí)以上,也是偶們凡人望塵莫及的。對(duì)了,J哥哥高中肆業(yè)(?),可以說(shuō)是自學(xué)成才。不過(guò)呢,誰(shuí)要用這個(gè)例子來(lái)為自己學(xué)習(xí)不好辯護(hù),就
大錯(cuò)特錯(cuò)了。那 Leonardo Da
Vinci還是自學(xué)成才呢(人是私生子,不能上學(xué))。普通人和天才還是有區(qū)別的。對(duì)了,其實(shí)偶們叫“達(dá)分奇”是相當(dāng)不對(duì)的,因?yàn)閂inci是地名,而Da
Vinci就是從Vinci來(lái)的人的意思。換句話說(shuō),Leonardo Da
Vinci就是“從Vinci來(lái)的Leonardo”的意思。叫別人“Da Vinci”就不知所謂樂(lè)。嗯,扯遠(yuǎn)了,打住。
David Cutler,VMS和Windows
NT的首席設(shè)計(jì)師,去微軟前號(hào)稱硅谷最牛的kernel開發(fā)員。當(dāng)初他和他的手下在微軟一周內(nèi)把一個(gè)具備基本功能的bootable
kernel寫出來(lái),然后說(shuō):“who can't write an OS in a
week?",也是牛氣沖天的說(shuō)。順便說(shuō)一句,D爺爺?shù)絅T3.5時(shí),管理1500名開發(fā)員,自己還兼做設(shè)計(jì)和編程,不改coder本色啊。
D爺爺天生脾氣火爆,和人爭(zhēng)論時(shí)喜歡雙手猛擊桌子以壯聲勢(shì)。:-) 日常交談F-word不離口。他面試秘書時(shí)必問(wèn):"what do
you think of the word 'fuk'?"
,讓無(wú)數(shù)美女剎羽而歸。終于有一天,一個(gè)同樣火爆的女面對(duì)這個(gè)問(wèn)題脫口而出:"That's my favorite
word"。于是她被錄取樂(lè),為D爺爺工作到NT3.5發(fā)布。
Don
Knuth。高爺爺其實(shí)用不著偶多說(shuō)。學(xué)編程的不知道他就好像學(xué)物理的不知道牛頓,學(xué)數(shù)學(xué)的不知道歐拉,學(xué)音樂(lè)的不知道莫扎特,學(xué)Delphi的不知到
Anders Hejlsberg,或者學(xué)Linux不知道Linus
Torvalds一樣,不可原諒啊。:-)為了讓文章完整,就再羅唆幾句吧。高爺爺本科時(shí)就開始給行行色色的公司寫各種稀奇古怪的編譯器掙外快了。他賣給
別人時(shí)收一兩千美元,那些公司拿了code,加工一下賣出去就是上萬(wàn)上十萬(wàn)。不過(guò)也沒(méi)見高爺爺不爽過(guò),學(xué)者本色的說(shuō)。想想那可是60年代初啊,高爺爺寫編
譯器寫多了,順帶就搞出了個(gè)Attribute
Grammar和LR(k),大大地造福后人啊。至于高爺爺在CalTech的編程比賽(有Alan
Kay得眾多高高手參加)總是第一,寫的Tex到86年就code freeze,還附帶2^n美分獎(jiǎng)勵(lì)等等都是耳熟能詳?shù)模季筒火埳鄻?lè)。
順便說(shuō)一下,高老大爺是無(wú)可爭(zhēng)議的寫作高手。他給Concrete Mathematics
寫的前言可謂字字鏗鏘,堪為前言的典范。他的技術(shù)文章也是一絕,文風(fēng)細(xì)致,解釋精當(dāng),而且沒(méi)有學(xué)究氣,不失輕快跳脫。記得幾年前讀Concrete
Mathemathics,時(shí)不時(shí)開懷大笑,讓老媽極其郁悶,覺(jué)得我nerdy到家,不可救藥。其實(shí)呢,子非魚,安知魚之樂(lè),更不知那完全是高爺爺?shù)墓?
勞。說(shuō)到寫作高手,不能不提Stephen A.
Cook。他的文章當(dāng)年就被我們的寫作老師極力推薦,號(hào)稱典雅文風(fēng)的樣本。庫(kù)爺爺一頭銀發(fā),身材頎長(zhǎng),總是面帶謙和的微笑,頗有仙風(fēng)道骨,正好和他的仙文
相配的說(shuō)。
高爺爺其實(shí)還是開源運(yùn)動(dòng)的先驅(qū)。雖然他沒(méi)有象Richard
Stallman那樣八方奔走,但他捐獻(xiàn)了好多作品,都可以在網(wǎng)上看到,比如著名的Mathematical
Writing,MMIXWare,The Tex Book等,更不用說(shuō)足以讓他流芳百世的Tex樂(lè)。
Ken
Thompson,C語(yǔ)言前身B語(yǔ)言的作者,Unix的發(fā)明人之一(另一個(gè)是Dennis M.
Riche老大,被尊為DMR),Belle(一個(gè)厲害的國(guó)際象棋程序)的作者之一, 操作系統(tǒng)Plan 9的主要作者(另一個(gè)是大牛人Rob
Pike,
前不久被google挖走了)。Ken爺爺也算是計(jì)算機(jī)歷史上開天辟地的人物了。1969年還是計(jì)算機(jī)史前時(shí)代,普通人都認(rèn)為只有大型機(jī)才能運(yùn)行通用的操
作系統(tǒng),小型機(jī)只有高山仰止的份兒。至于用高級(jí)語(yǔ)言來(lái)寫操作系統(tǒng),更是笑談。Ken爺爺自然不是池中物,于是他和DMR怒了,在1969年到1970間用
匯編在PDP-7上寫出了UNIX的第一個(gè)版本。他們并不知道,一場(chǎng)轟轟烈烈的UNIX傳奇由此拉開了序幕。Ken爺爺在1971年又把Unix用C重
寫,于是C在隨后20年成就了不知多少豪杰的夢(mèng)想和光榮。
Ken爺爺還有段佳話:
裝了UNIX的PDP-11最早被安裝在Bell Lab里供大家日常使用。很快大家就發(fā)現(xiàn)Ken爺爺總能進(jìn)入他們的帳戶,獲得最高權(quán)限。Bell
Lab里的科學(xué)家都心比天高,當(dāng)然被搞得郁悶無(wú)比。于是有高手怒了,跳出來(lái)分析了UNIX代碼,找到后門,修改代碼,然后重新編譯了整個(gè)UNIX。就在大
家都以為“這個(gè)世界清凈了”的時(shí)候,他們發(fā)現(xiàn)Ken爺爺還是輕而易舉地拿到他們的帳戶權(quán)限,百思不解后,只好繼續(xù)郁悶。誰(shuí)知道這一郁悶,就郁悶了14年,
直到Ken爺爺?shù)莱鰝€(gè)中緣由。原來(lái),代碼里的確有后門,但后門不在Unix代碼里,而在編譯Unix代碼的C編譯器里。每次C編譯器編譯UNIX的代碼,
就自動(dòng)生成后門代碼。而整個(gè)Bell Lab的人,都是用Ken爺爺?shù)腃編譯器。:D
多新手學(xué)習(xí)嵌入式系統(tǒng),不清楚那么多方向舵知識(shí)和參考書,該從哪里開始學(xué)習(xí)。入手了,卻又在該先學(xué)習(xí)什么后學(xué)習(xí)什么上失去方向。這里有你想要的答案,幫你指點(diǎn)迷經(jīng)。
這是我在ITjob培訓(xùn)網(wǎng)上找到的課程大綱,覺(jué)得作為嵌入式系統(tǒng)開發(fā)的學(xué)習(xí)步驟,按部就班地去施行和學(xué)習(xí),到不失為一種好的學(xué)習(xí)方法:)
隨著現(xiàn)代社會(huì)信息化進(jìn)程的加快,嵌入式系統(tǒng)被廣泛的地應(yīng)用于軍事、家用、工業(yè)、商業(yè)、辦公、醫(yī)療等社會(huì)各個(gè)方
面,表現(xiàn)出很強(qiáng)的投資價(jià)值。從國(guó)際范圍來(lái)看,作為數(shù)字化電子信息產(chǎn)品核心的嵌入式系統(tǒng)目前其硬件和軟件開發(fā)工具市場(chǎng)已經(jīng)突破2000億美元,嵌入式系統(tǒng)帶
來(lái)的全球工業(yè)年產(chǎn)值更是達(dá)到了一萬(wàn)億美元,隨著全球經(jīng)濟(jì)的持續(xù)增長(zhǎng)以及信息化的加速發(fā)展,嵌入式系統(tǒng)市場(chǎng)必將進(jìn)一步增長(zhǎng)。
本課程是為了適應(yīng)目前發(fā)展迅速的嵌入式Linux需求而設(shè)計(jì),課程目標(biāo)是讓學(xué)員達(dá)到適應(yīng)嵌入式應(yīng)用軟件開發(fā)、嵌入式系統(tǒng)開發(fā)或嵌入式驅(qū)動(dòng)開發(fā)的基本素質(zhì)。
課程循序漸進(jìn)的帶領(lǐng)您嵌入式開發(fā)的世界,采用了目前應(yīng)用最廣泛的軟硬件開發(fā)平臺(tái)(Linux和Arm),可以保證您盡量貼近目前企業(yè)需求。
學(xué)習(xí)步驟如下:(一步步來(lái)哦:)
1、Linux
基礎(chǔ)
安裝Linux操作系統(tǒng)
Linux文件系統(tǒng)
Linux常用命令
Linux啟動(dòng)過(guò)程詳解
熟悉Linux服務(wù)
能夠獨(dú)立安裝Linux操作系統(tǒng)
能夠熟練使用Linux系統(tǒng)的基本命令
認(rèn)識(shí)Linux系統(tǒng)的常用服務(wù)
安裝Linux操作系統(tǒng)
Linux基本命令實(shí)踐
設(shè)置Linux環(huán)境變量
定制Linux的服務(wù)
Shell 編程基礎(chǔ)
使用vi編輯文件
使用Emacs編輯文件
使用其他編輯器
2、Shell
編程基礎(chǔ)
Shell簡(jiǎn)介
認(rèn)識(shí)后臺(tái)程序
Bash編程
熟悉Linux系統(tǒng)下的編輯環(huán)境
熟悉Linux下的各種Shell
熟練進(jìn)行shell編程
熟悉vi基本操作
熟悉Emacs的基本操作
比較不同shell的區(qū)別
編寫一個(gè)測(cè)試服務(wù)器是否連通的shell腳本程序
編寫一個(gè)查看進(jìn)程是否存在的shell腳本程序
編寫一個(gè)帶有循環(huán)語(yǔ)句的shell腳本程序
3、Linux
下的 C 編程基礎(chǔ)
linux
C語(yǔ)言環(huán)境概述
Gcc使用方法
Gdb調(diào)試技術(shù)
Autoconf
Automake
Makefile
代碼優(yōu)化 熟悉Linux系統(tǒng)下的開發(fā)環(huán)境
熟悉Gcc編譯器
熟悉Makefile規(guī)則
編寫Hello,World程序
使用
make命令編譯程序
編寫帶有一個(gè)循環(huán)的程序
調(diào)試一個(gè)有問(wèn)題的程序
4、嵌入式系統(tǒng)開發(fā)基礎(chǔ)
嵌入式系統(tǒng)概述
交叉編譯
配置TFTP服務(wù)
配置NFS服務(wù)
下載Bootloader和內(nèi)核
嵌入式Linux應(yīng)用軟件開發(fā)流程
熟悉嵌入式系統(tǒng)概念以及開發(fā)流程
建立嵌入式系統(tǒng)開發(fā)環(huán)境
制作cross_gcc工具鏈
編譯并下載U-boot
編譯并下載Linux內(nèi)核
編譯并下載Linux應(yīng)用程序
4、嵌入式系統(tǒng)移植
Linux內(nèi)核代碼
平臺(tái)相關(guān)代碼分析
ARM平臺(tái)介紹
平臺(tái)移植的關(guān)鍵技術(shù)
移植Linux內(nèi)核到
ARM平臺(tái) 了解移植的概念
能夠移植Linux內(nèi)核
移植Linux2.6內(nèi)核到
ARM9開發(fā)板
5、嵌入式 Linux
下串口通信
串行I/O的基本概念
嵌入式Linux應(yīng)用軟件開發(fā)流程
Linux系統(tǒng)的文件和設(shè)備
與文件相關(guān)的系統(tǒng)調(diào)用
配置超級(jí)終端和MiniCOM
能夠熟悉進(jìn)行串口通信
熟悉文件I/O
編寫串口通信程序
編寫多串口通信程序
6、嵌入式系統(tǒng)中多進(jìn)程程序設(shè)計(jì)
Linux系統(tǒng)進(jìn)程概述
嵌入式系統(tǒng)的進(jìn)程特點(diǎn)
進(jìn)程操作
守護(hù)進(jìn)程
相關(guān)的系統(tǒng)調(diào)用
了解Linux系統(tǒng)中進(jìn)程的概念
能夠編寫多進(jìn)程程序
編寫多進(jìn)程程序
編寫一個(gè)守護(hù)進(jìn)程程序
sleep系統(tǒng)調(diào)用
任務(wù)管理、同步與通信 Linux任務(wù)概述
任務(wù)調(diào)度
管道
信號(hào)
共享內(nèi)存
任務(wù)管理 API
了解Linux系統(tǒng)任務(wù)管理機(jī)制
熟悉進(jìn)程間通信的幾種方式
熟悉嵌入式Linux中的任務(wù)間同步與通信
編寫一個(gè)簡(jiǎn)單的管道程序?qū)崿F(xiàn)文件傳輸
編寫一個(gè)使用共享內(nèi)存的程序
7、嵌入式系統(tǒng)中多線程程序設(shè)計(jì)
線程的基礎(chǔ)知識(shí)
多線程編程方法
線程應(yīng)用中的同步問(wèn)題
了解線程的概念
能夠編寫簡(jiǎn)單的多線程程序
編寫一個(gè)多線程程序
8、嵌入式 Linux
網(wǎng)絡(luò)編程
網(wǎng)絡(luò)基礎(chǔ)知識(shí)
嵌入式Linux中TCP/IP網(wǎng)絡(luò)結(jié)構(gòu)
socket 編程
常用 API函數(shù)
分析Ping命令的實(shí)現(xiàn)
基本UDP套接口編程
許可證管理
PPP協(xié)議
GPRS
了解嵌入式Linux網(wǎng)絡(luò)體系結(jié)構(gòu)
能夠進(jìn)行嵌入式Linux環(huán)境下的socket
編程
熟悉UDP協(xié)議、PPP協(xié)議
熟悉GPRS
使用socket 編寫代理服務(wù)器
使用socket
編寫路由器
編寫許可證服務(wù)器
指出TCP和UDP的優(yōu)缺點(diǎn)
編寫一個(gè)web服務(wù)器
編寫一個(gè)運(yùn)行在
ARM平臺(tái)的網(wǎng)絡(luò)播放器
9、GUI
程序開發(fā)
GUI基礎(chǔ)
嵌入式系統(tǒng)GUI類型
編譯QT
進(jìn)行QT開發(fā)
熟悉嵌入式系統(tǒng)常用的GUI
能夠進(jìn)行QT編程
使用QT編寫“Hello,World”程序
調(diào)試一個(gè)加入信號(hào)/槽的實(shí)例
通過(guò)重載QWidget
類方法處理事件
10、Linux
字符設(shè)備驅(qū)動(dòng)程序
設(shè)備驅(qū)動(dòng)程序基礎(chǔ)知識(shí)
Linux系統(tǒng)的模塊
字符設(shè)備驅(qū)動(dòng)分析
fs_operation結(jié)構(gòu)
加載驅(qū)動(dòng)程序
了解設(shè)備驅(qū)動(dòng)程序的概念
了解Linux字符設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)
能夠編寫字符設(shè)備驅(qū)動(dòng)程序
編寫Skull驅(qū)動(dòng)
編寫鍵盤驅(qū)動(dòng)
編寫I/O驅(qū)動(dòng)
分析一個(gè)看門狗驅(qū)動(dòng)程序
對(duì)比Linux2.6內(nèi)核與2.4內(nèi)核中字符設(shè)備驅(qū)動(dòng)的不同
Linux 塊設(shè)備驅(qū)動(dòng)程序
塊設(shè)備驅(qū)動(dòng)程序工作原理
典型的塊設(shè)備驅(qū)動(dòng)程序分析
塊設(shè)備的讀寫請(qǐng)求隊(duì)列
了解Linux塊設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)
能夠編寫簡(jiǎn)單的塊設(shè)備驅(qū)動(dòng)程序
比較字符設(shè)備與塊設(shè)備的異同
編寫MMC卡驅(qū)動(dòng)程序
分析一個(gè)文件系統(tǒng)
對(duì)比Linux2.6內(nèi)核與2.4內(nèi)核中塊設(shè)備驅(qū)動(dòng)的不同
11、文件系統(tǒng)
虛擬文件系統(tǒng)
文件系統(tǒng)的建立
ramfs內(nèi)存文件系統(tǒng)
proc文件系統(tǒng)
devfs 文件系統(tǒng)
MTD技術(shù)簡(jiǎn)介
MTD塊設(shè)備初始化
MTD塊設(shè)備的讀寫操作
了解Linux系統(tǒng)的文件系統(tǒng)
了解嵌入式Linux的文件系統(tǒng)
了解MTD技術(shù)
能夠編寫簡(jiǎn)單的文件系統(tǒng)
為 ARM9開發(fā)板添加
MTD支持
移植JFFS2文件系統(tǒng)
通過(guò)proc文件系統(tǒng)修改操作系統(tǒng)參數(shù)
分析romfs
文件系統(tǒng)源代碼
創(chuàng)建一個(gè)cramfs
文件系統(tǒng)
轉(zhuǎn)眼間,從事程序員這一行已經(jīng)兩年半了。
記得上中學(xué)的時(shí)候,剛接觸了電腦,在體驗(yàn)了Windows得神奇以后,我就開始立志,希望將來(lái)能成為一個(gè)軟件工程師。那時(shí),在我的每本課本得第一頁(yè),除了會(huì)寫上我自己的名字以外,還會(huì)有一行用鋼筆寫下的黑體字 “我的未來(lái),我的Microsoft” 。
大學(xué)畢業(yè)以后進(jìn)入一家普通的軟件公司,渾渾噩噩得過(guò)著Coding & Debug 的日子。不知道工作是為了誰(shuí),也不知道工作是為了什么,只知道我只是一個(gè)程序員。人沒(méi)有目標(biāo)和理想,就是行尸走肉,而我,就是這樣一個(gè)臭皮囊,已經(jīng)恍惚了這么多年。
有一天,終于又重新打開求職的網(wǎng)頁(yè),又看到了那個(gè)從前在心目中無(wú)比神圣的Logo,那個(gè)永遠(yuǎn)的Microsoft。
我終于明白了那時(shí)的夢(mèng)想。其實(shí)我真正想要的,就是能夠像Microsoft一樣,能夠被更多的人需要,能夠?qū)θ藗兊纳钣蟹e極得影響,這才是我工作和人生的價(jià)值。
覺(jué)得為時(shí)已晚的時(shí)候,恰恰是最早的時(shí)候。
還好,我還年輕。
我的未來(lái),我的Microsoft。