linux永久連結與軟連結 linux asm 檔案

來源:互聯網
上載者:User

今天閱讀嵌入式linux LED驅動程式的時候

驅動實現部分是搞清楚了

但是幾個標頭檔的路徑真的把我搞糊塗了LINUX 2.6.13檔案組織如下


標頭檔如下


#include <asm/irq.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>


可我根本就找不到ARM對應的asm這個檔案夾,或者說找到了也對應的不是對應S3C24XX的

後來無意間看核心移植的一篇文章講了連結的執行個體

所以asm檔案應該也是一個串連,那麼一切就說的通了


asm檔案串連到\kernel-2.6.13\include\asm-arm檔案夾下

#include <asm/irq.h>                                        ==\kernel-2.6.13\include\asm-arm\irq.h
#include <asm/arch/regs-gpio.h>                  ==kernel-2.6.13\include\asm-arm\arch-s3c2410\regs-gpio.h
#include <asm/hardware.h>                           ==\kernel-2.6.13\include\asm-arm\hardware.h


所以我猜測如果你看到

#include <mach/regs-gpio.h>

可能意思是

mach  ==kernel-2.6.13\arch\arm\mach-s3c2410

#include <linux/interrupt.h>           作業系統中斷#include <asm/uaccess.h>               與處理器相關的入口//#include <asm/arch/regs-gpio.h>          與處理器相關的IO口操作#include <mach/regs-gpio.h>                   同上//#include <asm/hardware.h>                 與處理器相關的硬體#include <mach/hardware.h>                   同上

http://www.cnblogs.com/sonic4x/archive/2011/08/05/2128543.html
linux永久連結與軟連結

1.Linux連結概念
Linux連結分兩種,一種被稱為永久連結(Hard Link),另一種被稱為符號連結(Symbolic Link)。預設情況下,ln命令產生永久連結。

【硬串連】
硬串連指通過索引節點來進行串連。在Linux的檔案系統中,儲存在磁碟分割中的檔案不管是什麼類型都給它分配一個編號,稱為索引節點號(Inode Index)。在Linux中,多個檔案名稱指向同一索引節點是存在的。一般這種串連就是硬串連。硬串連的作用是允許一個檔案擁有多個有效路徑名,這樣使用者就可以建立硬串連到重要檔案,以防止“誤刪”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的串連。只刪除一個串連並不影響索引節點本身和其它的串連,只有當最後一個串連被刪除後,檔案的資料區塊及目錄的串連才會被釋放。也就是說,檔案真正刪除的條件是與之相關的所有硬串連檔案均被刪除。

硬串連的2個限制:

l  不允許給目錄建立永久連結

l  只有在同一檔案系統中的檔案之間才能建立連結。 即不同硬碟分區上的兩個檔案之間不能夠建立永久連結。這是因為永久連結是通過結點指向原始檔案的,而檔案的i-結點在不同的檔案系統中可能會不同。

 

【軟串連】
另外一種串連稱之為符號串連(Symbolic Link),也叫軟串連。軟連結檔案有類似於Windows的捷徑。它實際上是一個特殊的檔案。在符號串連中,檔案實際上是一個文字檔,其中包含的有另一檔案的位置資訊。

      這就允許符號連結(經常簡寫為symlinks)指向位於其他分區、甚至是其他網路硬碟上的某個檔案

 

2.通過實驗加深理解
[oracle@Linux]$ touch f1          #建立一個測試檔案f1
[oracle@Linux]$ ln f1 f2          #建立f1的一個硬串連檔案f2
[oracle@Linux]$ ln -s f1 f3       #建立f1的一個符號串連檔案f3
[oracle@Linux]$ ls -li            # -i參數顯示檔案的inode節點資訊
total 0
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

從上面的結果中可以看出,硬串連檔案f2與原檔案f1的inode節點相同,均為9797648,然而符號串連檔案的inode節點不同。

[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory

通過上面的測試可以看出:當刪除原始檔案f1後,硬串連f2不受影響,但是符號串連f3檔案無效

3.總結
依此您可以做一些相關的測試,可以得到以下全部結論:
1).刪除符號串連f3,對f1,f2無影響;
2).刪除硬串連f2,對f1,f3也無影響;
3).刪除原檔案f1,對硬串連f2沒有影響,導致符號串連f3失效;
4).同時刪除原檔案f1,硬串連f2,整個檔案會真正的被刪除。

