banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Vấn đề write_handler trong lập trình kernel  XML
  [Programming]   Vấn đề write_handler trong lập trình kernel 13/07/2010 18:21:00 (+0700) | #1 | 215256
[Avatar]
nvmanh1990
Member

[Minus]    0    [Plus]
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
[Profile] [PM] [Yahoo!]
Em mới học lập trình trong kernel.
Hiện tại em đang vướng ở bài làm việc với file.
Đề bài đưa ra là:
Tạo một module. Trong module khai báo 1 buffer.
Khi insmod module thì tạo file file4 trong thư mục /sys/test

Vấn đề của em là mỗi khi người dùng ghi vào file một chuỗi thì em muốn buffer trong module của em chứa đúng chuỗi đó.
Ví dụ: $ echo abc123 > /sys/test/file4
thì buffer sẽ chứa chuỗi sau: “abc123”.

Nhưng em làm thì không buffer không chỉ lưu chuỗi người dùng ghi vào file mà nó còn có các ký tự lạ đằng sau.
Vậy em chỉ muốn buffer là chuỗi mà người dùng nhập vào thì phải làm sao ạ?

Đây là hàm handler em làm smilie

Code:
static ssize_t write_handlerFile4(struct kobject *kobj, struct bin_attribute *battr, char *buf, loff_t off, size_t len)
{
        int i;
        int leng;
        leng = len;
        kfree(buffer);
        buffer = kmalloc(leng,GFP_KERNEL)
        
        for (i = 0; i < leng ; i ++) {
                buffer[i] = buf[i];
        }
        if (off >= len)
                return 0;
        else
                return len;
}


Em mới học nên chưa hiểu sâu và rõ, có nhiều vấn đề có thể hiểu sai. Mong các bác giúp đỡ.
Có gì sai hoặc hiểu chưa đúng xin được nghe các bác đóng góp.
Thân.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 04:09:53 (+0700) | #2 | 215267
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Em muốn có kết quả trả về là buffer mà sao em lại trả về len?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 05:51:58 (+0700) | #3 | 215271
[Avatar]
nvmanh1990
Member

[Minus]    0    [Plus]
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
[Profile] [PM] [Yahoo!]
buffer của em là biến toàn cục. Vì thế em đã tự lấy giá trị của buffer trong hàm qua vòng for rồi.
Việc trả lại giá trị cho hàm là 0 để hàm dừng lại và trả len để hàm tiếp tục việc ghi dữ liệu.
Theo em biết thì khi ko có lỗi xảy ra, write handler phải trả về số bytes đã được ghi vào file thành công để Kernel core tăng vị trí của con trỏ ghi file lên 1 giá trị tương ứng.
Thân.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 06:27:39 (+0700) | #4 | 215272
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

nvmanh1990 wrote:
buffer của em là biến toàn cục. Vì thế em đã tự lấy giá trị của buffer trong hàm qua vòng for rồi.
Việc trả lại giá trị cho hàm là 0 để hàm dừng lại và trả len để hàm tiếp tục việc ghi dữ liệu.
Theo em biết thì khi ko có lỗi xảy ra, write handler phải trả về số bytes đã được ghi vào file thành công để Kernel core tăng vị trí của con trỏ ghi file lên 1 giá trị tương ứng.
Thân. 


.... nhưng rốt cuộc em cho nó "return" cái gì?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 07:15:32 (+0700) | #5 | 215276
[Avatar]
nvmanh1990
Member

[Minus]    0    [Plus]
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
[Profile] [PM] [Yahoo!]
Em cũng chưa hiểu return lắm. Nhưng theo em biết thì hàm này sẽ dừng ghi khi return 0 và tiếp tục ghi nếu return giá trị khác 0 . smilie
Vd như hàm read handler của em
Code:
static ssize_t read_handler(struct kobject *kobj,struct bin_attribute *battr, char *buf, loff_t off, size_t len) 
{
        strcpy(buf,buffer);
        len = strlen(buffer);
        if (off >= len)
                return 0;
        else
              return len;  
}

