2016-03-29 14 views
18

Từ không gian người dùng, chúng tôi có thể sử dụng cpuset để thực sự cách ly một lõi cụ thể trong hệ thống của chúng tôi và chỉ thực hiện một quy trình cụ thể cho lõi đó.Phân tách hạt nhân thành một lõi cụ thể Sử dụng Cpuset

Tôi đang cố gắng làm điều tương tự với mô-đun hạt nhân. Vì vậy, tôi muốn các mô-đun để được thực hiện trong một lõi cô lập. Nói cách khác: Làm cách nào để sử dụng cpuset từ bên trong mô-đun hạt nhân? *

Sử dụng linux/cpuset.h trong mô-đun hạt nhân của tôi không hoạt động. Vì vậy, tôi có một mô-đun như thế này:

#include <linux/module.h> 
#include <linux/cpuset.h> 

... 
#ifdef CONFIG_CPUSETS 
    printk(KERN_INFO, "cpusets is enabled!"); 
#endif 
cpuset_init(); // this function is declared in cpuset.h 
... 

Khi cố gắng để tải mô-đun này, tôi nhận được (trong dmesg) được thông báo sau cpusets is enabled!. Nhưng tôi cũng nhận được thông báo Unknown symbol cpu_init (err 0).

Tương tự, tôi đã thử sử dụng sched_setaffinity từ linux/sched.h để di chuyển tất cả các procceses đang chạy đến một lõi cụ thể và sau đó chạy mô-đun của tôi đến một lõi riêng biệt. Tôi đã gặp lỗi tương tự như vậy: Unknown symbol sched_setaffinity (err 0). Tôi đoán tôi đã nhận được "biểu tượng không rõ" bởi vì những chức năng đó không có EXPORT_SYMBOL trong hạt nhân. Vì vậy, tôi đã đi và cố gắng gọi số sys_sched_setaffinitygọi hệ thống (dựa trên số này question) nhưng lại nhận được thông báo này: Unknown symbol sys_sched_setaffinity (err 0)!

Hơn nữa, tôi không tìm kiếm giải pháp sử dụng isolcpus, được đặt trong khi khởi động. Tôi chỉ muốn tải các mô-đun và sau đó các isolo xảy ra.

  • (chính xác hơn, tôi muốn đề hạt nhân của mình để thực hiện trong cô lập lõi. Tôi biết rằng tôi có thể sử dụng mối quan hệ để ràng buộc chủ đề đến lõi cụ thể, nhưng điều này không đảm bảo với tôi rằng các lõi sẽ được bị cô lập bởi các quy trình khác đang chạy trên chúng.)
+1