下面是一個簡單的LED驅動程式執行個體

http://blog.mcuol.com/User/gaochengnan/Article/13406_1.htm

另外可參考

http://hi.baidu.com/tekuba/item/d72e32eb8f19713d86d9de94

http://longer.spaces.eepw.com.cn/articles/article/item/60415

led驅動實驗源碼gaoled.c: #include "linux/config.h"#include "linux/module.h"#include "linux/kernel.h"#include "linux/fs.h"#include "linux/init.h"#include "linux/devfs_fs_kernel.h"#include "linux/miscdevice.h"#include "linux/delay.h"#include "asm/irq.h"#include "asm/arch/regs-gpio.h"#include "asm/hardware.h" #define DEVICE_NAME  "gcnled"           //定義裝置名稱#define LED_MAJOR 250                  //手動定義主裝置號 MODULE_AUTHOR("gcn");MODULE_DESCRIPTION("S3C2440 LED Driver");MODULE_LICENSE("GPL"); //定義要操作的裝置,把每一個led作為結構體的一個成員static unsigned long led_table [] ={              S3C2410_GPF4,    S3C2410_GPF5,    S3C2410_GPF6,    S3C2410_GPF7,};//對裝置進行設定,此即5個管腳為輸出口static unsigned int led_cfg_table [] ={    S3C2410_GPF4_OUTP,    S3C2410_GPF5_OUTP,    S3C2410_GPF6_OUTP,    S3C2410_GPF7_OUTP,};/*編寫s3c2440_led_ioctl函數:裝置驅動程式中對裝置的I/O通道進行管理的函數,用來實現對led的操作*/是整個驅動程式的核心*/static int s3c2440_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){ if (arg > 3){           return -EINVAL;          }led(cmd){           case 0:           case 1:          s3c2410_gpio_setpin(led_table[arg], !cmd);           return 0;           default:           return -EINVAL;         }}//定義s3c2440_led_fops:結構體提供基本函數進入點static struct file_operations s3c2440_leds_fops =    {        .owner =   THIS_MODULE,        .ioctl =   s3c2440_leds_ioctl,};//模組載入函數static int __init s3c2440_leds_init(void){    int ret;    int i;//註冊裝置號/* register_chrdev是註冊字元裝置的函數*/    ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&s3c2440_leds_fops);    if (ret < 0){             printk(DEVICE_NAME " can''''''''''''''''''''''''''''''''t register major number\n");             return ret;           }/* 2.6核心驅動註冊完後,要用以下代碼建立裝置檔案*/devfs_mk_cdev(MKDEV(LED_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);for (i = 0; i < 4; i++){s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);/*相當於open函數將相應連接埠設定為輸出口*/s3c2410_gpio_setpin(led_table[i], 1);/*連接埠置1*/}printk(DEVICE_NAME " initialized\n");/*列印出驅動載入成功的資訊*/    return 0;}//模組卸載函數static void __exit s3c2440_leds_exit(void){    devfs_remove(DEVICE_NAME);/* 2.6核心驅動要用以下代碼移除裝置檔案*/    unregister_chrdev(LED_MAJOR, DEVICE_NAME);}//指定驅動程式的初始化函數和卸載函數module_init(s3c2440_leds_init);module_exit(s3c2440_leds_exit);  把gaoled.c考入核心目錄下的/devices/char目錄下修改該目錄下的makefile:Obj-m += gaoled.o在核心根目錄下運行make modules會發現產生了gaoled.ko檔案接下來把gaoled.ko轉移到開發板上(我是直接用優盤考出來在開發板上掛載的)在gaoled.c目錄下運行 insmod gaoled.ko列印出gcnled initialized成功!查看是否成功可以在開發板上進入/ proc下執行cat devices 可以看到 250 gcnled注意:編譯產生.ko檔案是在pc機完成的。          然後在開發板上載入模組insmod xxx.ko  出現問題:devices busy 裝置忙碌什麼的因為主裝置號重複了!我剛開始用的231 改成250之後就好了 以上均親身實踐測試程式通過 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.