Khi người dùng đọc file file 4 thì sẽ nhận được chuỗi trả về trong buffer.
Thân.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 12:06:54 (+0700) | #6 | 215305
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Code:
for (i = 0; i < len ; i ++) {
    buffer[i] = buf[i];
}
buffer[len] = 0;

Do code cũ của cậu không có 0 ở cuối buffer (0 = báo hết chuỗi).
Code cậu chưa kiểm tra kỹ tính hợp lệ hay bất thường của các inpurt parameter.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 16:39:26 (+0700) | #7 | 215330
[Avatar]
nvmanh1990
Member

[Minus]    0    [Plus]
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
[Profile] [PM] [Yahoo!]
Thanks các anh trả lời ^^!
Em hôm nay sửa lại và đã đọc và ghi file ok. Nhưng vấn đề là hàm read_handler chỉ đọc được mỗi lần tối đa là 4096 byte.
Nhưng nếu như buffer có độ lớn > 4096 thì chết cứng smilie Do không thể memcpy được khi dữ liệu copy lớn hơn nơi copy.
Ai giúp em phần này được không ? smilie
Tức là khi dữ liệu cần đọc lớn hơn 4096 thì hàm read_handler sẽ đọc 4096 byte đầu tiên và tiếp tục đọc đến khi hết byte cần đọc. Mỗi lần đọc thì biến off chỉ thanh đọc đang đọc đến đâu.
VD như buffer trong module của em chưa 8000 byte.
Lần 1 đọc thì hàm read_handler sẽ đọc ra là 4096 byte. Và khi đó off sẽ là 4096.
Lần 2 thì hàm read_handler sẽ đọc tiếp phần còn lại tong buffer và bắt đàu đọc từ off ( Tức là đọc từ byte 4096 -> hết).
2 hàm read và write em viết smilie
Code:
static ssize_t read_handler(struct kobject *kobj,struct bin_attribute *battr, char *buf, loff_t off, size_t len) 
{
        memcpy(buf,buffer, count);

        if (off > 0)
	        return 0;
        else
                return count;
}

static ssize_t write_handler(struct kobject *kobj, struct bin_attribute *battr, char *buf, loff_t off, size_t len)
{
        memcpy(buffer,buf,len);
        count = len  ;

        return len;
}

Biến count là biến chứa số phần tử lưu trong buffer.
Nhân tiện cho em hỏi bác nào có tài liệu hoặc code mẫu về phần lock/semaphore trong kernel cho em xin smilie
Nhất là phần struct rw_semaphore smilie
Thân.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 17:17:53 (+0700) | #8 | 215332
vietwow
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 13:15:47
Messages: 90
Offline
[Profile] [PM]
Hi nvmanh1990,

Ko biết bạn có thể post full source code của chương trình này ko ? Vì mình cũng đang tập lập trình kernel smilie

Thanx smilie
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 19:10:58 (+0700) | #9 | 215336
[Avatar]
nvmanh1990
Member

[Minus]    0    [Plus]
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
[Profile] [PM] [Yahoo!]

vietwow wrote:
Hi nvmanh1990,

Ko biết bạn có thể post full source code của chương trình này ko ? Vì mình cũng đang tập lập trình kernel smilie

Thanx smilie 

Của bạn đây ^^!
Có gì hay ho share mình với ^^!
Y!M mình : nvmanh1990
Code:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sysfs.h>

struct kset *test_subsys;  
struct kobject *koObjDir1;

#define MAX 100
char *buffer;
int count;

int flag = 0;

static ssize_t read_handlerFile4(struct kobject *kobj,struct bin_attribute *battr, char *buf, loff_t off, size_t len) ;
static ssize_t write_handlerFile4(struct kobject *kobj, struct bin_attribute *battr, char *buf, loff_t off, size_t len);

