[Programming] Vấn đề write_handler trong lập trình kernel |
13/07/2010 18:21:00 (+0700) | #1 | 215256 |
|
nvmanh1990
Member
|
0 |
|
|
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
|
|
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
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. |
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 04:09:53 (+0700) | #2 | 215267 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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. |
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 05:51:58 (+0700) | #3 | 215271 |
|
nvmanh1990
Member
|
0 |
|
|
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
|
|
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. |
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 06:27:39 (+0700) | #4 | 215272 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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. |
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 07:15:32 (+0700) | #5 | 215276 |
|
nvmanh1990
Member
|
0 |
|
|
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
|
|
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 .
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. |
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 12:06:54 (+0700) | #6 | 215305 |
TQN
Elite Member
|
0 |
|
|
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
|
|
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. |
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 16:39:26 (+0700) | #7 | 215330 |
|
nvmanh1990
Member
|
0 |
|
|
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
|
|
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 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 ?
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
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
Nhất là phần struct rw_semaphore
Thân.
|
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 17:17:53 (+0700) | #8 | 215332 |
vietwow
Member
|
0 |
|
|
Joined: 28/06/2006 13:15:47
Messages: 90
Offline
|
|
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
Thanx |
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 19:10:58 (+0700) | #9 | 215336 |
|
nvmanh1990
Member
|
0 |
|
|
Joined: 28/07/2008 17:51:00
Messages: 78
Offline
|
|
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
Thanx
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");
|
|
|
|
|
[Programming] Vấn đề write_handler trong lập trình kernel |
14/07/2010 22:22:44 (+0700) | #10 | 215353 |
vietwow
Member
|
0 |
|
|
Joined: 28/06/2006 13:15:47
Messages: 90
Offline
|
|
Thanx bạn |
|
|
|