Đối với ràng buộc chủ đề hạt nhân cụ thể để lõi cụ thể, bạn có thể sử dụng [kthread_bind] (http://lxr.free-electrons.com/source/kernel/kthread.c#L366) hoặc [set_cpu_allowed_ptr] (http://lxr.free-electrons.com/source/kernel/sched/core.c#L1262). Để không cho phép các quy trình khác sử dụng lõi cụ thể, bạn cần phải định cấu hình lịch biểu bằng cách nào đó. Ví dụ: như được mô tả [ở đây] (http://unix.stackexchange.com/questions/186338/setting-system-wide-cpu-affinities-for-running-processes-on-a-linux-platform). – Tsyvarev

+2

Để thêm vào nhận xét của @ Tsyvarev: 'isolcpus' (tham số hạt nhân - xem Tài liệu/kernel-parameters.txt)" có thể được sử dụng để chỉ định một hoặc nhiều CPU tách biệt với các thuật toán cân bằng và lập lịch SMP chung. xử lý lên hoặc tắt một CPU "bị cô lập" thông qua các syscalls CPU hoặc cpuset. " –

+0

@Tsyvarev và @Gil Hamlton. Cảm ơn câu trả lời của bạn. Tôi biết 'kthread_bind'. Về các giải pháp được đề xuất: 'isolcpus' và' maxcpus', từ sự hiểu biết của tôi, các tham số đó nên được sử dụng trong khi khởi động. Tôi muốn cô lập mà không cần khởi động lại, trên thực tế, sự cô lập chỉ xảy ra khi mô-đun được tải, vì vậy tôi cảm thấy đây không phải là cách để đi. – insumity

Trả lời

7

Vì vậy, tôi muốn mô-đun được thực thi trong lõi riêng biệt.

thực sự cô lập một lõi cụ thể trong hệ thống của chúng tôi và thực hiện chỉ là một quy trình cụ thể để mà cốt lõi

Đây là một mã nguồn lao động biên soạn và thử nghiệm trên một hộp Debian sử dụng hạt nhân 3.16. Tôi sẽ mô tả làm thế nào để tải và dỡ bỏ đầu tiên và những gì tham số thông qua.

Tất cả các nguồn có thể được tìm thấy trên github đây ...

https://github.com/harryjackson/doc/tree/master/linux/kernel/toy/toy

Xây dựng và nạp module ...

make 
insmod toy param_cpu_id=2 

Để dỡ bỏ việc sử dụng mô-đun

rmmod toy 

Tôi không sử dụng modprobe vì nó mong đợi một số cấu hình, v.v.Tham số mà chúng tôi đang chuyển đến mô-đun hạt nhân toy là CPU mà chúng tôi muốn tách biệt. Không có thao tác thiết bị nào được gọi sẽ chạy trừ khi chúng đang thực thi trên CPU đó.

Khi các mô-đun được nạp, bạn có thể tìm thấy nó ở đây

/dev/toy 

hoạt động đơn giản như

cat /dev/toy 

tạo các sự kiện hạt nhân mô-đun bắt và tạo ra một số đầu ra. Bạn có thể xem kết quả bằng cách sử dụng dmesg.

Source code ...

#include <linux/module.h> 
#include <linux/fs.h> 
#include <linux/miscdevice.h> 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Harry"); 
MODULE_DESCRIPTION("toy kernel module"); 
MODULE_VERSION("0.1"); 
#define DEVICE_NAME "toy" 
#define CLASS_NAME "toy" 

static int param_cpu_id; 
module_param(param_cpu_id , int, (S_IRUSR | S_IRGRP | S_IROTH)); 
MODULE_PARM_DESC(param_cpu_id, "CPU ID that operations run on"); 

//static void bar(void *arg); 
//static void foo(void *cpu); 
static int  toy_open( struct inode *inodep, struct file *fp); 
static ssize_t toy_read( struct file *fp  , char *buffer, size_t len, loff_t * offset); 
static ssize_t toy_write( struct file *fp  , const char *buffer, size_t len, loff_t *); 
static int  toy_release(struct inode *inodep, struct file *fp); 

static struct file_operations toy_fops = { 
    .owner = THIS_MODULE, 
    .open = toy_open, 
    .read = toy_read, 
    .write = toy_write, 
    .release = toy_release, 
}; 

static struct miscdevice toy_device = { 
    .minor = MISC_DYNAMIC_MINOR, 
    .name = "toy", 
    .fops = &toy_fops 
}; 

//static int CPU_IDS[64] = {0}; 
static int toy_open(struct inode *inodep, struct file *filep) { 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "open: called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "open: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "open: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static ssize_t toy_read(struct file *filep, char *buffer, size_t len, loff_t *offset){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "read: called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "read: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "read: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static ssize_t toy_write(struct file *filep, const char *buffer, size_t len, loff_t *offset){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "write called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "write: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "write: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static int toy_release(struct inode *inodep, struct file *filep){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "release called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "release: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "release: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 

static int __init toy_init(void) { 
    int cpu_id; 
    if(param_cpu_id < 0 || param_cpu_id > 4) { 
    printk(KERN_INFO "toy: unable to load module without cpu parameter\n"); 
    return -1; 
    } 
    printk(KERN_INFO "toy: loading to device driver, param_cpu_id: %d\n", param_cpu_id); 
    //preempt_disable(); // See notes below 
    cpu_id = get_cpu(); 
    printk(KERN_INFO "toy init called and running on CPU: %d\n", cpu_id); 
    misc_register(&toy_device); 
    //preempt_enable(); // See notes below 
    put_cpu(); 
    //smp_call_function_single(1,foo,(void *)(uintptr_t) 1,1); 
    return 0; 
} 

static void __exit toy_exit(void) { 
    misc_deregister(&toy_device); 
    printk(KERN_INFO "toy exit called\n"); 
} 

module_init(toy_init); 
module_exit(toy_exit); 

Đoạn mã trên có chứa hai phương pháp mà bạn yêu cầu tức là cô lập của CPU và trên init chạy trên một lõi riêng biệt.

Bật init get_cpu vô hiệu hóa việc mua hàng tức là bất kỳ thứ gì xuất hiện sau hạt nhân sẽ không được hạt nhân nạp trước và sẽ chạy trên một lõi. Lưu ý, đây đã được thực hiện kernel sử dụng 3.16, mileage của bạn có thể thay đổi tùy thuộc vào phiên bản kernel của bạn nhưng tôi nghĩ rằng những của API đã được khoảng một thời gian dài

Đây là Makefile ...

obj-m += toy.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

Notes. get_cpu được khai báo trong linux/smp.h như

#define get_cpu() ({ preempt_disable(); smp_processor_id(); }) 
#define put_cpu() preempt_enable() 

do đó bạn không thực sự cần phải gọi preempt_disable trước khi gọi get_cpu. Cuộc gọi get_cpu là một wrapper quanh trình tự sau đây của các cuộc gọi ...

preempt_count_inc(); 
barrier(); 

và put_cpu được thực sự làm điều này ...

barrier(); 
if (unlikely(preempt_count_dec_and_test())) { 
    __preempt_schedule(); 
} 

Bạn có thể nhận được là ưa thích như bạn thích bằng cách sử dụng trên . Hầu như tất cả những điều này được lấy từ các nguồn sau đây ..

Google cho ... smp_call_function_single

Linux phát triển hạt nhân, cuốn sách của Robert Love.

http://derekmolloy.ie/writing-a-linux-kernel-module-part-2-a-character-device/

https://github.com/vsinitsyn/reverse/blob/master/reverse.c

+0

Sau 'kernel_thread', luồng có thể kẹp tới CPU đã cho bằng cách sử dụng lệnh' cpuset * '. Tuy nhiên, để buộc _all_ các luồng khác thành _not_ sử dụng CPU này sẽ [có thể] cần một thay đổi tùy chỉnh thành 'do_fork' có thể là vấn đề [rất lớn]. Giải pháp "đủ tốt" sẽ dành cho chuỗi đã cho để đặt trình lên lịch R/T và đặt mức ưu tiên R/T là 11 [giá trị an toàn - chỉ cao hơn nếu bạn dám]. Trong thực tế, điều này sẽ mang lại hiệu quả mong muốn như hầu hết mọi thứ khác sẽ không [có thể] chạy vì luồng sẽ bán độc quyền CPU với mức ưu tiên cao (er) –

0

Bạn có thử work_struct với

struct workqueue_attrs { 
cpumask_var_t   cpumask;  /* allowed CPUs */ 
} 

Trước hết cpu nên bị cô lập qua (ví dụ 0x1 cpu)

setenv bootargs isolcpus=\"0x1"\ 

và tiếp theo

struct lkm_sample { 
struct work_struct lkm_work_struct; 
struct workqueue_struct *lkm_wq_struct; 
... 
}; 
static struct lkm_sample lkm_smpl; 

static void work(struct work_struct *work) 
{ 
struct lkm_sample *tmp = container_of(work, struct lkm_sample,  lkm_work_struct); 
.... 
return; 
} 
static int __init lkm_init(void) 
{ 
//see:  https://lwn.net/Articles/540999/ 
lkm_smpl.lkm_wq_struct = create_singlethread_workqueue("you_wq_name"); 
INIT_WORK(&lkm_smpl.lkm_wq_struct, work); 
} 

Nếu bạn muốn bắt đầu (chạy __init) LKM trên cpu bị cô lập:

  1. setenv bootargs isolcpus = \ "0x1" \

  2. lsmod helper_module.ko với

    call_usermodehelper_setup struct subprocess_info * call_usermodehelper_setup (đường dẫn char *, char ** argv,/* taskset 0x00000001 helper_application */ char ** envp, gfp_t gfp_mask, int (* init) (struct subprocess_info * info, struct cred * new), void (* cleanup) (struct subprocess_info * info), void * data); Sử dụng mô-đun hạt nhân trợ giúp cần chạy chương trình không gian người dùng (helper_application) thông qua taskset và mặt nạ phải từ isolcpus. Mô-đun trợ giúp chỉ nên chạy hàm __init() và trả về -1 vì chỉ có một tác vụ: chạy ứng dụng không gian người dùng trên cpu bị cô lập.

  3. Ứng dụng trợ giúp người dùng không gian tiếp theo chỉ nên: lsmod cho goal_module.ko, goal_module sẽ bắt đầu trên cùng một CPU bị cô lập.

  4. Sử dụng phương pháp làm việc để tiếp tục chạy mô-đun bị cô lập trên cpu bị cô lập.

+0

Kiểm tra phần nhận xét trong câu hỏi của tôi. Tôi không tìm kiếm một giải pháp sử dụng 'isolcpus'. Tôi muốn cô lập chỉ khi tôi tải mô-đun. – insumity

+0

Bạn có muốn tách biệt CPU trong thời gian chạy không? Ví dụ bạn có thể for_each_process và trong vòng lặp nhận được cho mỗi task_struct PID và CPU, so sánh CPU với số bị cô lập và nếu đúng tiến trình di chuyển đúng cho bất kỳ CPU nào khác không bị cô lập. Và tiếp theo chạy work_struct trên CPU bị cô lập. – cosinus0

+0

Để di chuyển task_struct nhìn hình thức cpu ví dụ thành: > static void __migrate_swap_task (struct task_struct * p, int cpu) > void set_task_cpu (struct task_struct * p, unsigned int cpu) Để thiết cpu mast cho quá trình xem: > cpumask_t cpus_allowed; trong struct task_struct – cosinus0

2

Bạn chỉ trong câu hỏi của bạn:

Tôi đoán tôi có những "biểu tượng không rõ" vì những chức năng không có EXPORT_SYMBOL trong kernel

Tôi nghĩ rằng đây là điểm mấu chốt của vấn đề của bạn. Tôi thấy bạn đang bao gồm tệp linux/cpuset.h xác định phương thức: cpuset_init trong số các phương thức khác. Tuy nhiên, cả trong quá trình biên soạn và sử dụng lệnh nm chúng ta có thể thấy chỉ số chỉ chúng ta biết rằng chức năng này không có sẵn:

Biên soạn:

[email protected]:/home/hectorvp/cpuset/cpuset_try# make 
make -C /lib/modules/3.19.0-31-generic/build M=/home/hectorvp/cpuset/cpuset_try modules 
make[1]: Entering directory '/usr/src/linux-headers-3.19.0-31-generic' 
    CC [M] /home/hectorvp/cpuset/cpuset_try/cpuset_try.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
    WARNING: "cpuset_init" [/home/hectorvp/cpuset/cpuset_try/cpuset_try.ko] undefined! 
    CC  /home/hectorvp/cpuset/cpuset_try/cpuset_try.mod.o 
    LD [M] /home/hectorvp/cpuset/cpuset_try/cpuset_try.ko 
make[1]: Leaving directory '/usr/src/linux-headers-3.19.0-31-generic' 

Xem WARNING: "cupset_init" [...] undefined!.Và sử dụng nm:

(Lưu ý: U đứng cho 'undefined')

Tuy nhiên, tôi đã khám phá những biểu tượng của hạt nhân như sau:

[email protected]:/home/hectorvp/cpuset/cpuset_try# cat /proc/kallsyms | grep cpuset_init 
ffffffff8110dc40 T cpuset_init_current_mems_allowed 
ffffffff81d722ae T cpuset_init 
ffffffff81d72342 T cpuset_init_smp 

tôi xem nó được xuất nhưng không có sẵn trong /lib/modules/$(uname -r)/build/Module.symvers. Vì vậy, bạn nói đúng.

Sau khi điều tra thêm tôi thấy nó thực sự được quy định tại:

http://lxr.free-electrons.com/source/kernel/cpuset.c#L2101

Đây là chức năng bạn cần phải gọi như nó có sẵn trong không gian hạt nhân. Vì vậy, bạn sẽ không cần quyền truy cập vào không gian người dùng.

Công việc xung quanh tôi được tìm thấy để làm cho mô-đun có thể gọi biểu tượng này được báo cáo trong câu trả lời thứ hai của this question. Chú ý rằng bạn không cần phải bao gồm linux/cpuset.h nữa:

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
//#include <linux/cpuset.h> 
#include <linux/kallsyms.h> 


int init_module(void) 
{ 
     static void (*cpuset_init_p)(void); 
     cpuset_init_p = (void*) kallsyms_lookup_name("cpuset_init"); 
     printk(KERN_INFO "Starting ...\n"); 
     #ifdef CONFIG_CPUSETS 
      printk(KERN_INFO "cpusets is enabled!"); 
     #endif 
     (*cpuset_init_p)(); 
     /* 
     * A non 0 return means init_module failed; module can't be loaded. 
     */ 
     return 0; 
} 

void cleanup_module(void) 
{ 
     printk(KERN_INFO "Ending ...\n"); 
} 

MODULE_LICENSE("GPL"); 

Tôi biên dịch nó thành công và cài đặt với insmod. Bellow là sản phẩm tôi nhận được trong dmesg:

[ 1713.738925] Starting ... 
[ 1713.738929] cpusets is enabled! 
[ 1713.738943] kernel tried to execute NX-protected page - exploit attempt? (uid: 0) 
[ 1713.739042] BUG: unable to handle kernel paging request at ffffffff81d7237b 
[ 1713.739074] IP: [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.739102] PGD 1c16067 PUD 1c17063 PMD 30bc74063 PTE 8000000001d72163 
[ 1713.739136] Oops: 0011 [#1] SMP 
[ 1713.739153] Modules linked in: cpuset_try(OE+) xt_conntrack ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 xt_addrtype iptable_filter ip_tables x_tables nf_nat nf_conntrack br_netfilter bridge stp llc pci_stub vboxpci(OE) vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) aufs binfmt_misc cfg80211 nls_iso8859_1 snd_hda_codec_hdmi snd_hda_codec_realtek intel_rapl snd_hda_codec_generic iosf_mbi snd_hda_intel x86_pkg_temp_thermal intel_powerclamp snd_hda_controller snd_hda_codec snd_hwdep coretemp kvm_intel amdkfd kvm snd_pcm snd_seq_midi snd_seq_midi_event amd_iommu_v2 snd_rawmidi radeon snd_seq crct10dif_pclmul crc32_pclmul snd_seq_device aesni_intel ttm aes_x86_64 drm_kms_helper drm snd_timer i2c_algo_bit dcdbas mei_me lrw gf128mul mei snd glue_helper ablk_helper 
[ 1713.739533] cryptd soundcore shpchp lpc_ich serio_raw 8250_fintek mac_hid video parport_pc ppdev lp parport autofs4 hid_generic usbhid hid e1000e ahci psmouse ptp libahci pps_core 
[ 1713.739628] CPU: 2 PID: 24679 Comm: insmod Tainted: G   OE 3.19.0-56-generiC#62-Ubuntu 
[ 1713.739663] Hardware name: Dell Inc. OptiPlex 9020/0PC5F7, BIOS A03 09/17/2013 
[ 1713.739693] task: ffff8800d29f09d0 ti: ffff88009177c000 task.ti: ffff88009177c000 
[ 1713.739723] RIP: 0010:[<ffffffff81d7237b>] [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.739757] RSP: 0018:ffff88009177fd10 EFLAGS: 00010292 
[ 1713.739779] RAX: 0000000000000013 RBX: ffffffff81c1a080 RCX: 0000000000000013 
[ 1713.739808] RDX: 000000000000c928 RSI: 0000000000000246 RDI: 0000000000000246 
[ 1713.739836] RBP: ffff88009177fd18 R08: 000000000000000a R09: 00000000000003db 
[ 1713.739865] R10: 0000000000000092 R11: 00000000000003db R12: ffff8800ad1aaee0 
[ 1713.739893] R13: 0000000000000000 R14: ffffffffc0947000 R15: ffff88009177fef8 
[ 1713.739923] FS: 00007fbf45be8700(0000) GS:ffff88031dd00000(0000) knlGS:0000000000000000 
[ 1713.739955] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
[ 1713.739979] CR2: ffffffff81d7237b CR3: 00000000a3733000 CR4: 00000000001407e0 
[ 1713.740007] Stack: 
[ 1713.740016] ffffffffc094703e ffff88009177fd98 ffffffff81002148 0000000000000001 
[ 1713.740052] 0000000000000001 ffff8802479de200 0000000000000001 ffff88009177fd78 
[ 1713.740087] ffffffff811d79e9 ffffffff810fb058 0000000000000018 ffffffffc0949000 
[ 1713.740122] Call Trace: 
[ 1713.740137] [<ffffffffc094703e>] ? init_module+0x3e/0x50 [cpuset_try] 
[ 1713.740175] [<ffffffff81002148>] do_one_initcall+0xd8/0x210 
[ 1713.740190] [<ffffffff811d79e9>] ? kmem_cache_alloc_trace+0x189/0x200 
[ 1713.740207] [<ffffffff810fb058>] ? load_module+0x15b8/0x1d00 
[ 1713.740222] [<ffffffff810fb092>] load_module+0x15f2/0x1d00 
[ 1713.740236] [<ffffffff810f6850>] ? store_uevent+0x40/0x40 
[ 1713.740250] [<ffffffff810fb916>] SyS_finit_module+0x86/0xb0 
[ 1713.740265] [<ffffffff817ce10d>] system_call_fastpath+0x16/0x1b 
[ 1713.740280] Code: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 53 58 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <00> 00 00 00 00 1c 00 00 00 c0 92 2c 7d c0 92 2c 7d a0 fc 69 ee 
[ 1713.740398] RIP [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.740413] RSP <ffff88009177fd10> 
[ 1713.740421] CR2: ffffffff81d7237b 
[ 1713.746177] ---[ end trace 25614103c0658b94 ]--- 

Mặc dù lỗi, tôi muốn nói rằng tôi đã trả lời câu hỏi ban đầu của bạn:

Làm thế nào để sử dụng của cpuset từ bên trong một mô-đun hạt nhân? *

Có lẽ không phải là cách thanh lịch nhất vì tôi không phải là chuyên gia. Bạn cần tiếp tục từ đây.

Trân

Các vấn đề liên quan