static struct bin_attribute file4 = { // file 4
          .attr = {
            .owner = THIS_MODULE,
            .mode  = 0666,
            .name  = "file4",
          },
          .read = read_handlerFile4,
          .write = write_handlerFile4,
};


static int hello_start (void) 
{
    int err;
	buffer = kmalloc(MAX,GFP_KERNEL);
	if (!buffer) {
	        printk("can't malloc");
	        return 0;
	}
	
	memset(buffer,'A',MAX);
	count = MAX;

    test_subsys = kset_create_and_add("test",NULL,NULL); // create subder test
    if (!test_subsys) {
            return -ENOMEM;
    }
    flag++;
    koObjDir1   = kobject_create_and_add("dir1",&test_subsys->kobj); // create dir dir1
    if (!koObjDir1) {
            kset_unregister(test_subsys); // del subdir test
            return -ENOMEM;
    }
    flag++;
    err = sysfs_create_bin_file(koObjDir1, &file4); // create file4
    if (err) {
            kobject_del(koObjDir1);
            kset_unregister(test_subsys);
            return err;
    }
    flag++;
	return 1;
}

static void hello_end (void)
{
        if (flag == 3) {
                sysfs_remove_bin_file(koObjDir1, &file4); 
                kobject_del(koObjDir1);
                kset_unregister(test_subsys);
        }
        kfree(buffer);
	printk("This modules is close ^^!\n");
}

static ssize_t read_handlerFile4(struct kobject *kobj,struct bin_attribute *battr, char *buf, loff_t off, size_t len) 
{
        memcpy(buf,buffer, count);

        if (off > 0)
	        return 0;
        else
                return count;
}

static ssize_t write_handlerFile4(struct kobject *kobj, struct bin_attribute *battr, char *buf, loff_t off, size_t len)
{
        memcpy(buffer,buf,len);
        count = len  ;

        return len;
}

module_init(hello_start);
module_exit(hello_end);
MODULE_LICENSE("GPL");

[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 14/07/2010 22:22:44 (+0700) | #10 | 215353
vietwow
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 13:15:47
Messages: 90
Offline
[Profile] [PM]
Thanx bạn smilie
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 15/07/2010 03:57:59 (+0700) | #11 | 215355
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

nvmanh1990 wrote:

Nhân tiện cho em hỏi bác nào có tài liệu hoặc code mẫu về phần lock/semaphore trong kernel cho em xin smilie
Nhất là phần struct rw_semaphore smilie
Thân.
 


Có lẽ em nên thử:

http://www.complete.org/LinuxProgrammingBible/Downloads
http://linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=5
http://kernelnewbies.org/Documents/Kernel-Docbooks?action=AttachFile&do=get&target=kernel-locking_2.6.29.pdf

Đặc biệt trang này http://kernelnewbies.org/Documents/Kernel-Docbooks có nhiều tài liệu rất hay.

Cũng nên đọc cái này:
http://www.mjmwired.net/kernel/Documentation/mutex-design.txt

Có vài cuốn "Linux Programming" của đám No Starch và Wrox cũng hay nhưng anh không có e-book để share.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Programming]   Vấn đề write_handler trong lập trình kernel 02/12/2011 13:56:06 (+0700) | #12 | 250597
Ojunkyi
Member

[Minus]    0    [Plus]
Joined: 01/12/2011 21:20:16
Messages: 1
Offline
[Profile] [PM]
cho mình hỏi,ở chỗ khai bao cấu trúc :

bin_attribute {

.owner = THIS_MODULE,
...
}
nó luôn báo lỗi ở đó là:

unknown field ‘owner’ specified in initializer
warning: initialization from incompatible pointer type [enabled by default]
warning: (near initialization for ‘file4.attr.name’) [enabled by default]
warning: ‘file4’ defined but not used [-Wunused-variable]

mong mọi người giải đáp thắc mới sớm với .
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|