最近參與的工作有在玩 Kernel 的部份,首先要做兩個 Kernel Module 的常見任務介紹:
1. Module 帶入 Parameter 的部份.
其實也很簡單,在 module 定義 macclone 這個變數,再用 module_param 帶入它的值。
static short int macclone = 1;
module_param(macclone, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(macclone, "An Short");
int init_module(void)
{
struct net_device *ndev = NULL;
printk("a = '%d'\n", macclone);
應用時,是用
sudo insmod hello macclone=1
這樣帶進去的。詳細的部份,可以參考
LinuxTopia (中文是翻作 「Linux 討皮癢」嗎?)上面的說明。
2. C code 裡面應用 Little Endian 和 Big Endian 的部份.
單純的 C code 如果要應用 Little Endian 和 Big Endian 的分別其實可以直接 include endian.h 就可以:
#include <stdio.h>
#include <endian.h>
int
main()
{
#ifdef LITTLE_ENDIAN
printf("little\n");
#else
printf("big\n");
#endif
return 0;
}
如果沒有 endian.h 可以用,像是在 kernel 裡面決定 endian (下面我不確定是最佳解...),可以用在
這邊 的 blog 提到
IBM 網站上找到的資料:
const int endian = 1;
#define is_bigendian() ( (*(char*)&endian) == 0 )
union {
int val;
unsigned char c[sizeof(int)];
}u;
--
參考網址:
。
關於 little endian 和 big endian
。
Big Endian 和 Little Endian
。
Linuxtopia